Browse Source

Improved performance of "Replace all".

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@528 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
c9b90e95f3
  1. 43
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs

43
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs

@ -7,6 +7,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
@ -21,7 +22,7 @@ namespace SearchAndReplace
public class SearchReplaceManager public class SearchReplaceManager
{ {
public static SearchAndReplaceDialog SearchAndReplaceDialog = null; public static SearchAndReplaceDialog SearchAndReplaceDialog = null;
static Search find = new Search(); static Search find = new Search();
static SearchReplaceManager() static SearchReplaceManager()
@ -74,7 +75,7 @@ namespace SearchAndReplace
find.Reset(); find.Reset();
return; return;
} else { } else {
textArea = OpenTextArea(result.FileName); textArea = OpenTextArea(result.FileName);
textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(result.Offset); textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(result.Offset);
int lineNr = textArea.Document.GetLineNumberForOffset(result.Offset); int lineNr = textArea.Document.GetLineNumberForOffset(result.Offset);
@ -89,34 +90,38 @@ namespace SearchAndReplace
public static void ReplaceAll() public static void ReplaceAll()
{ {
SetSearchOptions(); SetSearchOptions();
TextEditorControl textArea = null;
if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) { if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) {
textArea = ((ITextEditorControlProvider)WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent).TextEditorControl; TextEditorControl textArea = ((ITextEditorControlProvider)WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent).TextEditorControl;
textArea.ActiveTextAreaControl.TextArea.SelectionManager.ClearSelection(); textArea.ActiveTextAreaControl.TextArea.SelectionManager.ClearSelection();
} }
find.Reset(); find.Reset();
find.SearchStrategy.CompilePattern(); find.SearchStrategy.CompilePattern();
List<TextEditorControl> textAreas = new List<TextEditorControl>();
while (true) { while (true) {
SearchResult result = SearchReplaceManager.find.FindNext(); SearchResult result = SearchReplaceManager.find.FindNext();
if (result == null) { if (result == null) {
foreach (TextEditorControl textArea in textAreas) {
textArea.EndUpdate();
textArea.Refresh();
}
MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.ReplaceAllDone}", "${res:Global.FinishedCaptionText}"); MessageService.ShowMessage("${res:ICSharpCode.TextEditor.Document.SearchReplaceManager.ReplaceAllDone}", "${res:Global.FinishedCaptionText}");
find.Reset(); find.Reset();
return; return;
} else { } else {
textArea = OpenTextArea(result.FileName); TextEditorControl textArea = OpenTextArea(result.FileName);
textArea.BeginUpdate(); if (!textAreas.Contains(textArea)) {
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear(); textArea.BeginUpdate();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear();
textAreas.Add(textArea);
}
string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern); string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern);
find.Replace(result.Offset, find.Replace(result.Offset,
result.Length, result.Length,
transformedPattern); transformedPattern);
textArea.EndUpdate();
textArea.Refresh();
} }
} }
} }
@ -125,27 +130,27 @@ namespace SearchAndReplace
public static void FindNext() public static void FindNext()
{ {
SetSearchOptions(); SetSearchOptions();
if (find == null || if (find == null ||
SearchOptions.FindPattern == null || SearchOptions.FindPattern == null ||
SearchOptions.FindPattern.Length == 0) { SearchOptions.FindPattern.Length == 0) {
return; return;
} }
find.SearchStrategy.CompilePattern(); find.SearchStrategy.CompilePattern();
SearchResult result = find.FindNext(); SearchResult result = find.FindNext();
if (result == null) { if (result == null) {
MessageBox.Show((Form)WorkbenchSingleton.Workbench, MessageBox.Show((Form)WorkbenchSingleton.Workbench,
ResourceService.GetString("Dialog.NewProject.SearchReplace.SearchStringNotFound"), ResourceService.GetString("Dialog.NewProject.SearchReplace.SearchStringNotFound"),
"Not Found", "Not Found",
MessageBoxButtons.OK, MessageBoxButtons.OK,
MessageBoxIcon.Information); MessageBoxIcon.Information);
find.Reset(); find.Reset();
} else { } else {
TextEditorControl textArea = OpenTextArea(result.FileName); TextEditorControl textArea = OpenTextArea(result.FileName);
if (lastResult != null && lastResult.FileName == result.FileName && if (lastResult != null && lastResult.FileName == result.FileName &&
textArea.ActiveTextAreaControl.Caret.Offset != lastResult.Offset + lastResult.Length) { textArea.ActiveTextAreaControl.Caret.Offset != lastResult.Offset + lastResult.Length) {
find.Reset(); find.Reset();
} }
int startPos = Math.Min(textArea.Document.TextLength, Math.Max(0, result.Offset)); int startPos = Math.Min(textArea.Document.TextLength, Math.Max(0, result.Offset));
@ -161,7 +166,7 @@ namespace SearchAndReplace
lastResult = result; lastResult = result;
} }
static TextEditorControl OpenTextArea(string fileName) static TextEditorControl OpenTextArea(string fileName)
{ {
if (fileName != null) { if (fileName != null) {
return ((ITextEditorControlProvider)FileService.OpenFile(fileName).ViewContent).TextEditorControl; return ((ITextEditorControlProvider)FileService.OpenFile(fileName).ViewContent).TextEditorControl;

Loading…
Cancel
Save