702 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			702 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.ComponentModel;
 | |
| using System.ComponentModel.Design;
 | |
| using System.Windows.Forms;
 | |
| using System.ComponentModel.Design.Serialization;
 | |
| using System.CodeDom;
 | |
| using System.Drawing;
 | |
| using System.Collections;
 | |
| using System.Windows.Forms.Design;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Represents Windows Forms designer for Bar control.
 | |
| 	/// </summary>
 | |
| 	public class BarDesigner:BarBaseControlDesigner
 | |
| 	{
 | |
| 		#region Internal Implementation
 | |
| 		private int m_MouseDownSelectedTabIndex=-1;
 | |
| 		private bool m_IsDocking=false;
 | |
| 		private Form m_OutlineForm=null;
 | |
| 		private DockSiteInfo m_DockInfo;
 | |
| 		private bool m_DragDrop=false;
 | |
| 
 | |
| 		public BarDesigner():base()
 | |
| 		{
 | |
| 			m_DockInfo=new DockSiteInfo();
 | |
| 			this.EnableItemDragDrop=true;
 | |
| 		}
 | |
| 
 | |
| 		public override DesignerVerbCollection Verbs 
 | |
| 		{
 | |
| 			get 
 | |
| 			{
 | |
| 				Bar bar=this.Control as Bar;
 | |
| 				DesignerVerb[] verbs=null;
 | |
| 				if(this.IsDockableWindow)
 | |
| 				{
 | |
| 					verbs = new DesignerVerb[]
 | |
| 						{
 | |
| 							new DesignerVerb("Create Document", new EventHandler(CreateDocument))};
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					verbs = new DesignerVerb[]
 | |
| 						{
 | |
| 							new DesignerVerb("Create Button", new EventHandler(CreateButton)),
 | |
| 							new DesignerVerb("Create Text Box", new EventHandler(CreateTextBox)),
 | |
| 							new DesignerVerb("Create Combo Box", new EventHandler(CreateComboBox)),
 | |
| 							new DesignerVerb("Create Label", new EventHandler(CreateLabel)),
 | |
| 							new DesignerVerb("Open Bar Designer", new EventHandler(EditBar))};
 | |
| 				}
 | |
| 				
 | |
| 				return new DesignerVerbCollection(verbs);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void EditBar(object sender, EventArgs e) 
 | |
| 		{
 | |
| 			OpenDesigner();
 | |
| 		}
 | |
| 
 | |
| 		public override void DoDefaultAction()
 | |
| 		{
 | |
| 			ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
 | |
| 			if(!this.IsDockableWindow && selection!=null && selection.PrimarySelection==this.Control)
 | |
| 				OpenDesigner();
 | |
| 			else
 | |
| 				base.DoDefaultAction();
 | |
| 		}
 | |
| 
 | |
| 		private void OpenDesigner()
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar!=null)	
 | |
| 			{
 | |
| 				DotNetBarManagerDesigner.OpenDesignerEditor(null,bar,this);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| #if FRAMEWORK20
 | |
|         public override void InitializeNewComponent(IDictionary defaultValues)
 | |
|         {
 | |
|             base.InitializeNewComponent(defaultValues);
 | |
|             SetDesignTimeDefaults();
 | |
|         }
 | |
| #else
 | |
| 		public override void OnSetComponentDefaults()
 | |
| 		{
 | |
| 			base.OnSetComponentDefaults();
 | |
| 			SetDesignTimeDefaults();
 | |
| 		}
 | |
| #endif
 | |
| 
 | |
|         private void SetDesignTimeDefaults()
 | |
|         {
 | |
|             Bar bar = this.Component as Bar;
 | |
|             if (bar == null)
 | |
|                 return;
 | |
|             bar.Style = eDotNetBarStyle.Office2003;
 | |
|         }
 | |
| 
 | |
| 		protected override BaseItem GetItemContainer()
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar!=null)
 | |
| 				return bar.ItemsContainer;
 | |
| 			return null;
 | |
| 		}
 | |
| 
 | |
| 		protected override void RecalcLayout()
 | |
| 		{
 | |
| 			Bar bar=this.GetItemContainerControl() as Bar;
 | |
| 			if(bar!=null)
 | |
| 				bar.RecalcLayout();
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnSubItemsChanging()
 | |
| 		{
 | |
| 			base.OnSubItemsChanging();
 | |
| 			IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | |
| 			if(change!=null)
 | |
| 			{
 | |
| 				Bar bar=this.GetItemContainerControl() as Bar;
 | |
| 				change.OnComponentChanging(this.Component,TypeDescriptor.GetProperties(bar).Find("Items",true));
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnSubItemsChanged()
 | |
| 		{
 | |
| 			base.OnSubItemsChanged();
 | |
| 			IComponentChangeService change=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | |
| 			if(change!=null)
 | |
| 			{
 | |
| 				Bar bar=this.GetItemContainerControl() as Bar;
 | |
| 				change.OnComponentChanged(this.Component,TypeDescriptor.GetProperties(bar).Find("Items",true),null,null);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		
 | |
| 		#endregion
 | |
| 
 | |
| 		#region Support For Dockable Windows
 | |
| 
 | |
| 		public override SelectionRules SelectionRules
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if(this.IsDockableWindow)
 | |
| 					return (SelectionRules.Locked);
 | |
| 				return base.SelectionRules;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public override bool CanParent(Control control)
 | |
| 		{
 | |
| 			if(control.Contains(this.Control))
 | |
| 				return false;
 | |
| 			if(this.IsDockableWindow && !(control is PanelDockContainer))
 | |
| 				return false;
 | |
| 			return base.CanParent(control);
 | |
| 		}
 | |
| 
 | |
| 		protected override bool IsDockableWindow
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				Bar bar=this.Control as Bar;
 | |
| 				if(bar!=null && bar.LayoutType==eLayoutType.DockContainer)
 | |
| 					return true;
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void SelectDockTab(int index)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar==null) return;
 | |
| 
 | |
| 			IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
 | |
| 			if(cc!=null)
 | |
| 				cc.OnComponentChanging(bar,TypeDescriptor.GetProperties(typeof(Bar))["SelectedDockTab"]);
 | |
| 			bar.SelectedDockTab=index;
 | |
| 			if(cc!=null)
 | |
| 				cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["SelectedDockTab"],null,null);
 | |
| 			if(bar.SelectedDockTab>=0)
 | |
| 			{
 | |
| #if FRAMEWORK20
 | |
|                 SelectComponent(bar.Items[bar.SelectedDockTab], SelectionTypes.Primary);
 | |
| #else
 | |
|                 SelectComponent(bar.Items[bar.SelectedDockTab],SelectionTypes.MouseDown);
 | |
| #endif
 | |
|                 DockContainerItem dock=bar.Items[bar.SelectedDockTab] as DockContainerItem;
 | |
| 				if(dock!=null && dock.Control!=null)
 | |
| 				{
 | |
| 					dock.Control.BringToFront();
 | |
| 					if(cc!=null)
 | |
| 						cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override eDotNetBarStyle Style
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				Bar bar=this.Control as Bar;
 | |
| 				if(bar!=null)
 | |
| 					return bar.Style;
 | |
| 				return base.Style;;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OtherComponentRemoving(object sender, ComponentEventArgs e)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(e.Component is Control)
 | |
| 			{
 | |
| 				BaseItem item=GetControlItem(e.Component as Control);
 | |
| 				if(item!=null && item.Parent!=null && item.Parent.SubItems.Contains(item))
 | |
| 				{
 | |
| 					if(item is DockContainerItem)
 | |
| 						((DockContainerItem)item).Control=null;
 | |
|                     else if(item is ControlContainerItem)
 | |
|                         ((ControlContainerItem)item).Control = null;
 | |
| 					item.Parent.SubItems.Remove(item);
 | |
| 					DestroySubItems(item);
 | |
| 					this.RecalcLayout();
 | |
| 					if(bar!=null && bar.Items.Count>0)
 | |
| 						SelectDockTab(0);
 | |
| 				}
 | |
| 			}
 | |
| 			else if(!m_InternalRemoving && bar!=null && e.Component is DockContainerItem && bar.Items.Contains((BaseItem)e.Component))
 | |
| 			{
 | |
| 				// Throw exception to stop removing the last dock container item.
 | |
| 				if(bar.VisibleItemCount==1)
 | |
| 					throw new InvalidOperationException("Cannot delete last DockContainerItem object. Select and Delete Bar object instead");
 | |
| 			}
 | |
| 			base.OtherComponentRemoving(sender,e);
 | |
| 		}
 | |
| 
 | |
| 		protected override bool OnMouseDown(ref Message m)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(!this.IsDockableWindow || bar==null)
 | |
| 				return base.OnMouseDown(ref m);
 | |
| 			Point p=Control.MousePosition;
 | |
| 			int i=GetTabAt(p.X,p.Y);
 | |
| 			if(i>=0 && m.Msg==NativeFunctions.WM_RBUTTONDOWN)
 | |
| 			{
 | |
| 				ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
 | |
| 				if(selection!=null && selection.PrimarySelection!=bar.Items[i])
 | |
| 				{
 | |
| 					ArrayList arr=new ArrayList(1);
 | |
| 					arr.Add(bar.Items[i]);
 | |
| #if FRAMEWORK20
 | |
|                     selection.SetSelectedComponents(arr, SelectionTypes.Primary);
 | |
| #else
 | |
|                     selection.SetSelectedComponents(arr,SelectionTypes.MouseDown);
 | |
| #endif
 | |
| 
 | |
|                     SelectDockTab(i);
 | |
| 					this.OnContextMenu(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y);
 | |
| 					return true;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 
 | |
| 			return base.OnMouseDown(ref m);
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseDragBegin(int x, int y)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			m_DragDrop=false;
 | |
| 
 | |
| 			if(bar!=null && this.IsDockableWindow)
 | |
| 			{
 | |
| 				m_MouseDownSelectedTabIndex=GetTabAt(x,y);
 | |
| 				if(m_MouseDownSelectedTabIndex!=-1)
 | |
| 				{
 | |
| 					if(bar.SelectedDockTab!=m_MouseDownSelectedTabIndex)
 | |
| 						SelectDockTab(m_MouseDownSelectedTabIndex);
 | |
| 					m_DragDrop=true;
 | |
| 				}
 | |
| 				else if(IsInTabSystemBox(x,y))
 | |
| 				{
 | |
| 					MouseDownTabSystemBox(x,y);
 | |
| 				}
 | |
| 				else if(IsCaptionGrabHandle(bar))
 | |
| 				{
 | |
| 					Point clientPos=bar.PointToClient(new Point(x,y));
 | |
| 					if(bar.GrabHandleRect.Contains(clientPos))
 | |
| 						m_DragDrop=true;
 | |
| 				}
 | |
| 			}
 | |
| 			base.OnMouseDragBegin(x,y);
 | |
| 			
 | |
| 			if(m_MouseDownSelectedTabIndex!=-1)
 | |
| 			{
 | |
| 				ISelectionService selection = (ISelectionService) this.GetService(typeof(ISelectionService));
 | |
| 				if(selection!=null && selection.PrimarySelection!=bar.Items[m_MouseDownSelectedTabIndex])
 | |
| 				{
 | |
| 					ArrayList arr=new ArrayList(1);
 | |
| 					arr.Add(bar.Items[m_MouseDownSelectedTabIndex]);
 | |
| #if FRAMEWORK20
 | |
|                     selection.SetSelectedComponents(arr, SelectionTypes.Primary);
 | |
| #else
 | |
|                     selection.SetSelectedComponents(arr,SelectionTypes.Click);
 | |
| #endif
 | |
|                 }
 | |
| 			}
 | |
| 
 | |
| 			if(m_DragDrop)
 | |
| 			{
 | |
| 				bar.Capture = true;
 | |
| 				NativeFunctions.RECT rect = new NativeFunctions.RECT(0,0,0,0);
 | |
| 				NativeFunctions.GetWindowRect(bar.Parent.Handle, ref rect);
 | |
| 				Rectangle r=Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom);
 | |
| 				Cursor.Clip=r;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private bool IsCaptionGrabHandle(Bar bar)
 | |
| 		{
 | |
| 			return (bar.GrabHandleStyle==eGrabHandleStyle.Caption || bar.GrabHandleStyle==eGrabHandleStyle.CaptionTaskPane);
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseDragMove(int x, int y)
 | |
| 		{
 | |
| 			if(!this.IsDockableWindow || !m_DragDrop)
 | |
| 			{
 | |
| 				base.OnMouseDragMove(x,y);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			Point screenPos=new Point(x,y);
 | |
| 			
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar==null) return;
 | |
| 
 | |
| 			Point tabPos=bar.DockTabControl.PointToClient(screenPos);
 | |
| 			if(bar.DockTabControl!=null && bar.DockTabControl.ClientRectangle.Contains(tabPos))
 | |
| 			{
 | |
| 				if(m_IsDocking)
 | |
| 				{
 | |
| 					EndBarOwnerDocking(bar);
 | |
| 					m_IsDocking=false;
 | |
| 					m_DockInfo=new DockSiteInfo();
 | |
| 				}
 | |
| 				MouseEventArgs e=new MouseEventArgs(MouseButtons.Left,0,tabPos.X,tabPos.Y,0);
 | |
| 				bar.DockTabControl.InternalOnMouseMove(e);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				m_IsDocking=true;
 | |
| 				IOwnerBarSupport ownerDock=bar.Owner as IOwnerBarSupport;
 | |
| 				m_DockInfo=ownerDock.GetDockInfo(bar,screenPos.X,screenPos.Y);
 | |
| 				if(m_DockInfo.objDockSite==null)
 | |
| 				{
 | |
| 					if(m_OutlineForm!=null)
 | |
| 						m_OutlineForm.Hide();
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					Rectangle r=m_DockInfo.objDockSite.GetBarDockRectangle(bar,ref m_DockInfo);
 | |
| 					if(!r.IsEmpty)
 | |
| 					{
 | |
| 						if(m_OutlineForm==null)
 | |
| 							m_OutlineForm=BarFunctions.CreateOutlineForm();
 | |
| 						NativeFunctions.SetWindowPos(m_OutlineForm.Handle.ToInt32(),NativeFunctions.HWND_TOP,r.X,r.Y,r.Width,r.Height,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
 | |
| 					}
 | |
| 					else if(m_OutlineForm!=null)
 | |
| 						m_OutlineForm.Hide();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseDragEnd(bool cancel)
 | |
| 		{
 | |
| 			if(!this.IsDockableWindow)
 | |
| 			{
 | |
| 				base.OnMouseDragEnd(cancel);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			this.Control.Capture = false;
 | |
| 			Cursor.Clip = Rectangle.Empty;
 | |
| 			
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 
 | |
| 			if(cancel || bar==null || !m_DragDrop)
 | |
| 			{
 | |
| 				base.OnMouseDragEnd(cancel);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			m_DragDrop=false;
 | |
| 
 | |
| 			IDesignerHost designerHost=this.GetService(typeof(IDesignerHost)) as IDesignerHost;
 | |
| 			if(designerHost==null)
 | |
| 			{
 | |
| 				EndBarOwnerDocking(bar);
 | |
| 				m_IsDocking=false;
 | |
| 				m_MouseDownSelectedTabIndex=-1;
 | |
| 				base.OnMouseDragEnd(cancel);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			if(m_IsDocking)
 | |
| 			{
 | |
| 				EndBarOwnerDocking(bar);
 | |
| 				// Moves and docks the selected DockContainerItem or bar
 | |
| 				Bar referenceBar=m_DockInfo.MouseOverBar;
 | |
| 				if(m_DockInfo.MouseOverDockSide!=eDockSide.None && m_DockInfo.MouseOverDockSide!=eDockSide.Document && (referenceBar!=bar || m_MouseDownSelectedTabIndex!=-1 && bar.VisibleItemCount>1))
 | |
| 				{
 | |
| 					DesignerTransaction trans=designerHost.CreateTransaction("DotNetBar Docking");
 | |
| 					IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
 | |
| 					try
 | |
| 					{
 | |
| 						Bar newBar=null;
 | |
| 						if(m_MouseDownSelectedTabIndex!=-1 && bar.VisibleItemCount>1)
 | |
| 							newBar=BarFunctions.CreateDuplicateDockBar(bar,this);
 | |
| 						else
 | |
| 							newBar=bar;
 | |
| 
 | |
| 						cc.OnComponentChanging(bar,TypeDescriptor.GetProperties(typeof(Bar))["SelectedDockTab"]);
 | |
| 						
 | |
| 						if(m_MouseDownSelectedTabIndex!=-1 && bar.VisibleItemCount>1)
 | |
| 						{
 | |
| 							DockContainerItem item=bar.Items[bar.SelectedDockTab] as DockContainerItem;
 | |
| 							cc.OnComponentChanging(bar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"]);
 | |
| 							cc.OnComponentChanging(bar,TypeDescriptor.GetProperties(typeof(Bar))["Items"]);
 | |
| 							bar.Items.Remove(item);
 | |
| 							cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
 | |
| 							cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 
 | |
| 							cc.OnComponentChanging(newBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"]);
 | |
| 							cc.OnComponentChanging(newBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"]);
 | |
| 							newBar.Items.Add(item);
 | |
| 							cc.OnComponentChanged(newBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
 | |
| 							cc.OnComponentChanged(newBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);							
 | |
| 						}
 | |
| 						
 | |
| 						cc.OnComponentChanging(m_DockInfo.objDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["Controls"]);
 | |
| 						cc.OnComponentChanging(newBar,null);
 | |
| 						cc.OnComponentChanging(referenceBar,null);
 | |
| 						cc.OnComponentChanging(m_DockInfo.objDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"]);
 | |
| 						m_DockInfo.objDockSite.GetDocumentUIManager().Dock(referenceBar,newBar,m_DockInfo.MouseOverDockSide);
 | |
| 						cc.OnComponentChanged(m_DockInfo.objDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"],null,null);
 | |
| 						cc.OnComponentChanged(referenceBar,null,null,null);
 | |
| 						cc.OnComponentChanged(newBar,null,null,null);
 | |
| 						cc.OnComponentChanged(m_DockInfo.objDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["Controls"],null,null);
 | |
| 
 | |
| 					}
 | |
| 					catch
 | |
| 					{
 | |
| 						trans.Cancel();
 | |
| 						throw;
 | |
| 					}
 | |
| 					finally
 | |
| 					{
 | |
| 						if(!trans.Canceled)
 | |
| 							trans.Commit();
 | |
| 					}
 | |
| 				}
 | |
| 				else if(m_DockInfo.MouseOverDockSide==eDockSide.Document && bar!=referenceBar)
 | |
| 				{
 | |
| 					BarDesigner referenceDesigner=designerHost.GetDesigner(referenceBar) as BarDesigner;
 | |
| 					if(referenceDesigner!=null)
 | |
| 						referenceDesigner.DelayedDockTabs(bar,m_MouseDownSelectedTabIndex);
 | |
| 				}
 | |
| 
 | |
| 				m_DockInfo=new DockSiteInfo();
 | |
| 			}
 | |
| 			else if(m_MouseDownSelectedTabIndex!=-1)
 | |
| 			{
 | |
| 				if(m_MouseDownSelectedTabIndex!=bar.SelectedDockTab)
 | |
| 				{
 | |
| 					IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
 | |
| 					if(cc!=null)
 | |
| 					{
 | |
| 						cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
 | |
| 						cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["SelectedDockTab"],null,null);
 | |
| 						cc.OnComponentChanged(bar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			m_IsDocking=false;
 | |
| 			m_MouseDownSelectedTabIndex=-1;
 | |
| 			base.OnMouseDragEnd(cancel);
 | |
| 		}
 | |
| 
 | |
| 		private Timer m_TimerDelayRemove=null;
 | |
| 		private Bar m_DelayDockBar=null;
 | |
| 		private int m_DelayDockTabIndex=-1;
 | |
| 		internal void DelayedDockTabs(Bar bar, int tabIndex)
 | |
| 		{
 | |
| 			if(m_TimerDelayRemove==null)
 | |
| 			{
 | |
| 				m_DelayDockBar=bar;
 | |
| 				m_DelayDockTabIndex=tabIndex;
 | |
| 				m_TimerDelayRemove=new Timer();
 | |
| 				m_TimerDelayRemove.Tick+=new EventHandler(this.TimerTickDelayRemove);
 | |
| 				m_TimerDelayRemove.Interval=200;
 | |
| 				m_TimerDelayRemove.Enabled=true;
 | |
| 				m_TimerDelayRemove.Start();
 | |
| 			}
 | |
| 		}
 | |
| 		private void TimerTickDelayRemove(object sender, EventArgs e)
 | |
| 		{
 | |
| 			m_TimerDelayRemove.Stop();
 | |
| 			m_TimerDelayRemove.Enabled=false;
 | |
| 			m_TimerDelayRemove.Dispose();
 | |
| 			m_TimerDelayRemove=null;
 | |
| 
 | |
| 			DockTabs(m_DelayDockBar,m_DelayDockTabIndex,this.Control as Bar);
 | |
| 
 | |
| 			m_DelayDockBar=null;
 | |
| 			m_DelayDockTabIndex=-1;
 | |
| 		}
 | |
| 
 | |
| 		private void DockTabs(Bar sourceBar, int selectedTabIndex, Bar targetBar)
 | |
| 		{
 | |
| 			// Move Dock-container item to different bar
 | |
| 			IDesignerHost designerHost=this.GetService(typeof(IDesignerHost)) as IDesignerHost;
 | |
| 			DesignerTransaction trans=designerHost.CreateTransaction("DotNetBar Docking");
 | |
| 			IComponentChangeService cc=(IComponentChangeService)GetService(typeof(IComponentChangeService));
 | |
| 			try
 | |
| 			{
 | |
| 				DockContainerItem[] items=null;
 | |
| 				if(selectedTabIndex!=-1)
 | |
| 					items=new DockContainerItem[] {sourceBar.Items[sourceBar.SelectedDockTab] as DockContainerItem};
 | |
| 				else
 | |
| 				{
 | |
| 					items=new DockContainerItem[sourceBar.Items.Count];
 | |
| 					sourceBar.Items.CopyTo(items,0);
 | |
| 				}
 | |
| 
 | |
| 				cc.OnComponentChanging(sourceBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"]);
 | |
| 				cc.OnComponentChanging(sourceBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"]);
 | |
| 				sourceBar.Items.RemoveRange(items);
 | |
| 				cc.OnComponentChanged(sourceBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
 | |
| 				cc.OnComponentChanged(sourceBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 
 | |
| 				cc.OnComponentChanging(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"]);
 | |
| 				cc.OnComponentChanging(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"]);
 | |
| 				targetBar.Items.AddRange(items);
 | |
| 				cc.OnComponentChanged(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Items"],null,null);
 | |
| 				cc.OnComponentChanged(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 
 | |
| 				if(sourceBar.Items.Count==0)
 | |
| 				{
 | |
| 					DockSite sourceDockSite=sourceBar.Parent as DockSite;
 | |
| 					cc.OnComponentChanging(sourceDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"]);
 | |
| 					cc.OnComponentChanging(sourceBar,null);
 | |
| 					sourceDockSite.GetDocumentUIManager().UnDock(sourceBar,false);
 | |
| 					cc.OnComponentChanged(sourceBar,null,null,null);
 | |
| 					cc.OnComponentChanged(sourceDockSite,TypeDescriptor.GetProperties(typeof(DockSite))["DocumentDockContainer"],null,null);
 | |
| 
 | |
| 					designerHost.DestroyComponent(sourceBar);
 | |
| 				}
 | |
| 
 | |
| 				if(targetBar!=null && targetBar.SelectedDockTab>=0)
 | |
| 				{
 | |
| 					DockContainerItem dock=targetBar.Items[targetBar.SelectedDockTab] as DockContainerItem;
 | |
| 					if(dock!=null && dock.Control!=null)
 | |
| 					{
 | |
| 						cc.OnComponentChanged(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 						dock.Control.BringToFront();
 | |
| 						cc.OnComponentChanged(targetBar,TypeDescriptor.GetProperties(typeof(Bar))["Controls"],null,null);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				trans.Cancel();
 | |
| 				throw;
 | |
| 			}
 | |
| 			finally
 | |
| 			{
 | |
| 				if(!trans.Canceled)
 | |
| 					trans.Commit();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void EndBarOwnerDocking(Bar bar)
 | |
| 		{
 | |
| 			IOwnerBarSupport barSupport=bar.Owner as IOwnerBarSupport;
 | |
| 			if(barSupport!=null)
 | |
| 				barSupport.DockComplete();
 | |
| 			if(m_OutlineForm!=null)
 | |
| 			{
 | |
| 				m_OutlineForm.Hide();
 | |
| 				m_OutlineForm.Dispose();
 | |
| 				m_OutlineForm=null;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns tab index under specified coordinates.
 | |
| 		/// </summary>
 | |
| 		/// <param name="x">Screen X coordinate</param>
 | |
| 		/// <param name="y">Screen Y coordinate</param>
 | |
| 		/// <returns>Tab index or -1 if tab was not found</returns>
 | |
| 		private int GetTabAt(int x, int y)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar==null) return -1;
 | |
| 			
 | |
| 			// Select dockable tab if mouse is clicked over the tab
 | |
| 			if(this.IsDockableWindow && bar.DockTabControl!=null)
 | |
| 			{
 | |
| 				Point posTab=bar.DockTabControl.PointToClient(new Point(x,y));
 | |
| 				if(bar.DockTabControl._TabSystemBox.Visible && bar.DockTabControl._TabSystemBox.DisplayRectangle.Contains(posTab))
 | |
| 				{
 | |
| 					return -1;
 | |
| 				}
 | |
| 				TabItem tab=bar.DockTabControl.HitTest(posTab.X,posTab.Y);
 | |
| 				if(tab!=null)
 | |
| 					return bar.Items.IndexOf(tab.AttachedItem);
 | |
| 			}
 | |
| 
 | |
| 			return -1;
 | |
| 		}
 | |
| 
 | |
| 		private bool IsInTabSystemBox(int x, int y)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar==null) return false;
 | |
| 
 | |
| 			// Select dockable tab if mouse is clicked over the tab
 | |
| 			if(this.IsDockableWindow && bar.DockTabControl!=null)
 | |
| 			{
 | |
| 				Point posTab=bar.DockTabControl.PointToClient(new Point(x,y));
 | |
| 				if(bar.DockTabControl._TabSystemBox.Visible && bar.DockTabControl._TabSystemBox.DisplayRectangle.Contains(posTab))
 | |
| 					return true;
 | |
| 			}
 | |
| 
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		private void MouseDownTabSystemBox(int x, int y)
 | |
| 		{
 | |
| 			Bar bar=this.Control as Bar;
 | |
| 			if(bar==null) return;
 | |
| 
 | |
| 			// Select dockable tab if mouse is clicked over the tab
 | |
| 			if(this.IsDockableWindow && bar.DockTabControl!=null)
 | |
| 			{
 | |
| 				Point posTab=bar.DockTabControl.PointToClient(new Point(x,y));
 | |
| 				if(bar.DockTabControl._TabSystemBox.Visible && bar.DockTabControl._TabSystemBox.DisplayRectangle.Contains(posTab))
 | |
| 				{
 | |
| 					if(bar.DockTabControl._TabSystemBox.ForwardEnabled && bar.DockTabControl._TabSystemBox.ForwardRect.Contains(posTab))
 | |
| 					{
 | |
| 						bar.DockTabControl.ScrollForward();
 | |
| 					}
 | |
| 					else if(bar.DockTabControl._TabSystemBox.BackEnabled && bar.DockTabControl._TabSystemBox.BackRect.Contains(posTab))
 | |
| 					{
 | |
| 						bar.DockTabControl.ScrollBackwards();
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Removes all subitems from container.
 | |
| 		/// </summary>
 | |
| 		protected override void ThisComponentRemoving(object sender, ComponentEventArgs e)
 | |
| 		{
 | |
| 			if(!m_InternalRemoving)
 | |
| 			{
 | |
| 				m_InternalRemoving=true;
 | |
| 				try
 | |
| 				{
 | |
| 					if(this.IsDockableWindow)
 | |
| 					{
 | |
| 						Bar bar=this.Control as Bar;
 | |
| 						if(bar!=null && bar.DockSide==eDockSide.Document && bar.Parent is DockSite)
 | |
| 						{
 | |
| 							IComponentChangeService cc=this.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
 | |
| 							if(cc!=null)
 | |
| 								cc.OnComponentChanging(((DockSite)bar.Parent),TypeDescriptor.GetProperties(typeof(DockSite)).Find("DocumentDockContainer",true));
 | |
| 							((DockSite)bar.Parent).GetDocumentUIManager().UnDock(bar,false);
 | |
| 							if(cc!=null)
 | |
| 								cc.OnComponentChanged(((DockSite)bar.Parent),TypeDescriptor.GetProperties(typeof(DockSite)).Find("DocumentDockContainer",true),null,null);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				finally
 | |
| 				{
 | |
| 					m_InternalRemoving=false;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			base.ThisComponentRemoving(sender,e);
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| }
 |