diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj
index 088d5066b6..80ced74cdb 100644
--- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj
+++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj
@@ -54,6 +54,7 @@
+
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml.cs
index 25043cbff7..754849fd7a 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml.cs
@@ -25,10 +25,11 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView
}
public static readonly DependencyProperty RootProperty =
- DependencyProperty.Register("Root", typeof(OutlineNode), typeof(Outline));
+ DependencyProperty.Register("Root", typeof(IOutlineNode), typeof(Outline));
- public OutlineNode Root {
- get { return (OutlineNode)GetValue(RootProperty); }
+ public IOutlineNode Root
+ {
+ get { return (IOutlineNode)GetValue(RootProperty); }
set { SetValue(RootProperty, value); }
}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs
index f3e03c08ba..5508d1a1ed 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs
@@ -19,249 +19,101 @@ using ICSharpCode.WpfDesign.XamlDom;
namespace ICSharpCode.WpfDesign.Designer.OutlineView
{
- public class OutlineNode : INotifyPropertyChanged
- {
- //Used to check if element can enter other containers
- public static PlacementType DummyPlacementType;
-
- static OutlineNode()
- {
- DummyPlacementType = PlacementType.Register("DummyPlacement");
- }
- public static OutlineNode Create(DesignItem designItem)
- {
- OutlineNode node;
- if (!outlineNodes.TryGetValue(designItem, out node)) {
- node = new OutlineNode(designItem);
- outlineNodes[designItem] = node;
- }
- return node;
- }
-
- //TODO: Reset with DesignContext
- static Dictionary outlineNodes = new Dictionary();
-
- OutlineNode(DesignItem designItem)
- {
- DesignItem = designItem;
- UpdateChildren();
-
- var hidden = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).ValueOnInstance;
- if (hidden != null && (bool) hidden == true) {
- this._isDesignTimeVisible = false;
- ((FrameworkElement) this.DesignItem.Component).Visibility = Visibility.Hidden;
- }
-
- var locked = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).ValueOnInstance;
- if (locked != null && (bool) locked == true) {
- this._isDesignTimeLocked = true;
- }
-
- //TODO
- DesignItem.NameChanged += new EventHandler(DesignItem_NameChanged);
- DesignItem.PropertyChanged += new PropertyChangedEventHandler(DesignItem_PropertyChanged);
- SelectionService.SelectionChanged += new EventHandler(Selection_SelectionChanged);
- }
-
- public DesignItem DesignItem { get; private set; }
-
- public ISelectionService SelectionService {
- get { return DesignItem.Services.Selection; }
- }
-
- bool isExpanded = true;
-
- public bool IsExpanded {
- get {
- return isExpanded;
- }
- set {
- isExpanded = value;
- RaisePropertyChanged("IsExpanded");
- }
- }
-
- bool isSelected;
-
- public bool IsSelected {
- get {
- return isSelected;
- }
- set {
- if (isSelected != value) {
- isSelected = value;
- SelectionService.SetSelectedComponents(new[] { DesignItem },
- value ? SelectionTypes.Add : SelectionTypes.Remove);
- RaisePropertyChanged("IsSelected");
- }
- }
- }
-
- bool _isDesignTimeVisible = true;
-
- public bool IsDesignTimeVisible
- {
- get {
- return _isDesignTimeVisible;
- }
- set {
- _isDesignTimeVisible = value;
- var ctl = DesignItem.Component as UIElement;
- ctl.Visibility = _isDesignTimeVisible ? Visibility.Visible : Visibility.Hidden;
-
- RaisePropertyChanged("IsDesignTimeVisible");
-
- if (!value)
- DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).SetValue(true);
- else
- DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).Reset();
- }
- }
-
- bool _isDesignTimeLocked = false;
-
- public bool IsDesignTimeLocked
- {
- get {
- return _isDesignTimeLocked;
- }
- set {
- _isDesignTimeLocked = value;
- ((XamlDesignItem)DesignItem).IsDesignTimeLocked = _isDesignTimeLocked;
-
- RaisePropertyChanged("IsDesignTimeLocked");
-
-// if (value)
-// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).SetValue(true);
-// else
-// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).Reset();
- }
- }
-
- ObservableCollection children = new ObservableCollection();
-
- public ObservableCollection Children {
- get { return children; }
- }
-
- public string Name {
- get {
- if (string.IsNullOrEmpty(DesignItem.Name)) {
- return DesignItem.ComponentType.Name;
- }
- return DesignItem.ComponentType.Name + " (" + DesignItem.Name + ")";
- }
- }
-
- void Selection_SelectionChanged(object sender, DesignItemCollectionEventArgs e)
- {
- IsSelected = DesignItem.Services.Selection.IsComponentSelected(DesignItem);
- }
-
- void DesignItem_NameChanged(object sender, EventArgs e)
- {
- RaisePropertyChanged("Name");
- }
-
- void DesignItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
- {
- if (e.PropertyName == DesignItem.ContentPropertyName) {
- UpdateChildren();
- }
- }
-
- void UpdateChildren()
- {
- Children.Clear();
-
- if (DesignItem.ContentPropertyName != null) {
- var content = DesignItem.ContentProperty;
- if (content.IsCollection) {
- UpdateChildrenCore(content.CollectionElements);
- }
- else {
- if (content.Value != null) {
- UpdateChildrenCore(new[] { content.Value });
- }
- }
- }
- }
-
- void UpdateChildrenCore(IEnumerable items)
- {
- foreach (var item in items) {
- if (ModelTools.CanSelectComponent(item)) {
- var node = OutlineNode.Create(item);
- Children.Add(node);
- }
- else
- {
- var content = item.ContentProperty;
- if (content != null)
- {
- if (content.IsCollection) {
- UpdateChildrenCore(content.CollectionElements);
- }
- else {
- if (content.Value != null) {
- UpdateChildrenCore(new[] { content.Value });
- }
- }
- }
- }
- }
- }
-
- public bool CanInsert(IEnumerable nodes, OutlineNode after, bool copy)
- {
- var placementBehavior = DesignItem.GetBehavior();
- if (placementBehavior == null)
- return false;
- var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType);
- if (operation != null) {
- bool canEnter = placementBehavior.CanEnterContainer(operation, true);
- operation.Abort();
- return canEnter;
- }
- return false;
- }
-
- public void Insert(IEnumerable nodes, OutlineNode after, bool copy)
- {
- using (var moveTransaction = DesignItem.Context.OpenGroup("Item moved in outline view", nodes.Select(n => n.DesignItem).ToList())) {
- if (copy) {
- nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone())).ToList();
- } else {
- foreach (var node in nodes) {
- node.DesignItem.Remove();
- }
- }
-
- var index = after == null ? 0 : Children.IndexOf(after) + 1;
-
- var content = DesignItem.ContentProperty;
- if (content.IsCollection) {
- foreach (var node in nodes) {
- content.CollectionElements.Insert(index++, node.DesignItem);
- }
- } else {
- content.SetValue(nodes.First().DesignItem);
- }
- moveTransaction.Commit();
- }
- }
-
- #region INotifyPropertyChanged Members
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- void RaisePropertyChanged(string name)
- {
- if (PropertyChanged != null) {
- PropertyChanged(this, new PropertyChangedEventArgs(name));
- }
- }
-
- #endregion
- }
-}
+ public interface IOutlineNode
+ {
+ ISelectionService SelectionService { get; }
+ bool IsExpanded { get; set; }
+ DesignItem DesignItem { get; set; }
+ bool IsSelected { get; set; }
+ bool IsDesignTimeVisible { get; set; }
+ bool IsDesignTimeLocked { get; }
+ string Name { get; }
+ bool CanInsert(IEnumerable nodes, IOutlineNode after, bool copy);
+ void Insert(IEnumerable nodes, IOutlineNode after, bool copy);
+ }
+
+
+ public class OutlineNode: OutlineNodeBase
+ {
+ //TODO: Reset with DesignContext
+ static Dictionary outlineNodes = new Dictionary();
+
+ protected OutlineNode(DesignItem designitem): base(designitem)
+ {
+ UpdateChildren();
+ SelectionService.SelectionChanged += new EventHandler(Selection_SelectionChanged);
+ }
+
+ static OutlineNode()
+ {
+ DummyPlacementType = PlacementType.Register("DummyPlacement");
+ }
+
+ public static IOutlineNode Create(DesignItem designItem)
+ {
+ IOutlineNode node;
+ if (!outlineNodes.TryGetValue(designItem, out node))
+ {
+ node = new OutlineNode(designItem);
+ outlineNodes[designItem] = node;
+ }
+ return node;
+ }
+
+ void Selection_SelectionChanged(object sender, DesignItemCollectionEventArgs e)
+ {
+ IsSelected = DesignItem.Services.Selection.IsComponentSelected(DesignItem);
+ }
+
+ protected override void UpdateChildren()
+ {
+ Children.Clear();
+
+ if (DesignItem.ContentPropertyName != null)
+ {
+ var content = DesignItem.ContentProperty;
+ if (content.IsCollection)
+ {
+ UpdateChildrenCore(content.CollectionElements);
+ }
+ else
+ {
+ if (content.Value != null)
+ {
+ UpdateChildrenCore(new[] { content.Value });
+ }
+ }
+ }
+ }
+
+ void UpdateChildrenCore(IEnumerable items)
+ {
+ foreach (var item in items)
+ {
+ if (ModelTools.CanSelectComponent(item))
+ {
+ var node = OutlineNode.Create(item);
+ Children.Add(node);
+ }
+ else
+ {
+ var content = item.ContentProperty;
+ if (content != null)
+ {
+ if (content.IsCollection)
+ {
+ UpdateChildrenCore(content.CollectionElements);
+ }
+ else
+ {
+ if (content.Value != null)
+ {
+ UpdateChildrenCore(new[] { content.Value });
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNodeBase.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNodeBase.cs
new file mode 100644
index 0000000000..2e807f6967
--- /dev/null
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNodeBase.cs
@@ -0,0 +1,239 @@
+/*
+ * Created by SharpDevelop.
+ * User: trubra
+ * Date: 2014-01-28
+ * Time: 10:09
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Windows;
+using System.Linq;
+using ICSharpCode.WpfDesign.Designer.Xaml;
+using ICSharpCode.WpfDesign.XamlDom;
+
+namespace ICSharpCode.WpfDesign.Designer.OutlineView
+{
+ ///
+ /// Description of OutlineNodeBase.
+ ///
+ public abstract class OutlineNodeBase : INotifyPropertyChanged, IOutlineNode
+ {
+
+ protected abstract void UpdateChildren();
+ //Used to check if element can enter other containers
+ protected static PlacementType DummyPlacementType;
+
+ protected OutlineNodeBase(DesignItem designItem)
+ {
+ DesignItem = designItem;
+
+
+ var hidden = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).ValueOnInstance;
+ if (hidden != null && (bool)hidden)
+ {
+ _isDesignTimeVisible = false;
+ ((FrameworkElement)DesignItem.Component).Visibility = Visibility.Hidden;
+ }
+
+ var locked = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).ValueOnInstance;
+ if (locked != null && (bool)locked)
+ {
+ _isDesignTimeLocked = true;
+ }
+
+ //TODO
+
+ DesignItem.NameChanged += new EventHandler(DesignItem_NameChanged);
+ DesignItem.PropertyChanged += new PropertyChangedEventHandler(DesignItem_PropertyChanged);
+ }
+
+ public DesignItem DesignItem { get; set; }
+
+ public ISelectionService SelectionService
+ {
+ get { return DesignItem.Services.Selection; }
+ }
+
+ bool isExpanded = true;
+
+ public bool IsExpanded
+ {
+ get
+ {
+ return isExpanded;
+ }
+ set
+ {
+ isExpanded = value;
+ RaisePropertyChanged("IsExpanded");
+ }
+ }
+
+ bool isSelected;
+
+ public bool IsSelected
+ {
+ get
+ {
+ return isSelected;
+ }
+ set
+ {
+ if (isSelected != value)
+ {
+ isSelected = value;
+ SelectionService.SetSelectedComponents(new[] { DesignItem },
+ value ? SelectionTypes.Add : SelectionTypes.Remove);
+ RaisePropertyChanged("IsSelected");
+ }
+ }
+ }
+
+ bool _isDesignTimeVisible = true;
+
+ public bool IsDesignTimeVisible
+ {
+ get
+ {
+ return _isDesignTimeVisible;
+ }
+ set
+ {
+ _isDesignTimeVisible = value;
+ var ctl = DesignItem.Component as UIElement;
+ if(ctl!=null)
+ ctl.Visibility = _isDesignTimeVisible ? Visibility.Visible : Visibility.Hidden;
+
+ RaisePropertyChanged("IsDesignTimeVisible");
+
+ if (!value)
+ DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).SetValue(true);
+ else
+ DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).Reset();
+ }
+ }
+
+ bool _isDesignTimeLocked = false;
+
+ public bool IsDesignTimeLocked
+ {
+ get
+ {
+ return _isDesignTimeLocked;
+ }
+ set
+ {
+ _isDesignTimeLocked = value;
+ ((XamlDesignItem)DesignItem).IsDesignTimeLocked = _isDesignTimeLocked;
+
+ RaisePropertyChanged("IsDesignTimeLocked");
+
+ // if (value)
+ // DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).SetValue(true);
+ // else
+ // DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).Reset();
+ }
+ }
+
+ ObservableCollection children = new ObservableCollection();
+
+ public ObservableCollection Children
+ {
+ get { return children; }
+ }
+
+ public string Name
+ {
+ get
+ {
+ if (string.IsNullOrEmpty(DesignItem.Name))
+ {
+ return DesignItem.ComponentType.Name;
+ }
+ return DesignItem.ComponentType.Name + " (" + DesignItem.Name + ")";
+ }
+ }
+
+ void DesignItem_NameChanged(object sender, EventArgs e)
+ {
+ RaisePropertyChanged("Name");
+ }
+
+ void DesignItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == DesignItem.ContentPropertyName)
+ {
+ UpdateChildren();
+ }
+ }
+
+
+
+ public bool CanInsert(IEnumerable nodes, IOutlineNode after, bool copy)
+ {
+ var placementBehavior = DesignItem.GetBehavior();
+ if (placementBehavior == null)
+ return false;
+ var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType);
+ if (operation != null)
+ {
+ bool canEnter = placementBehavior.CanEnterContainer(operation, true);
+ operation.Abort();
+ return canEnter;
+ }
+ return false;
+ }
+
+ public virtual void Insert(IEnumerable nodes, IOutlineNode after, bool copy)
+ {
+ using (var moveTransaction = DesignItem.Context.OpenGroup("Item moved in outline view", nodes.Select(n => n.DesignItem).ToList()))
+ {
+ if (copy)
+ {
+ nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone())).ToList();
+ }
+ else
+ {
+ foreach (var node in nodes)
+ {
+ node.DesignItem.Remove();
+ }
+ }
+
+ var index = after == null ? 0 : Children.IndexOf(after) + 1;
+
+ var content = DesignItem.ContentProperty;
+ if (content.IsCollection)
+ {
+ foreach (var node in nodes)
+ {
+ content.CollectionElements.Insert(index++, node.DesignItem);
+ }
+ }
+ else
+ {
+ content.SetValue(nodes.First().DesignItem);
+ }
+ moveTransaction.Commit();
+ }
+ }
+
+ #region INotifyPropertyChanged Members
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public void RaisePropertyChanged(string name)
+ {
+ if (PropertyChanged != null)
+ {
+ PropertyChanged(this, new PropertyChangedEventArgs(name));
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/CollectionEditor.xaml.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/CollectionEditor.xaml.cs
index 57e1b3ccb7..0313d7dc0b 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/CollectionEditor.xaml.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/CollectionEditor.xaml.cs
@@ -49,7 +49,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors
if(control!=null){
TypeMappings.TryGetValue(control.GetType(), out _type);
if (_type != null) {
- OutlineNode node = OutlineNode.Create(item);
+ IOutlineNode node = OutlineNode.Create(item);
Outline.Root = node;
PropertyGridView.PropertyGrid.SelectedItems = item.Services.Selection.SelectedItems;
}
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 b4a6d06841..bb7003011d 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
@@ -45,13 +45,13 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
public CategoriesCollection Categories { get; private set; }
public PropertyNodeCollection Events { get; private set; }
- public EventHandler AggregatePropertiesUpdated { get; set; }
+ public event EventHandler AggregatePropertiesUpdated;
private PropertyGridGroupMode _groupMode;
public PropertyGridGroupMode GroupMode
{
- get { return _groupMode; }
+ get { return _groupMode; }
set
{
if (_groupMode != value)
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs
index 5716300d9e..0ac05437a8 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs
@@ -146,7 +146,7 @@ namespace ICSharpCode.WpfDesign.Designer.Services
{
CreateComponentTool cct = new CreateComponentTool(createdItem);
return AddItemWithCustomSize(container, cct.CreateItem(container.Context), position, size);
- }
+ }
public static bool AddItemWithDefaultSize(DesignItem container, Type createdItem, Size size)
{
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 a335f5f1f6..53a407d42d 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
@@ -87,6 +87,7 @@
+
FlatCollectionEditor.xaml
Code