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); }
// 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); } }