#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

194 lines
7.6 KiB

// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.SharpDevelop.Widgets;
using ICSharpCode.WpfDesign.Designer.Controls;
using ICSharpCode.WpfDesign.Extensions;
using ICSharpCode.WpfDesign.Adorners;
using ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors;
namespace ICSharpCode.WpfDesign.Designer.Extensions
{
/// <summary>
/// Extends the Quick operation menu for the designer.
/// </summary>
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
[ExtensionFor(typeof (FrameworkElement))]
public class QuickOperationMenuExtension : PrimarySelectionAdornerProvider
{
private QuickOperationMenu _menu;
private KeyBinding _keyBinding;
protected override void OnInitialized()
{
base.OnInitialized();
_menu = new QuickOperationMenu();
_menu.Loaded += OnMenuLoaded;
var placement = new RelativePlacement(HorizontalAlignment.Right, VerticalAlignment.Top) {XOffset = 7, YOffset = 3.5};
this.AddAdorners(placement, _menu);
var kbs = this.ExtendedItem.Services.GetService(typeof (IKeyBindingService)) as IKeyBindingService;
var command = new RelayCommand(delegate
{
_menu.MainHeader.IsSubmenuOpen = true;
_menu.MainHeader.Focus();
});
_keyBinding=new KeyBinding(command, Key.Enter, ModifierKeys.Alt);
if (kbs != null)
kbs.RegisterBinding(_keyBinding);
}
private void OnMenuLoaded(object sender, EventArgs e)
{
if(_menu.MainHeader!=null)
_menu.MainHeader.Click += MainHeaderClick;
int menuItemsAdded = 0;
var view = this.ExtendedItem.View;
if (view != null) {
string setValue;
if(view is ItemsControl) {
_menu.AddSubMenuInTheHeader(new MenuItem() {Header = "Edit Items"});
}
if(view is Grid) {
_menu.AddSubMenuInTheHeader(new MenuItem() {Header = "Edit Rows"});
_menu.AddSubMenuInTheHeader(new MenuItem() {Header = "Edit Columns"});
}
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++;
}
if(this.ExtendedItem.Parent!=null && this.ExtendedItem.Parent.View is DockPanel) {
var sda = new MenuItem() {Header = "Set Dock to"};
_menu.AddSubMenuInTheHeader(sda);
setValue = this.ExtendedItem.Properties.GetAttachedProperty(DockPanel.DockProperty).ValueOnInstance.ToString();
_menu.AddSubMenuCheckable(sda, Enum.GetValues(typeof (Dock)), Dock.Left.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)clickedOn.Header=="Edit Items") {
var editor = new CollectionEditor();
var itemsControl=this.ExtendedItem.View as ItemsControl;
if (itemsControl != null)
editor.LoadItemsCollection(this.ExtendedItem);
editor.Show();
}
if((string)clickedOn.Header=="Edit Rows") {
var editor = new FlatCollectionEditor();
var gd=this.ExtendedItem.View as Grid;
if (gd != null)
editor.LoadItemsCollection(this.ExtendedItem.Properties["RowDefinitions"]);
editor.Show();
}
if((string)clickedOn.Header=="Edit Columns") {
var editor = new FlatCollectionEditor();
var gd=this.ExtendedItem.View as Grid;
if (gd != null)
editor.LoadItemsCollection(this.ExtendedItem.Properties["ColumnDefinitions"]);
editor.Show();
}
if (parent.Header is string && (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 (parent.Header is string && (string)parent.Header == "Set Dock to") {
var value = _menu.UncheckChildrenAndSelectClicked(parent, clickedOn);
if(value!=null) {
var dock = Enum.Parse(typeof (Dock), value);
if (dock != null)
this.ExtendedItem.Properties.GetAttachedProperty(DockPanel.DockProperty).SetValue(dock);
}
}
if (parent.Header is string && (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 (parent.Header is string && (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;
var kbs = this.ExtendedItem.Services.GetService(typeof (IKeyBindingService)) as IKeyBindingService;
if(kbs!=null)
kbs.DeregisterBinding(_keyBinding);
}
}
}