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
}
}