diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs index 14968429b3..b0be8a790e 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs @@ -13,6 +13,7 @@ using System.Windows.Threading; using ICSharpCode.WpfDesign.Adorners; using ICSharpCode.WpfDesign.Designer.Controls; +using ICSharpCode.WpfDesign.Designer.Xaml; namespace ICSharpCode.WpfDesign.Designer { @@ -35,20 +36,28 @@ namespace ICSharpCode.WpfDesign.Designer } } - static void RunHitTest(Visual reference, Point point, HitTestFilterCallback filterCallback, HitTestResultCallback resultCallback) + void RunHitTest(Visual reference, Point point, HitTestFilterCallback filterCallback, HitTestResultCallback resultCallback) { VisualTreeHelper.HitTest(reference, filterCallback, resultCallback, new PointHitTestParameters(point)); } - static HitTestFilterBehavior FilterHitTestInvisibleElements(DependencyObject potentialHitTestTarget) + HitTestFilterBehavior FilterHitTestInvisibleElements(DependencyObject potentialHitTestTarget) { UIElement element = potentialHitTestTarget as UIElement; + if (element != null) { if (!(element.IsHitTestVisible && element.Visibility == Visibility.Visible)) { return HitTestFilterBehavior.ContinueSkipSelfAndChildren; } } + + var designItem = Context.Services.Component.GetDesignItem(element) as XamlDesignItem; + + if (designItem != null && designItem.IsDesignTimeLocked) { + return HitTestFilterBehavior.ContinueSkipSelfAndChildren; + } + return HitTestFilterBehavior.Continue; } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/license.txt b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/license.txt index 5b3df7ad65..194fd7f1e1 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/license.txt +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/license.txt @@ -14,6 +14,7 @@ Copied from the Fugue Icon Library and left unmodified: - Icons.16x16.WpfOutline.EyeClosed.png - Icons.16x16.GuideSnap.png - Icons.16x16.GridSnap.png + - lock.png Copied from the Fugue Icon Library and modified or mashed up with other Fugue Icons or parts taken from them: diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/lock.png b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/lock.png new file mode 100644 index 0000000000..571c16d386 Binary files /dev/null and b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/lock.png differ diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeView.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeView.cs index 1ee8f58adf..2620894f92 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeView.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeView.cs @@ -53,12 +53,34 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView get { return (object)GetValue(RootProperty); } set { SetValue(RootProperty, value); } } + + #region Filtering + + public static readonly DependencyProperty FilterProperty = + DependencyProperty.Register("Filter", typeof(string), typeof(DragTreeView), new PropertyMetadata(OnFilterPropertyChanged)); + + public string Filter { + get { return (string)GetValue(FilterProperty); } + set { SetValue(FilterProperty, value); } + } + + private static void OnFilterPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var ctl = d as DragTreeView; + var ev = ctl.FilterChanged; + if (ev != null) + ev(ctl.Filter); + } + + public event Action FilterChanged; + + public virtual bool ShouldItemBeVisible(DragTreeViewItem dragTreeViewitem) + { + return true; + } - //public object[] SelectedItems - //{ - // get { return Selection.Select(item => item.DataContext).ToArray(); } - //} - + #endregion + protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeViewItem.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeViewItem.cs index 469f097d2a..f510988d2b 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeViewItem.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/DragTreeViewItem.cs @@ -20,10 +20,12 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView { public class DragTreeViewItem : TreeViewItem { + ContentPresenter part_header; + static DragTreeViewItem() { DefaultStyleKeyProperty.OverrideMetadata(typeof(DragTreeViewItem), - new FrameworkPropertyMetadata(typeof(DragTreeViewItem))); + new FrameworkPropertyMetadata(typeof(DragTreeViewItem))); } public DragTreeViewItem() @@ -37,16 +39,35 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView ParentTree = this.GetVisualAncestors().OfType().FirstOrDefault(); if (ParentTree != null) { ParentTree.ItemAttached(this); + ParentTree.FilterChanged += ParentTree_FilterChanged; } } + void ParentTree_FilterChanged(string obj) + { + var v = ParentTree.ShouldItemBeVisible(this); + if (v) + part_header.Visibility = Visibility.Visible; + else + part_header.Visibility = Visibility.Collapsed; + } + void DragTreeViewItem_Unloaded(object sender, RoutedEventArgs e) { if (ParentTree != null) { ParentTree.ItemDetached(this); + ParentTree.FilterChanged -= ParentTree_FilterChanged; } ParentTree = null; } + + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + part_header = GetTemplateChild("PART_Header") as ContentPresenter; + } public new static readonly DependencyProperty IsSelectedProperty = Selector.IsSelectedProperty.AddOwner(typeof(DragTreeViewItem), new FrameworkPropertyMetadata(OnIsSelectedChanged)); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml index 9fccd006d4..0132bebd87 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/Outline.xaml @@ -2,7 +2,8 @@ x:Name="root" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:Default="clr-namespace:ICSharpCode.WpfDesign.Designer.OutlineView"> + xmlns:Default="clr-namespace:ICSharpCode.WpfDesign.Designer.OutlineView" + xmlns:Controls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls"> @@ -34,9 +35,38 @@ + + + ItemsSource="{Binding Children}"> + @@ -44,15 +74,20 @@ - - - - - + + + + + + + + + + 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 ca01d3d1fb..cd88f162bf 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs @@ -2,19 +2,21 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using System.Text; -using System.ComponentModel; -using ICSharpCode.WpfDesign; -using System.Collections.ObjectModel; -using System.Collections; -using ICSharpCode.WpfDesign.Designer; -using ICSharpCode.WpfDesign.XamlDom; using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using ICSharpCode.WpfDesign; +using ICSharpCode.WpfDesign.Designer; +using ICSharpCode.WpfDesign.Designer.Xaml; +using ICSharpCode.WpfDesign.XamlDom; + namespace ICSharpCode.WpfDesign.Designer.OutlineView { public class OutlineNode : INotifyPropertyChanged @@ -50,6 +52,11 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView ((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); @@ -87,10 +94,9 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView value ? SelectionTypes.Add : SelectionTypes.Remove); RaisePropertyChanged("IsSelected"); } - } + } } - bool _isDesignTimeVisible = true; public bool IsDesignTimeVisible @@ -112,6 +118,26 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView } } + 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 { 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 e5d4a3674c..4a646e75c3 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs @@ -33,5 +33,12 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView foreach (var item in items) _customOutlineNodes.Add(item.DataContext as OutlineNode); } + + public override bool ShouldItemBeVisible(DragTreeViewItem dragTreeViewitem) + { + var node = dragTreeViewitem.DataContext as OutlineNode; + + return string.IsNullOrEmpty(Filter) || node.Name.ToLower().Contains(Filter.ToLower()); + } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineView.xaml b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineView.xaml index 9e1cb270b6..6076383cd0 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineView.xaml +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineView.xaml @@ -98,20 +98,20 @@ - - - + @@ -144,7 +144,7 @@ Value="False"> + Value="Collapsed" /> 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 d7ae9ec43d..6d7833b130 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj @@ -361,4 +361,7 @@ + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs index abac9ec74c..1329a5c6bb 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignItem.cs @@ -145,6 +145,23 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml } } + /// + /// Item is Locked at Design Time + /// + public bool IsDesignTimeLocked { + get { + var locked = Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).ValueOnInstance; + return (locked != null && (bool) locked == true); + } + set { + if (value) + Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).SetValue(true); + else + Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).Reset(); + } + + } + public override DesignItem Clone() { DesignItem item = null; diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs index 3b05419726..77f10e970f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs @@ -469,6 +469,8 @@ namespace ICSharpCode.WpfDesign.XamlDom return FindAttachedProperty(typeof(DesignTimeProperties), attribute.LocalName); } else if (attribute.LocalName == "IsHidden" && attribute.NamespaceURI == XamlConstants.DesignTimeNamespace) { return FindAttachedProperty(typeof(DesignTimeProperties), attribute.LocalName); + } else if (attribute.LocalName == "IsLocked" && attribute.NamespaceURI == XamlConstants.DesignTimeNamespace) { + return FindAttachedProperty(typeof(DesignTimeProperties), attribute.LocalName); } return null;