Browse Source

Support editing attached properties in the property grid.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/wpfdesigner@5989 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Kumar Devvrat 16 years ago
parent
commit
f1e2aa28c8
  1. 13
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
  2. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs
  3. 47
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs

13
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs

@ -27,16 +27,18 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid @@ -27,16 +27,18 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
Categories = new ObservableCollection<Category>(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<MemberDescriptor, PropertyNode> nodeFromDescriptor = new Dictionary<MemberDescriptor, PropertyNode>();
@ -192,14 +194,14 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid @@ -192,14 +194,14 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
List<MemberDescriptor> list = new List<MemberDescriptor>();
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 @@ -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;

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

@ -368,7 +368,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -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));

47
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/TypeHelper.cs

@ -67,5 +67,52 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -67,5 +67,52 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
yield return e;
}
}
/// <summary>
/// Gets available properties for an object, includes attached properties also.
/// </summary>
public static IEnumerable<PropertyDescriptor> GetAvailableProperties(object element)
{
foreach(PropertyDescriptor p in TypeDescriptor.GetProperties(element)){
if (!p.IsBrowsable) continue;
if (p.IsReadOnly) continue;
yield return p;
}
}
/// <summary>
/// Gets common properties between <paramref name="elements"/>. Includes attached properties too.
/// </summary>
/// <param name="elements"></param>
/// <returns></returns>
public static IEnumerable<PropertyDescriptor> GetCommonAvailableProperties(IEnumerable<object> 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;
}
}
}
}

Loading…
Cancel
Save