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