diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorViewContent.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorViewContent.cs index 9fa8c3aeaf..e4401dfb92 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorViewContent.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorViewContent.cs @@ -6,8 +6,10 @@ // using System; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; namespace PythonBinding.Tests.Utils { @@ -27,5 +29,10 @@ namespace PythonBinding.Tests.Utils public TextEditorControl TextEditorControl { get { return textEditor; } } + + public IDocument GetDocumentForFile(OpenedFile file) + { + throw new NotImplementedException(); + } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorViewContent.cs b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorViewContent.cs index 0b4699f30c..08ca2e515b 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorViewContent.cs +++ b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorViewContent.cs @@ -6,9 +6,11 @@ // using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; using System; using System.Collections.Generic; using System.Windows.Forms; @@ -31,6 +33,11 @@ namespace WixBinding.Tests.Utils return null; } } + + public IDocument GetDocumentForFile(OpenedFile file) + { + return null; + } #endregion } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index 9912eb44c1..073753fa25 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -192,13 +192,7 @@ namespace ICSharpCode.FormsDesigner if (formClass.Name != this.formClass.Name) { LoggingService.Info("Renaming form to " + formClass.Name); - Dictionary providedFileDocuments = new Dictionary(); - providedFileDocuments.Add(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileDocument); - if (!this.ViewContent.PrimaryFile.Equals(this.ViewContent.DesignerCodeFile)) { - System.Diagnostics.Debug.Assert(!this.ViewContent.DesignerCodeFileDocument.Equals(this.ViewContent.PrimaryFileDocument)); - providedFileDocuments.Add(this.ViewContent.PrimaryFileName, this.ViewContent.PrimaryFileDocument); - } - ICSharpCode.SharpDevelop.Refactoring.FindReferencesAndRenameHelper.RenameClass(this.formClass, formClass.Name, providedFileDocuments); + ICSharpCode.SharpDevelop.Refactoring.FindReferencesAndRenameHelper.RenameClass(this.formClass, formClass.Name); this.ViewContent.DesignerCodeFile.MakeDirty(); this.ViewContent.PrimaryFile.MakeDirty(); Reparse(); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index 241a8f2691..c841df9f4e 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -27,7 +27,7 @@ using ICSharpCode.TextEditor.Util; namespace ICSharpCode.FormsDesigner { - public class FormsDesignerViewContent : AbstractViewContentHandlingLoadErrors, IClipboardHandler, IUndoHandler, IHasPropertyContainer, IContextHelpProvider, IToolsHost + public class FormsDesignerViewContent : AbstractViewContentHandlingLoadErrors, IClipboardHandler, IUndoHandler, IHasPropertyContainer, IContextHelpProvider, IToolsHost, IFileDocumentProvider { readonly Control pleaseWaitLabel = new Label() {Text=StringParser.Parse("${res:Global.PleaseWait}"), TextAlign=ContentAlignment.MiddleCenter}; DesignSurface designSurface; @@ -93,6 +93,17 @@ namespace ICSharpCode.FormsDesigner get { return this.designerCodeFileEncoding; } } + public IDocument GetDocumentForFile(OpenedFile file) + { + if (file == this.DesignerCodeFile) { + return this.DesignerCodeFileDocument; + } else if (file == this.PrimaryFile) { + return this.PrimaryFileDocument; + } else { + return null; + } + } + public IViewContent PrimaryViewContent { get { return this.primaryViewContent; } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs index 1d29cc6fa5..a46ffbab7b 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs @@ -699,6 +699,16 @@ namespace ICSharpCode.XmlEditor return xmlEditor; } } + + public IDocument GetDocumentForFile(OpenedFile file) + { + if (file == this.PrimaryFile) { + return this.TextEditorControl.Document; + } else { + return null; + } + } + #endregion #region IPositionable interface diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index df1f92ca4a..8d5bf9644d 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -511,6 +511,7 @@ + diff --git a/src/Main/Base/Project/Src/Services/File/FileService.cs b/src/Main/Base/Project/Src/Services/File/FileService.cs index 11a197a288..64c28c0d92 100644 --- a/src/Main/Base/Project/Src/Services/File/FileService.cs +++ b/src/Main/Base/Project/Src/Services/File/FileService.cs @@ -295,6 +295,10 @@ namespace ICSharpCode.SharpDevelop } } + /// + /// Gets a list of the names of the files that are open as primary files + /// in view contents. + /// public static IList GetOpenFiles() { List fileNames = new List(); diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index 5337f2dee1..ca878a1fc3 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -14,9 +14,11 @@ using System.Text; using System.Threading; using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextEditor.Document; using RegistryContentPair = System.Collections.Generic.KeyValuePair; @@ -638,6 +640,14 @@ namespace ICSharpCode.SharpDevelop OpenedFile file = FileService.GetOpenedFile(fileName); if (file != null) { + IFileDocumentProvider p = file.CurrentView as IFileDocumentProvider; + if (p != null) { + IDocument document = p.GetDocumentForFile(file); + if (document != null) { + return document.TextContent; + } + } + using(Stream s = file.OpenRead()) { // load file Encoding encoding = DefaultFileEncoding; diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs b/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs index 63ed5023eb..71c05b13c0 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs @@ -12,7 +12,9 @@ using System.IO; using System.Text; using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.TextEditor.Document; namespace ICSharpCode.SharpDevelop.Project { @@ -83,6 +85,25 @@ namespace ICSharpCode.SharpDevelop.Project // Loading the source files is done asynchronously: // While one file is parsed, the next is already loaded from disk. + // Load file from memory if it is open + OpenedFile file = FileService.GetOpenedFile(fileName); + if (file != null) { + string content; + if (isOnMainThread) { + content = GetFileContentFromFileDocumentProvider(file); + } else { + content = WorkbenchSingleton.SafeThreadFunction(GetFileContentFromFileDocumentProvider, file); + } + if (content != null) { + return content; + } + + using(Stream s = file.OpenRead()) { + Encoding encoding = defaultEncoding; + return ICSharpCode.TextEditor.Util.FileReader.ReadFileContent(s, ref encoding); + } + } + // load file return ICSharpCode.TextEditor.Util.FileReader.ReadFileContent(fileName, defaultEncoding); } @@ -165,5 +186,14 @@ namespace ICSharpCode.SharpDevelop.Project } return null; } + + static string GetFileContentFromFileDocumentProvider(OpenedFile file) + { + IFileDocumentProvider p = file.CurrentView as IFileDocumentProvider; + if (p == null) return null; + IDocument document = p.GetDocumentForFile(file); + if (document == null) return null; + return document.TextContent; + } } } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 4df66c0bae..638b7e66e8 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -131,11 +131,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring } public static void RenameClass(IClass c, string newName) - { - RenameClass(c, newName, null); - } - - public static void RenameClass(IClass c, string newName, IDictionary providedFileDocuments) { c = c.GetCompoundClass(); // get compound class if class is partial @@ -154,7 +149,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } - FindReferencesAndRenameHelper.RenameReferences(list, newName, providedFileDocuments); + FindReferencesAndRenameHelper.RenameReferences(list, newName); } static IList GetClassParts(IClass c) @@ -369,25 +364,36 @@ namespace ICSharpCode.SharpDevelop.Refactoring SearchResultPanel.Instance.ShowSearchResults(new SearchResult(pattern, results)); } - public static void RenameReferences(List list, string newName) - { - RenameReferences(list, newName, null); + sealed class FileView { + public IViewContent ViewContent { get; set; } + public OpenedFile OpenedFile { get; set; } } - public static void RenameReferences(List list, string newName, IDictionary providedFileDocuments) + public static void RenameReferences(List list, string newName) { - Dictionary modifiedDocuments = new Dictionary(); + Dictionary modifiedDocuments = new Dictionary(); List modifications = new List(); foreach (Reference r in list) { - ICSharpCode.TextEditor.Document.IDocument document; - IViewContent viewContent; + ICSharpCode.TextEditor.Document.IDocument document = null; + IViewContent viewContent = null; - if (providedFileDocuments == null || !providedFileDocuments.TryGetValue(FileUtility.NormalizePath(r.FileName), out document)) { + OpenedFile file = FileService.GetOpenedFile(r.FileName); + if (file != null) { + viewContent = file.CurrentView; + IFileDocumentProvider p = viewContent as IFileDocumentProvider; + if (p != null) { + document = p.GetDocumentForFile(file); + } + } + + if (document == null) { viewContent = FileService.OpenFile(r.FileName, false); - ITextEditorControlProvider p = viewContent as ITextEditorControlProvider; - document = (p == null) ? null : p.TextEditorControl.Document; - } else { - viewContent = null; + IFileDocumentProvider p = viewContent as IFileDocumentProvider; + if (p != null) { + file = FileService.GetOpenedFile(r.FileName); + System.Diagnostics.Debug.Assert(file != null, "OpenedFile not found after opening the file."); + document = p.GetDocumentForFile(file); + } } if (document == null) { @@ -396,16 +402,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring } if (!modifiedDocuments.ContainsKey(document)) { - modifiedDocuments.Add(document, viewContent); + modifiedDocuments.Add(document, new FileView() {ViewContent = viewContent, OpenedFile = file}); document.UndoStack.StartUndoGroup(); } ModifyDocument(modifications, document, r.Offset, r.Length, newName); } - foreach (KeyValuePair entry in modifiedDocuments) { + foreach (KeyValuePair entry in modifiedDocuments) { entry.Key.UndoStack.EndUndoGroup(); - if (entry.Value != null) { - ParserService.ParseViewContent(entry.Value); + entry.Value.OpenedFile.MakeDirty(); + if (entry.Value.ViewContent is IEditable) { + ParserService.ParseViewContent(entry.Value.ViewContent); + } else { + ParserService.ParseFile(entry.Value.OpenedFile.FileName, entry.Key.TextContent, !entry.Value.OpenedFile.IsUntitled); } } } diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/IFileDocumentProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/IFileDocumentProvider.cs new file mode 100644 index 0000000000..e97b1ca8a3 --- /dev/null +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/IFileDocumentProvider.cs @@ -0,0 +1,27 @@ +// +// +// +// +// $Revision$ +// + +using System; + +using ICSharpCode.TextEditor.Document; + +namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor +{ + /// + /// Interface for view contents that provide a text editor document + /// for one or more s. + /// + public interface IFileDocumentProvider + { + /// + /// Gets the edited document for the specified file. + /// + /// The to get the document for. + /// The edited document for the specified file, or null if this view does not provide a document for the specified file. + IDocument GetDocumentForFile(OpenedFile file); + } +} diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaControlProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaControlProvider.cs index 93dec18a90..4a664f297b 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaControlProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaControlProvider.cs @@ -10,7 +10,7 @@ using ICSharpCode.TextEditor; namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { - public interface ITextEditorControlProvider + public interface ITextEditorControlProvider : IFileDocumentProvider { TextEditorControl TextEditorControl { get; diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorBasedPad.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorBasedPad.cs index 60d096c51b..7d02a61520 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorBasedPad.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorBasedPad.cs @@ -11,6 +11,7 @@ using System.Windows.Forms; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { @@ -64,6 +65,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor } } + public virtual IDocument GetDocumentForFile(OpenedFile file) + { + return null; + } + PrintDocument IPrintable.PrintDocument { get { return this.TextEditorControl.PrintDocument; diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs index edda2c2d1b..ff8a0e0cca 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs @@ -78,6 +78,15 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor } } + public IDocument GetDocumentForFile(OpenedFile file) + { + if (file == this.PrimaryFile) { + return this.TextEditorControl.Document; + } else { + return null; + } + } + public bool EnableUndo { get { return textEditorControl.EnableUndo;