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