void SearchDefinition(IDocument document, BracketSearchResult result) { if (document.GetCharAt(result.OpeningBracketOffset) != '{') return; // get line var documentLine = document.GetLineByOffset(result.OpeningBracketOffset); while (documentLine != null && IsBracketOnly(document, documentLine)) documentLine = documentLine.PreviousLine; if (documentLine != null) { result.DefinitionHeaderOffset = documentLine.Offset; result.DefinitionHeaderLength = documentLine.Length; } }
public void Show(BracketSearchResult bracketSearchResult) { ClosePopup(); if (bracketSearchResult == null || bracketSearchResult.DefinitionHeaderLength == 0) return; int startOffset = bracketSearchResult.DefinitionHeaderOffset; int endOffset = startOffset + bracketSearchResult.DefinitionHeaderLength; // show whole line even if the definition is only a part: DocumentLine firstLine = editor.Document.GetLineByOffset(startOffset); DocumentLine lastLine = editor.Document.GetLineByOffset(endOffset); TextEditor popupEditor = new TextEditor(); popupEditor.IsReadOnly = true; popupEditor.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; popupEditor.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; popupEditor.CopySettingsFrom(editor); IHighlighter oldHighlighter = editor.GetRequiredService<IHighlighter>(); FixedHighlighter newHighlighter = FixedHighlighter.CreateView(oldHighlighter, firstLine.Offset, lastLine.EndOffset); popupEditor.Document = (TextDocument)newHighlighter.Document; popupEditor.TextArea.TextView.LineTransformers.Add(new HighlightingColorizer(newHighlighter)); popup = new ExtendedPopup(editor.TextArea); const double borderThickness = 1; popup.Child = new Border() { Child = popupEditor, BorderBrush = editor.TextArea.Foreground, BorderThickness = new Thickness(borderThickness) }; popup.HorizontalOffset = -borderThickness - editor.TextArea.TextView.ScrollOffset.X; popup.Placement = PlacementMode.Top; popup.PlacementTarget = editor.TextArea.TextView; this.currentStartOffset = firstLine.Offset; editor.TextArea.TextView.VisualLinesChanged += textView_VisualLinesChanged; if (editor.TextArea.TextView.VisualLinesValid) textView_VisualLinesChanged(null, null); // open popup if necessary }
public BracketSearchResult SearchBracket(IDocument document, int offset) { if (offset > 0) { char c = document.GetCharAt(offset - 1); int index = openingBrackets.IndexOf(c); int otherOffset = -1; if (index > -1) otherOffset = SearchBracketForward(document, offset, openingBrackets[index], closingBrackets[index]); index = closingBrackets.IndexOf(c); if (index > -1) otherOffset = SearchBracketBackward(document, offset - 2, openingBrackets[index], closingBrackets[index]); if (otherOffset > -1) { var result = new BracketSearchResult(Math.Min(offset - 1, otherOffset), 1, Math.Max(offset - 1, otherOffset), 1); SearchDefinition(document, result); return result; } } return null; }