diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs index 14968429b3..b7af3ec784 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,29 @@ 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/DesignSurface.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs index ffbf2246d3..0de7db3e29 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.WpfDesign.Designer /// [TemplatePart(Name = "PART_DesignContent", Type = typeof(ContentControl))] [TemplatePart(Name = "PART_Zoom", Type = typeof(ZoomControl))] - public class DesignSurface : ContentControl + public partial class DesignSurface : ContentControl { private FocusNavigator _focusNav; @@ -73,10 +73,21 @@ namespace ICSharpCode.WpfDesign.Designer base.OnApplyTemplate(); } + + private bool enableBringIntoView = false; + + public void ScrollIntoView(DesignItem designItem) + { + enableBringIntoView = true; + LogicalTreeHelper.BringIntoView(designItem.View); + enableBringIntoView = false; + } void _partDesignContent_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e) { - e.Handled = true; + if (!enableBringIntoView) + e.Handled = true; + enableBringIntoView = false; } protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/ResizeThumbExtension.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/ResizeThumbExtension.cs index d0e4adc1c1..8229a351b6 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/ResizeThumbExtension.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/ResizeThumbExtension.cs @@ -147,6 +147,15 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions if (alignment.Vertical == VerticalAlignment.Bottom) dy = drag.Delta.Y; var designPanel = ExtendedItem.Services.DesignPanel as DesignPanel; + + if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && alignment.Horizontal != HorizontalAlignment.Center && alignment.Vertical != VerticalAlignment.Center) + { + if (dx > dy) + dx = dy; + else + dy = dx; + } + if (zoom != null) { dx = dx * (1 / zoom.CurrentZoom); 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..ac121b1bbd 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); @@ -261,7 +283,7 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView OnSelectionChanged(); } - void SelectOnly(DragTreeViewItem item) + protected virtual void SelectOnly(DragTreeViewItem item) { ClearSelection(); Select(item); 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..f3e03c08ba 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); @@ -90,13 +97,12 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView } } - bool _isDesignTimeVisible = true; public bool IsDesignTimeVisible { - get { - return _isDesignTimeVisible; + get { + return _isDesignTimeVisible; } set { _isDesignTimeVisible = value; @@ -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 { @@ -168,6 +194,21 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView 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/OutlineTreeView.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineTreeView.cs index e5d4a3674c..f739db7366 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,23 @@ 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()); + } + + protected override void SelectOnly(DragTreeViewItem item) + { + base.SelectOnly(item); + + var node = item.DataContext as OutlineNode; + + var surface = node.DesignItem.View.TryFindParent(); + if (surface != null) + surface.ScrollIntoView(node.DesignItem); + } } } 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/DesignTimeProperties.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignTimeProperties.cs index 74cac07867..ef4f4790c4 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignTimeProperties.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignTimeProperties.cs @@ -112,5 +112,22 @@ namespace ICSharpCode.WpfDesign.XamlDom DependencyProperty.RegisterAttached("DesignHeight", typeof(double), typeof(DesignTimeProperties)); #endregion + + #region LayoutRounding + + public static bool GetLayoutRounding(DependencyObject obj) + { + return (bool)obj.GetValue(DesignHeightProperty); + } + + public static void SetLayoutRounding(DependencyObject obj, bool value) + { + obj.SetValue(DesignHeightProperty, value); + } + + public static readonly DependencyProperty DesignLayoutRounding = + DependencyProperty.RegisterAttached("LayoutRounding", typeof(bool), typeof(DesignTimeProperties)); + + #endregion } } 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;