Browse Source

fix bug in Find next/Interactive replace: Saved selection should use anchors

pull/23/head
Siegfried Pammer 14 years ago
parent
commit
beb58991b9
  1. 2
      SharpDevelop.sln
  2. 2
      src/AddIns/Misc/SearchAndReplace/Project/Commands/SearchMainMenuCommands.cs
  3. 7
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs
  4. 86
      src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs

2
SharpDevelop.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.2.0.8103-alpha
# SharpDevelop 4.2.0.8199-alpha
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject
EndProjectSection

2
src/AddIns/Misc/SearchAndReplace/Project/Commands/SearchMainMenuCommands.cs

@ -40,7 +40,7 @@ namespace SearchAndReplace @@ -40,7 +40,7 @@ namespace SearchAndReplace
public override void Run()
{
if (SearchOptions.CurrentFindPattern.Length > 0) {
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection() : null);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(true) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
var result = SearchManager.FindNext(strategy, location);
SearchManager.SelectResult(result);

7
src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs

@ -407,12 +407,13 @@ namespace SearchAndReplace @@ -407,12 +407,13 @@ namespace SearchAndReplace
}
}
public static ISegment GetActiveSelection()
public static ISegment GetActiveSelection(bool useAnchors)
{
ITextEditor editor = GetActiveTextEditor();
if (editor != null) {
var document = new TextDocument(DocumentUtilitites.GetTextSource(editor.Document));
return new AnchorSegment(document, editor.SelectionStart, editor.SelectionLength);
if (useAnchors)
return new AnchorSegment((TextDocument)editor.Document.GetService(typeof(TextDocument)), editor.SelectionStart, editor.SelectionLength);
return new TextSegment { StartOffset = editor.SelectionStart, Length = editor.SelectionLength };
}
return null;

86
src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs

@ -23,7 +23,6 @@ namespace SearchAndReplace @@ -23,7 +23,6 @@ namespace SearchAndReplace
{
SearchAndReplaceMode searchAndReplaceMode;
ITextEditor textEditor;
ISegment selection;
public SearchAndReplaceMode SearchAndReplaceMode {
get {
@ -63,13 +62,6 @@ namespace SearchAndReplace @@ -63,13 +62,6 @@ namespace SearchAndReplace
{
}
protected override void Dispose(bool disposing)
{
RemoveSelectionChangedHandler();
RemoveActiveWindowChangedHandler();
base.Dispose(disposing);
}
public SearchTarget SearchTarget {
get {
return (SearchTarget)(Get<ComboBox>("lookIn").SelectedIndex);
@ -95,7 +87,7 @@ namespace SearchAndReplace @@ -95,7 +87,7 @@ namespace SearchAndReplace
void FindNextButtonClicked(object sender, EventArgs e)
{
WritebackOptions();
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, selection);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(true) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
lastMatch = SearchManager.FindNext(strategy, location);
SearchManager.SelectResult(lastMatch);
@ -108,7 +100,7 @@ namespace SearchAndReplace @@ -108,7 +100,7 @@ namespace SearchAndReplace
var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor();
monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}");
try {
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, selection);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
var results = SearchManager.FindAllParallel(strategy, location, monitor);
SearchManager.ShowSearchResults(SearchOptions.FindPattern, results);
@ -121,7 +113,7 @@ namespace SearchAndReplace @@ -121,7 +113,7 @@ namespace SearchAndReplace
var monitor = WorkbenchSingleton.StatusBar.CreateProgressMonitor();
monitor.TaskName = StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}");
try {
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, selection);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(false) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
var results = SearchManager.FindAllParallel(strategy, location, monitor);
SearchManager.MarkAll(results);
@ -135,7 +127,7 @@ namespace SearchAndReplace @@ -135,7 +127,7 @@ namespace SearchAndReplace
AsynchronousWaitDialog.RunInCancellableWaitDialog(
StringParser.Parse("${res:AddIns.SearchReplace.SearchProgressTitle}"), null,
monitor => {
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, selection);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(true) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
var results = SearchManager.FindAll(strategy, location, monitor);
count = SearchManager.ReplaceAll(results, SearchOptions.ReplacePattern, monitor.CancellationToken);
@ -149,7 +141,7 @@ namespace SearchAndReplace @@ -149,7 +141,7 @@ namespace SearchAndReplace
WritebackOptions();
if (SearchManager.IsResultSelected(lastMatch))
SearchManager.Replace(lastMatch, SearchOptions.ReplacePattern);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, selection);
var location = new SearchLocation(SearchOptions.SearchTarget, SearchOptions.LookIn, SearchOptions.LookInFiletypes, SearchOptions.IncludeSubdirectories, SearchOptions.SearchTarget == SearchTarget.CurrentSelection ? SearchManager.GetActiveSelection(true) : null);
var strategy = SearchStrategyFactory.Create(SearchOptions.FindPattern, !SearchOptions.MatchCase, SearchOptions.MatchWholeWord, SearchOptions.SearchMode);
lastMatch = SearchManager.FindNext(strategy, location);
SearchManager.SelectResult(lastMatch);
@ -252,17 +244,6 @@ namespace SearchAndReplace @@ -252,17 +244,6 @@ namespace SearchAndReplace
Get<ComboBox>("fileTypes").Enabled = false;
Get<Label>("lookAtTypes").Enabled = false;
}
if (IsSelectionSearch) {
InitSelectionSearch();
} else {
RemoveSelectionSearchHandlers();
}
}
bool IsSelectionSearch {
get {
return SearchTarget == SearchTarget.CurrentSelection;
}
}
/// <summary>
@ -288,63 +269,6 @@ namespace SearchAndReplace @@ -288,63 +269,6 @@ namespace SearchAndReplace
return null;
}
void WorkbenchActiveViewContentChanged(object source, EventArgs e)
{
ITextEditor activeTextEditorControl = SearchManager.GetActiveTextEditor();
if (activeTextEditorControl != this.textEditor) {
AddSelectionChangedHandler(activeTextEditorControl);
TextSelectionChanged(source, e);
}
}
void AddSelectionChangedHandler(ITextEditor textEditor)
{
RemoveSelectionChangedHandler();
this.textEditor = textEditor;
if (textEditor != null) {
this.textEditor.SelectionChanged += TextSelectionChanged;
}
}
void RemoveSelectionChangedHandler()
{
if (textEditor != null) {
textEditor.SelectionChanged -= TextSelectionChanged;
}
}
void RemoveActiveWindowChangedHandler()
{
WorkbenchSingleton.Workbench.ActiveViewContentChanged -= WorkbenchActiveViewContentChanged;
}
/// <summary>
/// When the selected text is changed make sure the 'Current Selection'
/// option is not selected if no text is selected.
/// </summary>
/// <remarks>The text selection can change either when the user
/// selects different text in the editor or the active window is
/// changed.</remarks>
void TextSelectionChanged(object source, EventArgs e)
{
LoggingService.Debug("TextSelectionChanged.");
selection = GetCurrentTextSelection();
}
void InitSelectionSearch()
{
selection = GetCurrentTextSelection();
AddSelectionChangedHandler(SearchManager.GetActiveTextEditor());
WorkbenchSingleton.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged;
}
void RemoveSelectionSearchHandlers()
{
RemoveSelectionChangedHandler();
RemoveActiveWindowChangedHandler();
}
/// <summary>
/// Enables the various find, bookmark and replace buttons
/// depending on whether any find string has been entered. The buttons

Loading…
Cancel
Save