diff --git a/src/AddIns/BackendBindings/FSharpBinding/FSharpInteractive.cs b/src/AddIns/BackendBindings/FSharpBinding/FSharpInteractive.cs index 7d22ad4a4d..e6346bb2ad 100644 --- a/src/AddIns/BackendBindings/FSharpBinding/FSharpInteractive.cs +++ b/src/AddIns/BackendBindings/FSharpBinding/FSharpInteractive.cs @@ -142,9 +142,8 @@ namespace FSharpBinding pad.BringPadToFront(); FSharpInteractive fsharpInteractive = (FSharpInteractive)pad.PadContent; if (fsharpInteractive.foundCompiler) { - ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (editorProvider != null) { - var textEditor = editorProvider.TextEditor; + ITextEditor textEditor = SD.GetActiveViewContentService(); + if (textEditor != null) { if (textEditor.SelectionLength > 0) { fsharpInteractive.fsiProcess.StandardInput.WriteLine(textEditor.SelectedText); } else { diff --git a/src/AddIns/Debugger/Debugger.AddIn/DisableBreakpointMenuCommand.cs b/src/AddIns/Debugger/Debugger.AddIn/DisableBreakpointMenuCommand.cs index a961cd88d5..f17794a529 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/DisableBreakpointMenuCommand.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/DisableBreakpointMenuCommand.cs @@ -21,13 +21,15 @@ namespace Debugger.AddIn { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as ITextEditorProvider; + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) + return; BreakpointBookmark point = null; foreach (BreakpointBookmark breakpoint in DebuggerService.Breakpoints) { - if ((breakpoint.FileName == provider.TextEditor.FileName) && - (breakpoint.LineNumber == provider.TextEditor.Caret.Line)) { + if ((breakpoint.FileName == editor.FileName) && + (breakpoint.LineNumber == editor.Caret.Line)) { point = breakpoint; break; } diff --git a/src/AddIns/Debugger/Debugger.AddIn/EnableBreakpointMenuCommand.cs b/src/AddIns/Debugger/Debugger.AddIn/EnableBreakpointMenuCommand.cs index 6929d5427d..b77f57aada 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/EnableBreakpointMenuCommand.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/EnableBreakpointMenuCommand.cs @@ -21,13 +21,15 @@ namespace Debugger.AddIn { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as ITextEditorProvider; + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) + return; BreakpointBookmark point = null; foreach (BreakpointBookmark breakpoint in DebuggerService.Breakpoints) { - if ((breakpoint.FileName == provider.TextEditor.FileName) && - (breakpoint.LineNumber == provider.TextEditor.Caret.Line)) { + if ((breakpoint.FileName == editor.FileName) && + (breakpoint.LineNumber == editor.Caret.Line)) { point = breakpoint; break; } diff --git a/src/AddIns/Debugger/Debugger.AddIn/IsActiveBreakpointCondition.cs b/src/AddIns/Debugger/Debugger.AddIn/IsActiveBreakpointCondition.cs index f74e1a057a..e6fab5342a 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/IsActiveBreakpointCondition.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/IsActiveBreakpointCondition.cs @@ -25,19 +25,17 @@ namespace Debugger.AddIn public bool IsValid(object caller, Condition condition) { - if (WorkbenchSingleton.Workbench == null || WorkbenchSingleton.Workbench.ActiveWorkbenchWindow == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) return false; - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as ITextEditorProvider; - if (provider == null) - return false; - if (string.IsNullOrEmpty(provider.TextEditor.FileName)) + if (string.IsNullOrEmpty(editor.FileName)) return false; BreakpointBookmark point = null; foreach (BreakpointBookmark breakpoint in DebuggerService.Breakpoints) { - if ((breakpoint.FileName == provider.TextEditor.FileName) && - (breakpoint.LineNumber == provider.TextEditor.Caret.Line)) { + if ((breakpoint.FileName == editor.FileName) && + (breakpoint.LineNumber == editor.Caret.Line)) { point = breakpoint; break; } diff --git a/src/AddIns/Debugger/Debugger.AddIn/IsBreakpointCondition.cs b/src/AddIns/Debugger/Debugger.AddIn/IsBreakpointCondition.cs index 24e3a8a48c..f459ec02c1 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/IsBreakpointCondition.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/IsBreakpointCondition.cs @@ -25,17 +25,15 @@ namespace Debugger.AddIn public bool IsValid(object caller, Condition condition) { - if (WorkbenchSingleton.Workbench == null || WorkbenchSingleton.Workbench.ActiveWorkbenchWindow == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) return false; - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as ITextEditorProvider; - if (provider == null) - return false; - if (string.IsNullOrEmpty(provider.TextEditor.FileName)) + if (string.IsNullOrEmpty(editor.FileName)) return false; foreach (BreakpointBookmark mark in DebuggerService.Breakpoints) { - if ((mark.FileName == provider.TextEditor.FileName) && - (mark.LineNumber == provider.TextEditor.Caret.Line)) + if ((mark.FileName == editor.FileName) && + (mark.LineNumber == editor.Caret.Line)) return true; } diff --git a/src/AddIns/Debugger/Debugger.AddIn/Service/RunToCursorCommand.cs b/src/AddIns/Debugger/Debugger.AddIn/Service/RunToCursorCommand.cs index 493f39993f..233b658a29 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Service/RunToCursorCommand.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Service/RunToCursorCommand.cs @@ -14,13 +14,10 @@ namespace ICSharpCode.SharpDevelop.Services { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - - if (provider == null || WindowsDebugger.CurrentProcess == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null || WindowsDebugger.CurrentProcess == null) return; - - ITextEditor textEditor = provider.TextEditor; - WindowsDebugger.CurrentProcess.RunTo(textEditor.FileName, textEditor.Caret.Line, textEditor.Caret.Column); + WindowsDebugger.CurrentProcess.RunTo(editor.FileName, editor.Caret.Line, editor.Caret.Column); } } } diff --git a/src/AddIns/Debugger/Debugger.AddIn/Service/SetCurrentStatementCommand.cs b/src/AddIns/Debugger/Debugger.AddIn/Service/SetCurrentStatementCommand.cs index 2517cdd4c4..ebc7a49ff5 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Service/SetCurrentStatementCommand.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Service/SetCurrentStatementCommand.cs @@ -12,13 +12,11 @@ namespace ICSharpCode.SharpDevelop.Services { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; + ITextEditor textEditor = SD.GetActiveViewContentService(); - if (provider == null || DebuggerService.CurrentDebugger == null) + if (textEditor == null || DebuggerService.CurrentDebugger == null) return; - ITextEditor textEditor = provider.TextEditor; - DebuggerService.CurrentDebugger.SetInstructionPointer(textEditor.FileName, textEditor.Caret.Line, textEditor.Caret.Column, false); } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs index a877686570..e2282915e6 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs @@ -22,8 +22,10 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AvalonEdit.AddIn { + [ViewContentService] public interface ICodeEditorProvider : ITextEditorProvider { + [Obsolete("Use viewContent.GetService() instead.")] CodeEditor CodeEditor { get; } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 8ac2d6d96e..760903bc99 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -37,7 +37,7 @@ namespace ICSharpCode.AvalonEdit.AddIn /// Integrates AvalonEdit with SharpDevelop. /// Also provides support for Split-View (showing two AvalonEdit instances using the same TextDocument) /// - [TextEditorService] + [TextEditorService, ViewContentService] public class CodeEditor : Grid, IDisposable { const string contextMenuPath = "/SharpDevelop/ViewContent/AvalonEdit/ContextMenu"; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/FoldingCommands.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/FoldingCommands.cs index 21d819ae5d..fa741bae6b 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/FoldingCommands.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/FoldingCommands.cs @@ -15,8 +15,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - ITextEditor editor = provider.TextEditor; + ITextEditor editor = SD.GetActiveViewContentService(); FoldingManager foldingManager = editor.GetService(typeof(FoldingManager)) as FoldingManager; if (foldingManager != null) { @@ -37,8 +36,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - ITextEditor editor = provider.TextEditor; + ITextEditor editor = SD.GetActiveViewContentService(); FoldingManager foldingManager = editor.GetService(typeof(FoldingManager)) as FoldingManager; if (foldingManager != null) { @@ -60,8 +58,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - ITextEditor editor = provider.TextEditor; + ITextEditor editor = SD.GetActiveViewContentService(); FoldingManager foldingManager = editor.GetService(typeof(FoldingManager)) as FoldingManager; if (foldingManager != null) { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SaveFileWithEncoding.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SaveFileWithEncoding.cs index 45a9e2aa73..59e6bfcff4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SaveFileWithEncoding.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SaveFileWithEncoding.cs @@ -15,13 +15,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands public override void Run() { IViewContent vc = WorkbenchSingleton.Workbench.ActiveViewContent; - ICodeEditorProvider cep = vc as ICodeEditorProvider; - if (cep != null) { + if (vc == null) + return; + var codeEditor = vc.GetService(); + if (codeEditor != null) { ChooseEncodingDialog dlg = new ChooseEncodingDialog(); dlg.Owner = WorkbenchSingleton.MainWindow; - dlg.Encoding = cep.CodeEditor.PrimaryTextEditor.Encoding; + dlg.Encoding = codeEditor.PrimaryTextEditor.Encoding; if (dlg.ShowDialog() == true) { - cep.CodeEditor.PrimaryTextEditor.Encoding = dlg.Encoding; + codeEditor.PrimaryTextEditor.Encoding = dlg.Encoding; SharpDevelop.Commands.SaveFile.Save(vc.PrimaryFile); } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SortSelectionCommand.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SortSelectionCommand.cs index 24dbba2efa..fd7b999c71 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SortSelectionCommand.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SortSelectionCommand.cs @@ -2,12 +2,14 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.Linq; + using ICSharpCode.Core; using ICSharpCode.NRefactory.Editor; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; -using System.Collections.Generic; namespace ICSharpCode.AvalonEdit.AddIn.Commands { @@ -24,9 +26,8 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands if (SortOptions.SortDirection == SortDirection.Descending) comparer = new DescendingStringComparer(comparer); - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (provider != null) { - ITextEditor editor = provider.TextEditor; + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { if (editor.SelectionLength > 0) { int start = editor.Document.GetLineByOffset(editor.SelectionStart).LineNumber; int end = editor.Document.GetLineByOffset(editor.SelectionStart + editor.SelectionLength).LineNumber; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SurroundWithCommand.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SurroundWithCommand.cs index 8de3a8c934..09fb8a4647 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SurroundWithCommand.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Commands/SurroundWithCommand.cs @@ -4,10 +4,10 @@ using System; using System.IO; using System.Linq; - using ICSharpCode.AvalonEdit.AddIn.Snippets; using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.CodeCompletion; using ICSharpCode.SharpDevelop.Gui; @@ -21,21 +21,20 @@ namespace ICSharpCode.AvalonEdit.AddIn.Commands /// public override void Run() { - ICodeEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ICodeEditorProvider; - - if (provider == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) return; - CodeSnippetGroup group = SnippetManager.Instance.FindGroup(Path.GetExtension(provider.TextEditor.FileName)); + CodeSnippetGroup group = SnippetManager.Instance.FindGroup(Path.GetExtension(editor.FileName)); if (group == null) return; DefaultCompletionItemList list = new DefaultCompletionItemList(); - list.Items.AddRange(group.Snippets.Where(i => i.HasSelection).Select(item => item.CreateCompletionItem(provider.TextEditor))); + list.Items.AddRange(group.Snippets.Where(i => i.HasSelection).Select(item => item.CreateCompletionItem(editor))); - new CodeSnippetCompletionWindow(provider.TextEditor, list).Show(); + new CodeSnippetCompletionWindow(editor, list).Show(); } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs index 2442c8cad0..c11a444510 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionsPopup.cs @@ -4,6 +4,7 @@ using System; using System.Windows.Controls.Primitives; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; @@ -61,12 +62,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions ITextEditor GetCurrentEditor() { - if (WorkbenchSingleton.Workbench == null) - return null; - var activeViewContent = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (activeViewContent == null) - return null; - return activeViewContent.TextEditor; + return SD.GetActiveViewContentService(); } void OpenAtMousePosition() diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/FormatXmlCommand.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/FormatXmlCommand.cs index 89883482ed..ffc7eed762 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/FormatXmlCommand.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/FormatXmlCommand.cs @@ -1,10 +1,10 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using ICSharpCode.SharpDevelop.Editor; using System; using ICSharpCode.Core; -using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.XmlEditor { @@ -15,10 +15,9 @@ namespace ICSharpCode.XmlEditor { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - - if (provider != null) { - XmlView.FormatXml(provider.TextEditor); + ITextEditor textEditor = SD.GetActiveViewContentService(); + if (textEditor != null) { + XmlView.FormatXml(textEditor); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RemoveXPathHighlightingCommand.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RemoveXPathHighlightingCommand.cs index d628da39d7..970c517252 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RemoveXPathHighlightingCommand.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RemoveXPathHighlightingCommand.cs @@ -30,11 +30,7 @@ namespace ICSharpCode.XmlEditor public void RemoveXPathNodeTextMarkers() { foreach (IViewContent view in workbench.ViewContentCollection) { - ITextEditorProvider textEditorProvider = view as ITextEditorProvider; - if (textEditorProvider != null) { - XPathNodeTextMarker marker = new XPathNodeTextMarker(textEditorProvider.TextEditor.Document); - marker.RemoveMarkers(); - } + XPathNodeTextMarker.RemoveMarkers(view); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RunXslTransformCommand.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RunXslTransformCommand.cs index 399b4ad3d7..27a6ddcb08 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RunXslTransformCommand.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/RunXslTransformCommand.cs @@ -70,15 +70,7 @@ namespace ICSharpCode.XmlEditor static string GetStylesheetContent(string fileName) { - // File already open? - ITextEditorProvider view = FileService.GetOpenFile(fileName) as ITextEditorProvider; - if (view != null) { - return view.TextEditor.Document.Text; - } - - // Read in file contents. - StreamReader reader = new StreamReader(fileName, true); - return reader.ReadToEnd(); + return SD.FileService.GetFileContent(fileName).Text; } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs index f2674ab939..885a9b0879 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs @@ -45,15 +45,18 @@ namespace ICSharpCode.XmlEditor } } - public void RemoveMarkers() + /// + /// Removes all markers from the given view content or text editor. + /// + public static void RemoveMarkers(IServiceProvider serviceProvider) { - ITextMarkerService markerService = document.GetService(typeof(ITextMarkerService)) as ITextMarkerService; + ITextMarkerService markerService = serviceProvider.GetService(typeof(ITextMarkerService)) as ITextMarkerService; if (markerService != null) { markerService.RemoveAll(IsXPathNodeTextMarker); } } - bool IsXPathNodeTextMarker(ITextMarker marker) + static bool IsXPathNodeTextMarker(ITextMarker marker) { return (Type)marker.Tag == typeof(XPathNodeTextMarker); } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathQueryControl.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathQueryControl.cs index e60632db60..032595b81a 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathQueryControl.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathQueryControl.cs @@ -428,14 +428,14 @@ namespace ICSharpCode.XmlEditor // Clear previous XPath results. ClearResults(); - XPathNodeTextMarker marker = new XPathNodeTextMarker(xmlView.TextEditor.Document); - marker.RemoveMarkers(); + XPathNodeTextMarker.RemoveMarkers(xmlView.TextEditor.Document); // Run XPath query. XPathQuery query = new XPathQuery(xmlView.TextEditor, GetNamespaces()); XPathNodeMatch[] nodes = query.FindNodes(xpathComboBox.Text); if (nodes.Length > 0) { AddXPathResults(nodes); + XPathNodeTextMarker marker = new XPathNodeTextMarker(xmlView.TextEditor.Document); marker.AddMarkers(nodes); } else { AddNoXPathResult(); diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs index b1eb4ce444..7795388541 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs @@ -63,12 +63,9 @@ namespace ICSharpCode.XmlEditor public static bool XmlViewContentActive { get { - if (WorkbenchSingleton.Workbench == null) { - return false; - } - ITextEditorProvider view = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (view != null) { - return IsFileNameHandled(view.TextEditor.FileName); + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { + return IsFileNameHandled(editor.FileName); } return false; } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs index d328fd17f2..bc293c2892 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs @@ -82,11 +82,12 @@ namespace ICSharpCode.XmlEditor { get { foreach (IViewContent view in File.RegisteredViewContents) { - ITextEditorProvider provider = view as ITextEditorProvider; - if (provider != null) { + IFileDocumentProvider provider = view.GetService(); + ITextEditor textEditor = view.GetService(); + if (textEditor != null && provider != null) { IDocument document = provider.GetDocumentForFile(File); if (document != null) { - return provider.TextEditor; + return textEditor; } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XslOutputView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XslOutputView.cs index bc73306ce0..45d06e9c5f 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XslOutputView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XslOutputView.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.XmlEditor get { if (editor == null) { instance = FileService.NewFile("xslOutput.xml", ""); - editor = (instance as ITextEditorProvider).TextEditor; + editor = instance.GetService(); instance.Disposed += new EventHandler(InstanceDisposed); } @@ -33,7 +33,7 @@ namespace ICSharpCode.XmlEditor get { if (instance == null) { instance = FileService.NewFile("xslOutput.xml", ""); - editor = (instance as ITextEditorProvider).TextEditor; + editor = instance.GetService(); instance.Disposed += new EventHandler(InstanceDisposed); } else { instance.WorkbenchWindow.SelectWindow(); diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchLocation.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchLocation.cs index 5896dc572b..39027d4428 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchLocation.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchLocation.cs @@ -8,6 +8,7 @@ using System.Linq; using ICSharpCode.Core; using ICSharpCode.NRefactory.Editor; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; @@ -47,16 +48,20 @@ namespace SearchAndReplace { List files = new List(); + ITextEditor editor; switch (Target) { case SearchTarget.CurrentDocument: case SearchTarget.CurrentSelection: - ITextEditorProvider vc = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (vc != null) - files.Add(vc.TextEditor.FileName); + editor = SD.GetActiveViewContentService(); + if (editor != null) + files.Add(editor.FileName); break; case SearchTarget.AllOpenFiles: - foreach (ITextEditorProvider editor in WorkbenchSingleton.Workbench.ViewContentCollection.OfType()) - files.Add(editor.TextEditor.FileName); + foreach (var vc in WorkbenchSingleton.Workbench.ViewContentCollection) { + editor = vc.GetService(); + if (editor != null) + files.Add(editor.FileName); + } break; case SearchTarget.WholeProject: if (ProjectService.CurrentProject == null) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs index 5567c3c982..5fb6279797 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs @@ -420,27 +420,22 @@ namespace SearchAndReplace #region TextEditor helpers static ITextEditor OpenTextArea(string fileName, bool switchToOpenedView = true) { - ITextEditorProvider textEditorProvider; + IViewContent viewContent; if (fileName != null) { - textEditorProvider = FileService.OpenFile(fileName, switchToOpenedView) as ITextEditorProvider; + viewContent = FileService.OpenFile(fileName, switchToOpenedView); } else { - textEditorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; + viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; } - if (textEditorProvider != null) { - return textEditorProvider.TextEditor; + if (viewContent != null) { + return viewContent.GetService(); } return null; } public static ITextEditor GetActiveTextEditor() { - ITextEditorProvider provider = SD.Workbench.ActiveViewContent as ITextEditorProvider; - if (provider != null) { - return provider.TextEditor; - } else { - return null; - } + return SD.GetActiveViewContentService(); } public static ISegment GetActiveSelection(bool useAnchors) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs index 083ce59e37..b976a3f559 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs @@ -118,6 +118,9 @@ namespace ICSharpCode.AvalonEdit.Document if (textSource == null) throw new ArgumentNullException("textSource"); + if (textSource is ReadOnlyDocument) + textSource = textSource.CreateSnapshot(); // retrieve underlying text source, which might be a RopeTextSource + RopeTextSource rts = textSource as RopeTextSource; if (rts != null) return rts.GetRope(); diff --git a/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs b/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs index 88ddcb934a..1c0f862ea6 100644 --- a/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs +++ b/src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs @@ -14,9 +14,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks { public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (provider != null) { - ITextEditor editor = provider.TextEditor; + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { IBookmarkMargin margin = editor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin; if (editor != null && margin != null) { Run(editor, margin); diff --git a/src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs b/src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs index f4b8e64b54..d50c8f9c65 100644 --- a/src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs +++ b/src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs @@ -84,23 +84,23 @@ namespace ICSharpCode.SharpDevelop.Commands case "CURLINE": { - IPositionable positionable = WorkbenchSingleton.Workbench.ActiveViewContent as IPositionable; + IPositionable positionable = SD.GetActiveViewContentService(); if (positionable != null) return positionable.Line.ToString(); return string.Empty; } case "CURCOL": { - IPositionable positionable = WorkbenchSingleton.Workbench.ActiveViewContent as IPositionable; + IPositionable positionable = SD.GetActiveViewContentService(); if (positionable != null) return positionable.Column.ToString(); return string.Empty; } case "CURTEXT": { - var tecp = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (tecp != null) { - return tecp.TextEditor.SelectedText; + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { + return editor.SelectedText; } return string.Empty; } diff --git a/src/Main/Base/Project/Src/Commands/DebugCommands.cs b/src/Main/Base/Project/Src/Commands/DebugCommands.cs index a17029e0bf..e83933e48c 100644 --- a/src/Main/Base/Project/Src/Commands/DebugCommands.cs +++ b/src/Main/Base/Project/Src/Commands/DebugCommands.cs @@ -117,23 +117,12 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public override void Run() { - var viewContent = WorkbenchSingleton.Workbench.ActiveContent; - ITextEditorProvider provider = viewContent as ITextEditorProvider; - ITextEditor editor = null; + ITextEditor editor = SD.GetActiveViewContentService(); - if (provider != null) { - editor = provider.TextEditor; + if (editor != null) { if (!string.IsNullOrEmpty(editor.FileName)) { DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line, typeof(BreakpointBookmark)); } - } else { - var view = viewContent as AbstractViewContentWithoutFile; - if (view != null) { - editor = view.GetService(typeof(ITextEditor)) as ITextEditor; - if (editor != null) { - DebuggerService.ToggleBreakpointAt(editor, editor.Caret.Line, typeof(DecompiledBreakpointBookmark)); - } - } } } } diff --git a/src/Main/Base/Project/Src/Editor/AvalonEdit/TextContentCondition.cs b/src/Main/Base/Project/Src/Editor/AvalonEdit/TextContentCondition.cs index dc2ad2285c..fe8d40da65 100644 --- a/src/Main/Base/Project/Src/Editor/AvalonEdit/TextContentCondition.cs +++ b/src/Main/Base/Project/Src/Editor/AvalonEdit/TextContentCondition.cs @@ -21,12 +21,9 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit public bool IsValid(object caller, Condition condition) { string textcontent = condition.Properties["textcontent"]; - IViewContent content = WorkbenchSingleton.Workbench.ActiveViewContent; - if (content is ITextEditorProvider) { - var ctrl = (content as ITextEditorProvider).TextEditor.GetService(typeof(ICSharpCode.AvalonEdit.TextEditor)) as ICSharpCode.AvalonEdit.TextEditor; - if (ctrl != null && ctrl.SyntaxHighlighting != null) { - return string.Equals(textcontent, ctrl.SyntaxHighlighting.Name, StringComparison.OrdinalIgnoreCase); - } + var editor = SD.GetActiveViewContentService(); + if (editor != null) { + return string.Equals(textcontent, editor.SyntaxHighlighting.Name, StringComparison.OrdinalIgnoreCase); } return false; } diff --git a/src/Main/Base/Project/Src/Editor/AvalonEdit/TextSelectedCondition.cs b/src/Main/Base/Project/Src/Editor/AvalonEdit/TextSelectedCondition.cs index aa87b18f3e..fef323c43c 100644 --- a/src/Main/Base/Project/Src/Editor/AvalonEdit/TextSelectedCondition.cs +++ b/src/Main/Base/Project/Src/Editor/AvalonEdit/TextSelectedCondition.cs @@ -11,9 +11,8 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit { public bool IsValid(object owner, Condition condition) { - ITextEditorProvider textEditorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (textEditorProvider != null) { - ITextEditor textEditor = textEditorProvider.TextEditor; + ITextEditor textEditor = SD.GetActiveViewContentService(); + if (textEditor != null) { return textEditor.SelectionLength > 0; } return false; diff --git a/src/Main/Base/Project/Src/Editor/Commands/CommentRegion.cs b/src/Main/Base/Project/Src/Editor/Commands/CommentRegion.cs index 3c0f85af2f..3a3179cddf 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/CommentRegion.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/CommentRegion.cs @@ -9,7 +9,7 @@ using ICSharpCode.SharpDevelop; namespace ICSharpCode.SharpDevelop.Editor.Commands { /// - /// Description of CommentRegion + /// Surrounds the selected text in a comment /// public class CommentRegion : AbstractMenuCommand { @@ -18,13 +18,12 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands /// public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - - if (provider == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) return; - using (provider.TextEditor.Document.OpenUndoGroup()) - provider.TextEditor.Language.FormattingStrategy.SurroundSelectionWithComment(provider.TextEditor); + using (editor.Document.OpenUndoGroup()) + editor.Language.FormattingStrategy.SurroundSelectionWithComment(editor); } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/GoToMatchingBrace.cs b/src/Main/Base/Project/Src/Editor/Commands/GoToMatchingBrace.cs index 066acaacf3..aac1d3588d 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/GoToMatchingBrace.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/GoToMatchingBrace.cs @@ -11,9 +11,9 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public override void Run() { - ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (editorProvider != null) { - Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset); + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { + Run(editor, editor.Caret.Offset); } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/IndentSelection.cs b/src/Main/Base/Project/Src/Editor/Commands/IndentSelection.cs index ff5a6a49f1..7deaa747b7 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/IndentSelection.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/IndentSelection.cs @@ -20,21 +20,20 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands /// public override void Run() { - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - - if (provider == null) + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor == null) return; int beginLine = 1; - int endLine = provider.TextEditor.Document.LineCount; + int endLine = editor.Document.LineCount; - if (provider.TextEditor.SelectionLength != 0) { - beginLine = provider.TextEditor.Document.GetLineByOffset(provider.TextEditor.SelectionStart).LineNumber; - endLine = provider.TextEditor.Document.GetLineByOffset(provider.TextEditor.SelectionStart + provider.TextEditor.SelectionLength).LineNumber; + if (editor.SelectionLength != 0) { + beginLine = editor.Document.GetLineByOffset(editor.SelectionStart).LineNumber; + endLine = editor.Document.GetLineByOffset(editor.SelectionStart + editor.SelectionLength).LineNumber; } - using (provider.TextEditor.Document.OpenUndoGroup()) - provider.TextEditor.Language.FormattingStrategy.IndentLines(provider.TextEditor, beginLine, endLine); + using (editor.Document.OpenUndoGroup()) + editor.Language.FormattingStrategy.IndentLines(editor, beginLine, endLine); } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs index 0d470cd816..b9bdaebf58 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs @@ -11,12 +11,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public override void Run() { - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - if (viewContent == null || !(viewContent is ITextEditorProvider)) { - return; - } - - ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; + ITextEditor textEditor = SD.GetActiveViewContentService(); if (textEditor == null) { return; } diff --git a/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs b/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs index fd1861ff80..b6f593b5a9 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs @@ -14,19 +14,13 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public override void Run() { - string clipboardText = ClipboardWrapper.GetText(); - if (string.IsNullOrEmpty(clipboardText)) - return; - - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - if (viewContent == null || !(viewContent is ITextEditorProvider)) { + ITextEditor textEditor = SD.GetActiveViewContentService(); + if (textEditor == null) return; - } - ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; - if (textEditor == null) { + string clipboardText = ClipboardWrapper.GetText(); + if (string.IsNullOrEmpty(clipboardText)) return; - } using (textEditor.Document.OpenUndoGroup()) Run(textEditor, clipboardText); diff --git a/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs b/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs index 9cad1c943f..358a8795a3 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs @@ -13,12 +13,9 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public override void Run() { - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - - if (viewContent == null || !(viewContent is ITextEditorProvider)) { + ITextEditor textEditor = SD.GetActiveViewContentService(); + if (textEditor == null) return; - } - ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; using (SharpDevelopColorDialog cd = new SharpDevelopColorDialog()) { if (cd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainWin32Window) == DialogResult.OK) { diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs index 72f002849a..6faaf12a77 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs @@ -18,9 +18,9 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands { public override void Run() { - ITextEditorProvider editorProvider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; - if (editorProvider != null) { - Run(editorProvider.TextEditor, editorProvider.TextEditor.Caret.Offset); + ITextEditor editor = SD.GetActiveViewContentService(); + if (editor != null) { + Run(editor, editor.Caret.Offset); } } diff --git a/src/Main/Base/Project/Src/Editor/IFileDocumentProvider.cs b/src/Main/Base/Project/Src/Editor/IFileDocumentProvider.cs index 6314b4aa0f..329198f203 100644 --- a/src/Main/Base/Project/Src/Editor/IFileDocumentProvider.cs +++ b/src/Main/Base/Project/Src/Editor/IFileDocumentProvider.cs @@ -10,6 +10,7 @@ namespace ICSharpCode.SharpDevelop.Editor /// Interface for view contents that provide a text editor document /// for one or more s. /// + [ViewContentService] public interface IFileDocumentProvider { /// diff --git a/src/Main/Base/Project/Src/Editor/ITextEditor.cs b/src/Main/Base/Project/Src/Editor/ITextEditor.cs index 46b50ca2f6..583a956265 100644 --- a/src/Main/Base/Project/Src/Editor/ITextEditor.cs +++ b/src/Main/Base/Project/Src/Editor/ITextEditor.cs @@ -13,8 +13,10 @@ using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.SharpDevelop.Editor { + [ViewContentService] public interface ITextEditorProvider : IFileDocumentProvider { + [Obsolete("Use viewContent.GetService() instead.")] ITextEditor TextEditor { get; } @@ -23,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Editor /// /// Interface for text editors. /// + [ViewContentService] public interface ITextEditor : IServiceProvider { /// diff --git a/src/Main/Base/Project/Src/Gui/ContentInterfaces/IEditable.cs b/src/Main/Base/Project/Src/Gui/ContentInterfaces/IEditable.cs index 035c45cbba..02da97ec53 100644 --- a/src/Main/Base/Project/Src/Gui/ContentInterfaces/IEditable.cs +++ b/src/Main/Base/Project/Src/Gui/ContentInterfaces/IEditable.cs @@ -7,6 +7,7 @@ using System; namespace ICSharpCode.SharpDevelop.Gui { + [ViewContentService] public interface IEditable { /// diff --git a/src/Main/Base/Project/Src/Gui/ContentInterfaces/IPositionable.cs b/src/Main/Base/Project/Src/Gui/ContentInterfaces/IPositionable.cs index 5dab7f93ee..6ba907428e 100644 --- a/src/Main/Base/Project/Src/Gui/ContentInterfaces/IPositionable.cs +++ b/src/Main/Base/Project/Src/Gui/ContentInterfaces/IPositionable.cs @@ -8,6 +8,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// that it's a texteditor which could set the caret to a position inside /// a file. /// + [ViewContentService] public interface IPositionable { /// diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/GotoDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/GotoDialog.cs index c5a2290c0d..51cac3a48d 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/GotoDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/GotoDialog.cs @@ -336,11 +336,7 @@ namespace ICSharpCode.SharpDevelop.Gui ITextEditor GetEditor() { - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - if (viewContent is ITextEditorProvider) { - return ((ITextEditorProvider)viewContent).TextEditor; - } - return null; + return SD.GetActiveViewContentService(); } void okButtonClick(object sender, RoutedEventArgs e) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ActiveTextEditors.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ActiveTextEditors.cs index d11256eb8b..9abd29b3c8 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ActiveTextEditors.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ActiveTextEditors.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference @@ -20,9 +21,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ITextEditor GetTextEditor(string fileName) { IViewContent viewContent = FileService.GetOpenFile(fileName); - var textEditorProvider = viewContent as ITextEditorProvider; - if (textEditorProvider != null) { - return textEditorProvider.TextEditor; + if (viewContent != null) { + return viewContent.GetService(); } return null; } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs index d315f1421a..50d86815a1 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/WordCountDialog.cs @@ -95,7 +95,7 @@ namespace ICSharpCode.SharpDevelop.Gui case 0: {// current file IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; if (viewContent != null) { - IEditable editable = viewContent as IEditable; + IEditable editable = viewContent.GetService(); if (editable == null) { MessageService.ShowWarning("${res:Dialog.WordCountDialog.IsNotTextFile}"); } else { @@ -109,7 +109,7 @@ namespace ICSharpCode.SharpDevelop.Gui if (WorkbenchSingleton.Workbench.ViewContentCollection.Count > 0) { total = new Report(StringParser.Parse("${res:Dialog.WordCountDialog.TotalText}"), 0, 0, 0); foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { - IEditable editable = content as IEditable; + IEditable editable = content.GetService(); if (editable != null) { Report r = GetReport(content, editable.CreateSnapshot().CreateReader()); if (r != null) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs index c910349c37..60629a3145 100755 --- a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs @@ -87,14 +87,19 @@ namespace ICSharpCode.SharpDevelop.Gui Task ResolveAtCaretAsync(ParserUpdateStepEventArgs e) { IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; - if (window == null) return Task.FromResult(null); - ITextEditorProvider provider = window.ActiveViewContent as ITextEditorProvider; - if (provider == null) return Task.FromResult(null); - ITextEditor editor = provider.TextEditor; + if (window == null) + return Task.FromResult(null); + IViewContent viewContent = window.ActiveViewContent; + if (viewContent == null) + return Task.FromResult(null); + ITextEditor editor = viewContent.GetService(); + if (editor == null) + return Task.FromResult(null); // e might be null when this is a manually triggered update // don't resolve when an unrelated file was changed - if (e != null && editor.FileName != e.FileName) return null; + if (e != null && editor.FileName != e.FileName) + return Task.FromResult(null); return SD.ParserService.ResolveAsync(editor.FileName, editor.Caret.Location, editor.Document); } @@ -121,19 +126,8 @@ namespace ICSharpCode.SharpDevelop.Gui /// void LoadFile(string fileName) { - // Get currently open text editor that matches the filename. - ITextEditor openTextEditor = null; - ITextEditorProvider provider = FileService.GetOpenFile(fileName) as ITextEditorProvider; - if (provider != null) { - openTextEditor = provider.TextEditor; - } - // Load the text into the definition view's text editor. - if (openTextEditor != null) { - ctl.Text = openTextEditor.Document.Text; - } else { - ctl.Load(fileName); - } + ctl.Document = new TextDocument(SD.FileService.GetFileContent(fileName)); currentFileName = fileName; ctl.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(fileName)); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs index d39819bb73..f90bcfdbb0 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs @@ -95,12 +95,12 @@ namespace ICSharpCode.SharpDevelop.Gui if (isInitialized) UpdateItems(); - ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider; + ITextEditor editor = SD.GetActiveViewContentService(); - if (provider != null) { + if (editor != null) { // ensure we don't attach multiple times to the same editor - provider.TextEditor.Caret.LocationChanged -= CaretPositionChanged; - provider.TextEditor.Caret.LocationChanged += CaretPositionChanged; + editor.Caret.LocationChanged -= CaretPositionChanged; + editor.Caret.LocationChanged += CaretPositionChanged; } } @@ -199,7 +199,7 @@ namespace ICSharpCode.SharpDevelop.Gui return ProjectService.CurrentProject != null && ProjectService.CurrentProject.FindFile(item.FileName) != null; case 2: // All open documents - return WorkbenchSingleton.Workbench.ViewContentCollection.OfType().Any(provider => item.FileName == provider.TextEditor.FileName); + return WorkbenchSingleton.Workbench.ViewContentCollection.Select(vc => vc.GetService()).Any(editor => editor != null && item.FileName == editor.FileName); case 3: // Document return WorkbenchSingleton.Workbench.ActiveViewContent != null && WorkbenchSingleton.Workbench.ActiveViewContent.PrimaryFileName == item.FileName; @@ -221,7 +221,7 @@ namespace ICSharpCode.SharpDevelop.Gui IUnresolvedFile parseInfo = SD.ParserService.GetExistingUnresolvedFile(WorkbenchSingleton.Workbench.ActiveViewContent.PrimaryFileName); if (parseInfo != null) { - IPositionable positionable = WorkbenchSingleton.Workbench.ActiveViewContent as IPositionable; + IPositionable positionable = WorkbenchSingleton.Workbench.ActiveViewContent.GetService(); if (positionable != null) { var c = parseInfo.GetInnermostTypeDefinition(positionable.Line, positionable.Column); if (c != null) return c; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs index 1988e6af80..02bd5e188f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs @@ -10,6 +10,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// /// Implement this interface to make your view content display tools in the tool box. /// + [ViewContentService] public interface IToolsHost { /// @@ -39,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Gui void WorkbenchActiveContentChanged(object sender, EventArgs e) { - IToolsHost th = WorkbenchSingleton.Workbench.ActiveViewContent as IToolsHost; + IToolsHost th = SD.GetActiveViewContentService(); if (th != null && th.ToolsContent != null) { contentControl.SetContent(th.ToolsContent, th); } else { diff --git a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs index fb83cacdf1..2d0ab9f898 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs @@ -24,9 +24,11 @@ namespace ICSharpCode.SharpDevelop.Debugging public static void SetPosition(IViewContent viewContent, int markerStartLine, int markerStartColumn, int markerEndLine, int markerEndColumn) { - ITextEditorProvider tecp = viewContent as ITextEditorProvider; - if (tecp != null) { - SetPosition(tecp.TextEditor.FileName, tecp.TextEditor.Document, markerStartLine, markerStartColumn, markerEndLine, markerEndColumn); + if (viewContent == null) + return; + ITextEditor editor = viewContent.GetService(); + if (editor != null) { + SetPosition(editor.FileName, editor.Document, markerStartLine, markerStartColumn, markerEndLine, markerEndColumn); } } diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index c257069339..45ccd62ea6 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -289,8 +289,12 @@ namespace ICSharpCode.SharpDevelop.Debugging public static void JumpToCurrentLine(string sourceFullFilename, int startLine, int startColumn, int endLine, int endColumn) { IViewContent viewContent = FileService.OpenFile(sourceFullFilename); - if (viewContent is ITextEditorProvider) - ((ITextEditorProvider)viewContent).TextEditor.JumpTo(startLine, startColumn); + if (viewContent != null) { + IPositionable positionable = viewContent.GetService(); + if (positionable != null) { + positionable.JumpTo(startLine, startColumn); + } + } CurrentLineBookmark.SetPosition(viewContent, startLine, startColumn, endLine, endColumn); } } diff --git a/src/Main/Base/Project/Src/Services/File/IFileService.cs b/src/Main/Base/Project/Src/Services/File/IFileService.cs index 7ac2e8c265..2e0ce27efa 100644 --- a/src/Main/Base/Project/Src/Services/File/IFileService.cs +++ b/src/Main/Base/Project/Src/Services/File/IFileService.cs @@ -44,6 +44,7 @@ namespace ICSharpCode.SharpDevelop /// /// This method is thread-safe. This method involves waiting for the main thread, so using it while /// holding a lock can lead to deadlocks. + /// This method never returns null. /// ITextSource GetFileContent(FileName fileName); @@ -65,6 +66,7 @@ namespace ICSharpCode.SharpDevelop /// /// /// This method is thread-safe. + /// This method never returns null. /// ITextSource GetFileContentFromDisk(FileName fileName, CancellationToken cancellationToken = default(CancellationToken)); #endregion diff --git a/src/Main/Base/Project/Src/Services/File/OpenedFile.cs b/src/Main/Base/Project/Src/Services/File/OpenedFile.cs index 1c9a4fbb8f..1b2586560a 100644 --- a/src/Main/Base/Project/Src/Services/File/OpenedFile.cs +++ b/src/Main/Base/Project/Src/Services/File/OpenedFile.cs @@ -348,7 +348,7 @@ namespace ICSharpCode.SharpDevelop static Properties GetMemento(IViewContent viewContent) { - IMementoCapable mementoCapable = viewContent as IMementoCapable; + IMementoCapable mementoCapable = viewContent.GetService(); if (mementoCapable == null) { return null; } else { diff --git a/src/Main/Base/Project/Src/Services/SD.cs b/src/Main/Base/Project/Src/Services/SD.cs index 15f68a934f..4ab15c1a06 100644 --- a/src/Main/Base/Project/Src/Services/SD.cs +++ b/src/Main/Base/Project/Src/Services/SD.cs @@ -58,6 +58,33 @@ namespace ICSharpCode.SharpDevelop return ServiceSingleton.ServiceProvider.GetRequiredService(); } + /// + /// Equivalent to SD.Workbench.ActiveViewContent.GetService<T>(), + /// but does not throw a NullReferenceException when ActiveViewContent is null. + /// (instead, null is returned). + /// + public static T GetActiveViewContentService() where T : class + { + return (T)GetActiveViewContentService(typeof(T)); + } + + /// + /// Equivalent to SD.Workbench.ActiveViewContent.GetService(type), + /// but does not throw a NullReferenceException when ActiveViewContent is null. + /// (instead, null is returned). + /// + public static object GetActiveViewContentService(Type type) + { + var workbench = ServiceSingleton.ServiceProvider.GetService(typeof(IWorkbench)) as IWorkbench; + if (workbench != null) { + var activeViewContent = workbench.ActiveViewContent; + if (activeViewContent != null) { + return activeViewContent.GetService(type); + } + } + return null; + } + /// /// Gets the workbench. /// diff --git a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs index 4b63cfcdf8..93fe2d76f3 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs @@ -21,6 +21,9 @@ namespace ICSharpCode.Core /// and set from a object from the same class. /// This is used to save and restore the state of GUI objects. /// + /// + /// This interface is used as a [ViewContentService] + /// public interface IMementoCapable { /// diff --git a/src/Main/SharpDevelop/Sda/Document.cs b/src/Main/SharpDevelop/Sda/Document.cs index c2a0e1b75a..39edd44f2d 100644 --- a/src/Main/SharpDevelop/Sda/Document.cs +++ b/src/Main/SharpDevelop/Sda/Document.cs @@ -15,9 +15,11 @@ namespace ICSharpCode.SharpDevelop.Sda { internal static Document FromWindow(IViewContent viewContent) { - ITextEditorProvider editable = viewContent as ITextEditorProvider; - if (editable != null) { - return new Document(viewContent, editable.TextEditor.PrimaryView.Document); + if (viewContent == null) + return null; + ITextEditor editor = viewContent.GetService(typeof(ITextEditor)) as ITextEditor; + if (editor != null) { + return new Document(viewContent, editor.Document); } else { return null; } diff --git a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs index e19422b2a2..c8ac2575db 100644 --- a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs +++ b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs @@ -493,7 +493,7 @@ namespace ICSharpCode.SharpDevelop.Workbench /// public void StoreMemento(IViewContent viewContent) { - IMementoCapable mementoCapable = viewContent as IMementoCapable; + IMementoCapable mementoCapable = viewContent.GetService(); if (mementoCapable != null && LoadDocumentProperties) { if (viewContent.PrimaryFileName == null) return; @@ -510,7 +510,7 @@ namespace ICSharpCode.SharpDevelop.Workbench void LoadViewContentMemento(IViewContent viewContent) { - IMementoCapable mementoCapable = viewContent as IMementoCapable; + IMementoCapable mementoCapable = viewContent.GetService(); if (mementoCapable != null && LoadDocumentProperties) { if (viewContent.PrimaryFileName == null) return;