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