using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.ComponentModel.Design.Serialization;
using System.CodeDom;
using System.Drawing;
using System.Collections;
namespace DevComponents.DotNetBar
{
///
/// Represents Windows Forms designer for SideBar control.
///
public class SideBarDesigner:BarBaseControlDesigner
{
#region Internal Implementation
public SideBarDesigner():base()
{
this.EnableItemDragDrop=true;
}
public override void Initialize(IComponent component)
{
base.Initialize(component);
if(!component.Site.DesignMode)
return;
SideBar bar=this.Control as SideBar;
if(bar!=null)
bar.SetDesignMode();
}
public override DesignerVerbCollection Verbs
{
get
{
DesignerVerb[] verbs;
verbs = new DesignerVerb[]
{
new DesignerVerb("Create Panel", new EventHandler(OnAddGroup)),
new DesignerVerb("Create Button", new EventHandler(OnAddButton)),
new DesignerVerb("Choose Color Scheme", new EventHandler(OnPickColorScheme))
};
return new DesignerVerbCollection(verbs);
}
}
protected override BaseItem GetItemContainer()
{
SideBar bar=this.Control as SideBar;
if(bar!=null)
return bar.ItemsContainer;
return null;
}
protected override void RecalcLayout()
{
SideBar bar=this.GetItemContainerControl() as SideBar;
if(bar!=null)
bar.RecalcLayout();
}
protected override void OnSubItemsChanging()
{
base.OnSubItemsChanging();
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
{
SideBar bar=this.GetItemContainerControl() as SideBar;
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("Panels",true));
}
}
protected override void OnSubItemsChanged()
{
base.OnSubItemsChanged();
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
{
SideBar bar=this.GetItemContainerControl() as SideBar;
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("Panels",true),null,null);
}
}
private void OnAddGroup(object sender, EventArgs e)
{
IDesignerHost dh=this.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction trans=null;
if(dh!=null)
trans=dh.CreateTransaction("New SideBarPanelItem");
try
{
CreateNewPanel();
}
finally
{
if(trans!=null && !trans.Canceled)
trans.Commit();
}
this.RecalcLayout();
}
private SideBarPanelItem CreateNewPanel()
{
SideBarPanelItem item=null;
SideBar bar=this.Component as SideBar;
IDesignerHost dh=GetIDesignerHost();
if(bar!=null && dh!=null)
{
OnSubItemsChanging();
item=dh.CreateComponent(typeof(SideBarPanelItem)) as SideBarPanelItem;
if(item==null)
return null;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(item,null);
item.Text=item.Name;
bar.Panels.Add(item);
item.Appearance = bar.Appearance;
if (item.Appearance == eSideBarAppearance.Flat)
SideBar.ApplyColorScheme(item, bar.PredefinedColorScheme);
if(change!=null)
change.OnComponentChanged(item,null,null,null);
OnSubItemsChanged();
}
return item;
}
private void OnAddButton(object sender, EventArgs e)
{
SideBar bar=this.Component as SideBar;
IDesignerHost dh=GetIDesignerHost();
if(bar!=null && dh!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection==null)
return;
SideBarPanelItem panel=null;
if(!(selection.PrimarySelection is SideBarPanelItem))
{
if(bar.ExpandedPanel==null)
panel=CreateNewPanel();
else
panel=bar.ExpandedPanel;
}
else
panel=selection.PrimarySelection as SideBarPanelItem;
if(panel==null)
return;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(panel).Find("SubItems",true));
ButtonItem item=dh.CreateComponent(typeof(ButtonItem)) as ButtonItem;
if(item==null)
return;
item.Text="New Button";
if(bar.Appearance==eSideBarAppearance.Flat)
item.ImagePosition=eImagePosition.Left;
else
item.ImagePosition=eImagePosition.Top;
item.ButtonStyle=eButtonStyle.ImageAndText;
panel.SubItems.Add(item);
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(panel).Find("SubItems",true),null,null);
this.RecalcLayout();
}
}
private void OnPickColorScheme(object sender, EventArgs e)
{
using(SideBarColorSchemePicker picker=new SideBarColorSchemePicker())
{
picker.ShowDialog();
if(picker.DialogResult==DialogResult.OK)
{
SetColorScheme(picker.SelectedColorScheme);
}
}
}
private void SetColorScheme(eSideBarColorScheme scheme)
{
SideBar sidebar=this.Control as SideBar;
if(sidebar!=null)
{
if(sidebar.Appearance!=eSideBarAppearance.Flat)
TypeDescriptor.GetProperties(sidebar)["Appearance"].SetValue(sidebar, eSideBarAppearance.Flat);
TypeDescriptor.GetProperties(sidebar)["PredefinedColorScheme"].SetValue(sidebar, scheme);
sidebar.ApplyPredefinedColorScheme(scheme);
this.RaiseStyleChanged();
}
}
private void RaiseStyleChanged()
{
IDesignerHost dh=GetIDesignerHost();
DesignerTransaction trans=null;
if(dh!=null)
trans=dh.CreateTransaction();
SideBar sidebar=this.Control as SideBar;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
{
change.OnComponentChanging(this.Control,null);
change.OnComponentChanged(this.Control,null,null,null);
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(sidebar).Find("ColorScheme",true));
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(sidebar).Find("ColorScheme",true),null,null);
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(sidebar).Find("Panels",true));
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(sidebar).Find("Panels",true),null,null);
foreach(SideBarPanelItem panel in sidebar.Panels)
{
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderStyle"],null,null);
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderHotStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderHotStyle"],null,null);
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderMouseDownStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderMouseDownStyle"],null,null);
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideHotStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideHotStyle"],null,null);
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideMouseDownStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideMouseDownStyle"],null,null);
change.OnComponentChanging(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideStyle"]);
change.OnComponentChanged(panel,TypeDescriptor.GetProperties(typeof(SideBarPanelItem))["HeaderSideStyle"],null,null);
}
}
if(trans!=null)
trans.Commit();
}
private IDesignerHost GetIDesignerHost()
{
try
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
return dh;
}
catch{}
return null;
}
protected override void PreFilterProperties(
IDictionary properties)
{
base.PreFilterProperties(properties);
// shadow the checked property so we can intercept the set.
//
properties["Appearance"] =
TypeDescriptor.CreateProperty(typeof(SideBarDesigner),
(PropertyDescriptor)properties["Appearance"],
new Attribute[0]);
}
///
/// Gets or sets visual appearance for the control.
///
[Browsable(true),DefaultValue(eSideBarAppearance.Traditional),Category("Appearance"),Description("Indicates visual appearance for the control.")]
public eSideBarAppearance Appearance
{
get
{
return ((SideBar)Control).Appearance;
}
set
{
// set the value into the control
if(((SideBar)Control).Appearance != value)
{
((SideBar)Control).Appearance=value;
if(value==eSideBarAppearance.Flat)
{
SetColorScheme(((SideBar)Control).PredefinedColorScheme);
}
else if(value==eSideBarAppearance.Traditional)
{
((SideBar)Control).ResetTraditional();
RaiseStyleChanged();
}
}
}
}
protected override bool CanDragItem(BaseItem item)
{
if(item is SideBarPanelItem)
return false;
return base.CanDragItem(item);
}
#endregion
}
}