예제 #1
0
        public BracketsHighlighter(TextEditor textEditor)
        {
            _bracketsStarting = new char[] { '{', '(', '[' };
            _bracketsEnding   = new char[] { '}', ')', ']' };
            _textEditor       = textEditor;
            _bracketsMatch    = null;
            _textEditor.TextArea.Caret.PositionChanged -= Caret_PositionChanged;
            _textEditor.TextArea.Caret.PositionChanged += Caret_PositionChanged;

            _bracketsColorizingTransformer = new BracketsColorizingTransformer();
            _textEditor.TextArea.TextView.LineTransformers.Add(_bracketsColorizingTransformer);
        }
예제 #2
0
        // Event rased every time caret is changed in document.
        private void Caret_PositionChanged(object sender, EventArgs eventArgs)
        {
            Caret caret = sender as Caret;

            if (_bracketsMatch != null)
            {
                _bracketsColorizingTransformer.Locations.Clear();
                _textEditor.TextArea.TextView.Redraw();
                _bracketsMatch = null;
            }

            int  caretOffset = _textEditor.Document.GetOffset(caret.Location);
            char textBefore  = '\0';
            char textAfter   = '\0';

            try
            {
                textAfter  = _textEditor.Text[caretOffset];
                textBefore = _textEditor.Text[caretOffset - 1];
            } catch
            {
                return;
            }

            if (_bracketsEnding.Contains(textBefore))
            {
                char searchFor = _bracketsStarting[Array.IndexOf(_bracketsEnding, textBefore)];
                _bracketsMatch = FindMatchingBrackets(caretOffset - 1, searchFor, textBefore);
            }
            else if (_bracketsStarting.Contains(textAfter))
            {
                char searchFor = _bracketsEnding[Array.IndexOf(_bracketsStarting, textAfter)];
                _bracketsMatch = FindMatchingBrackets(caretOffset + 1, textAfter, searchFor);
            }


            if (_bracketsMatch != null)
            {
                TextLocation openingLine = _textEditor.Document.GetLocation(_bracketsMatch.OpeningOffset);
                TextLocation closingLine = _textEditor.Document.GetLocation(_bracketsMatch.ClosingOffset);

                _bracketsColorizingTransformer.Locations.Add(openingLine);
                _bracketsColorizingTransformer.Locations.Add(closingLine);

                _textEditor.TextArea.TextView.Redraw(_bracketsMatch.OpeningOffset, _bracketsMatch.ClosingOffset - _bracketsMatch.OpeningOffset);
            }
        }