Browse Source

proposed fix for: SD-1917 - Find Next highlights wrong text after text edited

pull/30/head
Siegfried Pammer 13 years ago
parent
commit
0f36a2c40f
  1. 6
      src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin
  2. 33
      src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs
  3. 25
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchCommands.cs
  4. 58
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchPanel.cs

6
src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin

@ -43,4 +43,10 @@ @@ -43,4 +43,10 @@
<Path name="/SharpDevelop/Pads/SearchResultPad/Factories">
<Class id="DefaultSearchResultFactory" class="SearchAndReplace.DefaultSearchResultFactory"/>
</Path>
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
id="SearchAndReplace"
class="SearchAndReplace.SearchAndReplaceBinding" />
</Path>
</AddIn>

33
src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs

@ -2,8 +2,11 @@ @@ -2,8 +2,11 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Search;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
namespace SearchAndReplace
{
@ -153,4 +156,34 @@ namespace SearchAndReplace @@ -153,4 +156,34 @@ namespace SearchAndReplace
properties = PropertyService.Get(searchPropertyKey, new Properties());
}
}
public class SearchAndReplaceBinding : DefaultLanguageBinding
{
SearchInputHandler handler;
public override void Attach(ITextEditor editor)
{
TextArea textArea = editor.GetService(typeof(TextArea)) as TextArea;
if (textArea == null) return;
handler = new SearchInputHandler(textArea);
textArea.DefaultInputHandler.NestedInputHandlers.Add(handler);
handler.SearchOptionsChanged += SearchOptionsChanged;
}
void SearchOptionsChanged(object sender, SearchOptionsChangedEventArgs e)
{
SearchOptions.CurrentFindPattern = e.SearchPattern;
SearchOptions.MatchCase = e.MatchCase;
SearchOptions.MatchWholeWord = e.WholeWords;
SearchOptions.SearchMode = e.UseRegex ? SearchMode.RegEx : SearchMode.Normal;
}
public override void Detach()
{
if (handler != null) {
handler.SearchOptionsChanged -= SearchOptionsChanged;
}
handler = null;
}
}
}

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

@ -57,6 +57,8 @@ namespace ICSharpCode.AvalonEdit.Search @@ -57,6 +57,8 @@ namespace ICSharpCode.AvalonEdit.Search
: base(textArea)
{
RegisterCommands(this.CommandBindings);
panel = new SearchPanel();
panel.Attach(TextArea);
}
void RegisterCommands(ICollection<CommandBinding> commandBindings)
@ -71,9 +73,8 @@ namespace ICSharpCode.AvalonEdit.Search @@ -71,9 +73,8 @@ namespace ICSharpCode.AvalonEdit.Search
void ExecuteFind(object sender, ExecutedRoutedEventArgs e)
{
if (panel == null || panel.IsClosed) {
panel = new SearchPanel();
panel.Attach(TextArea);
if (panel.IsClosed) {
panel.Open();
}
panel.SearchPattern = TextArea.Selection.GetText();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Input, (Action)delegate { panel.Reactivate(); });
@ -81,21 +82,25 @@ namespace ICSharpCode.AvalonEdit.Search @@ -81,21 +82,25 @@ namespace ICSharpCode.AvalonEdit.Search
void ExecuteFindNext(object sender, ExecutedRoutedEventArgs e)
{
if (panel != null)
panel.FindNext();
panel.FindNext();
}
void ExecuteFindPrevious(object sender, ExecutedRoutedEventArgs e)
{
if (panel != null)
panel.FindPrevious();
panel.FindPrevious();
}
void ExecuteCloseSearchPanel(object sender, ExecutedRoutedEventArgs e)
{
if (panel != null)
panel.Close();
panel = null;
panel.Close();
}
/// <summary>
/// Fired when SearchOptions are modified inside the SearchPanel.
/// </summary>
public event EventHandler<SearchOptionsChangedEventArgs> SearchOptionsChanged {
add { panel.SearchOptionsChanged += value; }
remove { panel.SearchOptionsChanged -= value; }
}
}
}

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

@ -157,6 +157,7 @@ namespace ICSharpCode.AvalonEdit.Search @@ -157,6 +157,7 @@ namespace ICSharpCode.AvalonEdit.Search
if (renderer.CurrentResults.Any())
messageView.IsOpen = false;
strategy = SearchStrategyFactory.Create(SearchPattern ?? "", !MatchCase, WholeWords, UseRegex ? SearchMode.RegEx : SearchMode.Normal);
OnSearchOptionsChanged(new SearchOptionsChangedEventArgs(SearchPattern, MatchCase, UseRegex, WholeWords));
DoSearch(true);
}
@ -191,6 +192,7 @@ namespace ICSharpCode.AvalonEdit.Search @@ -191,6 +192,7 @@ namespace ICSharpCode.AvalonEdit.Search
this.CommandBindings.Add(new CommandBinding(SearchCommands.FindNext, (sender, e) => FindNext()));
this.CommandBindings.Add(new CommandBinding(SearchCommands.FindPrevious, (sender, e) => FindPrevious()));
this.CommandBindings.Add(new CommandBinding(SearchCommands.CloseSearchPanel, (sender, e) => Close()));
IsClosed = true;
}
void textArea_DocumentChanged(object sender, EventArgs e)
@ -355,13 +357,63 @@ namespace ICSharpCode.AvalonEdit.Search @@ -355,13 +357,63 @@ namespace ICSharpCode.AvalonEdit.Search
var layer = AdornerLayer.GetAdornerLayer(textArea);
if (layer != null)
layer.Remove(adorner);
messageView.IsOpen = false;
textArea.TextView.BackgroundRenderers.Remove(renderer);
textArea.Focus();
IsClosed = true;
}
/// <summary>
/// Closes the SearchPanel and removes it.
/// </summary>
public void CloseAndRemove()
{
Close();
textArea.DocumentChanged -= textArea_DocumentChanged;
if (currentDocument != null)
currentDocument.TextChanged -= textArea_Document_TextChanged;
messageView.IsOpen = false;
textArea.Focus();
IsClosed = true;
}
/// <summary>
/// Opens the an existing search panel.
/// </summary>
public void Open()
{
var layer = AdornerLayer.GetAdornerLayer(textArea);
if (layer != null)
layer.Add(adorner);
textArea.TextView.BackgroundRenderers.Add(renderer);
}
/// <summary>
/// Fired when SearchOptions are changed inside the SearchPanel.
/// </summary>
public event EventHandler<SearchOptionsChangedEventArgs> SearchOptionsChanged;
/// <summary>
/// Raises the <see cref="SearchOptionsChangend" /> event.
/// </summary>
protected virtual void OnSearchOptionsChanged(SearchOptionsChangedEventArgs e)
{
if (SearchOptionsChanged != null) {
SearchOptionsChanged(this, e);
}
}
}
public class SearchOptionsChangedEventArgs : EventArgs
{
public string SearchPattern { get; private set; }
public bool MatchCase { get; private set; }
public bool UseRegex { get; private set; }
public bool WholeWords { get; private set; }
public SearchOptionsChangedEventArgs(string searchPattern, bool matchCase, bool useRegex, bool wholeWords)
{
this.SearchPattern = searchPattern;
this.MatchCase = matchCase;
this.UseRegex = useRegex;
this.WholeWords = wholeWords;
}
}

Loading…
Cancel
Save