using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
///
/// Represents designer for BaseItem objects and derived classes.
///
public class BaseItemDesigner:System.ComponentModel.Design.ComponentDesigner,IDesignerServices
{
#region Internal Implementation
///
/// Creates new instance of the class.
///
public BaseItemDesigner()
{
}
public override void Initialize(IComponent component)
{
base.Initialize(component);
if(!component.Site.DesignMode)
return;
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
ss.SelectionChanged+=new EventHandler(OnSelectionChanged);
BaseItem c=component as BaseItem;
if(c!=null)
this.Visible=c.Visible;
// If our component is removed we need to clean-up
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
{
cc.ComponentRemoved+=new ComponentEventHandler(this.OnComponentRemoved);
}
}
protected override void Dispose(bool disposing)
{
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
ss.SelectionChanged-=new EventHandler(OnSelectionChanged);
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
{
cc.ComponentRemoved-=new ComponentEventHandler(this.OnComponentRemoved);
}
base.Dispose(disposing);
}
private void OnComponentRemoved(object sender,ComponentEventArgs e)
{
if(e.Component is BaseItem)
{
BaseItem parent=this.Component as BaseItem;
BaseItem item=e.Component as BaseItem;
if(item!=null && parent!=null && parent.SubItems.Contains(item))
{
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
cc.OnComponentChanging(parent,TypeDescriptor.GetProperties(parent)["SubItems"]);
parent.SubItems.Remove(item);
if(cc!=null)
cc.OnComponentChanged(parent,TypeDescriptor.GetProperties(parent)["SubItems"],null,null);
this.RecalcLayout();
}
}
}
private void OnSelectionChanged(object sender, EventArgs e)
{
ISelectionService ss = (ISelectionService)sender;
if(ss!=null && ss.PrimarySelection!=this.Component && ss.PrimarySelection is BaseItem)
{
BaseItem item=this.Component as BaseItem;
if(item!=null)
{
BaseItem selected=ss.PrimarySelection as BaseItem;
IOwner owner=item.GetOwner() as IOwner;
if(owner!=null)
{
if(owner.GetItem(selected.Name)!=selected)
owner.SetFocusItem(null);
}
}
}
}
public override DesignerVerbCollection Verbs
{
get
{
DesignerVerb[] verbs = new DesignerVerb[]
{
new DesignerVerb("Create Button", new EventHandler(CreateButton)),
new DesignerVerb("Create Text Box", new EventHandler(CreateTextBox)),
new DesignerVerb("Create Combo Box", new EventHandler(CreateComboBox)),
new DesignerVerb("Create Label", new EventHandler(CreateLabel)),
};
return new DesignerVerbCollection(verbs);
}
}
protected virtual void CreateButton(object sender, EventArgs e)
{
CreateNewItem(typeof(ButtonItem));
}
protected virtual void CreateComboBox(object sender, EventArgs e)
{
CreateNewItem(typeof(ComboBoxItem));
}
protected virtual void CreateLabel(object sender, EventArgs e)
{
CreateNewItem(typeof(LabelItem));
}
protected virtual void CreateTextBox(object sender, EventArgs e)
{
CreateNewItem(typeof(TextBoxItem));
}
protected virtual void CreateNewItem(Type itemType)
{
BaseItem parent=this.Component as BaseItem;
System.ComponentModel.Design.IDesignerHost dh=(System.ComponentModel.Design.IDesignerHost)GetService(typeof(System.ComponentModel.Design.IDesignerHost));
System.ComponentModel.Design.IComponentChangeService change=this.GetService(typeof(System.ComponentModel.Design.IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(parent).Find("SubItems",true));
BaseItem item=dh.CreateComponent(itemType) as BaseItem;
if(item==null)
return;
item.Text=item.Name;
BeforeNewItemAdded(item);
parent.SubItems.Add(item);
AfterNewItemAdded(item);
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(parent).Find("SubItems",true),null,null);
this.RecalcLayout();
}
protected virtual void BeforeNewItemAdded(BaseItem item) {}
protected virtual void AfterNewItemAdded(BaseItem item) {}
protected virtual void RecalcLayout()
{
BaseItem item=this.Component as BaseItem;
System.Windows.Forms.Control control=item.ContainerControl as System.Windows.Forms.Control;
if(control is Bar)
((Bar)control).RecalcLayout();
else if(control is ExplorerBar)
((ExplorerBar)control).RecalcLayout();
else if(control is BarBaseControl)
((BarBaseControl)control).RecalcLayout();
else if(control is SideBar)
((SideBar)control).RecalcLayout();
}
public override System.Collections.ICollection AssociatedComponents
{
get
{
System.Collections.ArrayList components=new System.Collections.ArrayList();
BaseItem parent=this.Component as BaseItem;
if(parent==null)
return base.AssociatedComponents;
parent.SubItems.CopyTo(components);
return components;
}
}
protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
properties["Visible"] = TypeDescriptor.CreateProperty(typeof(BaseItemDesigner),(PropertyDescriptor)properties["Visible"], new Attribute[]
{
new DefaultValueAttribute(true),
new BrowsableAttribute(true),
new CategoryAttribute("Layout")});
properties["CanCustomize"] = TypeDescriptor.CreateProperty(typeof(BaseItemDesigner),(PropertyDescriptor)properties["CanCustomize"], new Attribute[]
{
new DefaultValueAttribute(true),
new BrowsableAttribute(true),
new CategoryAttribute("Behavior"),
new DescriptionAttribute("Indicates whether item can be customized by user.")});
}
///
/// Gets or sets whether item can be customized by end user.
///
[System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Indicates whether item can be customized by user.")]
public virtual bool CanCustomize
{
get
{
return (bool)ShadowProperties["CanCustomize"];
}
set
{
// this value is not passed to the actual control
this.ShadowProperties["CanCustomize"] = value;
}
}
///
/// Gets or sets whether item is visible.
///
[DefaultValue(true),Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Gets or sets whether item is visible.")]
public bool Visible
{
get
{
return (bool)ShadowProperties["Visible"];
}
set
{
// this value is not passed to the actual control
this.ShadowProperties["Visible"] = value;
}
}
#endregion
#region IDesignerServices Implementation
object IDesignerServices.CreateComponent(System.Type componentClass)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
return dh.CreateComponent(componentClass);
}
void IDesignerServices.DestroyComponent(IComponent c)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
dh.DestroyComponent(c);
}
object IDesignerServices.GetService(Type serviceType)
{
return this.GetService(serviceType);
}
#endregion
}
}