From de3656269f9bb892c9b77fd30693af150e52e44f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 31 Dec 2006 13:08:59 +0000 Subject: [PATCH] Allow setting simple properties via DesignItem. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2238 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Xaml/XamlComponentService.cs | 31 +++++- .../Project/Xaml/XamlDesignContext.cs | 4 + .../Project/Xaml/XamlModelProperty.cs | 8 +- .../Project/themes/generic.xaml | 3 + .../WpfDesign.Designer/Tests/AssemblyInfo.cs | 15 +++ .../Tests/ModelTestHelper.cs | 97 +++++++++++++++++++ .../WpfDesign.Designer/Tests/ModelTests.cs | 30 ++++++ .../Tests/WpfDesign.Designer.Tests.csproj | 66 +++++++++++++ .../WpfDesign.Designer/Tests/app.config | 15 +++ .../WpfDesign.XamlDom/Project/XamlDocument.cs | 48 ++++++++- .../WpfDesign.XamlDom/Project/XamlObject.cs | 14 +++ .../WpfDesign.XamlDom/Project/XamlParser.cs | 44 +++++++-- .../WpfDesign.XamlDom/Project/XamlProperty.cs | 84 +++++++++++++++- .../Project/XamlPropertyInfo.cs | 9 ++ .../Project/XamlTypeFinder.cs | 63 ++++++++++-- .../Tests/SystemTypesLoadTest.cs | 35 +++++++ .../Tests/WpfDesign.XamlDom.Tests.csproj | 1 + .../DisplayBindings/WpfDesign/WpfDesign.sln | 6 ++ 18 files changed, 551 insertions(+), 22 deletions(-) create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/AssemblyInfo.cs create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/ModelTestHelper.cs create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/ModelTests.cs create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/WpfDesign.Designer.Tests.csproj create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/app.config create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Tests/SystemTypesLoadTest.cs diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs index 9cd00ed34c..53a66b5639 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlComponentService.cs @@ -8,11 +8,29 @@ using System; using System.Collections.Generic; using ICSharpCode.WpfDesign.XamlDom; +using System.Windows.Markup; namespace ICSharpCode.WpfDesign.Designer.Xaml { sealed class XamlComponentService : IComponentService { + #region IdentityEqualityComparer + sealed class IdentityEqualityComparer : IEqualityComparer + { + internal static readonly IdentityEqualityComparer Instance = new IdentityEqualityComparer(); + + int IEqualityComparer.GetHashCode(object obj) + { + return obj.GetHashCode(); + } + + bool IEqualityComparer.Equals(object x, object y) + { + return x == y; + } + } + #endregion + readonly XamlDesignContext _context; public XamlComponentService(XamlDesignContext context) @@ -23,7 +41,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml public event EventHandler ComponentRegistered; public event EventHandler ComponentUnregistered; - Dictionary _sites = new Dictionary(); + Dictionary _sites = new Dictionary(IdentityEqualityComparer.Instance); public DesignItem GetDesignItem(object component) { @@ -36,10 +54,15 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml public DesignItem RegisterComponentForDesigner(object component) { - if (component == null) - throw new ArgumentNullException("component"); + if (component == null) { + component = new NullExtension(); + } else if (component is Type) { + component = new TypeExtension((Type)component); + } - throw new NotImplementedException(); + XamlDesignItem item = new XamlDesignItem(_context.Document.CreateObject(component), _context); + _sites.Add(component, item); + return item; } /// diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs index 8a1827d83a..fb8fe68835 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs @@ -22,6 +22,10 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml readonly XamlDesignItem _rootItem; internal readonly XamlComponentService _componentService; + internal XamlDocument Document { + get { return _doc; } + } + /// /// Creates a new XamlDesignContext instance. /// diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs index 3d537c51bf..c2474d5efc 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs @@ -67,14 +67,18 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml { XamlComponentService componentService = _designItem.ComponentService; - DesignItem designItem = componentService.GetDesignItem(value); + XamlDesignItem designItem = (XamlDesignItem)componentService.GetDesignItem(value); if (designItem != null) { if (designItem.Parent != null) throw new DesignerException("Cannot set value to design item that already has a parent"); + _property.PropertyValue = designItem.XamlObject; } else { - designItem = componentService.RegisterComponentForDesigner(value); + XamlPropertyValue val = _property.ParentObject.OwnerDocument.CreatePropertyValue(value, _property); + designItem = componentService.RegisterXamlComponentRecursive(val as XamlObject); + _property.PropertyValue = val; } + _property.ValueOnInstance = value; } public override void Reset() diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/themes/generic.xaml b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/themes/generic.xaml index 21cb58e3f7..212137694b 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/themes/generic.xaml +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/themes/generic.xaml @@ -2,6 +2,9 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:src="clr-namespace:ICSharpCode.WpfDesign.Designer" > +