509 lines
15 KiB
C#
509 lines
15 KiB
C#
using System;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.Design;
|
|
using System.Collections;
|
|
using System.Drawing;
|
|
using System.ComponentModel.Design;
|
|
using System.ComponentModel;
|
|
|
|
namespace DevComponents.DotNetBar.Design
|
|
{
|
|
/// <summary>
|
|
/// Summary description for TabStripDesigner.
|
|
/// </summary>
|
|
public class TabStripDesigner:ParentControlDesigner
|
|
{
|
|
public TabStripDesigner()
|
|
{
|
|
}
|
|
|
|
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);
|
|
|
|
// 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);
|
|
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip!=null)
|
|
tabStrip.TabMoved+=new TabStrip.TabMovedEventHandler(this.TabMoved);
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
|
|
if(ss!=null)
|
|
ss.SelectionChanged-=new EventHandler(OnSelectionChanged);
|
|
|
|
// 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);
|
|
}
|
|
public override DesignerVerbCollection Verbs
|
|
{
|
|
get
|
|
{
|
|
DesignerVerb[] verbs;
|
|
verbs = new DesignerVerb[]
|
|
{
|
|
new DesignerVerb("Next Tab", new EventHandler(SelectNextTab)),
|
|
new DesignerVerb("Previous Tab", new EventHandler(SelectPreviousTab)),
|
|
new DesignerVerb("Create New Tab", new EventHandler(CreateNewTab))
|
|
};
|
|
return new DesignerVerbCollection(verbs);
|
|
}
|
|
}
|
|
|
|
protected virtual void CreateNewTab(object sender, EventArgs e)
|
|
{
|
|
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
|
|
TabStrip tabStrip=this.Control as TabStrip;
|
|
if(tabStrip==null || dh==null)
|
|
return;
|
|
|
|
DesignerTransaction dt = dh.CreateTransaction();
|
|
try
|
|
{
|
|
IComponentChangeService change = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
if (change != null)
|
|
change.OnComponentChanging(this.Component, null);
|
|
|
|
TabItem tab = dh.CreateComponent(typeof(TabItem)) as TabItem;
|
|
tab.Text = tab.Name;
|
|
|
|
tabStrip.Tabs.Add(tab);
|
|
|
|
if (change != null)
|
|
change.OnComponentChanged(this.Component, null, null, null);
|
|
}
|
|
catch
|
|
{
|
|
dt.Cancel();
|
|
}
|
|
finally
|
|
{
|
|
if (!dt.Canceled) dt.Commit();
|
|
}
|
|
}
|
|
|
|
private void SelectNextTab(object sender, EventArgs e)
|
|
{
|
|
TabStrip tabStrip = this.Control as TabStrip;
|
|
if (tabStrip == null)
|
|
return;
|
|
if (tabStrip.SelectedTabIndex < tabStrip.Tabs.Count - 1)
|
|
TypeDescriptor.GetProperties(tabStrip)["SelectedTabIndex"].SetValue(tabStrip, tabStrip.SelectedTabIndex + 1);
|
|
}
|
|
|
|
private void SelectPreviousTab(object sender, EventArgs e)
|
|
{
|
|
TabStrip tabStrip = this.Control as TabStrip;
|
|
if (tabStrip == null)
|
|
return;
|
|
if (tabStrip.SelectedTabIndex >0)
|
|
TypeDescriptor.GetProperties(tabStrip)["SelectedTabIndex"].SetValue(tabStrip, tabStrip.SelectedTabIndex - 1);
|
|
}
|
|
|
|
private void TabMoved(object sender, TabStripTabMovedEventArgs e)
|
|
{
|
|
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
if(change!=null)
|
|
{
|
|
change.OnComponentChanging(this.Control,null);
|
|
change.OnComponentChanged(this.Control,null,null,null);
|
|
}
|
|
}
|
|
|
|
private void OnSelectionChanged(object sender, EventArgs e)
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed)
|
|
return;
|
|
|
|
ISelectionService ss = (ISelectionService)sender;
|
|
if(ss!=null && ss.PrimarySelection!=this.Control)
|
|
{
|
|
if(ss.PrimarySelection is TabItem && tabStrip.Tabs.Contains(ss.PrimarySelection as TabItem))
|
|
{
|
|
tabStrip.DesignTimeSelection=ss.PrimarySelection as TabItem;
|
|
return;
|
|
}
|
|
}
|
|
tabStrip.DesignTimeSelection=null;
|
|
}
|
|
|
|
protected bool m_InternalRemove=false;
|
|
private void OnComponentRemoving(object sender,ComponentEventArgs e)
|
|
{
|
|
InternalComponentRemoving(e);
|
|
}
|
|
|
|
protected virtual void InternalComponentRemoving(ComponentEventArgs e)
|
|
{
|
|
if(m_InternalRemove)
|
|
return;
|
|
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
|
|
if(dh==null)
|
|
return;
|
|
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed)
|
|
return;
|
|
|
|
if(e.Component is TabItem && this.Control!=null && tabStrip.Tabs.Contains(e.Component as TabItem))
|
|
{
|
|
try
|
|
{
|
|
TabItem item=e.Component as TabItem;
|
|
if(item.AttachedControl!=null && this.Control.Controls.Contains(item.AttachedControl))
|
|
{
|
|
this.Control.Controls.Remove(item.AttachedControl);
|
|
dh.DestroyComponent(item.AttachedControl);
|
|
}
|
|
tabStrip.Tabs.Remove(item);
|
|
tabStrip.RecalcSize();
|
|
tabStrip.Refresh();
|
|
}
|
|
finally
|
|
{
|
|
m_InternalRemove=false;
|
|
}
|
|
}
|
|
else if (e.Component == this.Control)
|
|
{
|
|
m_InternalRemove = true;
|
|
try
|
|
{
|
|
TabStrip tabControl = this.Control as TabStrip;
|
|
TabItem[] tabs = new TabItem[tabControl.Tabs.Count];
|
|
tabControl.Tabs.CopyTo(tabs, 0);
|
|
foreach (TabItem tab in tabs)
|
|
dh.DestroyComponent(tab);
|
|
}
|
|
finally
|
|
{
|
|
m_InternalRemove = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual TabStrip GetTabStrip()
|
|
{
|
|
return this.Control as TabStrip;
|
|
}
|
|
|
|
protected override void PreFilterProperties(IDictionary properties)
|
|
{
|
|
base.PreFilterProperties(properties);
|
|
if (this.Control is TabStrip)
|
|
{
|
|
properties["MdiTabbedDocuments"] = TypeDescriptor.CreateProperty(typeof(TabStripDesigner), (PropertyDescriptor)properties["MdiTabbedDocuments"], new Attribute[]
|
|
{
|
|
new DefaultValueAttribute(false)});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether Tab-Strip control provides Tabbed MDI Child form support. Default value is false.
|
|
/// </summary>
|
|
[Browsable(true), Description("Indicates whether Tab-Strip control provides Tabbed MDI Child form support."), Category("Mdi Support"), DefaultValue(false)]
|
|
public bool MdiTabbedDocuments
|
|
{
|
|
get
|
|
{
|
|
return (bool)ShadowProperties["MdiTabbedDocuments"];
|
|
}
|
|
set
|
|
{
|
|
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
|
|
DesignerTransaction dt = null;
|
|
if (dh != null) dt = dh.CreateTransaction();
|
|
|
|
try
|
|
{
|
|
// this value is not passed to the actual control
|
|
this.ShadowProperties["MdiTabbedDocuments"] = value;
|
|
TabStrip ts = this.Control as TabStrip;
|
|
if (ts != null)
|
|
{
|
|
if (dh == null || dh.Loading)
|
|
return;
|
|
|
|
if (value)
|
|
{
|
|
TypeDescriptor.GetProperties(ts)["MdiForm"].SetValue(ts, null);
|
|
|
|
System.Windows.Forms.Form f = dh.RootComponent as System.Windows.Forms.Form;
|
|
TypeDescriptor.GetProperties(ts)["MdiForm"].SetValue(ts, f);
|
|
}
|
|
else
|
|
TypeDescriptor.GetProperties(ts)["MdiForm"].SetValue(ts, null);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
if (dt != null) dt.Cancel();
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
if (dt != null && !dt.Canceled) dt.Commit();
|
|
}
|
|
}
|
|
}
|
|
|
|
#if FRAMEWORK20
|
|
public override void InitializeNewComponent(IDictionary defaultValues)
|
|
{
|
|
base.InitializeNewComponent(defaultValues);
|
|
SetDesignTimeDefaults();
|
|
}
|
|
#else
|
|
public override void OnSetComponentDefaults()
|
|
{
|
|
base.OnSetComponentDefaults();
|
|
SetDesignTimeDefaults();
|
|
}
|
|
#endif
|
|
private void SetDesignTimeDefaults()
|
|
{
|
|
if (this.Component == null || this.Component.Site == null || !this.Component.Site.DesignMode)
|
|
return;
|
|
TabStrip ts = this.Control as TabStrip;
|
|
if (ts != null)
|
|
ts.Style = eTabStripStyle.VS2005;
|
|
this.CreateNewTab(null, null);
|
|
}
|
|
|
|
public override System.Collections.ICollection AssociatedComponents
|
|
{
|
|
get
|
|
{
|
|
ArrayList c=new ArrayList(base.AssociatedComponents);
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip!=null)
|
|
{
|
|
foreach(TabItem tab in tabStrip.Tabs)
|
|
c.Add(tab);
|
|
}
|
|
|
|
return c;
|
|
}
|
|
}
|
|
#region WndProc Support
|
|
/// <summary>
|
|
/// Selection support for items on container.
|
|
/// </summary>
|
|
private TabItem m_SelectItem=null;
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
System.Windows.Forms.Control ctrl=this.Control;
|
|
if(ctrl==null || ctrl.IsDisposed)
|
|
{
|
|
base.WndProc(ref m);
|
|
return;
|
|
}
|
|
|
|
switch(m.Msg)
|
|
{
|
|
case WinApi.WM_LBUTTONDOWN:
|
|
case WinApi.WM_RBUTTONDOWN:
|
|
{
|
|
if(OnMouseDown(ref m))
|
|
return;
|
|
break;
|
|
}
|
|
case WinApi.WM_RBUTTONUP:
|
|
case WinApi.WM_LBUTTONUP:
|
|
{
|
|
if(OnMouseUp(ref m))
|
|
return;
|
|
|
|
break;
|
|
}
|
|
case WinApi.WM_MOUSEMOVE:
|
|
{
|
|
if(OnMouseMove(ref m))
|
|
return;
|
|
break;
|
|
}
|
|
case WinApi.WM_MOUSELEAVE:
|
|
{
|
|
if(OnMouseLeave(ref m))
|
|
return;
|
|
break;
|
|
}
|
|
case WinApi.WM_USER+101:
|
|
{
|
|
if(OnProcessPendingSelection(ref m))
|
|
return;
|
|
break;
|
|
}
|
|
}
|
|
|
|
base.WndProc(ref m);
|
|
}
|
|
|
|
private bool m_IgnoreMouseUp=false;
|
|
private bool m_SelectTabControl=false;
|
|
protected virtual bool OnMouseDown(ref Message m)
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
|
|
if(tabStrip==null || tabStrip.IsDisposed || this.Control.IsDisposed)
|
|
return false;
|
|
|
|
Point pos=tabStrip.PointToClient(System.Windows.Forms.Control.MousePosition);
|
|
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
|
|
TabItem oldSelected=tabStrip.SelectedTab;
|
|
tabStrip.InternalOnMouseDown(e);
|
|
|
|
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
|
|
TabItem selected=null;
|
|
if(selection!=null && selection.PrimarySelection is TabItem)
|
|
selected=selection.PrimarySelection as TabItem;
|
|
|
|
if(tabStrip.SelectedTab!=null && selected!=tabStrip.SelectedTab && tabStrip.HitTest(e.X,e.Y)!=null)
|
|
{
|
|
ArrayList arr=new ArrayList(1);
|
|
arr.Add(tabStrip.SelectedTab);
|
|
#if FRAMEWORK20
|
|
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
|
|
#else
|
|
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
|
|
#endif
|
|
|
|
//m_SelectItem=tabStrip.SelectedTab;
|
|
//WinApi.PostMessage(m.HWnd.ToInt32(),WinApi.WM_USER+101,0,0);
|
|
m_IgnoreMouseUp=true;
|
|
|
|
if(m.Msg==WinApi.WM_RBUTTONDOWN)
|
|
this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
|
|
return true;
|
|
}
|
|
else if(tabStrip.SelectedTab==oldSelected)
|
|
{
|
|
if(tabStrip.HitTest(e.X,e.Y)!=null)
|
|
{
|
|
if(m.Msg==WinApi.WM_RBUTTONDOWN)
|
|
this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
protected virtual bool OnMouseUp(ref Message m)
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed || this.Control.IsDisposed)
|
|
return false;
|
|
|
|
Point pos=tabStrip.PointToClient(System.Windows.Forms.Control.MousePosition);
|
|
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
|
|
|
|
tabStrip.InternalOnMouseUp(e);
|
|
|
|
if(m_IgnoreMouseUp)
|
|
{
|
|
m_IgnoreMouseUp=false;
|
|
return true;
|
|
}
|
|
|
|
if(m_SelectTabControl)
|
|
{
|
|
m_SelectTabControl=false;
|
|
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
|
|
if(selection!=null && selection.PrimarySelection!=this.Control && !(selection.PrimarySelection.GetType() == this.Control.GetType()))
|
|
{
|
|
ArrayList arr=new ArrayList(1);
|
|
arr.Add(this.Control);
|
|
#if FRAMEWORK20
|
|
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
|
|
#else
|
|
selection.SetSelectedComponents(arr,SelectionTypes.Click);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
protected virtual bool OnMouseMove(ref Message m)
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed || this.Control.IsDisposed)
|
|
return false;
|
|
|
|
Point pos=tabStrip.PointToClient(System.Windows.Forms.Control.MousePosition);
|
|
MouseEventArgs e=new MouseEventArgs((m.WParam.ToInt32()==1?MouseButtons.Left:MouseButtons.None),0,pos.X,pos.Y,0);
|
|
tabStrip.InternalOnMouseMove(e);
|
|
if(tabStrip.DisplayRectangle.Contains(pos))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
protected virtual bool OnMouseLeave(ref Message m)
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed || this.Control.IsDisposed)
|
|
return false;
|
|
tabStrip.InternalOnMouseLeave(new EventArgs());
|
|
return false;
|
|
}
|
|
|
|
protected virtual bool OnProcessPendingSelection(ref Message m)
|
|
{
|
|
return ProcessPendingSelection();
|
|
}
|
|
|
|
protected virtual bool ProcessPendingSelection()
|
|
{
|
|
TabStrip tabStrip=this.GetTabStrip();
|
|
if(tabStrip==null || tabStrip.IsDisposed || this.Control.IsDisposed)
|
|
return false;
|
|
|
|
if(m_SelectItem!=null)
|
|
{
|
|
tabStrip.DesignTimeSelection=m_SelectItem;
|
|
//Point pos=tabStrip.PointToClient(System.Windows.Forms.Control.MousePosition);
|
|
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
|
|
if(selection==null)
|
|
return false;
|
|
ArrayList arr=new ArrayList(1);
|
|
arr.Add(m_SelectItem);
|
|
#if FRAMEWORK20
|
|
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
|
|
#else
|
|
selection.SetSelectedComponents(arr,SelectionTypes.Click);
|
|
#endif
|
|
|
|
m_SelectItem =null;
|
|
|
|
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
|
|
if(change!=null)
|
|
{
|
|
change.OnComponentChanging(this.Control,null);
|
|
change.OnComponentChanged(this.Control,null,null,null);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|