530 lines
18 KiB
C#
530 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.ComponentModel.Design;
|
|
using System.Windows.Forms.Design;
|
|
using System.Reflection;
|
|
using DevComponents.AdvTree;
|
|
|
|
namespace DevComponents.DotNetBar.Design
|
|
{
|
|
public partial class RadialMenuItemEditor : UserControl
|
|
{
|
|
private RadialMenuDesigner _Designer = null;
|
|
private RadialMenuContainer _RadialMenuContainer = null;
|
|
private RadialMenu _RadialMenu = null;
|
|
public RadialMenuItemEditor()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
#region Implementation
|
|
private object GetDesignService(Type serviceType)
|
|
{
|
|
if (_Designer != null)
|
|
{
|
|
return _Designer.GetDesignService(serviceType);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private RadialMenuItem CreateItem()
|
|
{
|
|
IDesignerHost dh = (IDesignerHost)GetDesignService(typeof(IDesignerHost));
|
|
if (dh == null)
|
|
return null;
|
|
|
|
RadialMenuItem item = (RadialMenuItem)dh.CreateComponent(typeof(RadialMenuItem));
|
|
int index = 1;
|
|
if (_RadialMenu != null)
|
|
index = _RadialMenu.Items.Count + 1;
|
|
else if (_RadialMenuContainer != null)
|
|
index = _RadialMenuContainer.SubItems.Count + 1;
|
|
|
|
item.Text = "Item " + index.ToString();
|
|
return item;
|
|
}
|
|
|
|
private void AddNewItem()
|
|
{
|
|
AddNewItem(null);
|
|
}
|
|
|
|
private void OnComponentChanging(RadialMenuItem parent, IComponentChangeService cc)
|
|
{
|
|
if (parent == null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
cc.OnComponentChanging(_RadialMenu, TypeDescriptor.GetProperties(_RadialMenu)["Items"]);
|
|
else if (_RadialMenuContainer != null)
|
|
cc.OnComponentChanging(_RadialMenuContainer, TypeDescriptor.GetProperties(_RadialMenuContainer)["SubItems"]);
|
|
}
|
|
else
|
|
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(parent)["SubItems"]);
|
|
}
|
|
private void OnComponentChanged(RadialMenuItem parent, IComponentChangeService cc)
|
|
{
|
|
if (parent == null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
cc.OnComponentChanged(_RadialMenu, TypeDescriptor.GetProperties(_RadialMenu)["Items"], null, null);
|
|
else if (_RadialMenuContainer != null)
|
|
cc.OnComponentChanged(_RadialMenuContainer, TypeDescriptor.GetProperties(_RadialMenuContainer)["SubItems"], null, null);
|
|
}
|
|
else
|
|
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(parent)["SubItems"], null, null);
|
|
}
|
|
private void AddNewItem(RadialMenuItem parent)
|
|
{
|
|
IDesignerHost dh = (IDesignerHost)GetDesignService(typeof(IDesignerHost));
|
|
DesignerTransaction dt = null;
|
|
if (dh != null)
|
|
{
|
|
dt = dh.CreateTransaction("New RadialMenuItem");
|
|
}
|
|
//bool isEmpty = advTree1.Nodes.Count == 0;
|
|
RadialMenuItem item = CreateItem();
|
|
if (item == null) return;
|
|
|
|
IComponentChangeService cc = GetDesignService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
if (cc != null)
|
|
{
|
|
OnComponentChanging(parent, cc);
|
|
}
|
|
|
|
if (parent == null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
_RadialMenu.Items.Add(item);
|
|
else if (_RadialMenuContainer != null)
|
|
_RadialMenuContainer.SubItems.Add(item);
|
|
}
|
|
else
|
|
parent.SubItems.Add(item);
|
|
|
|
if (cc != null)
|
|
{
|
|
OnComponentChanged(parent, cc);
|
|
}
|
|
|
|
if (dt != null)
|
|
dt.Commit();
|
|
Node node = CreateNodeForItem(item);
|
|
if (parent == null)
|
|
advTree1.Nodes.Add(node);
|
|
else
|
|
{
|
|
advTree1.SelectedNode.Nodes.Add(node);
|
|
advTree1.SelectedNode.Expand();
|
|
}
|
|
|
|
//if (isEmpty && advTree1.SelectedNode == null && advTree1.Nodes.Count > 0)
|
|
// advTree1.SelectedNode = advTree1.Nodes[0];
|
|
advTree1.SelectedNode = node;
|
|
}
|
|
#endregion
|
|
|
|
private void RadialMenuItemEditor_Load(object sender, EventArgs e)
|
|
{
|
|
IUIService service = GetDesignService(typeof(IUIService)) as IUIService;
|
|
if (service != null)
|
|
{
|
|
PropertyInfo pi = propertyGrid1.GetType().GetProperty("ToolStripRenderer", System.Reflection.BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
|
|
if (pi != null)
|
|
{
|
|
pi.SetValue(propertyGrid1, (ToolStripProfessionalRenderer)service.Styles["VsToolWindowRenderer"], null);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void advTree1_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
Node node = advTree1.GetNodeAt(e.Y);
|
|
if (node == null) advTree1.SelectedNode = null;
|
|
}
|
|
|
|
internal void UpdateDisplay()
|
|
{
|
|
advTree1.Nodes.Clear();
|
|
if (_RadialMenu == null && _RadialMenuContainer == null) return;
|
|
|
|
advTree1.BeginUpdate();
|
|
|
|
SubItemsCollection collection = null;
|
|
if (_RadialMenu != null)
|
|
collection = _RadialMenu.Items;
|
|
else
|
|
collection = _RadialMenuContainer.SubItems;
|
|
|
|
foreach (BaseItem item in collection)
|
|
{
|
|
RadialMenuItem menu = item as RadialMenuItem;
|
|
if (menu != null)
|
|
{
|
|
Node node = CreateNodeForItem(menu);
|
|
advTree1.Nodes.Add(node);
|
|
LoadSubItems(node, menu);
|
|
}
|
|
}
|
|
|
|
advTree1.EndUpdate();
|
|
}
|
|
|
|
private void LoadSubItems(Node parent, RadialMenuItem item)
|
|
{
|
|
foreach (BaseItem o in item.SubItems)
|
|
{
|
|
if (o is RadialMenuItem)
|
|
{
|
|
RadialMenuItem menu = (RadialMenuItem)o;
|
|
Node node = CreateNodeForItem(menu);
|
|
parent.Nodes.Add(node);
|
|
LoadSubItems(node, menu);
|
|
}
|
|
}
|
|
}
|
|
|
|
private Node CreateNodeForItem(RadialMenuItem item)
|
|
{
|
|
Node node = new Node();
|
|
node.Expanded = true;
|
|
node.Tag = item;
|
|
node.Text = item.Text + " [" + item.Name + "]";
|
|
//node.Image = item.GetItemImage();
|
|
//node.Cells.Add(new Cell(item.Name));
|
|
return node;
|
|
}
|
|
private string GetText(RadialMenuItem item)
|
|
{
|
|
return item.Text + " [" + item.Name + "]";
|
|
}
|
|
|
|
public RadialMenuDesigner Designer
|
|
{
|
|
get { return _Designer; }
|
|
set
|
|
{
|
|
_Designer = value;
|
|
if (_Designer != null)
|
|
this.propertyGrid1.Site = new PropertyGridSite((IServiceProvider)_Designer.Component.Site, this.propertyGrid1);
|
|
}
|
|
}
|
|
|
|
public RadialMenu RadialMenu
|
|
{
|
|
get { return _RadialMenu; }
|
|
set
|
|
{
|
|
if (value != _RadialMenu)
|
|
{
|
|
RadialMenu oldValue = _RadialMenu;
|
|
_RadialMenu = value;
|
|
OnRadialMenuChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
private void OnRadialMenuChanged(RadialMenu oldValue, RadialMenu newValue)
|
|
{
|
|
UpdateDisplay();
|
|
}
|
|
|
|
public RadialMenuContainer RadialMenuContainer
|
|
{
|
|
get { return _RadialMenuContainer; }
|
|
set
|
|
{
|
|
if (value != _RadialMenuContainer)
|
|
{
|
|
RadialMenuContainer oldValue = _RadialMenuContainer;
|
|
_RadialMenuContainer = value;
|
|
OnRadialMenuContainerChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when RadialMenuContainer property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnRadialMenuContainerChanged(RadialMenuContainer oldValue, RadialMenuContainer newValue)
|
|
{
|
|
UpdateDisplay();
|
|
}
|
|
|
|
private void buttonAddItem_Click(object sender, EventArgs e)
|
|
{
|
|
AddNewItem(null);
|
|
}
|
|
|
|
private void buttonNewSubMenu_Click(object sender, EventArgs e)
|
|
{
|
|
RadialMenuItem parent = null;
|
|
if (advTree1.SelectedNode != null) parent = advTree1.SelectedNode.Tag as RadialMenuItem;
|
|
AddNewItem(parent);
|
|
}
|
|
|
|
private void buttonRemoveItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (advTree1.SelectedNode == null) return;
|
|
RadialMenuItem item = advTree1.SelectedNode.Tag as RadialMenuItem;
|
|
if (item == null) return;
|
|
advTree1.SelectedNode.Remove();
|
|
DeleteItem(item);
|
|
}
|
|
|
|
private void DeleteItem(RadialMenuItem item)
|
|
{
|
|
IDesignerHost dh = (IDesignerHost)GetDesignService(typeof(IDesignerHost));
|
|
if (dh == null)
|
|
return;
|
|
|
|
IComponentChangeService cc = GetDesignService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
RadialMenuItem parent = item.Parent as RadialMenuItem;
|
|
if (cc != null)
|
|
OnComponentChanging(parent, cc);
|
|
|
|
if (parent == null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
_RadialMenu.Items.Remove(item);
|
|
else if (_RadialMenuContainer != null)
|
|
_RadialMenuContainer.SubItems.Remove(item);
|
|
}
|
|
else
|
|
parent.SubItems.Remove(item);
|
|
|
|
if (cc != null)
|
|
OnComponentChanged(parent, cc);
|
|
|
|
dh.DestroyComponent(item);
|
|
}
|
|
|
|
private void advTree1_AfterNodeSelect(object sender, AdvTreeNodeEventArgs e)
|
|
{
|
|
buttonRemove.Enabled = e.Node != null;
|
|
buttonNewSubMenu.Enabled = e.Node != null;
|
|
if (e.Node != null)
|
|
propertyGrid1.SelectedObject = e.Node.Tag;
|
|
else
|
|
propertyGrid1.SelectedObject = null;
|
|
}
|
|
|
|
private void advTree1_AfterNodeDrop(object sender, TreeDragDropEventArgs e)
|
|
{
|
|
IDesignerHost dh = (IDesignerHost)GetDesignService(typeof(IDesignerHost));
|
|
DesignerTransaction dt = null;
|
|
if (dh != null) dt = dh.CreateTransaction("Move items");
|
|
|
|
IComponentChangeService cc = GetDesignService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
|
|
try
|
|
{
|
|
RadialMenuItem movedItem = e.Node.Tag as RadialMenuItem;
|
|
RadialMenuItem parent = movedItem.Parent as RadialMenuItem;
|
|
|
|
if (cc != null)
|
|
{
|
|
OnComponentChanging(parent, cc);
|
|
}
|
|
|
|
if (parent == null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
_RadialMenu.Items.Remove(movedItem);
|
|
else if (_RadialMenuContainer != null)
|
|
_RadialMenuContainer.SubItems.Remove(movedItem);
|
|
}
|
|
else
|
|
parent.SubItems.Remove(movedItem);
|
|
|
|
if (cc != null)
|
|
{
|
|
OnComponentChanged(parent, cc);
|
|
}
|
|
|
|
if (e.NewParentNode == null)
|
|
{
|
|
int index = advTree1.Nodes.IndexOf(e.Node);
|
|
if (cc != null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
cc.OnComponentChanging(_RadialMenu, TypeDescriptor.GetProperties(_RadialMenu)["Items"]);
|
|
else if (_RadialMenuContainer != null)
|
|
cc.OnComponentChanging(_RadialMenuContainer, TypeDescriptor.GetProperties(_RadialMenuContainer)["SubItems"]);
|
|
}
|
|
|
|
if (_RadialMenu != null)
|
|
_RadialMenu.Items.Insert(index, movedItem);
|
|
else if (_RadialMenuContainer != null)
|
|
_RadialMenuContainer.SubItems.Insert(index, movedItem);
|
|
|
|
if (cc != null)
|
|
{
|
|
if (_RadialMenu != null)
|
|
cc.OnComponentChanged(_RadialMenu, TypeDescriptor.GetProperties(_RadialMenu)["Items"], null, null);
|
|
else if (_RadialMenuContainer != null)
|
|
cc.OnComponentChanged(_RadialMenuContainer, TypeDescriptor.GetProperties(_RadialMenuContainer)["SubItems"], null, null);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
parent = e.NewParentNode.Tag as RadialMenuItem;
|
|
int index = e.NewParentNode.Nodes.IndexOf(e.Node);
|
|
if (cc != null) cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(parent)["SubItems"]);
|
|
parent.SubItems.Insert(index, movedItem);
|
|
if (cc != null) cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(parent)["SubItems"], null, null);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
if (dt != null)
|
|
dt.Cancel();
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
if (dt != null && !dt.Canceled)
|
|
dt.Commit();
|
|
}
|
|
}
|
|
|
|
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
|
|
{
|
|
if (advTree1.SelectedNode == null) return;
|
|
Node node = advTree1.SelectedNode;
|
|
RadialMenuItem item = (RadialMenuItem)propertyGrid1.SelectedObject;
|
|
if (e.ChangedItem.PropertyDescriptor.Name == "Text" || e.ChangedItem.PropertyDescriptor.Name == "Name")
|
|
{
|
|
node.Text = GetText(item);
|
|
}
|
|
}
|
|
|
|
|
|
private void buttonX1_Click(object sender, EventArgs e)
|
|
{
|
|
Form form = this.FindForm();
|
|
if (form != null) form.Close();
|
|
}
|
|
|
|
private void radialMenu1_BeforeMenuOpen(object sender, DevComponents.DotNetBar.Events.CancelableEventSourceArgs e)
|
|
{
|
|
SubItemsCollection collection = null;
|
|
if (_RadialMenu != null)
|
|
{
|
|
collection = _RadialMenu.Items;
|
|
radialMenu1.MenuType = _RadialMenu.MenuType;
|
|
radialMenu1.Diameter = _RadialMenu.Diameter;
|
|
radialMenu1.CenterButtonDiameter = _RadialMenu.CenterButtonDiameter;
|
|
radialMenu1.Font = _RadialMenu.Font;
|
|
}
|
|
else if (_RadialMenuContainer != null)
|
|
{
|
|
collection = _RadialMenuContainer.SubItems;
|
|
radialMenu1.MenuType = _RadialMenuContainer.MenuType;
|
|
radialMenu1.Diameter = _RadialMenuContainer.Diameter;
|
|
radialMenu1.CenterButtonDiameter = _RadialMenuContainer.CenterButtonDiameter;
|
|
}
|
|
if (collection == null) return;
|
|
|
|
|
|
if (radialMenu1.Items.Count > 0)
|
|
{
|
|
BaseItem[] cleanUpItems = new BaseItem[radialMenu1.Items.Count];
|
|
radialMenu1.Items.CopyTo(cleanUpItems, 0);
|
|
radialMenu1.Items.Clear();
|
|
foreach (BaseItem item in cleanUpItems)
|
|
{
|
|
item.Dispose();
|
|
}
|
|
}
|
|
|
|
foreach (BaseItem item in collection)
|
|
{
|
|
if (item is RadialMenuItem)
|
|
{
|
|
BaseItem copy = item.Copy();
|
|
radialMenu1.Items.Add(copy);
|
|
}
|
|
}
|
|
}
|
|
|
|
#region PropertyGridSite
|
|
internal class PropertyGridSite : ISite, IServiceProvider
|
|
{
|
|
// Fields
|
|
private IComponent comp;
|
|
private bool inGetService;
|
|
private IServiceProvider sp;
|
|
|
|
// Methods
|
|
public PropertyGridSite(IServiceProvider sp, IComponent comp)
|
|
{
|
|
this.sp = sp;
|
|
this.comp = comp;
|
|
}
|
|
|
|
public object GetService(Type t)
|
|
{
|
|
if (!this.inGetService && (this.sp != null))
|
|
{
|
|
try
|
|
{
|
|
this.inGetService = true;
|
|
return this.sp.GetService(t);
|
|
}
|
|
finally
|
|
{
|
|
this.inGetService = false;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Properties
|
|
public IComponent Component
|
|
{
|
|
get
|
|
{
|
|
return this.comp;
|
|
}
|
|
}
|
|
|
|
public IContainer Container
|
|
{
|
|
get
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public bool DesignMode
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return null;
|
|
}
|
|
set
|
|
{
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|