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 { /// /// Represents Windows Forms designer for SideNav control. /// 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; } /// /// Support for popup menu closing. /// 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); } } } /// /// Triggered when some other component on the form is removed. /// 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 } }