Browse Source

- Add a QuickOperationMenu for changing quickly properties and take some action which is attachable to the primary selection.

- Fix a bug which caused NullReferenceException in hiding MarginHandles in case of a panel other than Grid.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/wpfdesigner@6104 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Kumar Devvrat 16 years ago
parent
commit
3cfef6401f
  1. 15
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml
  2. 30
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/MarginHandle.cs
  3. 133
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/QuickOperationMenu.cs
  4. 5
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/MarginHandleExtension.cs
  5. 111
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/QuickOperationMenuExtension.cs
  6. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj

15
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml

@ -489,4 +489,19 @@ @@ -489,4 +489,19 @@
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Controls:QuickOperationMenu}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Controls:QuickOperationMenu}">
<Menu Height="15" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="15" BorderThickness="0">
<MenuItem Height="15" Width="15" Padding="0" BorderBrush="LightGray" BorderThickness="1" Name="MainHeader">
<MenuItem.Header>
<Path Data="M3,5.5 L12,5.5 L7.5,11 z" Fill="Gray" />
</MenuItem.Header>
</MenuItem>
</Menu>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

30
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/MarginHandle.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
@ -88,6 +89,11 @@ namespace ICSharpCode.WpfDesign.Designer.Controls @@ -88,6 +89,11 @@ namespace ICSharpCode.WpfDesign.Designer.Controls
/// Decides whether to permanently display the handle or not.
/// </summary>
public bool ShouldBeVisible { get; set; }
/// <summary>
/// Decides whether stub has to be only displayed.
/// </summary>
public bool DisplayOnlyStub { get; set; }
public MarginHandle(DesignItem adornedControlItem, AdornerPanel adornerPanel, HandleOrientation orientation)
{
@ -148,16 +154,22 @@ namespace ICSharpCode.WpfDesign.Designer.Controls @@ -148,16 +154,22 @@ namespace ICSharpCode.WpfDesign.Designer.Controls
/// </summary>
/// <param name="handleLength"></param>
public void DecideVisiblity(double handleLength)
{
if(ShouldBeVisible){
marginStub.Visibility = handleLength == 0.0 ? Visibility.Visible : Visibility.Hidden;
this.Visibility = handleLength != 0.0 ? Visibility.Visible : Visibility.Hidden;
if (this.lineArrow != null){
lineArrow.Visibility = handleLength < 23 ? Visibility.Hidden : Visibility.Visible;
}
{
if(!DisplayOnlyStub){
if(ShouldBeVisible){
marginStub.Visibility = handleLength == 0.0 ? Visibility.Visible : Visibility.Hidden;
this.Visibility = handleLength != 0.0 ? Visibility.Visible : Visibility.Hidden;
if (this.lineArrow != null){
lineArrow.Visibility = handleLength < 23 ? Visibility.Hidden : Visibility.Visible;
}
}
}
}
else {
DisplayOnlyStub=false;
DecideVisiblity(this.HandleLength);
}
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();

133
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/QuickOperationMenu.cs

@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Kumar Devvrat"/>
// <version>$Revision: $</version>
// </file>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace ICSharpCode.WpfDesign.Designer.Controls
{
/// <summary>
/// A Small icon which shows up a menu containing common properties
/// </summary>
public class QuickOperationMenu : Control
{
static QuickOperationMenu()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof (QuickOperationMenu), new FrameworkPropertyMetadata(typeof (QuickOperationMenu)));
}
private MenuItem _mainHeader;
/// <summary>
/// Contains Default values in the Sub menu for example "HorizontalAlignment" has "HorizontalAlignment.Stretch" as it's value.
/// </summary>
private readonly Dictionary<MenuItem, MenuItem> _defaults = new Dictionary<MenuItem, MenuItem>();
/// <summary>
/// Is the main header menu which brings up all the menus.
/// </summary>
public MenuItem MainHeader {
get { return _mainHeader; }
}
/// <summary>
/// Add a submenu with checkable values.
/// </summary>
/// <param name="parent">The parent menu under which to add.</param>
/// <param name="enumValues">All the values of an enum to be showed in the menu</param>
/// <param name="defaultValue">The default value out of all the enums.</param>
/// <param name="setValue">The presently set value out of the enums</param>
public void AddSubMenuCheckable(MenuItem parent, Array enumValues, string defaultValue, string setValue)
{
foreach (var enumValue in enumValues) {
var menuItem = new MenuItem {Header = enumValue.ToString(), IsCheckable = true};
parent.Items.Add(menuItem);
if (enumValue.ToString() == defaultValue)
_defaults.Add(parent, menuItem);
if (enumValue.ToString() == setValue)
menuItem.IsChecked = true;
}
}
/// <summary>
/// Add a menu in the main header.
/// </summary>
/// <param name="menuItem">The menu to add.</param>
public void AddSubMenuInTheHeader(MenuItem menuItem)
{
if (_mainHeader != null)
_mainHeader.Items.Add(menuItem);
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var mainHeader = Template.FindName("MainHeader", this) as MenuItem;
if (mainHeader != null) {
_mainHeader = mainHeader;
_mainHeader.MouseLeave += OnMouseOut;
}
}
/// <summary>
/// Checks a menu item and making it exclusive. If the check was toggled then the default menu item is selected.
/// </summary>
/// <param name="parent">The parent item of the sub menu</param>
/// <param name="clickedOn">The Item clicked on</param>
/// <returns>Returns the Default value if the checkable menu item is toggled or otherwise the new checked menu item.</returns>
public string UncheckChildrenAndSelectClicked(MenuItem parent, MenuItem clickedOn)
{
MenuItem defaultMenuItem;
_defaults.TryGetValue(parent, out defaultMenuItem);
if (IsAnyItemChecked(parent)) {
foreach (var item in parent.Items) {
var menuItem = item as MenuItem;
if (menuItem != null) menuItem.IsChecked = false;
}
clickedOn.IsChecked = true;
return (string) clickedOn.Header;
} else {
if (defaultMenuItem != null) {
defaultMenuItem.IsChecked = true;
return (string) defaultMenuItem.Header;
}
}
return null;
}
/// <summary>
/// Checks in the sub-menu whether aby items has been checked or not
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
private bool IsAnyItemChecked(MenuItem parent)
{
bool check = false;
if (parent.HasItems) {
foreach (var item in parent.Items) {
var menuItem = item as MenuItem;
if (menuItem != null && menuItem.IsChecked)
check = true;
}
}
return check;
}
protected override void OnMouseEnter(MouseEventArgs e)
{
base.OnMouseEnter(e);
MainHeader.IsSubmenuOpen = true;
}
private void OnMouseOut(object sender, MouseEventArgs e)
{
MainHeader.IsSubmenuOpen = false;
}
}
}

5
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/MarginHandleExtension.cs

@ -47,6 +47,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -47,6 +47,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
public void HideHandles()
{
if (_leftHandle != null && _topHandle != null && _rightHandle != null && _bottomHandle != null) {
_leftHandle.Visibility=Visibility.Hidden;
_leftHandle.ShouldBeVisible=false;
_topHandle.Visibility=Visibility.Hidden;
@ -55,11 +56,12 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -55,11 +56,12 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
_rightHandle.ShouldBeVisible=false;
_bottomHandle.Visibility=Visibility.Hidden;
_bottomHandle.ShouldBeVisible=false;
}
}
public void ShowHandles()
{
if (_leftHandle != null && _topHandle != null && _rightHandle != null && _bottomHandle != null){
_leftHandle.Visibility=Visibility.Visible;
_leftHandle.ShouldBeVisible=true;
_leftHandle.DecideVisiblity(_leftHandle.HandleLength);
@ -72,6 +74,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -72,6 +74,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
_bottomHandle.Visibility=Visibility.Visible;
_bottomHandle.ShouldBeVisible=true;
_bottomHandle.DecideVisiblity(_bottomHandle.HandleLength);
}
}
}
}

