Browse Source

Fixed SD2-746: Bookmark all button on search dialog does nothing

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1267 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
b69a14156d
  1. 2
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 2
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs
  3. 2
      src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs
  4. 2
      src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs
  5. 8
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs
  6. 67
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs
  7. 129
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs
  8. 58
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs
  9. 12
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Pad/SearchResultPanelToolbarCommands.cs

2
AddIns/ICSharpCode.SharpDevelop.addin

@ -1736,7 +1736,7 @@ @@ -1736,7 +1736,7 @@
<MenuItem id = "ClearBookmarks"
label = "${res:XML.MainMenu.SearchMenu.ClrBookmark}"
icon = "Bookmarks.ClearAll"
class = "ICSharpCode.SharpDevelop.Bookmarks.EnableDisableAll"/>
class = "ICSharpCode.SharpDevelop.Bookmarks.ClearBookmarks"/>
<MenuItem id = "Separator2" type = "Separator" />
<MenuItem id = "GotoLineNr"
label = "${res:XML.MainMenu.SearchMenu.GotoLineNr}"

2
src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

@ -143,7 +143,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -143,7 +143,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
res.ProvidedDocumentInformation = GetDocumentInformation(r.FileName);
results.Add(res);
}
SearchReplaceInFilesManager.ShowSearchResults(pattern, results);
SearchInFilesManager.ShowSearchResults(pattern, results);
}
public static void RenameReferences(List<Reference> list, string newName)

2
src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs

@ -212,7 +212,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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)

2
src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

@ -216,7 +216,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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)

8
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Commands/SearchMainMenuCommands.cs

@ -33,9 +33,11 @@ namespace SearchAndReplace @@ -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;
}
}
}

67
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceInFilesManager.cs

@ -20,7 +20,7 @@ using ICSharpCode.TextEditor.Document; @@ -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 @@ -33,7 +33,7 @@ namespace SearchAndReplace
}
}
static SearchReplaceInFilesManager()
static SearchInFilesManager()
{
find.TextIteratorBuilder = new ForwardTextIteratorBuilder();
}
@ -63,7 +63,7 @@ namespace SearchAndReplace @@ -63,7 +63,7 @@ namespace SearchAndReplace
public static void ShowSearchResults(string pattern, List<SearchResult> results)
{
SearchAndReplace.SearchAllFinishedEventArgs e =
SearchAndReplace.SearchAllFinishedEventArgs e =
new SearchAllFinishedEventArgs(pattern, results);
OnSearchAllFinished(e);
@ -76,61 +76,6 @@ namespace SearchAndReplace @@ -76,61 +76,6 @@ namespace SearchAndReplace
}
}
public static void ReplaceAll()
{
if (!InitializeSearchInFiles()) {
return;
}
List<SearchResult> results = new List<SearchResult>();
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<SearchResult> results = new List<SearchResult>();
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 @@ -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 @@ -164,7 +109,7 @@ namespace SearchAndReplace
}
FinishSearchInFiles(results);
}
static void OnSearchAllFinished(SearchAllFinishedEventArgs e)
{
lastSearches.Insert(0, e);
@ -172,7 +117,7 @@ namespace SearchAndReplace @@ -172,7 +117,7 @@ namespace SearchAndReplace
SearchAllFinished(null, e);
}
}
public static event SearchAllFinishedEventHandler SearchAllFinished;
}
}

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

@ -110,31 +110,81 @@ namespace SearchAndReplace @@ -110,31 +110,81 @@ namespace SearchAndReplace
find.Reset();
if (!find.SearchStrategy.CompilePattern())
return;
for (int count = 0;; count++) {
List<TextEditorControl> textAreas = new List<TextEditorControl>();
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<TextEditorControl> textAreas = new List<TextEditorControl>();
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<TextEditorControl> 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 @@ -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 @@ -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 @@ -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 @@ -299,10 +376,10 @@ namespace SearchAndReplace
} else {
textEditorProvider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent as ITextEditorControlProvider;
}
if (textEditorProvider != null) {
return textEditorProvider.TextEditorControl;
}
}
return null;
}
}

58
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs

