diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs index b09a84e857..18c7d26a06 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs @@ -26,14 +26,12 @@ namespace ICSharpCode.WpfDesign.Designer } } - DefaultServiceProvider _services; + DesignContext _context; InnerDesignPanel _innerDesignPanel; UIElement _designedElement; - public DesignPanel(DefaultServiceProvider services) + public DesignPanel() { - this._services = services; - this.Focusable = true; _innerDesignPanel = new InnerDesignPanel(); @@ -50,6 +48,19 @@ namespace ICSharpCode.WpfDesign.Designer } } + /// + /// Gets/Sets the design context. + /// + public DesignContext Context { + get { return _context; } + set { _context = value; } + } + + private IToolService ToolService { + [DebuggerStepThrough] + get { return _context.Services.Tool; } + } + protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) { return new PointHitTestResult(this, hitTestParameters.HitPoint); @@ -69,7 +80,7 @@ namespace ICSharpCode.WpfDesign.Designer if (site != null) { Debug.WriteLine(" Found designed element: " + site.Component.GetType().Name); } - _services.Tool.CurrentTool.OnMouseDown(this, e); + ToolService.CurrentTool.OnMouseDown(this, e); } } @@ -77,7 +88,7 @@ namespace ICSharpCode.WpfDesign.Designer { if (originalSource == null) return null; - DesignItem site = _services.Component.GetDesignItem(originalSource); + DesignItem site = _context.Services.Component.GetDesignItem(originalSource); if (site != null) return site; if (originalSource == _innerDesignPanel) @@ -104,16 +115,6 @@ namespace ICSharpCode.WpfDesign.Designer } } - #region IDesignPanel implementation - public UIElement DesignPanelUI { - get { return this; } - } - - public DefaultServiceProvider Services { - get { return _services; } - } - #endregion - bool _isInInputAction; void IDesignPanel.StartInputAction() diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs index c65615cdad..93f9526470 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs @@ -11,7 +11,6 @@ using System.Windows.Controls; using System.Windows.Media; using System.Windows.Markup; using System.Xml; -using ICSharpCode.WpfDesign.XamlDom; using ICSharpCode.WpfDesign.Designer.Services; using ICSharpCode.WpfDesign.Designer.Controls; @@ -22,36 +21,26 @@ namespace ICSharpCode.WpfDesign.Designer /// public sealed class DesignSurface : SingleVisualChildElement { - readonly DefaultServiceProvider _services; - readonly DefaultComponentService _componentService; readonly ScrollViewer _scrollViewer; readonly DesignPanel _designPanel; + DesignContext _designContext; /// /// Create a new DesignSurface instance. /// public DesignSurface() { - DesignServiceContainer serviceContainer = new DesignServiceContainer(); - _services = new DefaultServiceProvider(serviceContainer); - - serviceContainer.AddService(typeof(IVisualDesignService), new DefaultVisualDesignService()); - serviceContainer.AddService(typeof(ISelectionService), new DefaultSelectionService()); - serviceContainer.AddService(typeof(IToolService), new DefaultToolService()); - _componentService = new DefaultComponentService(this); - serviceContainer.AddService(typeof(IComponentService), _componentService); - _scrollViewer = new ScrollViewer(); - _designPanel = new DesignPanel(_services); + _designPanel = new DesignPanel(); _scrollViewer.Content = _designPanel; this.VisualChild = _scrollViewer; } /// - /// Gets the service provider. + /// Gets the active design context. /// - public DefaultServiceProvider Services { - get { return _services; } + public DesignContext DesignContext { + get { return _designContext; } } /// @@ -69,7 +58,7 @@ namespace ICSharpCode.WpfDesign.Designer public void LoadDesigner(XmlReader xamlReader) { UnloadDesigner(); - InitializeDesigner(XamlParser.Parse(xamlReader)); + InitializeDesigner(new Xaml.XamlDesignContext(XamlDom.XamlParser.Parse(xamlReader))); } /// @@ -77,18 +66,14 @@ namespace ICSharpCode.WpfDesign.Designer /// public void SaveDesigner(XmlWriter writer) { - _currentDocument.Save(writer); + _designContext.Save(writer); } - XamlDocument _currentDocument; - - void InitializeDesigner(XamlDocument document) + void InitializeDesigner(DesignContext context) { - _currentDocument = document; - XamlDesignItem rootSite = _componentService.RegisterXamlComponentRecursive(document.RootElement); - UIElement rootUI = DefaultVisualDesignService.CreateUIElementFor(rootSite); - rootSite.SetView(rootUI); - _designPanel.DesignedElement = rootUI; + _designContext = context; + _designPanel.Context = context; + _designPanel.DesignedElement = context.RootItem.View; } /// @@ -96,12 +81,9 @@ namespace ICSharpCode.WpfDesign.Designer /// public void UnloadDesigner() { - _currentDocument = null; - UIElement designedElement = this.DesignedElement; - if (designedElement != null) { - _componentService.UnregisterAllComponents(); - _designPanel.DesignedElement = null; - } + _designContext = null; + _designPanel.Context = null; + _designPanel.DesignedElement = null; } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/DesignServiceContainer.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/DesignServiceContainer.cs deleted file mode 100644 index e5de6faed3..0000000000 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/DesignServiceContainer.cs +++ /dev/null @@ -1,39 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using System; -using System.Collections.Generic; - -namespace ICSharpCode.WpfDesign.Designer.Services -{ - sealed class DesignServiceContainer : IServiceContainer - { - public DesignServiceContainer() - { - AddService(typeof(IServiceContainer), this); - } - - Dictionary _services = new Dictionary(); - - public void AddService(Type serviceInterface, object serviceInstance) - { - if (serviceInterface == null) - throw new ArgumentNullException("serviceInterface"); - if (serviceInstance == null) - throw new ArgumentNullException("serviceInstance"); - - _services.Add(serviceInterface, serviceInstance); - } - - public object GetService(Type serviceType) - { - object instance; - _services.TryGetValue(serviceType, out instance); - return instance; - } - } -} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj index 904bd12b4c..454eba962f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj @@ -61,17 +61,18 @@ - - - + + + + {88DA149F-21B2-48AB-82C4-28FB6BDFD783} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs similarity index 88% rename from src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs rename to src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs index 74dd91e085..707d61d624 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs @@ -9,15 +9,15 @@ using System; using System.Collections.Generic; using ICSharpCode.WpfDesign.XamlDom; -namespace ICSharpCode.WpfDesign.Designer.Services +namespace ICSharpCode.WpfDesign.Designer.Xaml { - sealed class DefaultComponentService : IComponentService + sealed class XamlComponentService : IComponentService { - readonly DesignSurface _surface; + readonly XamlDesignContext _context; - public DefaultComponentService(DesignSurface surface) + public XamlComponentService(XamlDesignContext context) { - this._surface = surface; + this._context = context; } public event EventHandler ComponentRegistered; @@ -71,7 +71,7 @@ namespace ICSharpCode.WpfDesign.Designer.Services } } - XamlDesignItem site = new XamlDesignItem(obj, _surface); + XamlDesignItem site = new XamlDesignItem(obj, _context); _sites.Add(site.Component, site); if (ComponentRegistered != null) { ComponentRegistered(this, new DesignItemEventArgs(site)); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs new file mode 100644 index 0000000000..acb4843f58 --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs @@ -0,0 +1,45 @@ +// +// +// +// +// $Revision$ +// + +using System; +using ICSharpCode.WpfDesign.XamlDom; +using ICSharpCode.WpfDesign.Designer.Services; + +namespace ICSharpCode.WpfDesign.Designer.Xaml +{ + sealed class XamlDesignContext : DesignContext + { + readonly XamlDocument _doc; + readonly XamlDesignItem _rootItem; + readonly XamlComponentService _componentService; + + public XamlDesignContext(XamlDocument doc) + { + if (doc == null) + throw new ArgumentNullException("doc"); + this._doc = doc; + + this.Services.AddService(typeof(IVisualDesignService), new DefaultVisualDesignService()); + this.Services.AddService(typeof(ISelectionService), new DefaultSelectionService()); + this.Services.AddService(typeof(IToolService), new DefaultToolService()); + + _componentService = new XamlComponentService(this); + this.Services.AddService(typeof(IComponentService), _componentService); + + _rootItem = _componentService.RegisterXamlComponentRecursive(doc.RootElement); + } + + public override void Save(System.Xml.XmlWriter writer) + { + _doc.Save(writer); + } + + public override DesignItem RootItem { + get { return _rootItem; } + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/XamlDesignItem.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs similarity index 62% rename from src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/XamlDesignItem.cs rename to src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs index 1fc523be4f..be7fc80d08 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/XamlDesignItem.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs @@ -9,23 +9,23 @@ using System; using System.Windows; using ICSharpCode.WpfDesign.XamlDom; -namespace ICSharpCode.WpfDesign.Designer +namespace ICSharpCode.WpfDesign.Designer.Xaml { sealed class XamlDesignItem : DesignItem { - readonly XamlObject xamlObject; - readonly DesignSurface designSurface; + readonly XamlObject _xamlObject; + readonly XamlDesignContext _designContext; UIElement _view; - public XamlDesignItem(XamlObject xamlObject, DesignSurface designSurface) + public XamlDesignItem(XamlObject xamlObject, XamlDesignContext designContext) { - this.xamlObject = xamlObject; - this.designSurface = designSurface; + this._xamlObject = xamlObject; + this._designContext = designContext; } public override object Component { get { - return xamlObject.Instance; + return _xamlObject.Instance; } } @@ -43,9 +43,8 @@ namespace ICSharpCode.WpfDesign.Designer _view = newView; } - public override object GetService(Type serviceType) - { - return designSurface.Services.GetService(serviceType); + public override DesignContext Context { + get { return _designContext; } } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignContext.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignContext.cs new file mode 100644 index 0000000000..7d5a495982 --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignContext.cs @@ -0,0 +1,41 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Diagnostics; +using System.Xml; + +namespace ICSharpCode.WpfDesign +{ + /// + /// The context that the designer uses. + /// + public abstract class DesignContext + { + readonly ServiceContainer _services = new ServiceContainer(); + + /// + /// Gets the . + /// + public ServiceContainer Services { + [DebuggerStepThrough] + get { return _services; } + } + + /// + /// Gets the root design item. + /// + public abstract DesignItem RootItem { + get; + } + + /// + /// Save the designed elements as XML. + /// + public abstract void Save(XmlWriter writer); + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItem.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItem.cs index ff836866d3..326f2c5f3d 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItem.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItem.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Windows; namespace ICSharpCode.WpfDesign @@ -20,7 +21,7 @@ namespace ICSharpCode.WpfDesign /// http://blogs.msdn.com/jnak/archive/2006/04/24/580393.aspx /// http://blogs.msdn.com/jnak/archive/2006/08/04/687166.aspx /// - public abstract class DesignItem : IServiceProvider + public abstract class DesignItem { /// /// Gets the component this DesignSite was created for. @@ -32,23 +33,17 @@ namespace ICSharpCode.WpfDesign /// public abstract UIElement View { get; } - DefaultServiceProvider _defaultServiceProvider; - /// - /// Gets an instance that provides convenience properties for the most-used designers. + /// Gets the design context. /// - public DefaultServiceProvider Services { - get { - if (_defaultServiceProvider == null) { - _defaultServiceProvider = new DefaultServiceProvider(this); - } - return _defaultServiceProvider; - } - } + public abstract DesignContext Context { get; } /// - /// Gets the service with the specified type. + /// Gets an instance that provides convenience properties for the most-used designers. /// - public abstract object GetService(Type serviceType); + public ServiceContainer Services { + [DebuggerStepThrough] + get { return this.Context.Services; } + } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Extensions/Extension.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Extensions/Extension.cs new file mode 100644 index 0000000000..45ab7340c1 --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Extensions/Extension.cs @@ -0,0 +1,18 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.WpfDesign.Extensions +{ + /// + /// Base class for all Extensions. + /// + public abstract class Extension + { + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DefaultServiceProvider.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ServiceContainer.cs similarity index 60% rename from src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DefaultServiceProvider.cs rename to src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ServiceContainer.cs index e5a41e34a2..49288c4cd9 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DefaultServiceProvider.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ServiceContainer.cs @@ -6,24 +6,37 @@ // using System; +using System.Collections.Generic; using System.ComponentModel; namespace ICSharpCode.WpfDesign { /// - /// Provides convenience methods for well-known service instances. + /// The is a built-in service that manages the list of services. + /// You can only add services to it, removing or replacing services is not supported because + /// many designers depend on keeping their services available. /// - public sealed class DefaultServiceProvider : IServiceProvider + public sealed class ServiceContainer : IServiceProvider { - readonly IServiceProvider _serviceProvider; + Dictionary _services = new Dictionary(); /// - /// Creates a new DefaultServiceProvider that requests services from the specified service - /// provider. + /// Adds a new service to the container. /// - public DefaultServiceProvider(IServiceProvider serviceProvider) + /// + /// The type of the service interface to use as a key for the service. + /// + /// + /// The service instance implementing that interface. + /// + public void AddService(Type serviceInterface, object serviceInstance) { - this._serviceProvider = serviceProvider; + if (serviceInterface == null) + throw new ArgumentNullException("serviceInterface"); + if (serviceInstance == null) + throw new ArgumentNullException("serviceInstance"); + + _services.Add(serviceInterface, serviceInstance); } /// @@ -31,7 +44,9 @@ namespace ICSharpCode.WpfDesign /// public object GetService(Type serviceType) { - return _serviceProvider.GetService(serviceType); + object instance; + _services.TryGetValue(serviceType, out instance); + return instance; } /// @@ -40,28 +55,18 @@ namespace ICSharpCode.WpfDesign [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")] public T GetService() where T : class { - return (T)_serviceProvider.GetService(typeof(T)); + return (T)GetService(typeof(T)); } T GetServiceChecked() where T : class { - T service = (T)_serviceProvider.GetService(typeof(T)); + T service = (T)GetService(typeof(T)); if (service == null) { throw new DesignerException("Could not find guaranteed service " + typeof(T).FullName); } return service; } - /// - /// Gets the . - /// This service is guaranteed to always exist -> this property will never return null. - /// - public IServiceContainer ServiceContainer { - get { - return GetServiceChecked(); - } - } - /// /// Gets the . /// This service is guaranteed to always exist -> this property will never return null. diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Services.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Services.cs index 8e0bb0e98a..c6f916327f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Services.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Services.cs @@ -11,27 +11,6 @@ using System.Windows; namespace ICSharpCode.WpfDesign { - #region IServiceContainer - /// - /// The is a built-in service that manages the list of services. - /// You can only add services to it, removing or replacing services is not supported because - /// many designers depend on keeping their services available. - /// - public interface IServiceContainer : IServiceProvider - { - /// - /// Adds a new service to the container. - /// - /// - /// The type of the service interface to use as a key for the service. - /// - /// - /// The service instance implementing that interface. - /// - void AddService(Type serviceInterface, object serviceInstance); - } - #endregion - #region IVisualDesignService /// /// A service that can visualize non-UIElement objects on a design surface. diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs index 5d6751abcf..f0f6da193f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs @@ -87,9 +87,9 @@ namespace ICSharpCode.WpfDesign public interface IDesignPanel : IInputElement { /// - /// Gets the service provider used by the DesignPanel. + /// Gets the design context used by the DesignPanel. /// - DefaultServiceProvider Services { get; } + DesignContext Context { get; } /// /// Starts an input action. This prevents components and tools from getting input events, diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj index 0b2e03eb67..8bacd284b6 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj @@ -55,15 +55,18 @@ Configuration\GlobalAssemblyInfo.cs + - + + + \ No newline at end of file