using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
///
/// Represents Windows Forms designer for BubbleBar control.
///
public class BubbleBarDesigner:System.Windows.Forms.Design.ControlDesigner
{
#region Private Variables
private bool m_IgnoreMouseUp=false;
private Point m_MouseDownPosition=Point.Empty;
private bool m_Capture=false;
#endregion
public BubbleBarDesigner()
{
}
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);
}
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 = new DesignerVerb[]
{
new DesignerVerb("Create Tab", new EventHandler(CreateTab)),
new DesignerVerb("Create Button", new EventHandler(CreateButton))};
return new DesignerVerbCollection(verbs);
}
}
#if FRAMEWORK20
public override void InitializeNewComponent(IDictionary defaultValues)
{
base.InitializeNewComponent(defaultValues);
SetDesignTimeDefaults();
}
#else
public override void OnSetComponentDefaults()
{
base.OnSetComponentDefaults();
SetDesignTimeDefaults();
}
#endif
private void SetDesignTimeDefaults()
{
BubbleBar bar = this.Component as BubbleBar;
if (bar == null)
return;
// Setup default back style
bar.ButtonBackAreaStyle.SetColorScheme(new ColorScheme(eDotNetBarStyle.Office2003));
bar.ButtonBackAreaStyle.BackColor = Color.FromArgb(66, Color.DimGray);
bar.ButtonBackAreaStyle.BorderColor = Color.FromArgb(180, Color.WhiteSmoke);
bar.ButtonBackAreaStyle.BorderTop = eStyleBorderType.Solid;
bar.ButtonBackAreaStyle.BorderTopWidth = 1;
bar.ButtonBackAreaStyle.BorderBottom = eStyleBorderType.Solid;
bar.ButtonBackAreaStyle.BorderBottomWidth = 1;
bar.ButtonBackAreaStyle.BorderLeft = eStyleBorderType.Solid;
bar.ButtonBackAreaStyle.BorderLeftWidth = 1;
bar.ButtonBackAreaStyle.BorderRight = eStyleBorderType.Solid;
bar.ButtonBackAreaStyle.BorderRightWidth = 1;
bar.ButtonBackAreaStyle.PaddingBottom = 3;
bar.ButtonBackAreaStyle.PaddingTop = 3;
bar.ButtonBackAreaStyle.PaddingLeft = 3;
bar.ButtonBackAreaStyle.PaddingRight = 3;
bar.SelectedTabColors.BorderColor = Color.Black;
bar.MouseOverTabColors.BorderColor = SystemColors.Highlight;
}
private void OnSelectionChanged(object sender, EventArgs e)
{
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss==null)
return;
bool refresh=ResetFocus();
if(ss.PrimarySelection is BubbleBarTab)
{
if(((BubbleBarTab)ss.PrimarySelection).Parent==this.Control)
{
((BubbleBarTab)ss.PrimarySelection).Focus=true;
refresh=true;
}
}
else if(ss.PrimarySelection is BubbleButton)
{
if(((BubbleButton)ss.PrimarySelection).Parent.Parent==this.Control)
{
((BubbleButton)ss.PrimarySelection).Focus=true;
refresh=true;
}
}
if(refresh)
this.Control.Refresh();
}
private bool ResetFocus()
{
bool refresh=false;
BubbleBar bar=this.Control as BubbleBar;
foreach(BubbleBarTab tab in bar.Tabs)
{
if(tab.Focus)
{
tab.Focus=false;
refresh=true;
}
foreach(BubbleButton button in tab.Buttons)
{
if(button.Focus)
{
button.Focus=false;
refresh=true;
}
}
}
return refresh;
}
private void OnComponentRemoving(object sender,ComponentEventArgs e)
{
if(e.Component==this.Component)
ThisComponentRemoving(sender,e);
else if(e.Component is BubbleBarTab)
{
BubbleBarTab tab=e.Component as BubbleBarTab;
if(tab.Parent==this.Control)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
foreach(BubbleButton button in tab.Buttons)
dh.DestroyComponent(button);
BubbleBar bar=this.Component as BubbleBar;
bar.Tabs.Remove(tab);
bar.RecalcLayout();
bar.Refresh();
}
}
else if(e.Component is BubbleButton)
{
BubbleButton button=e.Component as BubbleButton;
if(button.GetBubbleBar()==this.Control)
{
button.Parent.Buttons.Remove(button);
BubbleBar bar=this.Component as BubbleBar;
bar.RecalcLayout();
bar.Refresh();
}
}
}
///
/// Removes all tabs and buttons.
///
protected virtual void ThisComponentRemoving(object sender, ComponentEventArgs e)
{
//m_InternalRemoving=true;
// try
// {
// Unhook events
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);
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
BubbleBar bar=this.Component as BubbleBar;
if(dh==null)
return;
foreach(BubbleBarTab tab in bar.Tabs)
{
foreach(BubbleButton button in tab.Buttons)
dh.DestroyComponent(button);
dh.DestroyComponent(tab);
}
//}
// finally
// {
// m_InternalRemoving=false;
// }
}
private void CreateButton(object sender,EventArgs e)
{
BubbleBar bar=this.Control as BubbleBar;
if(bar==null)
return;
if(bar.SelectedTab==null)
{
BubbleBarTab tab=CreateTab();
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true));
bar.SelectedTab=tab;
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true),null,null);
}
if(bar.SelectedTab==null)
return;
BubbleButton button=CreateButton(bar.SelectedTab);
if(button==null)
return;
ISelectionService ss=(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
{
ArrayList list=new ArrayList();
list.Add(button);
ss.SetSelectedComponents(list);
}
}
private void CreateTab(object sender,EventArgs e)
{
BubbleBar bar=this.Control as BubbleBar;
if(bar==null)
return;
BubbleBarTab tab=CreateTab();
if(tab!=null)
{
if(bar.SelectedTab!=tab)
{
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true));
bar.SelectedTab=tab;
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true),null,null);
}
ISelectionService ss=(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null)
{
ArrayList list=new ArrayList();
list.Add(tab);
ss.SetSelectedComponents(list);
}
}
}
private BubbleBarTab CreateTab()
{
BubbleBar bar=this.Control as BubbleBar;
if(bar==null)
return null;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("Tabs",true));
BubbleBarTab tab=dh.CreateComponent(typeof(BubbleBarTab)) as BubbleBarTab;
if(tab==null)
return null;
tab.Text=tab.Name;
eTabItemColor color=eTabItemColor.Blue;
if(bar.Tabs.Count>0)
{
int tt=bar.Tabs.Count+1;
Type t=typeof(eTabItemColor);
FieldInfo[] fi=t.GetFields(BindingFlags.Public | BindingFlags.Static);
int count=fi.Length;
while(tt>count)
tt-=count;
if(tt==0) tt++;
color=(eTabItemColor)Enum.Parse(typeof(eTabItemColor),fi[tt].Name);
}
tab.PredefinedColor=color;
bar.Tabs.Add(tab);
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("Tabs",true),null,null);
return tab;
}
private BubbleButton CreateButton(BubbleBarTab tab)
{
BubbleBar bar=this.Control as BubbleBar;
if(bar==null)
return null;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tab).Find("Buttons",true));
BubbleButton button=dh.CreateComponent(typeof(BubbleButton)) as BubbleButton;
if(button==null)
return null;
button.Image=BarFunctions.LoadBitmap("SystemImages.Note24.png");
button.ImageLarge=BarFunctions.LoadBitmap("SystemImages.Note64.png");
tab.Buttons.Add(button);
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tab).Find("Buttons",true),null,null);
return button;
}
///
/// Returns all components associated with this control
///
public override System.Collections.ICollection AssociatedComponents
{
get
{
ArrayList c=new ArrayList(base.AssociatedComponents);
BubbleBar bar=this.Control as BubbleBar;
if(bar!=null)
{
foreach(BubbleBarTab tab in bar.Tabs)
{
c.Add(tab);
GetTabComponents(tab,c);
}
}
return c;
}
}
private void GetTabComponents(BubbleBarTab tab, ArrayList c)
{
foreach(BubbleButton b in tab.Buttons)
c.Add(b);
}
protected override void OnSetCursor()
{
BubbleBar bar=this.Control as BubbleBar;
Point pos=bar.PointToClient(System.Windows.Forms.Control.MousePosition);
BubbleButton button=bar.GetButtonAt(pos);
if(button!=null)
{
Cursor.Current=Cursors.Default;
return;
}
BubbleBarTab tab=bar.GetTabAt(pos);
if(tab!=null)
{
Cursor.Current=Cursors.Default;
return;
}
base.OnSetCursor();
}
///
/// Selection support for items on container.
///
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case NativeFunctions.WM_LBUTTONDOWN:
case NativeFunctions.WM_RBUTTONDOWN:
{
if(OnMouseDown(ref m))
return;
break;
}
case NativeFunctions.WM_RBUTTONUP:
case NativeFunctions.WM_LBUTTONUP:
{
if(OnMouseUp(ref m))
return;
break;
}
case NativeFunctions.WM_MOUSEMOVE:
{
if(OnMouseMove(ref m))
return;
break;
}
case NativeFunctions.WM_LBUTTONDBLCLK:
{
if(OnMouseDoubleClick(m))
return;
break;
}
}
base.WndProc(ref m);
}
private bool OnMouseDoubleClick(Message m)
{
bool processed=false;
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null && selection.PrimarySelection is BubbleButton && ((BubbleButton)selection.PrimarySelection).GetBubbleBar()==this.Control)
{
IDesignerHost host=(IDesignerHost) this.GetService(typeof(IDesignerHost));
if(host!=null)
{
IDesigner designer=host.GetDesigner(selection.PrimarySelection as IComponent);
if(designer!=null)
{
designer.DoDefaultAction();
processed=true;
}
}
}
return processed;
}
protected virtual bool OnMouseDown(ref Message m)
{
BubbleBar bar=this.Control as BubbleBar;
if(bar==null)
return false;
Point pos=bar.PointToClient(System.Windows.Forms.Control.MousePosition);
m_MouseDownPosition=pos;
BubbleButton button=bar.GetButtonAt(pos);
if(button!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null)
{
ArrayList arr=new ArrayList(1);
arr.Add(button);
#if FRAMEWORK20
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
m_IgnoreMouseUp =true;
if(m.Msg==NativeFunctions.WM_RBUTTONDOWN)
{
this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
}
return true;
}
}
BubbleBarTab tab=bar.GetTabAt(pos);
if(tab!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null && selection.PrimarySelection!=tab)
{
ArrayList arr=new ArrayList(1);
arr.Add(tab);
#if FRAMEWORK20
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
if (bar.SelectedTab!=tab)
{
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true));
bar.SelectedTab=tab;
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("SelectedTab",true),null,null);
}
m_IgnoreMouseUp=true;
if(m.Msg!=NativeFunctions.WM_RBUTTONDOWN)
return true;
}
if(m.Msg==NativeFunctions.WM_RBUTTONDOWN)
{
this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
return true;
}
}
return false;
}
protected virtual bool OnMouseMove(ref Message m)
{
BubbleBar bar=this.Control as BubbleBar;
Point pos=bar.PointToClient(System.Windows.Forms.Control.MousePosition);
if(Control.MouseButtons==MouseButtons.Left)
{
if(bar.DragInProgress)
{
bar.DragMouseMove(pos);
return true;
}
else if(!m_MouseDownPosition.IsEmpty && Math.Abs(m_MouseDownPosition.X-pos.X)>=2 || Math.Abs(m_MouseDownPosition.Y-pos.Y)>=2)
{
BubbleBarTab tabDrag=bar.GetTabAt(pos);
if(tabDrag!=null)
{
bar.StartDrag(tabDrag);
System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
if(c!=null)
{
m_Capture=true;
c.Capture=true;
}
return true;
}
BubbleButton buttonDrag=bar.GetButtonAt(pos);
if(buttonDrag!=null)
{
bar.StartDrag(buttonDrag);
System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
if(c!=null)
{
m_Capture=true;
c.Capture=true;
}
return true;
}
m_MouseDownPosition=Point.Empty;
}
}
//BubbleButton button=bar.GetButtonAt(pos);
BubbleBarTab tab=bar.GetTabAt(pos);
if(tab!=null)
bar.SetMouseOverTab(tab);
else
bar.SetMouseOverTab(null);
return false;
}
private bool OnMouseUp(ref Message m)
{
if(m_Capture)
{
System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
if(c!=null)
c.Capture=false;
m_Capture=false;
}
BubbleBar bar=this.Control as BubbleBar;
if(bar!=null && bar.DragInProgress)
{
Point pos=bar.PointToClient(System.Windows.Forms.Control.MousePosition);
bar.DragMouseUp(pos);
BubbleBarTab tab=bar.SelectedTab;
if(tab!=null)
{
IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if(change!=null)
change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(tab).Find("Buttons",true));
if(change!=null)
change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(tab).Find("Buttons",true),null,null);
}
}
if(m_IgnoreMouseUp)
{
m_IgnoreMouseUp=false;
return true;
}
return false;
}
}
}