@ -41,6 +41,7 @@ namespace SearchAndReplace @@ -41,6 +41,7 @@ namespace SearchAndReplace
case SearchAndReplaceMode.Search:
SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.FindPanel.xfrm"));
Get<Button>("findAll").Click += FindAllButtonClicked;
Get<Button>("bookmarkAll").Click += BookmarkAllButtonClicked;
break;
case SearchAndReplaceMode.Replace:
SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.ReplacePanel.xfrm"));
@ -103,10 +104,22 @@ namespace SearchAndReplace @@ -103,10 +104,22 @@ namespace SearchAndReplace
WritebackOptions();
if (IsSelectionSearch) {
if (IsTextSelected(selection)) {
FindAllInSelection();
RunAllInSelection(0);
}
} else {
SearchReplaceInFilesManager.FindAll();
SearchInFilesManager.FindAll();
}
}
void BookmarkAllButtonClicked(object sender, EventArgs e)
{
WritebackOptions();
if (IsSelectionSearch) {
if (IsTextSelected(selection)) {
RunAllInSelection(1);
}
} else {
SearchReplaceManager.MarkAll();
}
}
@ -115,7 +128,7 @@ namespace SearchAndReplace @@ -115,7 +128,7 @@ namespace SearchAndReplace
WritebackOptions();
if (IsSelectionSearch) {
if (IsTextSelected(selection)) {
ReplaceAllInSelection();
RunAllInSelection(2);
}
} else {
SearchReplaceManager.ReplaceAll();
@ -251,7 +264,7 @@ namespace SearchAndReplace @@ -251,7 +264,7 @@ namespace SearchAndReplace
/// <summary>
/// Checks whether the selection spans two or more lines.
/// </summary>
/// <remarks>Maybe the ISelection interface should have an
/// <remarks>Maybe the ISelection interface should have an
/// IsMultipleLine method?</remarks>
static bool IsMultipleLineSelection(ISelection selection)
{
@ -270,7 +283,7 @@ namespace SearchAndReplace @@ -270,7 +283,7 @@ namespace SearchAndReplace
}
void FindNextInSelection()
{
{
int startOffset = Math.Min(selection.Offset, selection.EndOffset);
int endOffset = Math.Max(selection.Offset, selection.EndOffset);
@ -292,7 +305,7 @@ namespace SearchAndReplace @@ -292,7 +305,7 @@ namespace SearchAndReplace
} finally {
ignoreSelectionChanges = false;
}
}
}
/// <summary>
/// Returns the first ISelection object from the currently active text editor
@ -342,9 +355,9 @@ namespace SearchAndReplace @@ -342,9 +355,9 @@ namespace SearchAndReplace
/// <summary>
/// When the selected text is changed make sure the 'Current Selection'
/// option is not selected if no text is selected.
/// option is not selected if no text is selected.
/// </summary>
/// <remarks>The text selection can change either when the user
/// <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)
@ -375,7 +388,10 @@ namespace SearchAndReplace @@ -375,7 +388,10 @@ namespace SearchAndReplace
RemoveActiveWindowChangedHandler();
}
void FindAllInSelection()
/// <summary>
/// action: 0 = find, 1 = mark, 2 = replace
/// </summary>
void RunAllInSelection(int action)
{
int startOffset = Math.Min(selection.Offset, selection.EndOffset);
int endOffset = Math.Max(selection.Offset, selection.EndOffset);
@ -385,24 +401,12 @@ namespace SearchAndReplace @@ -385,24 +401,12 @@ namespace SearchAndReplace
try {
ignoreSelectionChanges = true;
SearchReplaceInFilesManager.FindAll(startOffset, endOffset - startOffset);
SearchReplaceUtilities.SelectText(textEditor, startOffset, endOffset);
} finally {
ignoreSelectionChanges = false;
}
}
void ReplaceAllInSelection()
{
int startOffset = Math.Min(selection.Offset, selection.EndOffset);
int endOffset = Math.Max(selection.Offset, selection.EndOffset);
SearchReplaceUtilities.SelectText(textEditor, startOffset, endOffset);
SetCaretPosition(textEditor.ActiveTextAreaControl.TextArea, startOffset);
try {
ignoreSelectionChanges = true;
SearchReplaceInFilesManager.ReplaceAll(startOffset, endOffset - startOffset);
if (action == 0)
SearchInFilesManager.FindAll(startOffset, endOffset - startOffset);
else if (action == 1)
SearchReplaceManager.MarkAll(startOffset, endOffset - startOffset);
else if (action == 2)
SearchReplaceManager.ReplaceAll(startOffset, endOffset - startOffset);
SearchReplaceUtilities.SelectText(textEditor, startOffset, endOffset);
} finally {
ignoreSelectionChanges = false;

12
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Pad/SearchResultPanelToolbarCommands.cs

@ -44,7 +44,7 @@ namespace SearchAndReplace @@ -44,7 +44,7 @@ namespace SearchAndReplace
public override bool IsEnabled {
get {
return SearchReplaceInFilesManager.LastSearches.Count > 0;
return SearchInFilesManager.LastSearches.Count > 0;
}
}
@ -57,8 +57,8 @@ namespace SearchAndReplace @@ -57,8 +57,8 @@ namespace SearchAndReplace
SearchAllFinishedEventArgs args = (SearchAllFinishedEventArgs)((ToolStripItem)sender).Tag;
// "bubble" this saved search to the top of the list
SearchReplaceInFilesManager.LastSearches.Remove(args);
SearchReplaceInFilesManager.LastSearches.Insert(0, args);
SearchInFilesManager.LastSearches.Remove(args);
SearchInFilesManager.LastSearches.Insert(0, args);
UpdateLastSearches(null, args);
PadDescriptor searchResultPanel = WorkbenchSingleton.Workbench.GetPad(typeof(SearchResultPanel));
@ -73,14 +73,14 @@ namespace SearchAndReplace @@ -73,14 +73,14 @@ namespace SearchAndReplace
void ClearHistory(object sender, EventArgs e)
{
SearchResultPanel.Instance.Clear();
SearchReplaceInFilesManager.LastSearches.Clear();
SearchInFilesManager.LastSearches.Clear();
UpdateLastSearches(null, null);
}
void UpdateLastSearches(object sender, SearchAllFinishedEventArgs e)
{
dropDownButton.DropDownItems.Clear();
foreach (SearchAllFinishedEventArgs args in SearchReplaceInFilesManager.LastSearches) {
foreach (SearchAllFinishedEventArgs args in SearchInFilesManager.LastSearches) {
ToolStripItem newItem = new ToolStripMenuItem();
newItem.Text = StringParser.Parse("${res:MainWindow.Windows.SearchResultPanel.OccurrencesOf}",
new string[,] {{ "Pattern", args.Pattern }})
@ -102,7 +102,7 @@ namespace SearchAndReplace @@ -102,7 +102,7 @@ namespace SearchAndReplace
base.OnOwnerChanged(e);
dropDownButton = (ToolBarDropDownButton)Owner;
SearchReplaceInFilesManager.SearchAllFinished += new SearchAllFinishedEventHandler(UpdateLastSearches);
SearchInFilesManager.SearchAllFinished += new SearchAllFinishedEventHandler(UpdateLastSearches);
UpdateLastSearches(null, null);
}
}

Loading…
Cancel
Save