Browse Source

Fix several issues with SearchPanel.

pull/39/merge
Daniel Grunwald 13 years ago
parent
commit
80aff30058
  1. 3
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs
  2. 45
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs

3
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs

@ -74,7 +74,8 @@ namespace ICSharpCode.AvalonEdit.Search
void ExecuteFind(object sender, ExecutedRoutedEventArgs e) void ExecuteFind(object sender, ExecutedRoutedEventArgs e)
{ {
panel.Open(); panel.Open();
panel.SearchPattern = TextArea.Selection.GetText(); if (!(TextArea.Selection.IsEmpty || TextArea.Selection.IsMultiline))
panel.SearchPattern = TextArea.Selection.GetText();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, (Action)delegate { panel.Reactivate(); }); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, (Action)delegate { panel.Reactivate(); });
} }

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

@ -29,7 +29,6 @@ namespace ICSharpCode.AvalonEdit.Search
TextArea textArea; TextArea textArea;
TextDocument currentDocument; TextDocument currentDocument;
SearchResultBackgroundRenderer renderer; SearchResultBackgroundRenderer renderer;
SearchResult currentResult;
TextBox searchTextBox; TextBox searchTextBox;
SearchPanelAdorner adorner; SearchPanelAdorner adorner;
@ -176,15 +175,13 @@ namespace ICSharpCode.AvalonEdit.Search
if (textArea == null) if (textArea == null)
throw new ArgumentNullException("textArea"); throw new ArgumentNullException("textArea");
this.textArea = textArea; this.textArea = textArea;
var layer = AdornerLayer.GetAdornerLayer(textArea);
adorner = new SearchPanelAdorner(textArea, this); adorner = new SearchPanelAdorner(textArea, this);
if (layer != null)
layer.Add(adorner);
DataContext = this; DataContext = this;
renderer = new SearchResultBackgroundRenderer(); renderer = new SearchResultBackgroundRenderer();
currentDocument = textArea.Document; currentDocument = textArea.Document;
currentDocument.TextChanged += textArea_Document_TextChanged; if (currentDocument != null)
currentDocument.TextChanged += textArea_Document_TextChanged;
textArea.DocumentChanged += textArea_DocumentChanged; textArea.DocumentChanged += textArea_DocumentChanged;
KeyDown += SearchLayerKeyDown; KeyDown += SearchLayerKeyDown;
@ -251,8 +248,7 @@ namespace ICSharpCode.AvalonEdit.Search
if (result == null) if (result == null)
result = renderer.CurrentResults.FirstSegment; result = renderer.CurrentResults.FirstSegment;
if (result != null) { if (result != null) {
currentResult = result; SelectResult(result);
SetResult(result);
} }
} }
@ -267,8 +263,7 @@ namespace ICSharpCode.AvalonEdit.Search
if (result == null) if (result == null)
result = renderer.CurrentResults.LastSegment; result = renderer.CurrentResults.LastSegment;
if (result != null) { if (result != null) {
currentResult = result; SelectResult(result);
SetResult(result);
} }
} }
@ -276,20 +271,20 @@ namespace ICSharpCode.AvalonEdit.Search
void DoSearch(bool changeSelection) void DoSearch(bool changeSelection)
{ {
if (IsClosed)
return;
renderer.CurrentResults.Clear(); renderer.CurrentResults.Clear();
currentResult = null;
if (!string.IsNullOrEmpty(SearchPattern)) { if (!string.IsNullOrEmpty(SearchPattern)) {
int offset = textArea.Caret.Offset; int offset = textArea.Caret.Offset;
if (changeSelection) { if (changeSelection) {
textArea.ClearSelection(); textArea.ClearSelection();
} }
// We cast from ISearchResult to SearchResult; this is safe because we always use the built-in strategy
foreach (SearchResult result in strategy.FindAll(textArea.Document, 0, textArea.Document.TextLength)) { foreach (SearchResult result in strategy.FindAll(textArea.Document, 0, textArea.Document.TextLength)) {
if (currentResult == null && result.StartOffset >= offset) { if (changeSelection && result.StartOffset >= offset) {
currentResult = result; SelectResult(result);
if (changeSelection) { changeSelection = false;
SetResult(result);
}
} }
renderer.CurrentResults.Add(result); renderer.CurrentResults.Add(result);
} }
@ -303,15 +298,10 @@ namespace ICSharpCode.AvalonEdit.Search
textArea.TextView.InvalidateLayer(KnownLayer.Selection); textArea.TextView.InvalidateLayer(KnownLayer.Selection);
} }
void SetResult(SearchResult result) void SelectResult(SearchResult result)
{ {
textArea.Caret.Offset = currentResult.StartOffset; textArea.Caret.Offset = result.StartOffset;
textArea.Selection = Selection.Create(textArea, currentResult.StartOffset, currentResult.EndOffset); textArea.Selection = Selection.Create(textArea, result.StartOffset, result.EndOffset);
var foldingManager = textArea.GetService(typeof(FoldingManager)) as FoldingManager;
if (foldingManager != null) {
foreach (var folding in foldingManager.GetFoldingsContaining(result.StartOffset))
folding.IsFolded = false;
}
textArea.Caret.BringCaretToView(); textArea.Caret.BringCaretToView();
// show caret even if the editor does not have the Keyboard Focus // show caret even if the editor does not have the Keyboard Focus
textArea.Caret.Show(); textArea.Caret.Show();
@ -353,13 +343,19 @@ namespace ICSharpCode.AvalonEdit.Search
/// </summary> /// </summary>
public void Close() public void Close()
{ {
bool hasFocus = this.IsKeyboardFocusWithin;
var layer = AdornerLayer.GetAdornerLayer(textArea); var layer = AdornerLayer.GetAdornerLayer(textArea);
if (layer != null) if (layer != null)
layer.Remove(adorner); layer.Remove(adorner);
messageView.IsOpen = false; messageView.IsOpen = false;
textArea.TextView.BackgroundRenderers.Remove(renderer); textArea.TextView.BackgroundRenderers.Remove(renderer);
textArea.Focus(); if (hasFocus)
textArea.Focus();
IsClosed = true; IsClosed = true;
// Clear existing search results so that the segments don't have to be maintained
renderer.CurrentResults.Clear();
} }
/// <summary> /// <summary>
@ -384,6 +380,7 @@ namespace ICSharpCode.AvalonEdit.Search
layer.Add(adorner); layer.Add(adorner);
textArea.TextView.BackgroundRenderers.Add(renderer); textArea.TextView.BackgroundRenderers.Add(renderer);
IsClosed = false; IsClosed = false;
DoSearch(false);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save