From 2194f1682241722d537657bd81e55654bf789ff6 Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Tue, 24 Sep 2013 18:38:23 +0200 Subject: [PATCH] Xaml Designer: - Support IsLocked Design Time Property - Support Filtering in Outline View --- .../WpfDesign.Designer/Project/DesignPanel.cs | 13 +++- .../Project/Images/license.txt | 1 + .../Project/Images/lock.png | Bin 0 -> 1535 bytes .../Project/OutlineView/DragTreeView.cs | 32 ++++++++-- .../Project/OutlineView/DragTreeViewItem.cs | 23 ++++++- .../Project/OutlineView/Outline.xaml | 59 ++++++++++++++---- .../Project/OutlineView/OutlineNode.cs | 42 ++++++++++--- .../Project/OutlineView/OutlineTreeView.cs | 7 +++ .../Project/OutlineView/OutlineView.xaml | 12 ++-- .../Project/WpfDesign.Designer.csproj | 3 + .../Project/Xaml/XamlDesignItem.cs | 17 +++++ .../WpfDesign.XamlDom/Project/XamlParser.cs | 2 + 12 files changed, 177 insertions(+), 34 deletions(-) create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Images/lock.png 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 0000000000000000000000000000000000000000..571c16d386fed9c3bc340307493c801b2a58fe9e GIT binary patch literal 1535 zcmaJ>dr%a09KR3+QA(6C4Z(GNj2&{jdwa*-o}9Q3PA)m5yK6XK$a43CTaUZFb{B4e zCY1&ZrO|w(mZLQ?rIn0K;V>40X_nw?2rW>@$7E4BW2vc$kMg^}2GE9~-T#|z?ltQckRHTP50Fc$s76Ch8 zJ!Nm60BI`K2##~QB$qAA@N<8CfN-4>zb5#cpHJCeu(5V z!%v-Z*>WJ77XYN!peb%N6@^kU4TkFs2E!aki()8(Y7tDEf*DM>)`X(azymAR1W%#K z&R7O)DJwJVm875vK|-OBCWLEvp$NeUf(UD9wJ8cBMJx+Qteg@Mrw=MHKy(XSP~!Li z6jo#l_!7wsE1o_L!5_49MP5l95)X(2$x_mW$ZQb7G$kX(uM-6hV0a0QDZZOE@o^kQ#a!s@V zScw;$JYPK63^`t2;zchXglGp2<#GWJ9}>fLQoIWL2?VYbcq{_%hx$`y;)Yo-DN#(5 zG-lCe7;#*yBN+>ZktAiL^*DhtMm?pcaCm^|85VLsktP^iN2I3eNStPrh$+-aQWQm7 zESN!y=~H1uaRUkW$FP1G+)|n_JRRzOWifPrKtM^ipxllo>Z(JfikM?%NT=LgxA}~3 z0vZ293%=u0AnRbab1ySTj@!EKV+L8-xrBTWCI9$|95<4D$t<6H=jBD$Y~<_XI@ecL z=Hw)(*F}!ppB|GjqM`az?3m7G=$bnDvhJhp#}>A(LB1`+Z#JK)nA={r<^JxOFsU5;J8lRwJdLQMy&xM`b2{{YS!_~X}i^L|NGb7hFdo-Ha~IQID72= z$)m|!cj=5Phw{Cj7n9t2&+(kX$B!yC!8~hM+h?ac6XWvFzEu-DtwmFVRZI0r^;KtPnBdWmspLc%vM&4DhuzFA2D17gdf0lap5DA?P{>E929XH{~we+^6rd=1+#y;#` z*~C9DOB{zwMTC+i(fx6!g=)U?Cs;Lvi9Fj{F*QL+jwa7gF9PSMIUYsEWFaR ze_C7K=-HNo)lD0HX29QA#z!KzI#^p}`-U0g`_30P=T_cXv~OSJy&h|gly~iXa`l7@ z*rbHSs-n5Un%0>S+oB)zE$@l?6jUZ^>{8lp<-V|^3w03cPzf{NU!aBlu_ 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;