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. 95
      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 @@ @@ -1567,6 +1567,13 @@
<Class id ="XmlFormatter" class = "ICSharpCode.SharpDevelop.DefaultEditor.XmlFormattingStrategy"/>
</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">
<DisplayBinding id = "Text"
insertafter = "Browser"

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

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

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

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

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

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

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

@ -87,12 +87,15 @@ namespace SearchAndReplace @@ -87,12 +87,15 @@ namespace SearchAndReplace
return;
} else {
textArea = OpenTextArea(result.FileName);
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);
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--;
}
}
}
@ -129,17 +132,20 @@ namespace SearchAndReplace @@ -129,17 +132,20 @@ namespace SearchAndReplace
return;
} else {
TextEditorControl textArea = OpenTextArea(result.FileName);
if (!textAreas.Contains(textArea)) {
textArea.BeginUpdate();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear();
textAreas.Add(textArea);
}
string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern);
find.Replace(result.Offset, result.Length, transformedPattern);
if (find.CurrentDocumentInformation.Document == null) {
textArea.Document.Replace(result.Offset, result.Length, transformedPattern);
if (textArea != null) {
if (!textAreas.Contains(textArea)) {
textArea.BeginUpdate();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear();
textAreas.Add(textArea);
}
string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern);
find.Replace(result.Offset, result.Length, transformedPattern);
if (find.CurrentDocumentInformation.Document == null) {
textArea.Document.Replace(result.Offset, result.Length, transformedPattern);
}
} else {
count--;
}
}
}
@ -160,29 +166,34 @@ namespace SearchAndReplace @@ -160,29 +166,34 @@ namespace SearchAndReplace
lastResult = null;
return;
}
SearchResult result = find.FindNext();
if (result == null) {
ShowNotFoundMessage();
find.Reset();
} else {
TextEditorControl textArea = OpenTextArea(result.FileName);
if (lastResult != null && lastResult.FileName == result.FileName &&
textArea.ActiveTextAreaControl.Caret.Offset != lastResult.Offset + lastResult.Length) {
TextEditorControl textArea = null;;
while (textArea == null) {
SearchResult result = find.FindNext();
if (result == null) {
ShowNotFoundMessage();
find.Reset();
lastResult = null;
return;
} else {
textArea = OpenTextArea(result.FileName);
if (textArea != null) {
if (lastResult != null && lastResult.FileName == result.FileName &&
textArea.ActiveTextAreaControl.Caret.Offset != lastResult.Offset + lastResult.Length) {
find.Reset();
}
int startPos = Math.Min(textArea.Document.TextLength, Math.Max(0, result.Offset));
int endPos = Math.Min(textArea.Document.TextLength, startPos + result.Length);
textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(endPos);
textArea.ActiveTextAreaControl.TextArea.SelectionManager.ClearSelection();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, textArea.Document.OffsetToPosition(startPos),
textArea.Document.OffsetToPosition(endPos)));
textArea.Refresh();
lastResult = result;
}
}
int startPos = Math.Min(textArea.Document.TextLength, Math.Max(0, result.Offset));
int endPos = Math.Min(textArea.Document.TextLength, startPos + result.Length);
textArea.ActiveTextAreaControl.Caret.Position = textArea.Document.OffsetToPosition(endPos);
textArea.ActiveTextAreaControl.TextArea.SelectionManager.ClearSelection();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, textArea.Document.OffsetToPosition(startPos),
textArea.Document.OffsetToPosition(endPos)));
textArea.Refresh();
}
lastResult = result;
}
static void ShowNotFoundMessage()
@ -196,11 +207,17 @@ namespace SearchAndReplace @@ -196,11 +207,17 @@ namespace SearchAndReplace
static TextEditorControl OpenTextArea(string fileName)
{
ITextEditorControlProvider textEditorProvider = 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 @@ @@ -7,7 +7,9 @@
using System;
using System.Collections;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.TextEditor;
@ -52,7 +54,6 @@ namespace SearchAndReplace @@ -52,7 +54,6 @@ namespace SearchAndReplace
}
}
public static IDocumentIterator CreateDocumentIterator(DocumentIteratorType type)
{
switch (type) {
@ -73,5 +74,26 @@ namespace SearchAndReplace @@ -73,5 +74,26 @@ namespace SearchAndReplace
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