예제 #1
0
 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;
             }
         }
     }
 }
예제 #2
0
        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);
        }