diff --git a/samples/XamlDesigner/Document.cs b/samples/XamlDesigner/Document.cs index 21a28e35e5..1079edf0a4 100644 --- a/samples/XamlDesigner/Document.cs +++ b/samples/XamlDesigner/Document.cs @@ -153,9 +153,9 @@ namespace ICSharpCode.XamlDesigner } } - OutlineNode outlineRoot; + IOutlineNode outlineRoot; - public OutlineNode OutlineRoot { + public IOutlineNode OutlineRoot { get { return outlineRoot; } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj index 1b41ab422d..366aa3a811 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/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs index 85d3229f24..344e9b5578 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs @@ -109,14 +109,17 @@ namespace ICSharpCode.WpfDesign.Designer return; } // First try hit-testing on the adorner layer. - + bool continueHitTest = true; - + + HitTestFilterCallback filterBehavior = CustomHitTestFilterBehavior ?? FilterHitTestInvisibleElements; + CustomHitTestFilterBehavior = null; hitTestElements.Clear(); if (testAdorners) { + RunHitTest( - _adornerLayer, mousePosition, FilterHitTestInvisibleElements, + _adornerLayer, mousePosition, filterBehavior, delegate(HitTestResult result) { if (result != null && result.VisualHit != null && result.VisualHit is Visual) { DesignPanelHitTestResult customResult = new DesignPanelHitTestResult((Visual)result.VisualHit); @@ -135,14 +138,14 @@ namespace ICSharpCode.WpfDesign.Designer } }); } - + if (continueHitTest && testDesignSurface) { RunHitTest( - this.Child, mousePosition, FilterHitTestInvisibleElements, + this.Child, mousePosition, filterBehavior, delegate(HitTestResult result) { if (result != null && result.VisualHit != null && result.VisualHit is Visual) { DesignPanelHitTestResult customResult = new DesignPanelHitTestResult((Visual)result.VisualHit); - + ViewService viewService = _context.Services.View; DependencyObject obj = result.VisualHit; @@ -210,6 +213,8 @@ namespace ICSharpCode.WpfDesign.Designer #region Properties + //Set custom HitTestFilterCallbak + public HitTestFilterCallback CustomHitTestFilterBehavior { get; set; } /// /// Gets/Sets the design context. /// 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 da541a9cf3..43f5702af4 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 @@ -40,10 +40,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 844ebd0d03..261d1b47e5 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs @@ -34,138 +34,45 @@ using ICSharpCode.WpfDesign.XamlDom; namespace ICSharpCode.WpfDesign.Designer.OutlineView { - public class OutlineNode : INotifyPropertyChanged + public interface IOutlineNode { - //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; - } + 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); + ObservableCollection Children{ get; } + } + + public class OutlineNode: OutlineNodeBase + { //TODO: Reset with DesignContext - static Dictionary outlineNodes = new Dictionary(); + static Dictionary outlineNodes = new Dictionary(); - OutlineNode(DesignItem designItem) + protected OutlineNode(DesignItem designitem): base(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 + static OutlineNode() { - 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(); - } + DummyPlacementType = PlacementType.Register("DummyPlacement"); } - bool _isDesignTimeLocked = false; - - public bool IsDesignTimeLocked + public static IOutlineNode Create(DesignItem designItem) { - 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 + ")"; + IOutlineNode node; + if (!outlineNodes.TryGetValue(designItem, out node)) { + node = new OutlineNode(designItem); + outlineNodes[designItem] = node; } + return node; } void Selection_SelectionChanged(object sender, DesignItemCollectionEventArgs e) @@ -173,19 +80,7 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView 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() + protected override void UpdateChildren() { Children.Clear(); @@ -193,8 +88,7 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView var content = DesignItem.ContentProperty; if (content.IsCollection) { UpdateChildrenCore(content.CollectionElements); - } - else { + } else { if (content.Value != null) { UpdateChildrenCore(new[] { content.Value }); } @@ -208,16 +102,12 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView if (ModelTools.CanSelectComponent(item)) { var node = OutlineNode.Create(item); Children.Add(node); - } - else - { + } else { var content = item.ContentProperty; - if (content != null) - { + if (content != null) { if (content.IsCollection) { UpdateChildrenCore(content.CollectionElements); - } - else { + } else { if (content.Value != null) { UpdateChildrenCore(new[] { content.Value }); } @@ -226,57 +116,5 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView } } } - - 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 } } 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..648b4097ec --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNodeBase.cs @@ -0,0 +1,225 @@ +/* + * 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/OutlineView/OutlineTreeView.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs index ffbd1347aa..30d9a974b5 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs @@ -28,30 +28,30 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView protected override bool CanInsert(DragTreeViewItem target, DragTreeViewItem[] items, DragTreeViewItem after, bool copy) { UpdateCustomNodes(items); - return (target.DataContext as OutlineNode).CanInsert(_customOutlineNodes, - after == null ? null : after.DataContext as OutlineNode, copy); + return (target.DataContext as IOutlineNode).CanInsert(_customOutlineNodes, + after == null ? null : after.DataContext as IOutlineNode, copy); } protected override void Insert(DragTreeViewItem target, DragTreeViewItem[] items, DragTreeViewItem after, bool copy) { UpdateCustomNodes(items); - (target.DataContext as OutlineNode).Insert(_customOutlineNodes, - after == null ? null : after.DataContext as OutlineNode, copy); + (target.DataContext as IOutlineNode).Insert(_customOutlineNodes, + after == null ? null : after.DataContext as IOutlineNode, copy); } // Need to do this through a seperate List since previously LINQ queries apparently disconnected DataContext;bug in .NET 4.0 - private List _customOutlineNodes; + private List _customOutlineNodes; void UpdateCustomNodes(IEnumerable items) { - _customOutlineNodes = new List(); + _customOutlineNodes = new List(); foreach (var item in items) - _customOutlineNodes.Add(item.DataContext as OutlineNode); + _customOutlineNodes.Add(item.DataContext as IOutlineNode); } public override bool ShouldItemBeVisible(DragTreeViewItem dragTreeViewitem) { - var node = dragTreeViewitem.DataContext as OutlineNode; + var node = dragTreeViewitem.DataContext as IOutlineNode; return string.IsNullOrEmpty(Filter) || node.Name.ToLower().Contains(Filter.ToLower()); } @@ -60,7 +60,7 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView { base.SelectOnly(item); - var node = item.DataContext as OutlineNode; + var node = item.DataContext as IOutlineNode; var surface = node.DesignItem.View.TryFindParent(); if (surface != null) 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 420cc02c4e..e592e37cf2 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 @@ -64,7 +64,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 290ba2f121..fcde434017 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs @@ -227,7 +227,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid if (selectedItems == null || selectedItems.Count == 0) return; if (selectedItems.Count == 1) SingleItem = selectedItems[0]; - + foreach (var md in GetDescriptors()) { if (PassesFilter(md.Name)) AddNode(md); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.cs index c213b05690..a854a6e943 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.cs @@ -42,7 +42,6 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid DefaultStyleKeyProperty.OverrideMetadata(typeof(PropertyGridView), new FrameworkPropertyMetadata(typeof(PropertyGridView))); } - public PropertyGridView() : this(null) { } 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 c066d06222..21df7aedcf 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/CreateComponentTool.cs @@ -157,9 +157,26 @@ namespace ICSharpCode.WpfDesign.Designer.Services return item; } + public static bool AddItemWithCustomSizePosition(DesignItem container, Type createdItem, Size size, Point position) + { + CreateComponentTool cct = new CreateComponentTool(createdItem); + return AddItemWithCustomSize(container, cct.CreateItem(container.Context), position, size); + } + + public static bool AddItemWithDefaultSize(DesignItem container, Type createdItem, Size size) + { + CreateComponentTool cct = new CreateComponentTool(createdItem); + return AddItemWithCustomSize(container, cct.CreateItem(container.Context), new Point(0, 0), size); + } + internal static bool AddItemWithDefaultSize(DesignItem container, DesignItem createdItem, Point position) { - var size = ModelTools.GetDefaultSize(createdItem); + return AddItemWithCustomSize(container, createdItem, position, ModelTools.GetDefaultSize(createdItem)); + } + + internal static bool AddItemWithCustomSize(DesignItem container, DesignItem createdItem, Point position, Size size) + { + PlacementOperation operation = PlacementOperation.TryStartInsertNewComponents( container, new DesignItem[] { createdItem }, diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ToolService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ToolService.cs index 63a450f196..1837bc404d 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ToolService.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ToolService.cs @@ -18,7 +18,7 @@ using System; using System.Windows.Input; - +using System.Windows.Media; namespace ICSharpCode.WpfDesign.Designer.Services { // See IToolService for description. @@ -37,6 +37,11 @@ namespace ICSharpCode.WpfDesign.Designer.Services }); } + public HitTestFilterCallback DesignPanelHitTestFilterCallback + { + set{ _designPanel.CustomHitTestFilterBehavior = value; } + } + public void Dispose() { if (_designPanel != null) { 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 ee6c301f7f..5b38b78d68 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj @@ -90,6 +90,7 @@ + RightClickMultipleItemsContextMenu.xaml diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/HierarchyTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/HierarchyTests.cs index fd1e76ea4e..7a0a7cdcb3 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/HierarchyTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/HierarchyTests.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.WpfDesign.Tests.Designer.OutlineView public class HierarchyTests : ModelTestHelper { private DesignItem _grid; - private OutlineNode _outline; + private IOutlineNode _outline; [TestFixtureSetUp] public void Intialize() diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/InsertTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/InsertTests.cs index 542b353bb0..d91fcb011c 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/InsertTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/InsertTests.cs @@ -26,15 +26,15 @@ namespace ICSharpCode.WpfDesign.Tests.Designer.OutlineView public class CollectionElementsInsertTests : ModelTestHelper { private DesignItem _grid; - private OutlineNode _outline; + private IOutlineNode _outline; private DesignItem _gridButton; private DesignItem _stackPanel; private DesignItem _stackPanelButton; - private OutlineNode _gridButtonNode; - private OutlineNode _stackPanelNode; - private OutlineNode _stackPanelButtonNode; + private IOutlineNode _gridButtonNode; + private IOutlineNode _stackPanelNode; + private IOutlineNode _stackPanelButtonNode; [SetUp] public void Intialize() @@ -162,15 +162,15 @@ namespace ICSharpCode.WpfDesign.Tests.Designer.OutlineView public class ContentControlInsertTests : ModelTestHelper { private DesignItem _grid; - private OutlineNode _outline; + private IOutlineNode _outline; private DesignItem _gridButton; private DesignItem _stackPanel; private DesignItem _stackPanelImage; - private OutlineNode _gridButtonNode; - private OutlineNode _stackPanelNode; - private OutlineNode _stackPanelImageNode; + private IOutlineNode _gridButtonNode; + private IOutlineNode _stackPanelNode; + private IOutlineNode _stackPanelImageNode; [SetUp] public void Intialize() diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/SelectionTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/SelectionTests.cs index 9d3c37d7c5..849687a48b 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/SelectionTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/OutlineView/SelectionTests.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.WpfDesign.Tests.Designer.OutlineView public class SelectionTests : ModelTestHelper { private DesignItem _grid; - private OutlineNode _outline; + private IOutlineNode _outline; [SetUp] public void Intialize() diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs index bb23a64926..a799c1f84e 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Tools.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using System.Windows.Media; using ICSharpCode.WpfDesign.Adorners; @@ -53,6 +54,10 @@ namespace ICSharpCode.WpfDesign /// public interface IToolService { + /// + /// Set custom HitTestFilterCallback for DesignPanel + /// + HitTestFilterCallback DesignPanelHitTestFilterCallback{ set; } /// /// Gets the 'pointer' tool. /// The pointer tool is the default tool for selecting and moving elements. @@ -77,6 +82,10 @@ namespace ICSharpCode.WpfDesign public interface IDesignPanel : IInputElement { /// + /// Set a custom filter callback so that any element can be filtered out + /// + HitTestFilterCallback CustomHitTestFilterBehavior { get; set; } + /// /// Gets the design context used by the DesignPanel. /// DesignContext Context { get; }