Browse Source

SearchPanel: fix a memory leak when the document instance is changed; fix issues with 0-length results; add access to MarkerBrush

pull/23/head
Siegfried Pammer 14 years ago
parent
commit
41a7197fd2
  1. 55
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs

55
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs

@ -24,9 +24,9 @@ namespace ICSharpCode.AvalonEdit.Search
public class SearchPanel : Control public class SearchPanel : Control
{ {
TextArea textArea; TextArea textArea;
TextDocument currentDocument;
SearchResultBackgroundRenderer renderer; SearchResultBackgroundRenderer renderer;
SearchResult currentResult; SearchResult currentResult;
FoldingManager foldingManager;
TextBox searchTextBox; TextBox searchTextBox;
SearchPanelAdorner adorner; SearchPanelAdorner adorner;
@ -66,6 +66,23 @@ namespace ICSharpCode.AvalonEdit.Search
set { SetValue(SearchPatternProperty, value); } set { SetValue(SearchPatternProperty, value); }
} }
public static readonly DependencyProperty MarkerBrushProperty =
DependencyProperty.Register("MarkerBrush", typeof(Brush), typeof(SearchPanel),
new FrameworkPropertyMetadata(Brushes.LightGreen, MarkerBrushChangedCallback));
public Brush MarkerBrush {
get { return (Brush)GetValue(MarkerBrushProperty); }
set { SetValue(MarkerBrushProperty, value); }
}
static void MarkerBrushChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
SearchPanel panel = d as SearchPanel;
if (panel != null) {
panel.renderer.MarkerBrush = (Brush)e.NewValue;
}
}
static SearchPanel() static SearchPanel()
{ {
DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchPanel), new FrameworkPropertyMetadata(typeof(SearchPanel))); DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchPanel), new FrameworkPropertyMetadata(typeof(SearchPanel)));
@ -107,11 +124,11 @@ namespace ICSharpCode.AvalonEdit.Search
layer.Add(adorner); layer.Add(adorner);
DataContext = this; DataContext = this;
foldingManager = textArea.GetService(typeof(FoldingManager)) as FoldingManager;
renderer = new SearchResultBackgroundRenderer(); renderer = new SearchResultBackgroundRenderer();
textArea.TextView.BackgroundRenderers.Add(renderer); textArea.TextView.BackgroundRenderers.Add(renderer);
textArea.Document.TextChanged += delegate { DoSearch(false); }; currentDocument = textArea.Document;
currentDocument.TextChanged += textArea_Document_TextChanged;
textArea.DocumentChanged += textArea_DocumentChanged;
KeyDown += SearchLayerKeyDown; KeyDown += SearchLayerKeyDown;
this.CommandBindings.Add(new CommandBinding(SearchCommands.FindNext, (sender, e) => FindNext())); this.CommandBindings.Add(new CommandBinding(SearchCommands.FindNext, (sender, e) => FindNext()));
@ -119,6 +136,20 @@ namespace ICSharpCode.AvalonEdit.Search
this.CommandBindings.Add(new CommandBinding(SearchCommands.CloseSearchPanel, (sender, e) => Close())); this.CommandBindings.Add(new CommandBinding(SearchCommands.CloseSearchPanel, (sender, e) => Close()));
} }
void textArea_DocumentChanged(object sender, EventArgs e)
{
if (currentDocument != null)
currentDocument.TextChanged -= textArea_Document_TextChanged;
currentDocument = textArea.Document;
if (currentDocument != null)
currentDocument.TextChanged += textArea_Document_TextChanged;
}
void textArea_Document_TextChanged(object sender, EventArgs e)
{
DoSearch(false);
}
public override void OnApplyTemplate() public override void OnApplyTemplate()
{ {
base.OnApplyTemplate(); base.OnApplyTemplate();
@ -155,9 +186,7 @@ namespace ICSharpCode.AvalonEdit.Search
/// </summary> /// </summary>
public void FindNext() public void FindNext()
{ {
SearchResult result = null; SearchResult result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset + 1);
if (currentResult != null)
result = renderer.CurrentResults.GetNextSegment(currentResult);
if (result == null) if (result == null)
result = renderer.CurrentResults.FirstSegment; result = renderer.CurrentResults.FirstSegment;
if (result != null) { if (result != null) {
@ -171,9 +200,9 @@ namespace ICSharpCode.AvalonEdit.Search
/// </summary> /// </summary>
public void FindPrevious() public void FindPrevious()
{ {
SearchResult result = null; SearchResult result = renderer.CurrentResults.FindFirstSegmentWithStartAfter(textArea.Caret.Offset);
if (currentResult != null) if (result != null)
result = renderer.CurrentResults.GetPreviousSegment(currentResult); result = renderer.CurrentResults.GetPreviousSegment(result);
if (result == null) if (result == null)
result = renderer.CurrentResults.LastSegment; result = renderer.CurrentResults.LastSegment;
if (result != null) { if (result != null) {
@ -210,11 +239,14 @@ namespace ICSharpCode.AvalonEdit.Search
{ {
textArea.Caret.Offset = currentResult.StartOffset; textArea.Caret.Offset = currentResult.StartOffset;
textArea.Selection = new SimpleSelection(currentResult.StartOffset, currentResult.EndOffset); textArea.Selection = new SimpleSelection(currentResult.StartOffset, currentResult.EndOffset);
var foldingManager = textArea.GetService(typeof(FoldingManager)) as FoldingManager;
if (foldingManager != null) { if (foldingManager != null) {
foreach (var folding in foldingManager.GetFoldingsContaining(result.StartOffset)) foreach (var folding in foldingManager.GetFoldingsContaining(result.StartOffset))
folding.IsFolded = false; folding.IsFolded = false;
} }
textArea.Caret.BringCaretToView(); textArea.Caret.BringCaretToView();
// show caret even if the editor does not have the Keyboard Focus
textArea.Caret.Show();
} }
void SearchLayerKeyDown(object sender, KeyEventArgs e) void SearchLayerKeyDown(object sender, KeyEventArgs e)
@ -252,6 +284,9 @@ namespace ICSharpCode.AvalonEdit.Search
if (layer != null) if (layer != null)
layer.Remove(adorner); layer.Remove(adorner);
textArea.TextView.BackgroundRenderers.Remove(renderer); textArea.TextView.BackgroundRenderers.Remove(renderer);
textArea.DocumentChanged -= textArea_DocumentChanged;
if (currentDocument != null)
currentDocument.TextChanged -= textArea_Document_TextChanged;
messageView.IsOpen = false; messageView.IsOpen = false;
} }
} }

Loading…
Cancel
Save