void HandleSkipCharsOnReplace(object sender, ReplaceEventArgs args) { for (int i = 0; i < skipChars.Count; i++) { SkipChar sc = skipChars[i]; if (args.Offset < sc.Start || args.Offset > sc.Offset) { skipChars.RemoveAt(i); i--; continue; } if (args.Offset <= sc.Offset) { sc.Offset -= args.Count; if (!string.IsNullOrEmpty(args.Value)) { sc.Offset += args.Value.Length; } } } }
protected override bool OnIMProcessedKeyPressEvent(Gdk.Key key, uint ch, Gdk.ModifierType state) { bool result = true; if (key == Gdk.Key.Escape) { bool b = Extension != null?ExtensionKeyPress(key, ch, state) : base.OnIMProcessedKeyPressEvent(key, ch, state); if (b) { view.SourceEditorWidget.RemoveSearchWidget(); return(true); } return(false); } if (Document == null) { return(true); } bool inStringOrComment = false; LineSegment line = Document.GetLine(Caret.Line); if (line == null) { return(true); } bool inChar = false; bool inComment = false; bool inString = false; // string escape = "\""; Stack <Span> stack = line.StartSpan != null ? new Stack <Span> (line.StartSpan) : new Stack <Span> (); Mono.TextEditor.Highlighting.SyntaxModeService.ScanSpans(Document, Document.SyntaxMode, Document.SyntaxMode, stack, line.Offset, Caret.Offset); foreach (Span span in stack) { if (string.IsNullOrEmpty(span.Color)) { continue; } if (span.Color == "string.single" || span.Color == "string.double" || span.Color.StartsWith("comment")) { inStringOrComment = true; inChar |= span.Color == "string.single"; inComment |= span.Color.StartsWith("comment"); inString = !inChar && !inComment; //escape = span.Escape; break; } } Document.BeginAtomicUndo(); // insert template when space is typed (currently disabled - it's annoying). bool templateInserted = false; //!inStringOrComment && (key == Gdk.Key.space) && DoInsertTemplate (); bool returnBetweenBraces = key == Gdk.Key.Return && (state & (Gdk.ModifierType.ControlMask | Gdk.ModifierType.ShiftMask)) == Gdk.ModifierType.None && Caret.Offset > 0 && Caret.Offset < Document.Length && Document.GetCharAt(Caret.Offset - 1) == '{' && Document.GetCharAt(Caret.Offset) == '}' && !inStringOrComment; int initialOffset = Caret.Offset; const string openBrackets = "{[('\""; const string closingBrackets = "}])'\""; int braceIndex = openBrackets.IndexOf((char)ch); SkipChar skipChar = skipChars.Find(sc => sc.Char == (char)ch && sc.Offset == Caret.Offset); // special handling for escape chars inside ' and " if (Caret.Offset > 0) { char charBefore = Document.GetCharAt(Caret.Offset - 1); if (inStringOrComment && (ch == '"' || (inChar && ch == '\'')) && charBefore == '\\') { skipChar = null; } } char insertionChar = '\0'; if (skipChar == null && Options.AutoInsertMatchingBracket && braceIndex >= 0) { if (!inStringOrComment) { char closingBrace = closingBrackets[braceIndex]; char openingBrace = openBrackets[braceIndex]; int count = 0; foreach (char curCh in TextWithoutCommentsAndStrings) { if (curCh == openingBrace) { count++; } else if (curCh == closingBrace) { count--; } } if (count >= 0) { GetTextEditorData().EnsureCaretIsNotVirtual(); int offset = Caret.Offset; insertionChar = closingBrace; Insert(offset, closingBrace.ToString()); Caret.Offset = offset; } } else { char charBefore = Document.GetCharAt(Caret.Offset - 1); if (!inString && !inComment && !inChar && ch == '"' && charBefore != '\\') { GetTextEditorData().EnsureCaretIsNotVirtual(); insertionChar = '"'; int offset = Caret.Offset; Insert(Caret.Offset, "\""); Caret.Offset = offset; } } } //Console.WriteLine (Caret.Offset + "/" + insOff); if (skipChar != null) { Caret.Offset++; skipChars.Remove(skipChar); } else { if (Extension != null) { if (ExtensionKeyPress(key, ch, state)) { result = base.OnIMProcessedKeyPressEvent(key, ch, state); } if (returnBetweenBraces) { Caret.Offset = initialOffset; ExtensionKeyPress(Gdk.Key.Return, (char)0, Gdk.ModifierType.None); } } else { result = base.OnIMProcessedKeyPressEvent(key, ch, state); if (returnBetweenBraces) { Caret.Offset = initialOffset; base.SimulateKeyPress(Gdk.Key.Return, 0, Gdk.ModifierType.None); } } } if (insertionChar != '\0') { SetInsertionChar(Caret.Offset, insertionChar); } if (templateInserted) { Document.EndAtomicUndo(); return(true); } Document.EndAtomicUndo(); return(result); }