2463 lines
81 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 BarBaseControlDesigner.
/// </summary>
public class BarBaseControlDesigner : System.Windows.Forms.Design.ParentControlDesigner, IDesignerServices, IBarItemDesigner
{
#region Private Variables
const string TEMP_NAME="tempDragDropItem";
public const string CreatingItemTransactionDescription = "Creating item";
private bool m_EnableItemDragDrop=false;
private bool m_AcceptExternalControls=true;
private Point m_MouseDownPoint=Point.Empty;
private BaseItem m_DragItem=null;
private bool m_DragInProgress=false;
private IDesignTimeProvider m_DesignTimeProvider=null;
private int m_InsertPosition;
private bool m_InsertBefore;
private bool m_Capture=false;
private System.Windows.Forms.Control m_DesignerHost=null;
private Timer m_TimerAdded=null;
private Timer m_TimerDragDrop=null;
private bool m_NewControlAdded=false;
private bool m_SuspendInternalCursor=false;
private bool m_DragLeave=false;
private bool m_ControlRemoved=false;
private DateTime m_JustAdded=DateTime.MinValue;
private bool m_MouseDownSelectionPerformed=false;
private bool m_PassiveContainer = false;
protected bool m_AddingItem = false;
protected bool m_CreatingItem = false;
protected DesignerTransaction m_InsertItemTransaction = null;
private bool m_InternalRemoveInProgress = false;
#endregion
#region Designer Implementation
public BarBaseControlDesigner()
{
}
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);
cc.ComponentRemoved+=new ComponentEventHandler(this.OnComponentRemoved);
cc.ComponentAdding += new ComponentEventHandler(ComponentChangeComponentAdding);
cc.ComponentAdded += new ComponentEventHandler(ComponentChangeComponentAdded);
}
IDesignerEventService ds=GetService(typeof(IDesignerEventService)) as IDesignerEventService;
if(ds!=null)
{
ds.ActiveDesignerChanged+=new ActiveDesignerEventHandler(this.OnActiveDesignerChanged);
ds.SelectionChanged+=new EventHandler(DesignerSelectionChanged);
}
if(this.Control is IBarDesignerServices)
((IBarDesignerServices)this.Control).Designer=this;
if (this.Control is ItemControl)
((ItemControl)this.Control).SetDesignMode(true);
if(component is System.Windows.Forms.Control)
{
((Control)component).ControlAdded+=new ControlEventHandler(this.ComponentAdded);
((Control)component).ControlRemoved+=new ControlEventHandler(this.ComponentRemoved);
}
//this.EnableDragDrop(false);
}
protected virtual void ComponentChangeComponentAdded(object sender, ComponentEventArgs e)
{
if (m_AddingItem)
{
m_AddingItem = false;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (cc != null)
cc.OnComponentChanging(this.Control, null);
this.GetDefaultNewItemContainer().SubItems.Add(e.Component as BaseItem);
if (cc != null)
cc.OnComponentChanged(this.Control, null, null, null);
m_InsertItemTransaction.Commit();
m_InsertItemTransaction = null;
this.RecalcLayout();
}
}
private void ComponentChangeComponentAdding(object sender, ComponentEventArgs e)
{
if (m_InsertItemTransaction == null && !m_AddingItem && !m_CreatingItem && e.Component is BaseItem)
{
ISelectionService ss = this.GetService(typeof(ISelectionService)) as ISelectionService;
if (ss != null && ss.PrimarySelection == this.Control)
{
IDesignerHost dh = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (dh.InTransaction && dh.TransactionDescription == CreatingItemTransactionDescription) return;
m_AddingItem = true;
m_InsertItemTransaction = dh.CreateTransaction("Adding Item Clip");
}
}
}
protected override void Dispose(bool disposing)
{
// Unhook events
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
{
cc.ComponentRemoving-=new ComponentEventHandler(this.OnComponentRemoving);
cc.ComponentRemoved-=new ComponentEventHandler(this.OnComponentRemoved);
}
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if (ss != null)
{
ss.SelectionChanged -= new EventHandler(OnSelectionChanged);
}
IDesignerEventService ds=GetService(typeof(IDesignerEventService)) as IDesignerEventService;
if(ds!=null)
{
ds.ActiveDesignerChanged-=new ActiveDesignerEventHandler(this.OnActiveDesignerChanged);
ds.SelectionChanged-=new EventHandler(DesignerSelectionChanged);
}
if(this.Component is System.Windows.Forms.Control)
{
((Control)this.Component).ControlAdded-=new ControlEventHandler(this.ComponentAdded);
((Control)this.Component).ControlRemoved-=new ControlEventHandler(this.ComponentRemoved);
}
base.Dispose(disposing);
}
public override bool CanParent(Control control)
{
BaseItem item = GetControlItem(control);
if (item != null && item != m_DragItem && !m_NewControlAdded)
return false;
return base.CanParent(control);
}
private void ComponentAdded(object sender, ControlEventArgs e)
{
if(!m_NewControlAdded || !m_EnableItemDragDrop || !m_AcceptExternalControls || this.IsDockableWindow)
{
if(!m_NewControlAdded)
{
if(!OnControlAdded(e))
return;
}
else
return;
}
m_TimerAdded=new Timer();
m_TimerAdded.Tick+=new EventHandler(this.TimerTick);
m_TimerAdded.Interval=50;
m_TimerAdded.Enabled=true;
m_TimerAdded.Start();
m_NewControlAdded=false;
}
/// <summary>
/// Called after control has been added to container but not through drag & drop. Control added could also be
/// internal control by the bar container.
/// </summary>
/// <param name="e">Event arguments</param>
/// <returns>true if acted upon this new control otherwise false.</returns>
protected virtual bool OnControlAdded(ControlEventArgs e)
{
return false;
}
private void ComponentRemoved(object sender, ControlEventArgs e)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if (dh == null || dh.Loading || m_InternalRemoveInProgress)
return;
if(m_JustAdded!=DateTime.MinValue && DateTime.Now.Subtract(m_JustAdded).Seconds<2)
{
m_JustAdded=DateTime.MinValue;
return;
}
m_JustAdded=DateTime.MinValue;
if(m_DragLeave)
ControlRemoved(e.Control);
else if(m_TimerDragDrop!=null)
m_ControlRemoved=true;
else
{
ISelectionService ss =(ISelectionService)GetService(typeof(ISelectionService));
if(ss!=null && ss.PrimarySelection==e.Control && this.GetControlItem(e.Control)!=null)
{
ControlRemoved(e.Control);
}
}
}
private void ControlRemoved(Control control)
{
if (control != null && !m_InternalRemoveInProgress)
{
BaseItem item=this.GetControlItem(control);
if(item!=null)
{
MouseDragDrop(-1,-1);
if(item.Parent!=null)
item.Parent.SubItems.Remove(item);
if (item is ControlContainerItem)
((ControlContainerItem)item).Control = null;
this.DestroyComponent(item);
this.RecalcLayout();
}
}
}
private void TimerTick(object sender, EventArgs e)
{
m_TimerAdded.Stop();
m_TimerAdded.Enabled=false;
m_TimerAdded=null;
this.RecalcLayout();
ISelectionService sel=(ISelectionService)this.GetService(typeof(ISelectionService));
if(sel!=null && sel.PrimarySelection is Control && this.Control.Controls.Contains((Control)sel.PrimarySelection))
{
IComponentChangeService cc=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
cc.OnComponentChanged(sel.PrimarySelection,null,null,null);
}
}
private void OnSelectionChanged(object sender, EventArgs e)
{
DesignTimeSelectionChanged(sender as ISelectionService);
}
private void OnActiveDesignerChanged(object sender, ActiveDesignerEventArgs e)
{
this.ActiveDesignerChanged(e);
}
/// <summary>
/// Support for popup menu closing.
/// </summary>
/// <param name="e"></param>
protected virtual void ActiveDesignerChanged(ActiveDesignerEventArgs e)
{
ClosePopups();
}
protected virtual void ClosePopups()
{
IOwner owner = GetIOwner();
if (owner != null)
{
owner.OnApplicationDeactivate(); // Closes all popups
}
}
protected virtual IOwner GetIOwner()
{
return this.GetItemContainerControl() as IOwner;
}
protected virtual IOwnerMenuSupport GetIOwnerMenuSupport()
{
return this.GetItemContainerControl() as IOwnerMenuSupport;
}
private bool _IsSelected = false;
/// <summary>
/// Gets whether this control or an item inside of it is selected.
/// </summary>
public bool IsSelected
{
get { return _IsSelected; }
internal set
{
if (value != _IsSelected)
{
bool oldValue = _IsSelected;
_IsSelected = value;
OnIsSelectedChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when IsSelected property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnIsSelectedChanged(bool oldValue, bool newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
}
private bool IsItemContained(BaseItem item)
{
if (item.ContainerControl == this.Control) return true;
BaseItem parent = item.Parent;
while (parent != null)
{
if (parent.ContainerControl == this.Control) return true;
parent = parent.Parent;
}
return false;
}
/// <summary>
/// Support for popup menu closing.
/// </summary>
protected virtual void DesignTimeSelectionChanged(ISelectionService ss)
{
if(ss==null)
return;
if(this.Control==null || this.Control.IsDisposed || this.IsDockableWindow)
return;
if (ss.PrimarySelection != this.Control)
{
BaseItem container = this.GetItemContainer();
if (container == null)
return;
if (ss.PrimarySelection is BaseItem)
{
BaseItem item = ss.PrimarySelection as BaseItem;
if (IsItemContained(item))
IsSelected = true;
else
IsSelected = false;
if (item.ContainerControl == this.GetItemContainerControl())
{
if ((!item.IsOnMenu || item.IsOnBar && ((Bar)item.ContainerControl).BarState == eBarState.Popup) && !(item.Expanded && item is PopupItem || item is GalleryContainer && ((GalleryContainer)item).PopupGalleryItem.Expanded))
this.GetIOwnerMenuSupport().ClosePopups();
return;
}
if (this.GetAllAssociatedComponents().Contains(item))
{
if (!item.IsOnMenu && !(item.IsOnBar && ((Bar)item.ContainerControl).BarState == eBarState.Popup))
this.GetIOwnerMenuSupport().ClosePopups();
return;
}
IOwner owner = this.GetIOwner();
if (owner != null && owner != item.GetOwner())
{
owner.SetFocusItem(null);
owner.OnApplicationDeactivate(); // Closes all popups
}
}
else
{
IOwner owner = this.GetIOwner();
if (owner != null)
{
owner.SetFocusItem(null);
owner.OnApplicationDeactivate(); // Closes all popups
}
IsSelected = false;
}
}
else
{
IOwner owner = this.GetIOwner();
if (owner != null)
owner.OnApplicationDeactivate(); // Closes all popups
IsSelected = true;
}
}
protected virtual BaseItem GetDefaultNewItemContainer()
{
return GetItemContainer();
}
protected virtual BaseItem GetItemContainer()
{
BarBaseControl bar=this.Control as BarBaseControl;
if(bar!=null)
return bar.GetBaseItemContainer();
if(this.Control is ItemControl)
return ((ItemControl)this.Control).GetBaseItemContainer();
return null;
}
protected virtual System.Windows.Forms.Control GetItemContainerControl()
{
return this.Control;
}
protected bool m_InternalRemoving=false;
private void OnComponentRemoving(object sender,ComponentEventArgs e)
{
if(e.Component==this.Component)
ThisComponentRemoving(sender,e);
else
OtherComponentRemoving(sender,e);
}
private void OnComponentRemoved(object sender,ComponentEventArgs e)
{
ComponentRemoved(sender,e);
}
protected virtual void ComponentRemoved(object sender, ComponentEventArgs e){}
/// <summary>
/// Removes all subitems from container.
/// </summary>
protected virtual void ThisComponentRemoving(object sender, ComponentEventArgs e)
{
if(!m_InternalRemoving)
{
m_InternalRemoving=true;
try
{
// Unhook events
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
cc.ComponentRemoving-=new ComponentEventHandler(this.OnComponentRemoving);
BaseItem container=this.GetItemContainer();
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null || container==null)
return;
//foreach(BaseItem item in container.SubItems)
//{
for (int i = container.SubItems.Count - 1; i >= 0; i--)
{
BaseItem item = container.SubItems[i];
// Covers the undo case in designer
if (item.Parent == container)
{
DestroySubItems(item, dh);
dh.DestroyComponent(item);
}
}
}
finally
{
m_InternalRemoving=false;
}
}
}
/// <summary>
/// Triggered when some other component on the form is removed.
/// </summary>
protected virtual void OtherComponentRemoving(object sender, ComponentEventArgs e)
{
if(e.Component is BaseItem)
{
BaseItem item=e.Component as BaseItem;
if(item.ContainerControl==GetItemContainerControl())
{
if(item.Parent!=null && item.Parent.SubItems.Contains(item))
item.Parent.SubItems.Remove(item);
if(item!=null)
DestroySubItems(item);
this.RecalcLayout();
}
}
}
protected virtual void DestroySubItems(BaseItem parent, IDesignerHost dh)
{
if(parent is ControlContainerItem)
{
if(((ControlContainerItem)parent).Control!=null)
{
Control c=((ControlContainerItem)parent).Control;
((ControlContainerItem)parent).Control=null;
dh.DestroyComponent(c);
}
}
else if(parent is DockContainerItem)
{
if(((DockContainerItem)parent).Control!=null)
{
Control c=((DockContainerItem)parent).Control;
((DockContainerItem)parent).Control=null;
dh.DestroyComponent(c);
}
}
BaseItem[] subitems=new BaseItem[parent.SubItems.Count];
parent.SubItems.CopyTo(subitems,0);
foreach(BaseItem item in subitems)
{
DestroySubItems(item,dh);
dh.DestroyComponent(item);
}
}
protected virtual void DestroySubItems(BaseItem parent)
{
IDesignerHost dh=GetService(typeof(IDesignerHost)) as IDesignerHost;
if(dh!=null)
DestroySubItems(parent,dh);
}
/// <summary>
/// Selection support for items on container.
/// </summary>
protected override void WndProc(ref Message m)
{
if(m_DesignerHost==null)
m_DesignerHost=System.Windows.Forms.Control.FromHandle(m.HWnd);
BaseItem container=this.GetItemContainer();
System.Windows.Forms.Control ctrl=this.GetItemContainerControl();
if(container==null || ctrl==null || ctrl.IsDisposed)
{
base.WndProc(ref m);
return;
}
switch(m.Msg)
{
case WinApi.WM_LBUTTONDOWN:
case WinApi.WM_RBUTTONDOWN:
{
if(OnMouseDown(ref m, m.Msg==WinApi.WM_LBUTTONDOWN?MouseButtons.Left:MouseButtons.Right))
return;
break;
}
case WinApi.WM_RBUTTONUP:
case WinApi.WM_LBUTTONUP:
{
if(OnMouseUp(ref m))
return;
break;
}
case WinApi.WM_MOUSEMOVE:
{
if(OnMouseMove(ref m))
{
m.Result=IntPtr.Zero;
return;
}
break;
}
case WinApi.WM_MOUSELEAVE:
{
if(OnMouseLeave(ref m))
return;
break;
}
case WinApi.WM_LBUTTONDBLCLK:
{
if(OnMouseDoubleClick(m))
return;
break;
}
case WinApi.WM_HSCROLL:
case WinApi.WM_VSCROLL:
{
base.WndProc(ref m);
this.RecalcLayout();
return;
}
}
base.WndProc(ref m);
}
protected virtual bool OnMouseDown(ref Message m, MouseButtons button)
{
if(this.IsDockableWindow)
return false;
System.Windows.Forms.Control ctrl=this.GetItemContainerControl();
BaseItem container=this.GetItemContainer();
IOwner owner = this.GetIOwner();
if(ctrl==null || owner==null || container==null)
return false;
if(m.Msg==WinApi.WM_RBUTTONDOWN)
{
Point pos=ctrl.PointToClient(System.Windows.Forms.Control.MousePosition);
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
container.InternalMouseDown(e);
BaseItem focusItem = owner.GetFocusItem();
if(focusItem!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null)
{
ArrayList arr=new ArrayList(1);
arr.Add(focusItem);
#if FRAMEWORK20
selection.SetSelectedComponents(arr,SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
OnItemSelected(focusItem);
if (arr[0] is PopupItem && ((PopupItem)arr[0]).SubItems.Count > 0 && !((PopupItem)arr[0]).Expanded)
((PopupItem)arr[0]).Expanded = true;
focusItem.DesignTimeMouseDownPoint = pos;
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)
{
bool bProcessed=false;
if(m_Capture)
{
m_Capture=false;
System.Windows.Forms.Control c=System.Windows.Forms.Control.FromHandle(m.HWnd);
if(c!=null)
c.Capture=false;
}
System.Windows.Forms.Control ctrl=this.GetItemContainerControl();
BaseItem container=this.GetItemContainer();
IOwner owner = this.GetIOwner();
if(ctrl==null || owner==null || container==null)
return false;
Point pos=ctrl.PointToClient(System.Windows.Forms.Control.MousePosition);
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
container.InternalMouseUp(e);
if (m_MouseDownSelectionPerformed)
bProcessed = true;
m_MouseDownSelectionPerformed=false;
if(m_DragItem!=null && m_DragItem is ControlContainerItem && ((ControlContainerItem)m_DragItem).Control!=null)
MouseDragDrop(pos.X,pos.Y);
return bProcessed;
}
protected virtual bool OnMouseMove(ref Message m)
{
return false;
}
protected override void OnMouseDragBegin(int x, int y)
{
if (m_PassiveContainer)
{
base.OnMouseDragBegin(x, y);
return;
}
Control bar=this.GetItemContainerControl();
System.Windows.Forms.Control ctrl=this.GetItemContainerControl();
IOwner owner = this.GetIOwner();
BaseItem container=this.GetItemContainer();
Point pos=ctrl.PointToClient(new Point(x,y));
MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,pos.X,pos.Y,0);
BaseItem dragItem=null;
BaseItem previousFocusItem = owner.GetFocusItem();
container.InternalMouseDown(e);
dragItem=owner.GetFocusItem();
// // Allow control selection
// if (dragItem != null && dragItem == previousFocusItem && (dragItem.SubItems.Count == 0 || !(dragItem is PopupItem)))
// {
// ArrayList arr = new ArrayList(1);
// arr.Add(this.Control);
// ISelectionService selection = (ISelectionService)this.GetService(typeof(ISelectionService));
//#if FRAMEWORK20
// selection.SetSelectedComponents(arr, SelectionTypes.Primary);
//#else
// selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
//#endif
// owner.SetFocusItem(null);
// dragItem = null;
// }
if(dragItem!=null)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null)
{
ArrayList arr=new ArrayList(1);
arr.Add(dragItem);
#if FRAMEWORK20
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
OnItemSelected(owner.GetFocusItem());
}
}
if(bar==null || dragItem==null || this.IsDockableWindow || !m_EnableItemDragDrop || !CanDragItem(dragItem))
{
if(dragItem==null)
base.OnMouseDragBegin(x,y);
else
this.Control.Capture = true; // Does same as base implementation
return;
}
bar.Capture = true;
if (this.IsDockableWindow)
{
WinApi.RECT rect = new WinApi.RECT(0, 0, 0, 0);
WinApi.GetWindowRect(bar.Handle, ref rect);
Rectangle r = Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom);
Cursor.Clip = r;
}
StartItemDrag(dragItem);
// Does same as base implementation
this.Control.Capture = true;
}
protected virtual bool CanDragItem(BaseItem item)
{
if (item is ControlContainerItem && ((ControlContainerItem)item).Control != null)
return false;
return true;
}
protected virtual Point GetClientPoint(int x, int y)
{
Point p = this.Control.PointToClient(new Point(x, y));
return p;
}
protected override void OnMouseDragMove(int x, int y)
{
if(m_DragInProgress)
{
Point p = GetClientPoint(x, y);
MouseDragOver(p.X,p.Y);
}
}
protected override void OnMouseDragEnd(bool cancel)
{
if(!this.IsDockableWindow && !m_PassiveContainer)
{
this.Control.Capture = false;
Cursor.Clip = Rectangle.Empty;
if(m_DragInProgress)
{
if(cancel)
MouseDragDrop(-1,-1);
else
{
Point p=this.Control.PointToClient(Control.MousePosition);
MouseDragDrop(p.X,p.Y);
}
cancel=true;
}
else
{
System.Windows.Forms.Control ctrl=this.GetItemContainerControl();
IOwner owner = this.GetIOwner();
if(owner!=null && owner.GetFocusItem()!=null)
cancel=true;
}
}
base.OnMouseDragEnd(cancel);
}
protected virtual bool OnMouseLeave(ref Message m)
{
return false;
}
protected virtual bool OnMouseDoubleClick(Message m)
{
bool processed=false;
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if (selection != null && selection.PrimarySelection == this.Control)
{
Point p = this.Control.PointToClient(Control.MousePosition);
IOwner owner = this.GetIOwner();
BaseItem container = this.GetItemContainer();
container.InternalMouseDown(new MouseEventArgs(MouseButtons.Left, 0, p.X, p.Y, 0));
BaseItem focusItem = owner.GetFocusItem();
// Allow control selection
if (focusItem!=null)
{
ArrayList arr = new ArrayList(1);
arr.Add(focusItem);
selection = (ISelectionService)this.GetService(typeof(ISelectionService));
#if FRAMEWORK20
selection.SetSelectedComponents(arr, SelectionTypes.Primary);
#else
selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
#endif
}
}
if(selection!=null && selection.PrimarySelection is ButtonItem && ((ButtonItem)selection.PrimarySelection).ContainerControl==this.GetItemContainerControl())
{
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 void OnItemSelected(BaseItem item)
{
}
protected virtual void RecalcLayout()
{
Control c=this.GetItemContainerControl();
if (c is BarBaseControl)
((BarBaseControl)c).RecalcLayout();
else if (c is ItemControl)
((ItemControl)c).RecalcLayout();
else if (c is ButtonX)
((ButtonX)c).RecalcLayout();
}
/// <summary>
/// Indicates to the designed control that it has been selected or one of the elements managed by the control is selected in designer.
/// </summary>
/// <param name="selected">true if selected otherwise false</param>
protected virtual void SetComponentSelected(bool selected)
{
if(this.GetItemContainerControl() is ItemControl)
{
((ItemControl)this.GetItemContainerControl()).DesignerSelection=selected;
}
else if (this.GetItemContainerControl() is Bar)
{
((Bar)this.GetItemContainerControl()).DesignerSelection = selected;
}
else if (this.GetItemContainerControl() is ExplorerBar)
{
((ExplorerBar)this.GetItemContainerControl()).DesignerSelection = selected;
}
}
public override System.Collections.ICollection AssociatedComponents
{
get
{
ArrayList c=new ArrayList(base.AssociatedComponents);
BaseItem container=this.GetItemContainer();
if(container!=null)
{
foreach(BaseItem item in container.SubItems)
{
if(item.DesignMode)
c.Add(item);
}
}
return c;
}
}
protected System.Collections.ICollection BaseAssociatedComponents
{
get { return base.AssociatedComponents; }
}
protected virtual ArrayList GetAllAssociatedComponents()
{
ArrayList c=new ArrayList(base.AssociatedComponents);
BaseItem container=this.GetItemContainer();
if(container!=null)
{
AddSubItems(container,c);
}
return c;
}
protected override bool GetHitTest(Point pt)
{
if (base.GetHitTest(pt))
{
return true;
}
ScrollableControl c = this.Control as ScrollableControl;
if (c!=null && c.IsHandleCreated && c.AutoScroll)
{
int res = WinApi.SendMessage(c.Handle, 0x84, 0, WinApi.MAKELPARAM(pt.X, pt.Y));
if ((res == 7) || (res == 6))
{
return true;
}
}
return false;
}
protected virtual void AddSubItems(BaseItem parent, ArrayList list)
{
foreach(BaseItem item in parent.SubItems)
{
if(item.DesignMode)
list.Add(item);
AddSubItems(item,list);
}
}
#endregion
#region Design-Time Item Creation
protected virtual void CreateButton(object sender, EventArgs e)
{
CreateButton();
}
public virtual ButtonItem CreateButton()
{
OnSubItemsChanging();
ButtonItem button = CreateButton(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
return button;
}
protected virtual ButtonItem CreateButton(BaseItem parent)
{
if(parent==null)
return null;
ButtonItem item = null;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh!=null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
item = dh.CreateComponent(typeof(ButtonItem)) as ButtonItem;
if (item == null)
return null;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
}
finally
{
if (!trans.Canceled)
trans.Commit();
m_CreatingItem = false;
}
}
return item;
}
protected virtual void CreateRatingItem(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateRatingItem(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateRatingItem(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
RatingItem item = dh.CreateComponent(typeof(RatingItem)) as RatingItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
}
finally
{
if (!trans.Canceled)
trans.Commit();
m_CreatingItem = false;
}
}
}
protected virtual void CreateCircularProgressItem(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateCircularProgressItem(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateCircularProgressItem(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
CircularProgressItem item = dh.CreateComponent(typeof(CircularProgressItem)) as CircularProgressItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
}
finally
{
if (!trans.Canceled)
trans.Commit();
m_CreatingItem = false;
}
}
}
protected virtual void CreateCheckBox(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateCheckBox(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateCheckBox(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
CheckBoxItem item = dh.CreateComponent(typeof(CheckBoxItem)) as CheckBoxItem;
if (item == null)
return;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
}
finally
{
if (!trans.Canceled)
trans.Commit();
m_CreatingItem = false;
}
}
}
protected virtual void CreateTextBox(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateTextBox(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateTextBox(BaseItem parent)
{
if(parent==null)
return;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh!=null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
TextBoxItem item = dh.CreateComponent(typeof(TextBoxItem)) as TextBoxItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
}
finally
{
if (!trans.Canceled)
trans.Commit();
m_CreatingItem = false;
}
}
}
protected virtual void CreateComboBox(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateComboBox(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateComboBox(BaseItem parent)
{
if(parent==null)
return;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh!=null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
ComboBoxItem item=dh.CreateComponent(typeof(ComboBoxItem)) as ComboBoxItem;
if(item==null)
return;
IComponentChangeService cc=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent,TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent,TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"],null,null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateLabel(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateLabel(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual LabelItem CreateLabel(BaseItem parent)
{
if(parent==null)
return null;
LabelItem item = null;
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh!=null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
item = dh.CreateComponent(typeof(LabelItem)) as LabelItem;
if (item == null)
return null;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
return item;
}
protected virtual void CreateColorPicker(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateColorPicker(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateColorPicker(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
ColorPickerDropDown item = dh.CreateComponent(typeof(ColorPickerDropDown)) as ColorPickerDropDown;
if (item == null)
return;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateContainer(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateContainer(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateContainer(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
ItemContainer item = dh.CreateComponent(typeof(ItemContainer)) as ItemContainer;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateProgressBar(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateProgressBar(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateProgressBar(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
ProgressBarItem item = dh.CreateComponent(typeof(ProgressBarItem)) as ProgressBarItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateSwitch(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateSwitch(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateSwitch(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
SwitchButtonItem item = dh.CreateComponent(typeof(SwitchButtonItem)) as SwitchButtonItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateMicroChart(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateMicroChart(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateMicroChart(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
MicroChartItem item = dh.CreateComponent(typeof(MicroChartItem)) as MicroChartItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateDocument(object sender, EventArgs e)
{
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh == null)
return;
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
DockContainerItem item = dh.CreateComponent(typeof(DockContainerItem)) as DockContainerItem;
item.Text = item.Name;
OnSubItemsChanging();
this.GetDefaultNewItemContainer().SubItems.Add(item);
PanelDockContainer panel = dh.CreateComponent(typeof(PanelDockContainer)) as PanelDockContainer;
this.Control.Controls.Add(panel);
panel.ColorSchemeStyle = this.InternalStyle;
panel.ApplyLabelStyle();
item.Control = panel;
OnSubItemsChanged();
this.RecalcLayout();
if (this.Control is Bar)
{
Bar bar = this.Control as Bar;
bar.SelectedDockTab = bar.Items.IndexOf(item);
}
panel.BringToFront();
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
protected virtual void CreateMetroTile(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateMetroTile(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateMetroTile(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
DevComponents.DotNetBar.Metro.MetroTileItem item = dh.CreateComponent(typeof(DevComponents.DotNetBar.Metro.MetroTileItem)) as DevComponents.DotNetBar.Metro.MetroTileItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateControlContainer(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateControlContainer(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateControlContainer(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
ControlContainerItem item = dh.CreateComponent(typeof(ControlContainerItem)) as ControlContainerItem;
if (item == null)
return;
item.AllowItemResize = false;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateGalleryContainer(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateGalleryContainer(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateGalleryContainer(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
GalleryContainer item = dh.CreateComponent(typeof(GalleryContainer)) as GalleryContainer;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateCustomizeItem(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateCustomizeItem(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateCustomizeItem(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
CustomizeItem item = dh.CreateComponent(typeof(CustomizeItem)) as CustomizeItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateMdiWindowList(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateMdiWindowList(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateMdiWindowList(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
MdiWindowListItem item = dh.CreateComponent(typeof(MdiWindowListItem)) as MdiWindowListItem;
if (item == null)
return;
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateSliderItem(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateSliderItem(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateRangeSliderItem(object sender, EventArgs e)
{
OnSubItemsChanging();
CreateRangeSliderItem(this.GetDefaultNewItemContainer());
OnSubItemsChanged();
}
protected virtual void CreateRangeSliderItem(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
RangeSliderItem item = dh.CreateComponent(typeof(RangeSliderItem)) as RangeSliderItem;
if (item == null)
return;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void CreateSliderItem(BaseItem parent)
{
if (parent == null)
return;
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction trans = dh.CreateTransaction("Adding new item");
try
{
m_CreatingItem = true;
SliderItem item = dh.CreateComponent(typeof(SliderItem)) as SliderItem;
if (item == null)
return;
TypeDescriptor.GetProperties(item)["Text"].SetValue(item, item.Name);
IComponentChangeService cc = this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanging(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"]);
parent.SubItems.Add(item);
this.RecalcLayout();
if (parent != this.GetDefaultNewItemContainer() && cc != null)
cc.OnComponentChanged(parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
OnitemCreated(item);
}
catch
{
trans.Cancel();
throw;
}
finally
{
m_CreatingItem = false;
if (!trans.Canceled)
trans.Commit();
}
}
}
protected virtual void OnitemCreated(BaseItem item) {}
protected virtual void OnSubItemsChanging() {}
protected virtual void OnSubItemsChanged() {}
protected virtual eDotNetBarStyle InternalStyle
{
get {return eDotNetBarStyle.Office2003;}
}
#endregion
#region Drag & Drop support
private void TimerTickDragDrop(object sender, EventArgs e)
{
Point p=this.Control.PointToClient(System.Windows.Forms.Control.MousePosition);
if(this.Control.Bounds.Contains(p))
m_DragLeave=false;
else
m_DragLeave=true;
if(System.Windows.Forms.Control.MouseButtons!=MouseButtons.Left)
{
m_TimerDragDrop.Enabled=false;
m_TimerDragDrop.Stop();
m_TimerDragDrop.Tick-=new EventHandler(TimerTickDragDrop);
m_TimerDragDrop.Dispose();
m_TimerDragDrop=null;
if(m_ControlRemoved)
{
m_ControlRemoved=false;
ISelectionService sel=this.GetService(typeof(ISelectionService)) as ISelectionService;
if(sel!=null && sel.PrimarySelection is System.Windows.Forms.Control)
ControlRemoved((System.Windows.Forms.Control)sel.PrimarySelection);
}
else if (m_DragInProgress)
{
if (m_DragLeave)
{
ControlContainerItem cc = m_DragItem as ControlContainerItem;
MouseDragDrop(-1, -1);
if (cc != null)
{
cc.Control = null;
DestroyComponent(cc);
}
}
}
}
}
protected override void OnDragLeave(EventArgs e)
{
if (m_DragInProgress && m_AcceptExternalControls && !this.IsDockableWindow)
{
MouseDragDrop(-1, -1);
}
base.OnDragLeave(e);
}
protected override void OnDragOver(DragEventArgs de)
{
if(m_DragInProgress)
{
Point p=this.Control.PointToClient(new Point(de.X,de.Y));
MouseDragOver(p.X,p.Y);
de.Effect=DragDropEffects.Move;
return;
}
if(m_EnableItemDragDrop && m_AcceptExternalControls && !this.IsDockableWindow)
{
ISelectionService sel=(ISelectionService)this.GetService(typeof(ISelectionService));
if(sel!=null && sel.PrimarySelection!=this.Component)
{
if(sel.PrimarySelection is Control && this.Control.Controls.Contains((Control)sel.PrimarySelection))
{
BaseItem item=GetControlItem(sel.PrimarySelection as Control);
if(item!=null)
{
m_MouseDownPoint=this.Control.PointToClient(new Point(de.X,de.Y));
m_SuspendInternalCursor=true;
StartItemDrag(item);
if(m_TimerDragDrop==null)
{
m_TimerDragDrop=new Timer();
m_TimerDragDrop.Tick+=new EventHandler(this.TimerTickDragDrop);
m_TimerDragDrop.Interval=100;
m_TimerDragDrop.Enabled=true;
m_TimerDragDrop.Start();
}
}
return;
}
else if(sel.SelectionCount>1)
{
de.Effect=DragDropEffects.None;
return;
}
else if(sel.PrimarySelection is Control && ((Control)sel.PrimarySelection).Parent!=null)
{
// New control being added to the container
BaseItem dragItem=null;
if(this.IsDockableWindow)
{
DockContainerItem dc=new DockContainerItem();
dc.Name=TEMP_NAME;
//dc.Control=sel.PrimarySelection as System.Windows.Forms.Control;
dragItem=dc;
}
else
{
ControlContainerItem cc=new ControlContainerItem();
cc.AllowItemResize = false;
cc.Name=TEMP_NAME;
//cc.Control=sel.PrimarySelection as System.Windows.Forms.Control;
dragItem=cc;
}
m_MouseDownPoint=this.Control.PointToClient(new Point(de.X,de.Y));
m_SuspendInternalCursor=true;
StartItemDrag(dragItem);
if (m_TimerDragDrop == null)
{
m_TimerDragDrop = new Timer();
m_TimerDragDrop.Tick += new EventHandler(this.TimerTickDragDrop);
m_TimerDragDrop.Interval = 100;
m_TimerDragDrop.Enabled = true;
m_TimerDragDrop.Start();
}
}
}
}
base.OnDragOver (de);
}
protected override void OnDragDrop(DragEventArgs de)
{
if(m_EnableItemDragDrop && m_AcceptExternalControls && !this.IsDockableWindow)
{
ISelectionService sel=(ISelectionService)this.GetService(typeof(ISelectionService));
if(sel!=null && sel.PrimarySelection is Control && this.Control.Controls.Contains((Control)sel.PrimarySelection))
{
de.Effect=DragDropEffects.Move;
Point p=this.Control.PointToClient(new Point(de.X,de.Y));
MouseDragDrop(p.X,p.Y);
}
else
{
if(sel.SelectionCount>1)
{
de.Effect=DragDropEffects.None;
return;
}
else
{
if(m_DragItem!=null && m_DragItem.Name==TEMP_NAME && (m_DragItem is ControlContainerItem || m_DragItem is DockContainerItem))
{
m_JustAdded=DateTime.Now;
BaseItem dragItem=null;
if(m_DragItem is ControlContainerItem)
{
ControlContainerItem cc=m_DragItem as ControlContainerItem;
cc.Control=null;
cc = this.CreateComponent(typeof(ControlContainerItem)) as ControlContainerItem;
TypeDescriptor.GetProperties(cc)["Control"].SetValue(cc, sel.PrimarySelection as System.Windows.Forms.Control);
TypeDescriptor.GetProperties(cc)["AllowItemResize"].SetValue(cc, false);
dragItem = cc;
}
else if(m_DragItem is DockContainerItem)
{
DockContainerItem dc=m_DragItem as DockContainerItem;
dc.Control=null;
dc = this.CreateComponent(typeof(DockContainerItem)) as DockContainerItem;
TypeDescriptor.GetProperties(dc)["Control"].SetValue(dc, sel.PrimarySelection as System.Windows.Forms.Control);
dragItem = dc;
}
m_DragItem=dragItem;
Point p=this.Control.PointToClient(new Point(de.X,de.Y));
MouseDragDrop(p.X,p.Y);
}
m_NewControlAdded=true;
}
}
}
base.OnDragDrop(de);
}
protected virtual BaseItem GetControlItem(System.Windows.Forms.Control control)
{
BaseItem parent=this.GetItemContainer();
if(parent==null)
return null;
return GetControlItem(control,parent);
}
internal BaseItem GetControlItem(System.Windows.Forms.Control control, BaseItem parent)
{
if(parent is ControlContainerItem && ((ControlContainerItem)parent).Control==control)
return parent;
else if(parent is DockContainerItem && ((DockContainerItem)parent).Control==control)
return parent;
foreach(BaseItem item in parent.SubItems)
{
BaseItem i2=GetControlItem(control,item);
if(i2!=null)
return i2;
}
return null;
}
protected virtual bool DragInProgress
{
get {return m_DragInProgress;}
set {m_DragInProgress=value;}
}
protected void StartItemDrag(BaseItem item)
{
if(item==null)
return;
if(m_DragItem==null)
{
m_DragItem=item;
if(!m_SuspendInternalCursor)
System.Windows.Forms.Cursor.Current=System.Windows.Forms.Cursors.Hand;
DragInProgress=true;
}
}
protected void MouseDragOver(int x, int y)
{
if(!m_DragInProgress)
return;
BaseItem dragItem=m_DragItem;
BaseItem container=this.GetItemContainer();
if(m_DesignTimeProvider!=null)
{
m_DesignTimeProvider.DrawReversibleMarker(m_InsertPosition,m_InsertBefore);
m_DesignTimeProvider=null;
}
Point pScreen = this.Control.PointToScreen(new Point(x, y));
Control control=this.GetItemContainerControl();
InsertPosition pos=((IDesignTimeProvider)container).GetInsertPosition(pScreen, dragItem);
if(pos!=null)
{
if(pos.TargetProvider==null)
{
// Cursor is over drag item
if(!m_SuspendInternalCursor)
System.Windows.Forms.Cursor.Current=System.Windows.Forms.Cursors.No;
}
else
{
pos.TargetProvider.DrawReversibleMarker(pos.Position,pos.Before);
m_InsertPosition=pos.Position;
m_InsertBefore=pos.Before;
m_DesignTimeProvider=pos.TargetProvider;
if(!m_SuspendInternalCursor)
System.Windows.Forms.Cursor.Current=System.Windows.Forms.Cursors.Hand;
}
}
else
{
if(!m_SuspendInternalCursor)
System.Windows.Forms.Cursor.Current=System.Windows.Forms.Cursors.No;
}
}
internal BaseItem DragItem
{
get { return m_DragItem; }
}
protected virtual void OnItemDragAndDropped(BaseItem dragItem)
{
IComponentChangeService cc = (IComponentChangeService)GetService(typeof(IComponentChangeService));
if (cc != null)
cc.OnComponentChanged(dragItem.Parent, TypeDescriptor.GetProperties(typeof(BaseItem))["SubItems"], null, null);
}
internal void MouseDragDrop(int x, int y)
{
if(!m_DragInProgress)
return;
if (m_DesignerHost != null && m_DesignerHost.Capture)
m_DesignerHost.Capture = false;
BaseItem dragItem=m_DragItem;
BaseItem container=this.GetItemContainer();
bool changed=false;
if(m_DesignTimeProvider!=null)
{
if(x==-1 && y==-1)
{
// Cancel state
m_DesignTimeProvider.DrawReversibleMarker(m_InsertPosition, m_InsertBefore);
}
else
{
m_DesignTimeProvider.DrawReversibleMarker(m_InsertPosition, m_InsertBefore);
if(dragItem!=null)
{
m_InternalRemoveInProgress = true;
try
{
BaseItem objParent = dragItem.Parent;
if (objParent != null)
{
if (objParent == (BaseItem)m_DesignTimeProvider && m_InsertPosition > 0)
{
if (objParent.SubItems.IndexOf(dragItem) < m_InsertPosition)
m_InsertPosition--;
}
objParent.SubItems.Remove(dragItem);
}
m_DesignTimeProvider.InsertItemAt(dragItem, m_InsertPosition, m_InsertBefore);
m_DesignTimeProvider = null;
changed = true;
if (dragItem.Parent != null && dragItem.Parent != this.GetItemContainer())
{
OnItemDragAndDropped(dragItem);
}
}
finally
{
m_InternalRemoveInProgress = false;
}
}
}
}
else if(x!=-1 && y!=-1 && dragItem is ControlContainerItem && ((ControlContainerItem)dragItem).Control!=null)
{
BaseItem parent = container;
if (dragItem.Parent != null)
dragItem.Parent.SubItems.Remove(dragItem);
parent.SubItems.Add(dragItem);
OnItemDragAndDropped(dragItem);
changed = true;
}
m_DesignTimeProvider=null;
DragInProgress=false;
if(!m_SuspendInternalCursor)
System.Windows.Forms.Cursor.Current=System.Windows.Forms.Cursors.Default;
if(dragItem!=null)
dragItem._IgnoreClick=true;
container.InternalMouseUp(new MouseEventArgs(MouseButtons.Left,0,x,y,0));
if(dragItem!=null)
dragItem._IgnoreClick=false;
m_DragItem=null;
this.RecalcLayout();
if(changed)
{
IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
if(cc!=null)
{
cc.OnComponentChanged(this.Control,null,null,null);
}
}
}
/// <summary>
/// Gets or sets whether drag and drop of BaseItems is enabled. Default is false.
/// </summary>
protected virtual bool EnableItemDragDrop
{
get {return m_EnableItemDragDrop;}
set {m_EnableItemDragDrop=value;}
}
/// <summary>
/// Gets or sets whether dropping of external control into Bar is enabled. Default is false.
/// </summary>
protected virtual bool AcceptExternalControls
{
get {return m_AcceptExternalControls;}
set {m_AcceptExternalControls=value;}
}
public void StartExternalDrag(BaseItem item)
{
if(!m_DragInProgress && m_DesignerHost!=null)
{
m_SuspendInternalCursor=false;
m_MouseDownPoint=this.Control.PointToClient(System.Windows.Forms.Control.MousePosition);
this.StartItemDrag(item);
m_DesignerHost.Capture=true;
}
}
protected virtual bool IsDockableWindow
{
get {return false;}
}
protected virtual void SelectComponent(IComponent comp, SelectionTypes selectionType)
{
ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
if(selection!=null && comp!=null)
{
ArrayList arr=new ArrayList(1);
arr.Add(comp);
selection.SetSelectedComponents(arr,selectionType);
}
}
protected virtual bool MouseDownSelectionPerformed
{
get {return m_MouseDownSelectionPerformed;}
set {m_MouseDownSelectionPerformed=value;}
}
protected virtual bool PassiveContainer
{
get { return m_PassiveContainer; }
set { m_PassiveContainer = value; }
}
#endregion
#region IDesignerServices Implementation
public object CreateComponent(System.Type componentClass)
{
IDesignerHost dh=(IDesignerHost)GetService(typeof(IDesignerHost));
if(dh==null)
return null;
object comp = null;
try
{
m_CreatingItem = true;
comp = dh.CreateComponent(componentClass);
}
finally
{
m_CreatingItem = false;
}
return comp;
}
public object CreateComponent(System.Type componentClass, string name)
{
IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh == null)
return null;
object comp = null;
try
{
m_CreatingItem = true;
comp = dh.CreateComponent(componentClass, name);
}
finally
{
m_CreatingItem = false;
}
return comp;
}
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 DesignerSelectionChanged(object sender, EventArgs e)
{
ISelectionService sel=this.GetService(typeof(ISelectionService)) as ISelectionService;
if(sel==null)
{
SetComponentSelected(false);
return;
}
bool selected=false;
if(sel.PrimarySelection==this.Control || sel.PrimarySelection==this.GetItemContainerControl())
selected=true;
else if(sel.PrimarySelection is BaseItem && ((BaseItem)sel.PrimarySelection).ContainerControl==this.GetItemContainerControl())
selected=true;
SetComponentSelected(selected);
}
}
#region IDesignerServices
/// <summary>
/// Classes used for internal support of design-time features.
/// </summary>
public interface IDesignerServices
{
/// <summary>
/// Creates new component.
/// </summary>
/// <param name="componentClass">Component type to create</param>
/// <returns>New instance of component</returns>
object CreateComponent(System.Type componentClass);
/// <summary>
/// Creates new component.
/// </summary>
/// <param name="componentClass">Component type to create</param>
/// <param name="name">Name to assign to component</param>
/// <returns>New instance of component</returns>
object CreateComponent(System.Type componentClass, string name);
/// <summary>
/// Destroys component
/// </summary>
/// <param name="c">Component to destroy</param>
void DestroyComponent(IComponent c);
/// <summary>
/// Gets specified designer service.
/// </summary>
/// <param name="serviceType">Type of the service to get</param>
/// <returns>Returns reference to the service.</returns>
object GetService(Type serviceType);
}
#endregion
}