SourceCode/PROMS/DotNetBar Source Code/DotNetBarManagerDesigner.cs

629 lines
19 KiB
C#

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Reflection;
using System.Collections;
namespace DevComponents.DotNetBar
{
/// <summary>
/// Summary description for DotNetBarDesigner.
/// </summary>
public class DotNetBarManagerDesigner:System.ComponentModel.Design.ComponentDesigner,IDesignerServices
{
private bool m_PopupProvider=false;
private bool m_Selected=false;
public override DesignerVerbCollection Verbs
{
get
{
DesignerVerb[] verbs = new DesignerVerb[] {new DesignerVerb("Edit DotNetBar", new EventHandler(OnEditDotNetBar)) ,
new DesignerVerb("Enable Document Docking", new EventHandler(OnEnableDocumentDocking))};
return new DesignerVerbCollection(verbs);
}
}
public override void DoDefaultAction()
{
DotNetBarManager dbm=this.Component as DotNetBarManager;
if(dbm!=null)
{
dbm.Customize(this);
}
}
protected override void Dispose(bool disposing)
{
// Unhook events
if(disposing)
{
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
cc.ComponentRemoving-=new ComponentEventHandler(this.OnComponentRemoving);
ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService));
if (ss!=null)
ss.SelectionChanged-=new EventHandler(OnSelectionChanged);
}
base.Dispose(disposing);
}
private void ComponentRenamed(object sender, ComponentRenameEventArgs e)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
if(e.Component==dh.RootComponent || e.Component==this.Component)
{
DotNetBarManager m=this.Component as DotNetBarManager;
if(m!=null && m.DefinitionName!="")
{
if(DesignTimeDte.DeleteFromProject(m.DefinitionName, this.Component.Site))
{
m.DefinitionName="";
m.SaveDesignDefinition();
}
}
}
}
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);
cc.ComponentRename+=new ComponentRenameEventHandler(this.ComponentRenamed);
}
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
ss.SelectionChanged+=new EventHandler(OnSelectionChanged);
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
if(dh.Loading)
{
dh.LoadComplete+=new EventHandler(this.LoadComplete);
return;
}
}
#if FRAMEWORK20
public override void InitializeNewComponent(IDictionary defaultValues)
{
base.InitializeNewComponent(defaultValues);
SetDesignTimeDefaults();
}
#else
public override void OnSetComponentDefaults()
{
base.OnSetComponentDefaults();
SetDesignTimeDefaults();
}
#endif
private void SetDesignTimeDefaults()
{
SetupDockSites();
// Set auto shortcuts that are automatically dispatched...
DotNetBarManager m = this.Component as DotNetBarManager;
m.AutoDispatchShortcuts.Add(eShortcut.F1);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlC);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlA);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlV);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlX);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlZ);
m.AutoDispatchShortcuts.Add(eShortcut.CtrlY);
m.AutoDispatchShortcuts.Add(eShortcut.Del);
m.AutoDispatchShortcuts.Add(eShortcut.Ins);
m.Style = eDotNetBarStyle.Office2003;
}
private void LoadComplete(object sender, EventArgs e)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh!=null && e!=null)
dh.LoadComplete-=new EventHandler(this.LoadComplete);
LoadDefinition();
}
private void LoadDefinition()
{
// Make sure at-least this property is set
DotNetBarManager m=this.Component as DotNetBarManager;
if(m!=null && !m.IsDisposed && (m.LeftDockSite==null && m.RightDockSite==null && m.TopDockSite==null && m.BottomDockSite==null))
{
m_PopupProvider=true;
m.BarStreamLoad(true);
}
else
{
m_PopupProvider=false;
//m.BarStreamLoad(true);
}
}
private void OnEditDotNetBar(object sender, EventArgs e)
{
DotNetBarManager dbm=this.Component as DotNetBarManager;
if(dbm!=null)
dbm.Customize(this);
}
private void OnEnableDocumentDocking(object sender, EventArgs e)
{
DotNetBarManager m=this.Component as DotNetBarManager;
if(m.FillDockSite==null)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
System.Windows.Forms.Control parent=dh.RootComponent as System.Windows.Forms.Control;
if(parent==null)
return;
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc==null)
return;
DesignerTransaction trans=dh.CreateTransaction("Document Docking Enabled");
DockSite fillDock=dh.CreateComponent(typeof(DockSite)) as DockSite;
fillDock.Dock=System.Windows.Forms.DockStyle.Fill;
cc.OnComponentChanging(parent,TypeDescriptor.GetProperties(typeof(System.Windows.Forms.Control))["Controls"]);
parent.Controls.Add(fillDock);
fillDock.BringToFront();
cc.OnComponentChanged(parent,TypeDescriptor.GetProperties(typeof(System.Windows.Forms.Control))["Controls"],null,null);
cc.OnComponentChanging(m,TypeDescriptor.GetProperties(typeof(DotNetBarManager))["FillDockSite"]);
m.FillDockSite=fillDock;
cc.OnComponentChanged(m,TypeDescriptor.GetProperties(typeof(DotNetBarManager))["FillDockSite"],null,fillDock);
DocumentDockContainer dockContainer=new DocumentDockContainer();
cc.OnComponentChanging(fillDock,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"]);
fillDock.DocumentDockContainer=dockContainer;
cc.OnComponentChanged(fillDock,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"],null,dockContainer);
Bar bar=dh.CreateComponent(typeof(Bar)) as Bar;
BarUtilities.InitializeDocumentBar(bar);
// bar.LayoutType=eLayoutType.DockContainer;
// bar.DockTabAlignment=eTabStripAlignment.Top;
// bar.AlwaysDisplayDockTab=true;
// bar.Stretch=true;
// bar.GrabHandleStyle=eGrabHandleStyle.None;
TypeDescriptor.GetProperties(bar)["Style"].SetValue(bar,m.Style);
// bar.Style=m.Style;
// bar.CanDockBottom=false;
// bar.CanDockTop=false;
// bar.CanDockLeft=false;
// bar.CanDockRight=false;
// bar.CanDockDocument=true;
// bar.CanUndock=false;
// bar.CanHide=true;
// bar.CanCustomize=false;
DockContainerItem item=dh.CreateComponent(typeof(DockContainerItem)) as DockContainerItem;
item.Text=item.Name;
cc.OnComponentChanging(bar,TypeDescriptor.GetProperties(typeof(Bar))["Items"]);
bar.Items.Add(item);
PanelDockContainer panel=dh.CreateComponent(typeof(PanelDockContainer)) as PanelDockContainer;
cc.OnComponentChanging(bar, TypeDescriptor.GetProperties(typeof(Bar))["Controls"]);
item.Control=panel;
cc.OnComponentChanged(bar, TypeDescriptor.GetProperties(typeof(Bar))["Controls"], null, null);
//bar.Controls.Add(panel);
panel.ColorSchemeStyle=m.Style;
panel.ApplyLabelStyle();
cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
DocumentBarContainer doc=new DocumentBarContainer(bar);
dockContainer.Documents.Add(doc);
cc.OnComponentChanging(fillDock,TypeDescriptor.GetProperties(typeof(DockSite))["Controls"]);
fillDock.Controls.Add(bar);
cc.OnComponentChanged(fillDock,TypeDescriptor.GetProperties(typeof(DockSite))["Controls"],null,null);
fillDock.RecalcLayout();
trans.Commit();
}
}
#region IDesignerServices Implementation
public object CreateComponent(System.Type componentClass)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
return dh.CreateComponent(componentClass);
}
public void 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
private void OnComponentRemoving(object sender,ComponentEventArgs e)
{
if(e.Component!=this.Component)
{
return;
}
// Unhook events
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
cc.ComponentRemoving-=new ComponentEventHandler(this.OnComponentRemoving);
DotNetBarManager m=this.Component as DotNetBarManager;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null || m==null)
return;
if(m.TopDockSite!=null)
dh.DestroyComponent(m.TopDockSite);
if(m.BottomDockSite!=null)
dh.DestroyComponent(m.BottomDockSite);
if(m.LeftDockSite!=null)
dh.DestroyComponent(m.LeftDockSite);
if(m.RightDockSite!=null)
dh.DestroyComponent(m.RightDockSite);
if(m.DefinitionName!=null)
{
DesignTimeDte.DeleteFromProject(m.DefinitionName, this.Component.Site);
m.DefinitionName="";
}
}
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
// Always call base first in PreFilter* methods, and last in PostFilter*
// methods.
base.PreFilterProperties(properties);
properties["ProvidePopupsOnly"] = TypeDescriptor.CreateProperty(
this.GetType(), // the type this property is defined on
"ProvidePopupsOnly", // the name of the property
typeof(bool), // the type of the property
new Attribute[] {CategoryAttribute.Design,System.ComponentModel.DesignerSerializationVisibilityAttribute.Hidden,new DescriptionAttribute("When set to True DotNetBar provides Popups only without Toolbars or Menu Bars. Use on child forms to provide Context Menus.")}); // attributes
properties["Style"] = TypeDescriptor.CreateProperty(
this.GetType(), // the type this property is defined on
"Style", // the name of the property
typeof(eDotNetBarStyle), // the type of the property
new Attribute[0]);
properties["ThemeAware"] = TypeDescriptor.CreateProperty(
this.GetType(), // the type this property is defined on
"ThemeAware", // the name of the property
typeof(bool), // the type of the property
new Attribute[0]);
}
// Popup Provider is design-time only property that determines whether current DotNetBar provides
// Popup Context Menu only or is full blown Toolbar/Menu bar component
[DefaultValue(false)]
protected bool ProvidePopupsOnly
{
get
{
return m_PopupProvider;
}
set
{
if(m_PopupProvider==value)
return;
m_PopupProvider=value;
DotNetBarManager m=this.Component as DotNetBarManager;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(m_PopupProvider)
{
RemoveDockSites();
if(m!=null && dh!=null && dh.RootComponent is System.Windows.Forms.UserControl)
{
m.ParentUserControl=dh.RootComponent as System.Windows.Forms.UserControl;
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
cc.OnComponentChanged(m,(TypeDescriptor.GetProperties(m)["ParentUserControl"]),null,null);
}
}
else
{
SetupDockSites();
if(m!=null)
{
m.ParentUserControl=null;
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
cc.OnComponentChanged(m,(TypeDescriptor.GetProperties(m)["ParentUserControl"]),null,null);
}
}
}
}
public override System.Collections.ICollection AssociatedComponents
{
get
{
DotNetBarManager m=this.Component as DotNetBarManager;
if(m==null)
return base.AssociatedComponents;
System.Collections.ArrayList list=new System.Collections.ArrayList(4);
if(m.TopDockSite!=null)
list.Add(m.TopDockSite);
if(m.BottomDockSite!=null)
list.Add(m.BottomDockSite);
if(m.LeftDockSite!=null)
list.Add(m.LeftDockSite);
if(m.RightDockSite!=null)
list.Add(m.RightDockSite);
if(m.DefinitionName=="")
{
list.AddRange(m.Bars);
foreach(Bar bar in m.Bars)
AddItems(bar.ItemsContainer,list);
foreach(BaseItem item in m.Items)
{
list.Add(item);
AddItems(item,list);
}
foreach(BaseItem item in m.ContextMenus)
{
list.Add(item);
AddItems(item,list);
}
}
return list;
}
}
private void AddItems(BaseItem parent,System.Collections.ArrayList list)
{
foreach(BaseItem item in parent.SubItems)
{
if(!item.SystemItem)
{
list.Add(item);
if(item.SubItems.Count>0)
AddItems(item,list);
}
}
}
private void RemoveDockSites()
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return;
DotNetBarManager m=this.Component as DotNetBarManager;
if(m.LeftDockSite!=null)
dh.DestroyComponent(m.LeftDockSite);
if(m.RightDockSite!=null)
dh.DestroyComponent(m.RightDockSite);
if(m.TopDockSite!=null)
dh.DestroyComponent(m.TopDockSite);
if(m.BottomDockSite!=null)
dh.DestroyComponent(m.BottomDockSite);
m.LeftDockSite=null;
m.TopDockSite=null;
m.BottomDockSite=null;
m.RightDockSite=null;
}
private void SetupDockSites()
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
{
return;
}
if(dh.Loading)
{
dh.LoadComplete+=new EventHandler(this.LoadComplete);
return;
}
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
// Set default properties for this control and add default dependent controls
DotNetBarManager m=this.Component as DotNetBarManager;
System.Windows.Forms.Form form=dh.RootComponent as System.Windows.Forms.Form;
System.Windows.Forms.UserControl parentControl=dh.RootComponent as System.Windows.Forms.UserControl;
if(m==null || (form==null && parentControl==null))
{
return;
}
if(form!=null)
{
try
{
m.ParentForm=form;
// Left Dock Site
DockSite ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barLeftDockSite");
form.Controls.Add(ds);
m.LeftDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Left;
// Right Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barRightDockSite");
form.Controls.Add(ds);
m.RightDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Right;
// Top Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barTopDockSite");
form.Controls.Add(ds);
m.TopDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Top;
// Bottom Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barBottomDockSite");
form.Controls.Add(ds);
m.BottomDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Bottom;
if(cc!=null)
{
cc.OnComponentChanging(form,TypeDescriptor.GetProperties(form).Find("Controls",true));
cc.OnComponentChanged(form,TypeDescriptor.GetProperties(form).Find("Controls",true),null,null);
}
}
catch(Exception e)
{
// DEBUG
System.Windows.Forms.MessageBox.Show("Error setting up dock sites: " + e.ToString());
}
}
else if(parentControl!=null)
{
try
{
// Left Dock Site
DockSite ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barLeftDockSite");
parentControl.Controls.Add(ds);
m.LeftDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Left;
// Right Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barRightDockSite");
parentControl.Controls.Add(ds);
m.RightDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Right;
// Top Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barTopDockSite");
parentControl.Controls.Add(ds);
m.TopDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Top;
// Bottom Dock Site
ds=(DockSite)dh.CreateComponent(typeof(DockSite),"barBottomDockSite");
parentControl.Controls.Add(ds);
m.BottomDockSite=ds;
ds.Dock=System.Windows.Forms.DockStyle.Bottom;
if(cc!=null)
{
cc.OnComponentChanging(parentControl,TypeDescriptor.GetProperties(parentControl).Find("Controls",true));
cc.OnComponentChanged(parentControl,TypeDescriptor.GetProperties(parentControl).Find("Controls",true),null,null);
}
}
catch(Exception e)
{
// DEBUG
System.Windows.Forms.MessageBox.Show("Error setting up dock sites on UserControl: " + e.ToString());
}
}
}
private void OnSelectionChanged(object sender, EventArgs e)
{
ISelectionService ss = (ISelectionService)sender;
if(ss!=null && ss.PrimarySelection==this.Component)
{
IOwner manager=this.Component as IOwner;
manager.OnApplicationActivate();
m_Selected=true;
}
else if(m_Selected)
{
IOwner manager=this.Component as IOwner;
manager.OnApplicationDeactivate();
m_Selected=false;
}
}
public static bool OpenDesignerEditor(DotNetBarManager manager, Bar bar, IDesignerServices designerServices)
{
DevComponents.DotNetBar.Design.DotNetBarDesigner designer=new DevComponents.DotNetBar.Design.DotNetBarDesigner();
if(manager!=null)
designer.ExternalManager=manager;
else if(bar!=null)
designer.ExternalBar=bar;
if(designerServices!=null)
designer.DesignerServices=designerServices;
System.Windows.Forms.DialogResult dr=designer.ShowDialog();
if(dr==System.Windows.Forms.DialogResult.Yes)
return true;
return false;
}
/// <summary>
/// Sets the style of all items in DotNetBar Manager.
/// </summary>
public eDotNetBarStyle Style
{
set
{
DotNetBarManager manager=this.Component as DotNetBarManager;
if(manager.Style!=value)
{
manager.Style=value;
IDesignerHost dh=this.GetService(typeof(IDesignerHost)) as IDesignerHost;
if(dh!=null && !dh.Loading)
manager.SaveDesignDefinition();
}
}
get
{
DotNetBarManager manager=this.Component as DotNetBarManager;
return manager.Style;
}
}
/// <summary>
/// Specifies whether new bars created are drawn using Themes when running on OS that supports themes like Windows XP. Note this setting
/// applies to new bars created.
/// </summary>
public bool ThemeAware
{
set
{
DotNetBarManager manager=this.Component as DotNetBarManager;
if(manager.ThemeAware!=value)
{
manager.ThemeAware=value;
IDesignerHost dh=this.GetService(typeof(IDesignerHost)) as IDesignerHost;
if(dh!=null && !dh.Loading)
manager.SaveDesignDefinition();
}
}
get
{
DotNetBarManager manager=this.Component as DotNetBarManager;
return manager.ThemeAware;
}
}
}
}