diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs index 93d8fc9084..29f2e358c2 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs @@ -133,7 +133,7 @@ namespace ICSharpCode.XmlEditor protected override void LoadFromPrimary() { - IFileDocumentProvider provider = this.PrimaryViewContent as IFileDocumentProvider; + IFileDocumentProvider provider = this.PrimaryViewContent.GetRequiredService(); IDocument document = provider.GetDocumentForFile(this.PrimaryFile); treeViewContainer.LoadXml(document.Text); XmlView view = XmlView.ForFile(this.PrimaryFile); diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs index 5fb6279797..aed2d3608d 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs @@ -46,7 +46,7 @@ namespace SearchAndReplace class SearchableFileContentFinder { - FileName[] viewContentFileNamesCollection = WorkbenchSingleton.SafeThreadFunction(() => SD.FileService.OpenedFiles.Select(f => f.FileName).ToArray()); + FileName[] viewContentFileNamesCollection = SD.MainThread.InvokeIfRequired(() => SD.FileService.OpenedFiles.Select(f => f.FileName).ToArray()); static ITextSource ReadFile(FileName fileName) { @@ -75,7 +75,7 @@ namespace SearchAndReplace using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { if (MimeTypeDetection.FindMimeType(stream).StartsWith("text/")) { stream.Position = 0; - return new StringTextSource(ICSharpCode.AvalonEdit.Utils.FileReader.ReadFileContent(stream, Encoding.Default)); + return new StringTextSource(ICSharpCode.AvalonEdit.Utils.FileReader.ReadFileContent(stream, SD.FileService.DefaultFileEncoding)); } } return null; diff --git a/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs b/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs index 12c8ca496f..5fab129999 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractPadContent.cs @@ -38,5 +38,13 @@ namespace ICSharpCode.SharpDevelop.Gui return WorkbenchSingleton.Workbench.GetPad(GetType()); } } + + public virtual object GetService(Type serviceType) + { + if (serviceType.IsInstanceOfType(this)) + return this; + else + return null; + } } } diff --git a/src/Main/Base/Project/Src/Gui/IPadContent.cs b/src/Main/Base/Project/Src/Gui/IPadContent.cs index 3bdda1eccf..373115f014 100644 --- a/src/Main/Base/Project/Src/Gui/IPadContent.cs +++ b/src/Main/Base/Project/Src/Gui/IPadContent.cs @@ -10,7 +10,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// The IPadContent interface is the basic interface to all "tool" windows /// in SharpDevelop. /// - public interface IPadContent : IDisposable + public interface IPadContent : IDisposable, IServiceProvider { /// /// This is the UI element for the view. diff --git a/src/Main/Base/Project/Src/Gui/IWorkbench.cs b/src/Main/Base/Project/Src/Gui/IWorkbench.cs index 195624dc22..f7818bc126 100644 --- a/src/Main/Base/Project/Src/Gui/IWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/IWorkbench.cs @@ -98,7 +98,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// If a document is currently active, this will be equal to ActiveViewContent, /// if a pad has the focus, this property will return the IPadContent instance. /// - object ActiveContent { + IServiceProvider ActiveContent { get; } diff --git a/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs b/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs index e2388b3c52..d50c5ff75e 100644 --- a/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs +++ b/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// The active content. This can be either a IViewContent or a IPadContent, depending on /// where the focus currently is. /// - object ActiveContent { + IServiceProvider ActiveContent { get; } diff --git a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs index 43ecbc6e7f..f1f09f63f4 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs @@ -323,18 +323,23 @@ namespace ICSharpCode.SharpDevelop.Gui public class FileScout : UserControl, IPadContent { - public object Control { + object IPadContent.Control { get { return this; } } - public object InitiallyFocusedControl { + object IPadContent.InitiallyFocusedControl { get { return null; } } + object IServiceProvider.GetService(Type type) + { + return null; + } + Splitter splitter1 = new Splitter(); FileList filelister = new FileList(); diff --git a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyContainer.cs b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyContainer.cs index db87f1cd01..558bd5df49 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyContainer.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyContainer.cs @@ -14,6 +14,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// One view/pad content instance has to always return the same property container instance /// and has to change only the properties on that PropertyContainer. /// + [ViewContentService] public interface IHasPropertyContainer { PropertyContainer PropertyContainer { get; } diff --git a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs index 5c77998b8c..547d258e33 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs @@ -127,10 +127,11 @@ namespace ICSharpCode.SharpDevelop.Gui void WorkbenchActiveContentChanged(object sender, EventArgs e) { - IHasPropertyContainer c = WorkbenchSingleton.Workbench.ActiveContent as IHasPropertyContainer; + var activeViewOrPad = WorkbenchSingleton.Workbench.ActiveContent; + IHasPropertyContainer c = activeViewOrPad != null ? activeViewOrPad.GetService() : null; if (c == null) { if (previousContent == null) { - c = WorkbenchSingleton.Workbench.ActiveViewContent as IHasPropertyContainer; + c = SD.GetActiveViewContentService(); } else { // if the previous content is no longer visible, we have to remove the active container if (previousContent is IViewContent && previousContent != WorkbenchSingleton.Workbench.ActiveViewContent) { diff --git a/src/Main/SharpDevelop/Workbench/AvalonDockLayout.cs b/src/Main/SharpDevelop/Workbench/AvalonDockLayout.cs index b2257d6608..476aa8d08e 100644 --- a/src/Main/SharpDevelop/Workbench/AvalonDockLayout.cs +++ b/src/Main/SharpDevelop/Workbench/AvalonDockLayout.cs @@ -92,7 +92,7 @@ namespace ICSharpCode.SharpDevelop.Workbench public event EventHandler ActiveContentChanged; - public object ActiveContent { + public IServiceProvider ActiveContent { get { object activeContent = dockingManager.ActiveContent; AvalonPadContent padContent = activeContent as AvalonPadContent; diff --git a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs index c8ac2575db..b59ff1c684 100644 --- a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs +++ b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs @@ -340,9 +340,9 @@ namespace ICSharpCode.SharpDevelop.Workbench } } - object activeContent; + IServiceProvider activeContent; - public object ActiveContent { + public IServiceProvider ActiveContent { get { WorkbenchSingleton.AssertMainThread(); return activeContent;