private void GotoPosAndFocus(ScintillaNet.ScintillaControl sci, int position) { // don't correct to multi-byte safe position (assumed correct) sci.GotoPos(position); int line = sci.LineFromPosition(position); // TODO The folding makes the line centering fail - solution: expand all folds / make it smarter. //sci.EnsureVisible(line); sci.ExpandAllFolds(); int top = sci.FirstVisibleLine; int middle = top + sci.LinesOnScreen/2; sci.LineScroll(0, line-middle); ((Control)sci).Focus(); }
public void GotoPosAndFocus(ScintillaNet.ScintillaControl sci, int position) { sci.MBSafeGotoPos(position); int line = sci.LineFromPosition(sci.CurrentPos); // TODO The folding makes the line centering fail - solution: expand all folds / make it smarter. //sci.EnsureVisible(line); sci.ExpandAllFolds(); int top = sci.FirstVisibleLine; int middle = top + sci.LinesOnScreen/2; sci.LineScroll(0, line-middle); // ((Control)sci).Focus(); }
/// <summary> /// Some characters can fire code generation /// </summary> /// <param name="sci">Scintilla control</param> /// <param name="value">Character</param> /// <returns>Code was generated</returns> static private bool CodeAutoOnChar(ScintillaNet.ScintillaControl sci, int value) { if (!ASContext.AutoImportsEnabled) return false; int position = sci.CurrentPos; if (value == '*' && position > 1 && sci.CharAt(position-2) == '.' && LastExpression != null) { // context string key = LastExpression.Keyword; if (key != null && (key == "import" || key == "extends" || key == "implements" || key == "package")) return false; ASResult context = EvalExpression(LastExpression.Value, LastExpression, ASContext.CurrentClass, true); if (context.IsNull() || context.Class.Flags != FlagType.Package) return false; string package = LastExpression.Value; int startPos = LastExpression.Position; string check = ""; char c; while (startPos > LastExpression.PositionExpression && check.Length <= package.Length && check != package) { c = (char)sci.CharAt(--startPos); if (c > 32) check = c+check; } if (check != package) return false; // insert import string statement = "import "+package+"*;"+ASContext.MainForm.GetNewLineMarker(sci.EOLMode); int endPos = sci.CurrentPos; int line = 0; int curLine = sci.LineFromPosition(position); int firstLine = 0; bool found = false; string txt; Match mImport; while (line < curLine) { txt = sci.GetLine(line++).TrimStart(); // HACK insert imports after AS3 package declaration if (txt.StartsWith("package")) { statement = '\t'+statement; firstLine = (txt.IndexOf('{') < 0) ? line+1 : line; } else if (txt.StartsWith("import")) { found = true; // insérer dans l'ordre alphabetique mImport = ASClassParser.re_import.Match(txt); if (mImport.Success && String.Compare(mImport.Groups["package"].Value, package) > 0) { line--; break; } } else if (found) { line--; break; } } if (line == curLine) line = firstLine; position = sci.PositionFromLine(line); line = sci.FirstVisibleLine; sci.SetSel(position, position); sci.ReplaceSel(statement); // prepare insertion of the term as usual startPos += statement.Length; endPos += statement.Length; sci.SetSel(startPos, endPos); sci.ReplaceSel(""); sci.LineScroll(0, line-sci.FirstVisibleLine+1); // create classes list ASClass cClass = ASContext.CurrentClass; ArrayList list = new ArrayList(); foreach(ASMember import in cClass.Imports) if (import.Type.StartsWith(package)) list.Add(new MemberItem(import)); CompletionList.Show(list, false); return true; } return false; }