111
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/QuickOperationMenuExtension.cs

@ -0,0 +1,111 @@ @@ -0,0 +1,111 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Kumar Devvrat"/>
// <version>$Revision: $</version>
// </file>
using System;
using System.Windows;
using System.Windows.Controls;
using ICSharpCode.WpfDesign.Designer.Controls;
using ICSharpCode.WpfDesign.Extensions;
using ICSharpCode.WpfDesign.Adorners;
namespace ICSharpCode.WpfDesign.Designer.Extensions
{
/// <summary>
/// Extends the Quick operation menu for the designer.
/// </summary>
[ExtensionFor(typeof (FrameworkElement))]
class QuickOperationMenuExtension : PrimarySelectionAdornerProvider
{
private QuickOperationMenu _menu;
protected override void OnInitialized()
{
base.OnInitialized();
_menu = new QuickOperationMenu();
_menu.Loaded += OnMenuLoaded;
var placement = new RelativePlacement(HorizontalAlignment.Right, VerticalAlignment.Top) {XOffset = 7};
this.AddAdorners(placement, _menu);
}
private void OnMenuLoaded(object sender, EventArgs e)
{
_menu.MainHeader.Click += MainHeaderClick;
int menuItemsAdded = 0;
var view = this.ExtendedItem.View;
if (view != null) {
string setValue;
if (view is StackPanel) {
var ch = new MenuItem() {Header = "Change Orientation"};
_menu.AddSubMenuInTheHeader(ch);
setValue = this.ExtendedItem.Properties[StackPanel.OrientationProperty].ValueOnInstance.ToString();
_menu.AddSubMenuCheckable(ch, Enum.GetValues(typeof (Orientation)), Orientation.Vertical.ToString(), setValue);
_menu.MainHeader.Items.Add(new Separator());
menuItemsAdded++;
}
var ha = new MenuItem() {Header = "Horizontal Alignment"};
_menu.AddSubMenuInTheHeader(ha);
setValue = this.ExtendedItem.Properties[FrameworkElement.HorizontalAlignmentProperty].ValueOnInstance.ToString();
_menu.AddSubMenuCheckable(ha, Enum.GetValues(typeof (HorizontalAlignment)), HorizontalAlignment.Stretch.ToString(), setValue);
menuItemsAdded++;
var va = new MenuItem() {Header = "Vertical Alignment"};
_menu.AddSubMenuInTheHeader(va);
setValue = this.ExtendedItem.Properties[FrameworkElement.VerticalAlignmentProperty].ValueOnInstance.ToString();
_menu.AddSubMenuCheckable(va, Enum.GetValues(typeof (VerticalAlignment)), VerticalAlignment.Stretch.ToString(), setValue);
menuItemsAdded++;
}
if (menuItemsAdded == 0) {
OnRemove();
}
}
private void MainHeaderClick(object sender, RoutedEventArgs e)
{
var clickedOn = e.Source as MenuItem;
if (clickedOn != null) {
var parent = clickedOn.Parent as MenuItem;
if (parent != null) {
if ((string) parent.Header == "Change Orientation") {
var value = _menu.UncheckChildrenAndSelectClicked(parent, clickedOn);
if (value != null) {
var orientation = Enum.Parse(typeof (Orientation), value);
if (orientation != null)
this.ExtendedItem.Properties[StackPanel.OrientationProperty].SetValue(orientation);
}
}
if ((string) parent.Header == "Horizontal Alignment") {
var value = _menu.UncheckChildrenAndSelectClicked(parent, clickedOn);
if (value != null) {
var ha = Enum.Parse(typeof (HorizontalAlignment), value);
if (ha != null)
this.ExtendedItem.Properties[FrameworkElement.HorizontalAlignmentProperty].SetValue(ha);
}
}
if ((string) parent.Header == "Vertical Alignment") {
var value = _menu.UncheckChildrenAndSelectClicked(parent, clickedOn);
if (value != null) {
var va = Enum.Parse(typeof (VerticalAlignment), value);
if (va != null)
this.ExtendedItem.Properties[FrameworkElement.VerticalAlignmentProperty].SetValue(va);
}
}
}
}
}
protected override void OnRemove()
{
base.OnRemove();
_menu.Loaded -= OnMenuLoaded;
}
}
}

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj

@ -95,6 +95,7 @@ @@ -95,6 +95,7 @@
<Compile Include="Controls\InPlaceEditor.cs" />
<Compile Include="Controls\MarginHandle.cs" />
<Compile Include="Controls\PanelMoveAdorner.cs" />
<Compile Include="Controls\QuickOperationMenu.cs" />
<Compile Include="Controls\SelectionFrame.cs" />
<Compile Include="Controls\ErrorBalloon.cs" />
<Compile Include="Controls\ResizeThumb.cs" />
@ -123,6 +124,7 @@ @@ -123,6 +124,7 @@
<Compile Include="Extensions\GridPlacementSupport.cs" />
<Compile Include="Extensions\InPlaceEditorExtension.cs" />
<Compile Include="Extensions\MarginHandleExtension.cs" />
<Compile Include="Extensions\QuickOperationMenuExtension.cs" />
<Compile Include="Extensions\SizeDisplayExtension.cs" />
<Compile Include="Extensions\SnaplinePlacementBehavior.cs">
<SubType>Code</SubType>

Loading…
Cancel
Save