From f1e2aa28c8b9f73da3fbdc50c4a0687eca74daab Mon Sep 17 00:00:00 2001 From: Kumar Devvrat Date: Wed, 23 Jun 2010 23:21:05 +0000 Subject: [PATCH] Support editing attached properties in the property grid. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/wpfdesigner@5989 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/PropertyGrid/PropertyGrid.cs | 13 +++-- .../Project/PropertyGrid/PropertyNode.cs | 2 +- .../Project/PropertyGrid/TypeHelper.cs | 47 +++++++++++++++++++ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs index bdbbcc044b..6a59432b6b 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs @@ -27,16 +27,18 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid { Categories = new ObservableCollection(new [] { specialCategory, - popularCategory, - otherCategory + popularCategory, + otherCategory, + attachedCategory }); Events = new PropertyNodeCollection(); } Category specialCategory = new Category("Special"); - Category popularCategory = new Category("Popular"); + Category popularCategory = new Category("Popular"); Category otherCategory = new Category("Other"); + Category attachedCategory = new Category("Attached"); Dictionary nodeFromDescriptor = new Dictionary(); @@ -192,14 +194,14 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid List list = new List(); if (SelectedItems.Count() == 1) { - foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.ComponentType)) { + foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.Component)) { list.Add(d); } foreach (MemberDescriptor d in TypeHelper.GetAvailableEvents(SingleItem.ComponentType)) { list.Add(d); } } else { - foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.ComponentType))) { + foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.Component))) { list.Add(d); } } @@ -248,6 +250,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid Category PickCategory(PropertyNode node) { if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory; + if (node.FirstProperty.Name.Contains(".")) return attachedCategory; var typeName = node.FirstProperty.DeclaringType.FullName; if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls.")) return otherCategory; diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs index 293cdeea25..9f48fd8895 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs @@ -368,7 +368,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid if (Parent == null || Parent.IsExpanded) { if (ValueItem != null) { - var list = TypeHelper.GetAvailableProperties(ValueItem.ComponentType) + var list = TypeHelper.GetAvailableProperties(ValueItem.Component) .OrderBy(d => d.Name) .Select(d => new PropertyNode(new[] { ValueItem.Properties[d.Name] }, this)); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs index 4b49da22e4..6e8cb9314f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs @@ -67,5 +67,52 @@ namespace ICSharpCode.WpfDesign.PropertyGrid yield return e; } } + + /// + /// Gets available properties for an object, includes attached properties also. + /// + public static IEnumerable GetAvailableProperties(object element) + { + foreach(PropertyDescriptor p in TypeDescriptor.GetProperties(element)){ + if (!p.IsBrowsable) continue; + if (p.IsReadOnly) continue; + yield return p; + } + } + + /// + /// Gets common properties between . Includes attached properties too. + /// + /// + /// + public static IEnumerable GetCommonAvailableProperties(IEnumerable elements) + { + foreach (var pd1 in GetAvailableProperties(elements.First())) { + bool propertyOk = true; + foreach (var element in elements.Skip(1)) { + bool typeOk = false; + foreach (var pd2 in GetAvailableProperties(element)) { + if (pd1 == pd2) { + typeOk = true; + break; + } + + /* Check if it is attached property.*/ + if(pd1.Name.Contains(".") && pd2.Name.Contains(".")){ + if(pd1.Name==pd2.Name){ + typeOk=true; + break; + } + } + } + if (!typeOk) { + propertyOk = false; + break; + } + } + if (propertyOk) yield return pd1; + } + } + } }