440 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			440 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using DevComponents.DotNetBar.Metro;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.ComponentModel.Design;
 | 
						|
using System.Text;
 | 
						|
using System.Windows.Forms;
 | 
						|
using DevComponents.DotNetBar.Controls;
 | 
						|
using System.Drawing;
 | 
						|
using System.Collections;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Design
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents Windows Forms designer for SideNav control.
 | 
						|
    /// </summary>
 | 
						|
    public class SideNavDesigner: BarBaseControlDesigner
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
 | 
						|
        public SideNavDesigner()
 | 
						|
        {
 | 
						|
            this.EnableItemDragDrop = true;
 | 
						|
            this.AcceptExternalControls = false;
 | 
						|
        }
 | 
						|
 | 
						|
        public override void Initialize(IComponent component)
 | 
						|
        {
 | 
						|
            base.Initialize(component);
 | 
						|
            if (!component.Site.DesignMode)
 | 
						|
                return;
 | 
						|
            SideNav c = component as SideNav;
 | 
						|
            if (c != null)
 | 
						|
            {
 | 
						|
                c.SetDesignMode();
 | 
						|
            }
 | 
						|
            this.EnableDragDrop(false);
 | 
						|
        }
 | 
						|
 | 
						|
        public override bool CanParent(Control control)
 | 
						|
        {
 | 
						|
            if (control is SideNavPanel && !this.Control.Controls.Contains(control))
 | 
						|
                return true;
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        public override DesignerVerbCollection Verbs
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                DesignerVerb[] verbs = null;
 | 
						|
                verbs = new DesignerVerb[]
 | 
						|
					{
 | 
						|
						new DesignerVerb("Create Tab", new EventHandler(CreateSideNavTab)),
 | 
						|
						new DesignerVerb("Create Button", new EventHandler(CreateButton)),
 | 
						|
						new DesignerVerb("Create Separator", new EventHandler(CreateSeparator))};
 | 
						|
 | 
						|
                return new DesignerVerbCollection(verbs);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void CreateSeparator(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateSeparator(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void CreateSeparator(BaseItem parent)
 | 
						|
        {
 | 
						|
            if (parent == null)
 | 
						|
                return;
 | 
						|
            Separator item = null;
 | 
						|
 | 
						|
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
            if (dh != null)
 | 
						|
            {
 | 
						|
                DesignerTransaction trans = dh.CreateTransaction("Adding new item");
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    m_CreatingItem = true;
 | 
						|
                    item = dh.CreateComponent(typeof(Separator)) as Separator;
 | 
						|
                    if (item == null)
 | 
						|
                        return;
 | 
						|
 | 
						|
                    TypeDescriptor.GetProperties(item)["FixedSize"].SetValue(item, new Size(3,1));
 | 
						|
                    TypeDescriptor.GetProperties(item)["SeparatorOrientation"].SetValue(item, eDesignMarkerOrientation.Vertical);
 | 
						|
                    item.Padding.Left = 6;
 | 
						|
                    item.Padding.Right = 6;
 | 
						|
 | 
						|
                    IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
                    if (parent != this.GetDefaultNewItemContainer() && cc != null)
 | 
						|
                        cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
 | 
						|
 | 
						|
                    parent.SubItems.Add(item);
 | 
						|
                    this.RecalcLayout();
 | 
						|
 | 
						|
                    if (parent != this.GetDefaultNewItemContainer() && cc != null)
 | 
						|
                        cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
 | 
						|
 | 
						|
                    OnitemCreated(item);
 | 
						|
                }
 | 
						|
                catch
 | 
						|
                {
 | 
						|
                    trans.Cancel();
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    if (!trans.Canceled)
 | 
						|
                        trans.Commit();
 | 
						|
                    m_CreatingItem = false;
 | 
						|
                }
 | 
						|
            }   
 | 
						|
        }
 | 
						|
 | 
						|
        private BaseItem GetNewItemContainer()
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            return r.SideNavStrip.GetBaseItemContainer();
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateButton(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateSideNavButton(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual SideNavItem CreateSideNavButton(BaseItem parent)
 | 
						|
        {
 | 
						|
            if (parent == null)
 | 
						|
                return null;
 | 
						|
            SideNavItem item = null;
 | 
						|
 | 
						|
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
            if (dh != null)
 | 
						|
            {
 | 
						|
                DesignerTransaction trans = dh.CreateTransaction("Adding new item");
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    m_CreatingItem = true;
 | 
						|
                    item = dh.CreateComponent(typeof(SideNavItem)) as SideNavItem;
 | 
						|
                    if (item == null)
 | 
						|
                        return null;
 | 
						|
 | 
						|
                    TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
 | 
						|
                    TypeDescriptor.GetProperties(item)["Symbol"].SetValue(item, "\uf10c");
 | 
						|
 | 
						|
                    IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
                    if (parent != this.GetDefaultNewItemContainer() && cc != null)
 | 
						|
                        cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
 | 
						|
 | 
						|
                    parent.SubItems.Add(item);
 | 
						|
                    this.RecalcLayout();
 | 
						|
 | 
						|
                    if (parent != this.GetDefaultNewItemContainer() && cc != null)
 | 
						|
                        cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
 | 
						|
 | 
						|
                    OnitemCreated(item);
 | 
						|
                }
 | 
						|
                catch
 | 
						|
                {
 | 
						|
                    trans.Cancel();
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    if (!trans.Canceled)
 | 
						|
                        trans.Commit();
 | 
						|
                    m_CreatingItem = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return item;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateTextBox(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateTextBox(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateComboBox(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateComboBox(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateLabel(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateLabel(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateColorPicker(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateColorPicker(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateProgressBar(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateProgressBar(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateRatingItem(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateRatingItem(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void CreateSwitch(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                CreateSwitch(GetNewItemContainer());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void ComponentChangeComponentAdded(object sender, ComponentEventArgs e)
 | 
						|
        {
 | 
						|
            if (m_AddingItem)
 | 
						|
            {
 | 
						|
                m_AddingItem = false;
 | 
						|
                IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
                if (cc != null)
 | 
						|
                    cc.OnComponentChanging(this.Control, null);
 | 
						|
                this.GetNewItemContainer().SubItems.Add(e.Component as BaseItem);
 | 
						|
                if (cc != null)
 | 
						|
                    cc.OnComponentChanged(this.Control, null, null, null);
 | 
						|
                m_InsertItemTransaction.Commit();
 | 
						|
                m_InsertItemTransaction = null;
 | 
						|
                this.RecalcLayout();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
#if FRAMEWORK20
 | 
						|
        public override void InitializeNewComponent(IDictionary defaultValues)
 | 
						|
        {
 | 
						|
            base.InitializeNewComponent(defaultValues);
 | 
						|
            SetDesignTimeDefaults();
 | 
						|
        }
 | 
						|
#else
 | 
						|
        public override void OnSetComponentDefaults()
 | 
						|
        {
 | 
						|
            SetDesignTimeDefaults();
 | 
						|
            base.OnSetComponentDefaults();
 | 
						|
        }
 | 
						|
#endif
 | 
						|
 | 
						|
        private void SetDesignTimeDefaults()
 | 
						|
        {
 | 
						|
            CreateSideNavTab("Menu", true);
 | 
						|
            CreateSeparator(GetNewItemContainer());
 | 
						|
            CreateSideNavTab("Home");
 | 
						|
            SideNav c = this.Control as SideNav;
 | 
						|
            
 | 
						|
            c.Size = new Size(400, 200);
 | 
						|
            c.Dock = DockStyle.Left;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override BaseItem GetItemContainer()
 | 
						|
        {
 | 
						|
            SideNav tab = this.Control as SideNav;
 | 
						|
            if (tab != null)
 | 
						|
                return tab.SideNavStrip.GetBaseItemContainer();
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override System.Windows.Forms.Control GetItemContainerControl()
 | 
						|
        {
 | 
						|
            SideNav tab = this.Control as SideNav;
 | 
						|
            if (tab != null)
 | 
						|
                return tab.SideNavStrip;
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Support for popup menu closing.
 | 
						|
        /// </summary>
 | 
						|
        protected override void DesignTimeSelectionChanged(ISelectionService ss)
 | 
						|
        {
 | 
						|
            if (ss == null)
 | 
						|
                return;
 | 
						|
            if (this.Control == null || this.Control.IsDisposed)
 | 
						|
                return;
 | 
						|
 | 
						|
            base.DesignTimeSelectionChanged(ss);
 | 
						|
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r == null) return;
 | 
						|
 | 
						|
            BaseItem container = r.SideNavStrip.GetBaseItemContainer();
 | 
						|
            if (container == null) return;
 | 
						|
 | 
						|
            if (ss.PrimarySelection is SideNavItem)
 | 
						|
            {
 | 
						|
                SideNavItem item = ss.PrimarySelection as SideNavItem;
 | 
						|
                if (container.SubItems.Contains(item) && !item.IsSystemMenu && item.Panel != null)
 | 
						|
                {
 | 
						|
                    TypeDescriptor.GetProperties(item)["Checked"].SetValue(item, true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Triggered when some other component on the form is removed.
 | 
						|
        /// </summary>
 | 
						|
        protected override void OtherComponentRemoving(object sender, ComponentEventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (r != null)
 | 
						|
            {
 | 
						|
                BaseItem container = r.SideNavStrip.GetBaseItemContainer();
 | 
						|
 | 
						|
                if (e.Component is SideNavItem && container != null && container.SubItems != null &&
 | 
						|
                    container.SubItems.Contains(((SideNavItem)e.Component)))
 | 
						|
                {
 | 
						|
                    IDesignerHost dh = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
 | 
						|
                    if (dh != null && ((SideNavItem)e.Component).Panel != null)
 | 
						|
                        dh.DestroyComponent(((SideNavItem)e.Component).Panel);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            base.OtherComponentRemoving(sender, e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void ComponentRemoved(object sender, ComponentEventArgs e)
 | 
						|
        {
 | 
						|
            SideNav r = this.Control as SideNav;
 | 
						|
            if (e.Component is BaseItem && r != null)
 | 
						|
            {
 | 
						|
                BaseItem item = e.Component as BaseItem;
 | 
						|
                if (r.Items.Contains(item))
 | 
						|
                    r.Items.Remove(item);
 | 
						|
                DestroySubItems(item);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Design-Time Item Creation
 | 
						|
        protected virtual void CreateSideNavTab(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CreateSideNavTab(string.Empty);
 | 
						|
        }
 | 
						|
 | 
						|
        private void CreateSideNavTab(string text)
 | 
						|
        {
 | 
						|
            CreateSideNavTab(text, false);
 | 
						|
        }
 | 
						|
        private void CreateSideNavTab(string text, bool isSysMenu)
 | 
						|
        {
 | 
						|
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
            if (dh != null)
 | 
						|
            {
 | 
						|
                DesignerTransaction trans = dh.CreateTransaction("Creating SideNav Tab");
 | 
						|
                IComponentChangeService cc = (IComponentChangeService)GetService(typeof(IComponentChangeService));
 | 
						|
                SideNav tab = this.Control as SideNav;
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    m_CreatingItem = true;
 | 
						|
                    OnSubItemsChanging();
 | 
						|
                    SideNavItem item = dh.CreateComponent(typeof(SideNavItem)) as SideNavItem;
 | 
						|
                    if (string.IsNullOrEmpty(text))
 | 
						|
                        TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
 | 
						|
                    else
 | 
						|
                        TypeDescriptor.GetProperties(item)["Text"].SetValue(item, text);
 | 
						|
                    if (isSysMenu)
 | 
						|
                    {
 | 
						|
                        TypeDescriptor.GetProperties(item)["Symbol"].SetValue(item, "\uf0c9");
 | 
						|
                        TypeDescriptor.GetProperties(item)["IsSystemMenu"].SetValue(item, true);
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        TypeDescriptor.GetProperties(item)["Symbol"].SetValue(item, "\uf015");
 | 
						|
                        SideNavPanel panel = dh.CreateComponent(typeof (SideNavPanel)) as SideNavPanel;
 | 
						|
                        TypeDescriptor.GetProperties(panel)["Dock"].SetValue(panel, DockStyle.Fill);
 | 
						|
 | 
						|
                        cc.OnComponentChanging(this.Control, TypeDescriptor.GetProperties(typeof (Control))["Controls"]);
 | 
						|
                        this.Control.Controls.Add(panel);
 | 
						|
                        panel.SendToBack();
 | 
						|
                        cc.OnComponentChanged(this.Control, TypeDescriptor.GetProperties(typeof (Control))["Controls"],
 | 
						|
                            null, null);
 | 
						|
 | 
						|
                        TypeDescriptor.GetProperties(item)["Panel"].SetValue(item, panel);
 | 
						|
                    }
 | 
						|
 | 
						|
                    SimpleItemContainer cont = (SimpleItemContainer)tab.SideNavStrip.GetBaseItemContainer();
 | 
						|
                    cc.OnComponentChanging(cont, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
 | 
						|
                    cont.SubItems.Add(item);
 | 
						|
                    cc.OnComponentChanged(cont, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
 | 
						|
                    if (tab.SelectedItem == null && !isSysMenu)
 | 
						|
                        TypeDescriptor.GetProperties(item)["Checked"].SetValue(item, true);
 | 
						|
 | 
						|
                    this.RecalcLayout();
 | 
						|
                    OnSubItemsChanged();
 | 
						|
                }
 | 
						|
                catch
 | 
						|
                {
 | 
						|
                    trans.Cancel();
 | 
						|
                    throw;
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    if (!trans.Canceled)
 | 
						|
                        trans.Commit();
 | 
						|
                    m_CreatingItem = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |