diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 24cfe7ae45..9cc22a678d 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1736,7 +1736,7 @@ + class = "ICSharpCode.SharpDevelop.Bookmarks.ClearBookmarks"/> list, string newName) diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs index 81da538a7a..f40928769c 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs @@ -212,7 +212,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands res.ProvidedDocumentInformation = FindReferencesAndRenameHelper.GetDocumentInformation(derivedClass.CompilationUnit.FileName); results.Add(res); } - SearchReplaceInFilesManager.ShowSearchResults("Classes deriving from " + c.Name, results); + SearchInFilesManager.ShowSearchResults("Classes deriving from " + c.Name, results); } void FindReferences(object sender, EventArgs e) diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs index 4273ee13d1..e4fb0890eb 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs @@ -216,7 +216,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands results.Add(res); } } - SearchReplaceInFilesManager.ShowSearchResults("Overrides of " + member.Name, results); + SearchInFilesManager.ShowSearchResults("Overrides of " + member.Name, results); } void FindReferences(object sender, EventArgs e) diff --git a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs index 60ebb429d5..fa39e25058 100644 --- a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs +++ b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs @@ -33,9 +33,11 @@ namespace SearchAndReplace { // Get Highlighted value and set it to FindDialog.searchPattern TextEditorControl textArea = SearchReplaceUtilities.GetActiveTextEditor(); - string selectedText = textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectedText; - if (selectedText != null && selectedText.Length > 0 && !IsMultipleLines(selectedText)) { - SearchOptions.CurrentFindPattern = selectedText; + if (textArea != null) { + string selectedText = textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectedText; + if (selectedText != null && selectedText.Length > 0 && !IsMultipleLines(selectedText)) { + SearchOptions.CurrentFindPattern = selectedText; + } } } diff --git a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs index 02d690e4db..7b77c0e71b 100644 --- a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs +++ b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs @@ -20,7 +20,7 @@ using ICSharpCode.TextEditor.Document; namespace SearchAndReplace { - public static class SearchReplaceInFilesManager + public static class SearchInFilesManager { static Search find = new Search(); @@ -33,7 +33,7 @@ namespace SearchAndReplace } } - static SearchReplaceInFilesManager() + static SearchInFilesManager() { find.TextIteratorBuilder = new ForwardTextIteratorBuilder(); } @@ -63,7 +63,7 @@ namespace SearchAndReplace public static void ShowSearchResults(string pattern, List results) { - SearchAndReplace.SearchAllFinishedEventArgs e = + SearchAndReplace.SearchAllFinishedEventArgs e = new SearchAllFinishedEventArgs(pattern, results); OnSearchAllFinished(e); @@ -76,61 +76,6 @@ namespace SearchAndReplace } } - public static void ReplaceAll() - { - if (!InitializeSearchInFiles()) { - return; - } - - List results = new List(); - - while (true) { - SearchResult result = find.FindNext(); - if (result == null) { - break; - } - - find.Replace(result.Offset, - result.Length, - result.TransformReplacePattern(SearchOptions.ReplacePattern)); - - results.Add(result); - } - - FinishSearchInFiles(results); - } - - public static void ReplaceAll(int offset, int length) - { - if (!InitializeSearchInFiles()) { - return; - } - - List results = new List(); - - while (true) { - SearchResult result = find.FindNext(offset, length); - if (result == null) { - break; - } - - string replacement = result.TransformReplacePattern(SearchOptions.ReplacePattern); - find.Replace(result.Offset, - result.Length, - replacement); - length -= result.Length - replacement.Length; - - // HACK - Move the cursor to the correct offset - the caret gets - // moved before the replace range if we replace a string with a - // single character. The ProvidedDocInfo.Replace method assumes that - // the current offset is at the end of the found text which it is not. - find.CurrentDocumentInformation.CurrentOffset = result.Offset + replacement.Length - 1; - results.Add(result); - } - - FinishSearchInFiles(results); - } - public static void FindAll() { if (!InitializeSearchInFiles()) { @@ -148,7 +93,7 @@ namespace SearchAndReplace FinishSearchInFiles(results); } - public static void FindAll(int offset, int length) + public static void FindAll(int offset, int length) { if (!InitializeSearchInFiles()) { return; @@ -164,7 +109,7 @@ namespace SearchAndReplace } FinishSearchInFiles(results); } - + static void OnSearchAllFinished(SearchAllFinishedEventArgs e) { lastSearches.Insert(0, e); @@ -172,7 +117,7 @@ namespace SearchAndReplace SearchAllFinished(null, e); } } - + public static event SearchAllFinishedEventHandler SearchAllFinished; } } diff --git a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs index 7ebcd66562..9aa2a76a23 100644 --- a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs +++ b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs @@ -110,31 +110,81 @@ namespace SearchAndReplace find.Reset(); if (!find.SearchStrategy.CompilePattern()) return; - for (int count = 0;; count++) { + List textAreas = new List(); + int count; + for (count = 0;; count++) { SearchResult result = SearchReplaceManager.find.FindNext(); if (result == null) { - if (count == 0) { - ShowNotFoundMessage(); - } else { - MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.MarkAllDone}", "${res:Global.FinishedCaptionText}"); - } - find.Reset(); - return; + break; } else { - textArea = OpenTextArea(result.FileName); - if (textArea != null) { - textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(result.Offset); - int lineNr = textArea.Document.GetLineNumberForOffset(result.Offset); - - if (!textArea.Document.BookmarkManager.IsMarked(lineNr)) { - textArea.Document.BookmarkManager.ToggleMarkAt(lineNr); - } - } else { - count--; - } + MarkResult(textAreas, result); + } + } + find.Reset(); + foreach (TextEditorControl ctl in textAreas) { + ctl.Refresh(); + } + ShowMarkDoneMessage(count); + } + + public static void MarkAll(int offset, int length) + { + SetSearchOptions(); + find.Reset(); + + if (!find.SearchStrategy.CompilePattern()) + return; + + List textAreas = new List(); + int count; + for (count = 0;; count++) { + SearchResult result = find.FindNext(offset, length); + if (result == null) { + break; + } else { + MarkResult(textAreas, result); } } + find.Reset(); + foreach (TextEditorControl ctl in textAreas) { + ctl.Refresh(); + } + ShowMarkDoneMessage(count); + } + + static void MarkResult(List textAreas, SearchResult result) + { + TextEditorControl textArea = OpenTextArea(result.FileName); + if (textArea != null) { + if (!textAreas.Contains(textArea)) { + textAreas.Add(textArea); + } + textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(result.Offset); + int lineNr = textArea.Document.GetLineNumberForOffset(result.Offset); + + if (!textArea.Document.BookmarkManager.IsMarked(lineNr)) { + textArea.Document.BookmarkManager.ToggleMarkAt(lineNr); + } + } + } + + static void ShowMarkDoneMessage(int count) + { + if (count == 0) { + ShowNotFoundMessage(); + } else { + MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.MarkAllDone}", "${res:Global.FinishedCaptionText}"); + } + } + + static void ShowReplaceDoneMessage(int count) + { + if (count == 0) { + ShowNotFoundMessage(); + } else { + MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.ReplaceAllDone}", "${res:Global.FinishedCaptionText}"); + } } public static void ReplaceAll() @@ -155,15 +205,13 @@ namespace SearchAndReplace SearchResult result = SearchReplaceManager.find.FindNext(); if (result == null) { - if (count == 0) { - ShowNotFoundMessage(); - } else { + if (count != 0) { foreach (TextEditorControl textArea in textAreas) { textArea.EndUpdate(); textArea.Refresh(); } - MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.ReplaceAllDone}", "${res:Global.FinishedCaptionText}"); } + ShowReplaceDoneMessage(count); find.Reset(); return; } else { @@ -187,6 +235,35 @@ namespace SearchAndReplace } } + public static void ReplaceAll(int offset, int length) + { + SetSearchOptions(); + find.Reset(); + + if (!find.SearchStrategy.CompilePattern()) + return; + + for (int count = 0;; count++) { + SearchResult result = find.FindNext(offset, length); + if (result == null) { + ShowReplaceDoneMessage(count); + return; + } + + string replacement = result.TransformReplacePattern(SearchOptions.ReplacePattern); + find.Replace(result.Offset, + result.Length, + replacement); + length -= result.Length - replacement.Length; + + // HACK - Move the cursor to the correct offset - the caret gets + // moved before the replace range if we replace a string with a + // single character. The ProvidedDocInfo.Replace method assumes that + // the current offset is at the end of the found text which it is not. + find.CurrentDocumentInformation.CurrentOffset = result.Offset + replacement.Length - 1; + } + } + static SearchResult lastResult = null; public static void FindNext() { @@ -253,7 +330,7 @@ namespace SearchAndReplace } public static bool FindNextInSelection() - { + { TextEditorControl textArea = null; while (textArea == null) { SearchResult result = find.FindNext(textSelection.Offset, textSelection.Length); @@ -299,10 +376,10 @@ namespace SearchAndReplace } else { textEditorProvider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent as ITextEditorControlProvider; } - + if (textEditorProvider != null) { return textEditorProvider.TextEditorControl; - } + } return null; } } diff --git a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs index f157c219a8..45afaa9560 100644 --- a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs +++ b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs @@ -41,6 +41,7 @@ namespace SearchAndReplace case SearchAndReplaceMode.Search: SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.FindPanel.xfrm")); Get