public void ClosePopup()
 {
     if (popup != null)
     {
         editor.TextArea.TextView.VisualLinesChanged -= textView_VisualLinesChanged;
         popup.IsOpenIfFocused = false;
         popup = null;
     }
 }
        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 void Dispose()
 {
     WorkbenchSingleton.Workbench.ActiveContentChanged -= WorkbenchSingleton_Workbench_ActiveContentChanged;
     ClosePopup();
     popup = null;
 }