388 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			388 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Windows.Forms.Design;
 | 
						|
using System.Collections;
 | 
						|
using System.ComponentModel.Design;
 | 
						|
using System.ComponentModel;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Design
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents VS.NET designer for the CrumbBar control.
 | 
						|
    /// </summary>
 | 
						|
    public class CrumbBarDesigner : ControlDesigner
 | 
						|
    {
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>Initializes designer with given component.</summary>
 | 
						|
        /// <param name="component">Component to initialize designer with.</param>
 | 
						|
        public override void Initialize(IComponent component)
 | 
						|
        {
 | 
						|
            base.Initialize(component);
 | 
						|
            if (!component.Site.DesignMode)
 | 
						|
                return;
 | 
						|
 | 
						|
            // If our component is removed we need to clean-up
 | 
						|
            IComponentChangeService cc = (IComponentChangeService)GetService(typeof(IComponentChangeService));
 | 
						|
            if (cc != null)
 | 
						|
            {
 | 
						|
                cc.ComponentRemoving += new ComponentEventHandler(this.OnComponentRemoving);
 | 
						|
            }
 | 
						|
 | 
						|
#if !TRIAL
 | 
						|
            IDesignerHost dh = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
 | 
						|
            if (dh != null)
 | 
						|
                dh.LoadComplete += new EventHandler(dh_LoadComplete);
 | 
						|
#endif
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Dispose(bool disposing)
 | 
						|
        {
 | 
						|
            // If our component is removed we need to clean-up
 | 
						|
            IComponentChangeService cc = (IComponentChangeService)GetService(typeof(IComponentChangeService));
 | 
						|
            if (cc != null)
 | 
						|
                cc.ComponentRemoving -= new ComponentEventHandler(this.OnComponentRemoving);
 | 
						|
            base.Dispose(disposing);
 | 
						|
        }
 | 
						|
 | 
						|
#if FRAMEWORK20
 | 
						|
        public override void InitializeNewComponent(IDictionary defaultValues)
 | 
						|
        {
 | 
						|
            base.InitializeNewComponent(defaultValues);
 | 
						|
            SetDesignTimeDefaults();
 | 
						|
        }
 | 
						|
#else
 | 
						|
		public override void OnSetComponentDefaults()
 | 
						|
		{
 | 
						|
			base.OnSetComponentDefaults();
 | 
						|
			SetDesignTimeDefaults();
 | 
						|
		}
 | 
						|
#endif
 | 
						|
        private void SetDesignTimeDefaults()
 | 
						|
        {
 | 
						|
            SetVistaBackgroundStyle();
 | 
						|
            CrumbBar bar = this.Control as CrumbBar;
 | 
						|
#if (FRAMEWORK20)
 | 
						|
            bar.AutoSize = true;
 | 
						|
#endif
 | 
						|
#if !TRIAL
 | 
						|
            string key = RibbonBarDesigner.GetLicenseKey();
 | 
						|
            bar.LicenseKey = key;
 | 
						|
#endif
 | 
						|
            if(IsMetroHosted())
 | 
						|
                bar.Style = eCrumbBarStyle.Office2007;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool IsMetroHosted()
 | 
						|
        {
 | 
						|
            IDesignerHost dh = (IDesignerHost)this.GetService(typeof(IDesignerHost));
 | 
						|
            if (dh != null && (dh.RootComponent is DevComponents.DotNetBar.Metro.MetroAppForm || dh.RootComponent is DevComponents.DotNetBar.Metro.MetroForm))
 | 
						|
                return true;
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
#if !TRIAL
 | 
						|
        private void dh_LoadComplete(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            IDesignerHost dh = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
 | 
						|
            if (dh != null)
 | 
						|
                dh.LoadComplete -= new EventHandler(dh_LoadComplete);
 | 
						|
 | 
						|
            string key = RibbonBarDesigner.GetLicenseKey();
 | 
						|
            CrumbBar bar = this.Control as CrumbBar;
 | 
						|
            if (key != "" && bar != null && bar.LicenseKey == "" && bar.LicenseKey != key)
 | 
						|
                TypeDescriptor.GetProperties(bar)["LicenseKey"].SetValue(bar, key);
 | 
						|
        }
 | 
						|
#endif
 | 
						|
 | 
						|
        private void SetVistaBackgroundStyle()
 | 
						|
        {
 | 
						|
            CrumbBar cb = this.Control as CrumbBar;
 | 
						|
 | 
						|
            IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
            if (cc != null)
 | 
						|
                cc.OnComponentChanging(this, TypeDescriptor.GetProperties(cb)["BackgroundStyle"]);
 | 
						|
 | 
						|
            cb.BackgroundStyle.Reset();
 | 
						|
            cb.BackgroundStyle.Border = eStyleBorderType.Solid;
 | 
						|
            cb.BackgroundStyle.BorderWidth = 1;
 | 
						|
            cb.BackgroundStyle.BorderColor = ColorScheme.GetColor("53595E");
 | 
						|
            cb.BackgroundStyle.BorderColor2 = ColorScheme.GetColor("A9B4BF");
 | 
						|
            cb.BackgroundStyle.BackColor = ColorScheme.GetColor("F8FAFD");
 | 
						|
            if (cc != null)
 | 
						|
                cc.OnComponentChanged(this, TypeDescriptor.GetProperties(cb)["BackgroundStyle"], null, null);
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetOffice2007BackgroundStyle()
 | 
						|
        {
 | 
						|
            CrumbBar cb = this.Control as CrumbBar;
 | 
						|
 | 
						|
            IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
            if (cc != null)
 | 
						|
                cc.OnComponentChanging(this, TypeDescriptor.GetProperties(cb)["BackgroundStyle"]);
 | 
						|
 | 
						|
            cb.BackgroundStyle.Reset();
 | 
						|
            cb.BackgroundStyle.Class = ElementStyleClassKeys.CrumbBarBackgroundKey;
 | 
						|
 | 
						|
            if (cc != null)
 | 
						|
                cc.OnComponentChanged(this, TypeDescriptor.GetProperties(cb)["BackgroundStyle"], null, null);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void PreFilterProperties(System.Collections.IDictionary properties)
 | 
						|
        {
 | 
						|
            base.PreFilterProperties(properties);
 | 
						|
            properties["Style"] = TypeDescriptor.CreateProperty(typeof(CrumbBarDesigner), (PropertyDescriptor)properties["Style"], new Attribute[]
 | 
						|
				{
 | 
						|
					new DefaultValueAttribute(eCrumbBarStyle.Vista),
 | 
						|
					new BrowsableAttribute(true),
 | 
						|
					new CategoryAttribute("Appearance")});
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the visual style of the control. Default value is Windows Vista style.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eCrumbBarStyle.Vista), Category("Appearance"), Description("Indicates visual style of the control.")]
 | 
						|
        public eCrumbBarStyle Style
 | 
						|
        {
 | 
						|
            get { return ((CrumbBar)this.Control).Style; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                CrumbBar b = this.Control as CrumbBar;
 | 
						|
                bool isChanged = (b.Style != value);
 | 
						|
                b.Style = value;
 | 
						|
                if (isChanged)
 | 
						|
                {
 | 
						|
                    IDesignerHost ds = GetService(typeof(IDesignerHost)) as IDesignerHost;
 | 
						|
                    if (ds != null && !ds.Loading)
 | 
						|
                    {
 | 
						|
                        if (value == eCrumbBarStyle.Vista)
 | 
						|
                            SetVistaBackgroundStyle();
 | 
						|
                        else if (value == eCrumbBarStyle.Office2007)
 | 
						|
                            SetOffice2007BackgroundStyle();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Returns design-time commands applicable to this designer.</summary>
 | 
						|
        public override DesignerVerbCollection Verbs
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                DesignerVerb[] verbs = null;
 | 
						|
#if (FRAMEWORK20)
 | 
						|
                verbs = new DesignerVerb[]
 | 
						|
					{
 | 
						|
                        new DesignerVerb("Edit Items...", new EventHandler(EditItems))
 | 
						|
				};
 | 
						|
#else
 | 
						|
                verbs = new DesignerVerb[]
 | 
						|
					{
 | 
						|
						new DesignerVerb("Create Item", new EventHandler(CreateItem))
 | 
						|
				};
 | 
						|
#endif
 | 
						|
                return new DesignerVerbCollection(verbs);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void EditItems(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            EditItems();
 | 
						|
        }
 | 
						|
 | 
						|
        internal void EditItems()
 | 
						|
        {
 | 
						|
            CrumbBar crumbBar = this.Component as CrumbBar;
 | 
						|
#if (FRAMEWORK20)
 | 
						|
            Form form = new Form();
 | 
						|
            form.Text = "CrumbBar control editor";
 | 
						|
            form.FormBorderStyle = FormBorderStyle.Sizable;
 | 
						|
            form.MinimizeBox = false;
 | 
						|
            form.StartPosition = FormStartPosition.CenterScreen;
 | 
						|
            CrumbBarItemsEditor editor = new CrumbBarItemsEditor();
 | 
						|
            editor.Dock = DockStyle.Fill;
 | 
						|
            form.Size = new System.Drawing.Size(800, 600);
 | 
						|
            form.Controls.Add(editor);
 | 
						|
 | 
						|
            editor.CrumbBar = crumbBar;
 | 
						|
            editor.Designer = this;
 | 
						|
            editor.UpdateDisplay();
 | 
						|
            form.ShowDialog();
 | 
						|
            form.Dispose();
 | 
						|
#else
 | 
						|
            DevComponents.AdvTree.Design.AdvTreeDesigner.EditValue(this, crumbBar, "Items");
 | 
						|
#endif
 | 
						|
        }
 | 
						|
 | 
						|
        private void CreateItem(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            CreateItem();
 | 
						|
        }
 | 
						|
 | 
						|
        internal void CreateItem()
 | 
						|
        {
 | 
						|
            CrumbBarItem node = CreateItem(this.Component as CrumbBar);
 | 
						|
            if (node != null)
 | 
						|
            {
 | 
						|
                ISelectionService sel = this.GetService(typeof(ISelectionService)) as ISelectionService;
 | 
						|
                ArrayList list = new ArrayList(1);
 | 
						|
                list.Add(node);
 | 
						|
                if (sel != null)
 | 
						|
                {
 | 
						|
                    sel.SetSelectedComponents(list, SelectionTypes.MouseDown);
 | 
						|
                    CrumbBar crumbBar = this.Component as CrumbBar;
 | 
						|
                    if (crumbBar != null && crumbBar.SelectedItem == null)
 | 
						|
                        crumbBar.SelectedItem = node;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public object GetDesignService(Type serviceType)
 | 
						|
        {
 | 
						|
            return GetService(serviceType);
 | 
						|
        }
 | 
						|
 | 
						|
        private CrumbBarItem CreateItem(CrumbBar crumbBar)
 | 
						|
        {
 | 
						|
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
            if (dh == null)
 | 
						|
                return null;
 | 
						|
 | 
						|
            CrumbBarItem node = null;
 | 
						|
            try
 | 
						|
            {
 | 
						|
                IComponentChangeService change = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
                if (change != null)
 | 
						|
                {
 | 
						|
                    change.OnComponentChanging(this.Component, TypeDescriptor.GetProperties(crumbBar).Find("Items", true));
 | 
						|
                }
 | 
						|
 | 
						|
                node = dh.CreateComponent(typeof(CrumbBarItem)) as CrumbBarItem;
 | 
						|
                if (node != null)
 | 
						|
                {
 | 
						|
                    node.Text = node.Name;
 | 
						|
                    crumbBar.Items.Add(node);
 | 
						|
 | 
						|
                    if (change != null)
 | 
						|
                        change.OnComponentChanged(this.Component, TypeDescriptor.GetProperties(crumbBar).Find("Items", true), null, null);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                crumbBar.RecalcLayout();
 | 
						|
            }
 | 
						|
 | 
						|
            return node;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>Called when component is about to be removed from designer.</summary>
 | 
						|
        /// <param name="sender">Event sender.</param>
 | 
						|
        /// <param name="e">Event arguments.</param>
 | 
						|
        public void OnComponentRemoving(object sender, ComponentEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Component == this.Component)
 | 
						|
            {
 | 
						|
                IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
                if (dh == null)
 | 
						|
                    return;
 | 
						|
 | 
						|
                ArrayList list = new ArrayList(this.AssociatedComponents);
 | 
						|
                foreach (IComponent c in list)
 | 
						|
                    dh.DestroyComponent(c);
 | 
						|
            }
 | 
						|
            else if (e.Component is CrumbBarItem && ((CrumbBarItem)e.Component).GetOwner() == this.Control)
 | 
						|
            {
 | 
						|
                OnNodeRemoving(e.Component as CrumbBarItem);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnNodeRemoving(CrumbBarItem node)
 | 
						|
        {
 | 
						|
            IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | 
						|
            IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
 | 
						|
            
 | 
						|
            // Root node
 | 
						|
            CrumbBar tree = this.Control as CrumbBar;
 | 
						|
            bool wasSelected = tree.GetIsInSelectedPath(node);
 | 
						|
 | 
						|
            if (node.Parent != null)
 | 
						|
            {
 | 
						|
                CrumbBarItem parent = node.Parent as CrumbBarItem;
 | 
						|
                if (parent != null)
 | 
						|
                {
 | 
						|
                    if (cc != null)
 | 
						|
                        cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(parent)["SubItems"]);
 | 
						|
                    parent.SubItems.Remove(node);
 | 
						|
                    if (cc != null)
 | 
						|
                        cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(parent)["SubItems"], null, null);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (cc != null)
 | 
						|
                    cc.OnComponentChanging(tree, TypeDescriptor.GetProperties(tree)["Items"]);
 | 
						|
                tree.Items.Remove(node);
 | 
						|
                if (cc != null)
 | 
						|
                    cc.OnComponentChanged(tree, TypeDescriptor.GetProperties(tree)["Items"], null, null);
 | 
						|
            }
 | 
						|
 | 
						|
            if (node.SubItems.Count > 0)
 | 
						|
            {
 | 
						|
                BaseItem[] nodes = new BaseItem[node.SubItems.Count];
 | 
						|
                node.SubItems.CopyTo(nodes, 0);
 | 
						|
                foreach (BaseItem n in nodes)
 | 
						|
                {
 | 
						|
                    node.SubItems.Remove(n);
 | 
						|
 | 
						|
                    if (dh != null)
 | 
						|
                        dh.DestroyComponent(n);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (wasSelected)
 | 
						|
            {
 | 
						|
                tree.SelectedItem = tree.GetFirstVisibleItem();
 | 
						|
            }
 | 
						|
 | 
						|
            this.RecalcLayout();
 | 
						|
        }
 | 
						|
 | 
						|
        private void RecalcLayout()
 | 
						|
        {
 | 
						|
            CrumbBar tree = this.Control as CrumbBar;
 | 
						|
            if (tree != null) tree.RecalcLayout();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns all components associated with this control
 | 
						|
        /// </summary>
 | 
						|
        public override ICollection AssociatedComponents
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                ArrayList c = new ArrayList(base.AssociatedComponents);
 | 
						|
                CrumbBar tree = this.Control as CrumbBar;
 | 
						|
                if (tree != null)
 | 
						|
                {
 | 
						|
                    foreach (BaseItem node in tree.Items)
 | 
						|
                        GetItemsRecursive(node, c);
 | 
						|
                }
 | 
						|
                return c;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void GetItemsRecursive(BaseItem parent, ArrayList c)
 | 
						|
        {
 | 
						|
            c.Add(parent);
 | 
						|
            foreach (BaseItem node in parent.SubItems)
 | 
						|
            {
 | 
						|
                c.Add(node);
 | 
						|
                GetItemsRecursive(node, c);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |