Browse Source

SD2-718 - Search finding a match in a resx file causing an invalid cast exception when trying to convert the resource editor to an ITextEditorControlProvider. Resource files are now excluded from searches. Excluded file extensions defined in ICSharpCode.SharpDevelop.addin. SearchReplaceManager now handles the situation where a view cannot be converted to an ITextEditorControlProvider.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1240 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 20 years ago
parent
commit
b132233e3e
  1. 7
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 7
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/DirectoryDocumentIterator.cs
  3. 4
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/WholeProjectDocumentIterator.cs
  4. 4
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/WholeSolutionDocumentIterator.cs
  5. 35
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs
  6. 24
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceUtilities.cs

7
AddIns/ICSharpCode.SharpDevelop.addin

@ -1567,6 +1567,13 @@
<Class id ="XmlFormatter" class = "ICSharpCode.SharpDevelop.DefaultEditor.XmlFormattingStrategy"/> <Class id ="XmlFormatter" class = "ICSharpCode.SharpDevelop.DefaultEditor.XmlFormattingStrategy"/>
</Path> </Path>
<!-- File extensions that should not be searched since they are not opened
in a text editor -->
<Path name="/AddIns/DefaultTextEditor/Search/ExcludedFileExtensions">
<String text=".resx"/>
<String text=".resources"/>
</Path>
<Path name = "/SharpDevelop/Workbench/DisplayBindings"> <Path name = "/SharpDevelop/Workbench/DisplayBindings">
<DisplayBinding id = "Text" <DisplayBinding id = "Text"
insertafter = "Browser" insertafter = "Browser"

7
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/DirectoryDocumentIterator.cs

@ -52,15 +52,16 @@ namespace SearchAndReplace
if (curIndex < 0 || curIndex >= files.Count) { if (curIndex < 0 || curIndex >= files.Count) {
return null; return null;
} }
if (!File.Exists(files[curIndex].ToString())) { string fileName = files[curIndex].ToString();
if (!File.Exists(fileName) || !SearchReplaceUtilities.IsSearchable(fileName)) {
++curIndex; ++curIndex;
return Current; return Current;
} }
IDocument document; IDocument document;
string fileName = files[curIndex].ToString();
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
if (content.FileName != null && if (content.FileName != null &&
FileUtility.IsEqualFileName(content.FileName, fileName)) { FileUtility.IsEqualFileName(content.FileName, fileName) &&
content is ITextEditorControlProvider) {
document = ((ITextEditorControlProvider)content).TextEditorControl.Document; document = ((ITextEditorControlProvider)content).TextEditorControl.Document;
return new ProvidedDocumentInformation(document, return new ProvidedDocumentInformation(document,
fileName, fileName,

4
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/WholeProjectDocumentIterator.cs

@ -52,7 +52,7 @@ namespace SearchAndReplace
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
if (content.FileName != null && if (content.FileName != null &&
FileUtility.IsEqualFileName(content.FileName, fileName) && FileUtility.IsEqualFileName(content.FileName, fileName) &&
content is ITextEditorControlProvider ) content is ITextEditorControlProvider)
{ {
document = (((ITextEditorControlProvider)content).TextEditorControl).Document; document = (((ITextEditorControlProvider)content).TextEditorControl).Document;
return new ProvidedDocumentInformation(document, return new ProvidedDocumentInformation(document,
@ -91,7 +91,7 @@ namespace SearchAndReplace
files.Clear(); files.Clear();
if (ProjectService.CurrentProject != null) { if (ProjectService.CurrentProject != null) {
foreach (ProjectItem item in ProjectService.CurrentProject.Items) { foreach (ProjectItem item in ProjectService.CurrentProject.Items) {
if (item is FileProjectItem) { if (item is FileProjectItem && SearchReplaceUtilities.IsSearchable(item.FileName)) {
files.Add(item.FileName); files.Add(item.FileName);
} }
} }

4
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/DocumentIterator/WholeSolutionDocumentIterator.cs

@ -52,7 +52,7 @@ namespace SearchAndReplace
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
if (content.FileName != null && if (content.FileName != null &&
FileUtility.IsEqualFileName(content.FileName, fileName) && FileUtility.IsEqualFileName(content.FileName, fileName) &&
content is ITextEditorControlProvider ) content is ITextEditorControlProvider)
{ {
document = (((ITextEditorControlProvider)content).TextEditorControl).Document; document = (((ITextEditorControlProvider)content).TextEditorControl).Document;
return new ProvidedDocumentInformation(document, return new ProvidedDocumentInformation(document,
@ -92,7 +92,7 @@ namespace SearchAndReplace
if (ProjectService.OpenSolution != null) { if (ProjectService.OpenSolution != null) {
foreach (IProject project in ProjectService.OpenSolution.Projects) { foreach (IProject project in ProjectService.OpenSolution.Projects) {
foreach (ProjectItem item in project.Items) { foreach (ProjectItem item in project.Items) {
if (item is FileProjectItem) { if (item is FileProjectItem && SearchReplaceUtilities.IsSearchable(item.FileName)) {
files.Add(item.FileName); files.Add(item.FileName);
} }
} }

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

@ -87,13 +87,16 @@ namespace SearchAndReplace
return; return;
} else { } else {
textArea = OpenTextArea(result.FileName); textArea = OpenTextArea(result.FileName);
if (textArea != null) {
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);
if (!textArea.Document.BookmarkManager.IsMarked(lineNr)) { if (!textArea.Document.BookmarkManager.IsMarked(lineNr)) {
textArea.Document.BookmarkManager.ToggleMarkAt(lineNr); textArea.Document.BookmarkManager.ToggleMarkAt(lineNr);
} }
} else {
count--;
}
} }
} }
} }
@ -129,7 +132,7 @@ namespace SearchAndReplace
return; return;
} else { } else {
TextEditorControl textArea = OpenTextArea(result.FileName); TextEditorControl textArea = OpenTextArea(result.FileName);
if (textArea != null) {
if (!textAreas.Contains(textArea)) { if (!textAreas.Contains(textArea)) {
textArea.BeginUpdate(); textArea.BeginUpdate();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear(); textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear();
@ -141,6 +144,9 @@ namespace SearchAndReplace
if (find.CurrentDocumentInformation.Document == null) { if (find.CurrentDocumentInformation.Document == null) {
textArea.Document.Replace(result.Offset, result.Length, transformedPattern); textArea.Document.Replace(result.Offset, result.Length, transformedPattern);
} }
} else {
count--;
}
} }
} }
} }
@ -160,14 +166,18 @@ namespace SearchAndReplace
lastResult = null; lastResult = null;
return; return;
} }
SearchResult result = find.FindNext();
TextEditorControl textArea = null;;
while (textArea == null) {
SearchResult result = find.FindNext();
if (result == null) { if (result == null) {
ShowNotFoundMessage(); ShowNotFoundMessage();
find.Reset(); find.Reset();
lastResult = null;
return;
} else { } else {
TextEditorControl textArea = OpenTextArea(result.FileName); textArea = OpenTextArea(result.FileName);
if (textArea != null) {
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();
@ -180,10 +190,11 @@ namespace SearchAndReplace
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, textArea.Document.OffsetToPosition(startPos), textArea.ActiveTextAreaControl.TextArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, textArea.Document.OffsetToPosition(startPos),
textArea.Document.OffsetToPosition(endPos))); textArea.Document.OffsetToPosition(endPos)));
textArea.Refresh(); textArea.Refresh();
}
lastResult = result; lastResult = result;
} }
}
}
}
static void ShowNotFoundMessage() static void ShowNotFoundMessage()
{ {
@ -196,11 +207,17 @@ namespace SearchAndReplace
static TextEditorControl OpenTextArea(string fileName) static TextEditorControl OpenTextArea(string fileName)
{ {
ITextEditorControlProvider textEditorProvider = null;
if (fileName != null) { if (fileName != null) {
return ((ITextEditorControlProvider)FileService.OpenFile(fileName).ViewContent).TextEditorControl; textEditorProvider = FileService.OpenFile(fileName).ViewContent as ITextEditorControlProvider;
} else {
textEditorProvider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent as ITextEditorControlProvider;
} }
return ((ITextEditorControlProvider)WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent).TextEditorControl; if (textEditorProvider != null) {
return textEditorProvider.TextEditorControl;
}
return null;
} }
} }
} }

24
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceUtilities.cs

@ -7,7 +7,9 @@
using System; using System;
using System.Collections; using System.Collections;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.TextEditor; using ICSharpCode.TextEditor;
@ -52,7 +54,6 @@ namespace SearchAndReplace
} }
} }
public static IDocumentIterator CreateDocumentIterator(DocumentIteratorType type) public static IDocumentIterator CreateDocumentIterator(DocumentIteratorType type)
{ {
switch (type) { switch (type) {
@ -73,5 +74,26 @@ namespace SearchAndReplace
throw new System.NotImplementedException("CreateDocumentIterator for type " + type); throw new System.NotImplementedException("CreateDocumentIterator for type " + type);
} }
} }
static ArrayList excludedFileExtensions;
public static bool IsSearchable(string fileName)
{
if (fileName == null)
return false;
if (excludedFileExtensions == null) {
excludedFileExtensions = AddInTree.BuildItems("/AddIns/DefaultTextEditor/Search/ExcludedFileExtensions", null, false);
}
string extension = Path.GetExtension(fileName);
if (extension != null) {
foreach (string excludedExtension in excludedFileExtensions) {
if (String.Compare(excludedExtension, extension, true) == 0) {
return false;
}
}
}
return true;
}
} }
} }

Loading…
Cancel
Save