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