1654 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1654 lines
		
	
	
		
			68 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Drawing;
 | 
						|
using System.Xml;
 | 
						|
using System.ComponentModel;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Represents class that manages document docking UI interaction.
 | 
						|
	/// </summary>
 | 
						|
	public class DocumentDockUIManager
 | 
						|
	{
 | 
						|
		#region Private Variables, Constructor
 | 
						|
		private DocumentDockContainer m_DocumentDockContainer=null;
 | 
						|
		private Cursor m_ContainerCursor=null;
 | 
						|
		private DockSite m_Container=null;
 | 
						|
		private Point m_MouseDownPoint=Point.Empty;
 | 
						|
		private bool m_ResizePreview=false;
 | 
						|
		private Form m_Splitter=null;
 | 
						|
		private DocumentDockContainer m_ResizeDockContainer=null;
 | 
						|
		private DocumentBaseContainer m_ResizeDocument=null;
 | 
						|
		private int m_SplitterWidth=3;
 | 
						|
		private bool m_LoadingLayout=false;
 | 
						|
 | 
						|
		public DocumentDockUIManager(DockSite container)
 | 
						|
		{
 | 
						|
			m_Container=container;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Properties
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the root document dock container object.
 | 
						|
		/// </summary>
 | 
						|
		public DocumentDockContainer RootDocumentDockContainer
 | 
						|
		{
 | 
						|
			get {return m_DocumentDockContainer;}
 | 
						|
			set {m_DocumentDockContainer=value;}
 | 
						|
		}
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the splitter width used for mouse hit-testing.
 | 
						|
        /// </summary>
 | 
						|
        public int SplitterWidth
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_SplitterWidth;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                m_SplitterWidth = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the container of the document. 
 | 
						|
		/// </summary>
 | 
						|
		public DockSite Container
 | 
						|
		{
 | 
						|
			get {return m_Container;}
 | 
						|
			set {m_Container=value;}
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Methods
 | 
						|
		/// <summary>
 | 
						|
		/// Estimates the docking position and size of a given bar for outline purposes during drag&drop
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="bar">Bar to find estimated docking position and size for</param>
 | 
						|
		/// <param name="pDockInfo">Docking information</param>
 | 
						|
		/// <returns>Preview Rectangle in screen coordinates.</returns>
 | 
						|
		internal Rectangle GetDockPreviewRectangle(Bar bar, ref DockSiteInfo dockInfo)
 | 
						|
		{
 | 
						|
			DocumentBaseContainer referenceDoc=GetDocumentFromBar(dockInfo.MouseOverBar);
 | 
						|
			Rectangle r=Rectangle .Empty;
 | 
						|
 | 
						|
            // Handle edge case docking first
 | 
						|
            if (m_Container.Dock!= DockStyle.Fill && (dockInfo.DockLine == 999 || dockInfo.DockLine == -1))
 | 
						|
            {
 | 
						|
                return GetEdgeDockPreviewRectangle(bar, ref dockInfo);
 | 
						|
            }
 | 
						|
			else if(referenceDoc!=null)
 | 
						|
			{
 | 
						|
				if(dockInfo.MouseOverDockSide==eDockSide.Left)
 | 
						|
				{
 | 
						|
					r=referenceDoc.DisplayBounds;
 | 
						|
					r.Width=r.Width/2;
 | 
						|
				}
 | 
						|
				else if(dockInfo.MouseOverDockSide==eDockSide.Right)
 | 
						|
				{
 | 
						|
					r=referenceDoc.DisplayBounds;
 | 
						|
					r.X+=r.Width/2;
 | 
						|
					r.Width=r.Width/2;
 | 
						|
				}
 | 
						|
				else if(dockInfo.MouseOverDockSide==eDockSide.Top)
 | 
						|
				{
 | 
						|
					r=referenceDoc.DisplayBounds;
 | 
						|
					r.Height=r.Height/2;
 | 
						|
				}
 | 
						|
				else if(dockInfo.MouseOverDockSide==eDockSide.Bottom)
 | 
						|
				{
 | 
						|
					r=referenceDoc.DisplayBounds;
 | 
						|
					r.Y+=r.Height/2;
 | 
						|
					r.Height=r.Height/2;
 | 
						|
				}
 | 
						|
				else if(dockInfo.MouseOverDockSide==eDockSide.Document)
 | 
						|
				{
 | 
						|
					r=referenceDoc.DisplayBounds;
 | 
						|
				}
 | 
						|
				r.Location=m_Container.PointToScreen(r.Location);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
                if (m_Container.Dock == DockStyle.Fill)
 | 
						|
                {
 | 
						|
                    r = m_Container.ClientRectangle;
 | 
						|
                    r.Location = m_Container.PointToScreen(r.Location);
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Right)
 | 
						|
                {
 | 
						|
                    r = m_Container.ClientRectangle;
 | 
						|
                    r.Location = m_Container.PointToScreen(r.Location);
 | 
						|
                    if (r.Width == 0)
 | 
						|
                    {
 | 
						|
                        r.Width = bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
                        r.X -= r.Width;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Left)
 | 
						|
                {
 | 
						|
                    r = m_Container.ClientRectangle;
 | 
						|
                    r.Location = m_Container.PointToScreen(r.Location);
 | 
						|
                    if (r.Width == 0)
 | 
						|
                    {
 | 
						|
                        r.Width = bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Top)
 | 
						|
                {
 | 
						|
                    r = m_Container.ClientRectangle;
 | 
						|
                    r.Location = m_Container.PointToScreen(r.Location);
 | 
						|
                    if (r.Height == 0)
 | 
						|
                    {
 | 
						|
                        r.Height = bar.GetBarDockedSize(eOrientation.Horizontal);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Bottom)
 | 
						|
                {
 | 
						|
                    r = m_Container.ClientRectangle;
 | 
						|
                    r.Location = m_Container.PointToScreen(r.Location);
 | 
						|
                    if (r.Height == 0)
 | 
						|
                    {
 | 
						|
                        r.Height = bar.GetBarDockedSize(eOrientation.Horizontal);
 | 
						|
                        r.Y -= r.Height;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
			}
 | 
						|
 | 
						|
			return r;
 | 
						|
		}
 | 
						|
 | 
						|
        private Rectangle GetEdgeDockPreviewRectangle(Bar bar, ref DockSiteInfo dockInfo)
 | 
						|
        {
 | 
						|
            Rectangle r = Rectangle.Empty;
 | 
						|
            int fullSizeIndex = -1;
 | 
						|
            int partialSizeIndex = -1;
 | 
						|
            if (dockInfo.FullSizeDock)
 | 
						|
                fullSizeIndex = m_Container.GetFullSizeIndex();
 | 
						|
            else if (dockInfo.PartialSizeDock)
 | 
						|
                partialSizeIndex = m_Container.GetPartialSizeIndex();
 | 
						|
 | 
						|
            // Docks the bar to the edge
 | 
						|
            switch (m_Container.Dock)
 | 
						|
            {
 | 
						|
                case DockStyle.Top:
 | 
						|
                    {
 | 
						|
                        r.Width = m_Container.ClientRectangle.Width;
 | 
						|
                        r.Height = bar.GetBarDockedSize(eOrientation.Horizontal);
 | 
						|
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            r.Width += m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, true).Width;
 | 
						|
                            r.Width += m_Container.GetSiteZOrderSize(m_Container.Owner.RightDockSite, true).Width;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = fullSizeIndex;
 | 
						|
                        }
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            // Reduce by the size of the left and right dock site
 | 
						|
                            r.Width -= m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, false).Width;
 | 
						|
                            r.Width -= m_Container.GetSiteZOrderSize(m_Container.Owner.RightDockSite, false).Width;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = partialSizeIndex;
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
                        Point p = Point.Empty;
 | 
						|
                        if (dockInfo.DockLine == -1)
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(m_Container.ClientRectangle.Location);
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.X, m_Container.ClientRectangle.Bottom));
 | 
						|
                            p.Y++;
 | 
						|
                        }
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                            p.X -= m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, true).Width;
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                            p.X += m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, false).Width;
 | 
						|
                        r.Location = p;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                case DockStyle.Bottom:
 | 
						|
                    {
 | 
						|
                        r.Width = m_Container.ClientRectangle.Width;
 | 
						|
                        r.Height = bar.GetBarDockedSize(eOrientation.Horizontal);
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            r.Width += m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, true).Width;
 | 
						|
                            r.Width += m_Container.GetSiteZOrderSize(m_Container.Owner.RightDockSite, true).Width;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = fullSizeIndex;
 | 
						|
                        }
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            // Reduce by the size of the left and right dock site
 | 
						|
                            r.Width -= m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, false).Width;
 | 
						|
                            r.Width -= m_Container.GetSiteZOrderSize(m_Container.Owner.RightDockSite, false).Width;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = partialSizeIndex;
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
                        Point p = Point.Empty;
 | 
						|
                        if (dockInfo.DockLine == -1)
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.X, m_Container.ClientRectangle.Y - r.Height));
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.X, m_Container.ClientRectangle.Bottom - r.Height));
 | 
						|
                            p.Y++;
 | 
						|
                        }
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                            p.X -= m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, true).Width;
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                            p.X += m_Container.GetSiteZOrderSize(m_Container.Owner.LeftDockSite, false).Width;
 | 
						|
                        r.Location = p;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                case DockStyle.Right:
 | 
						|
                    {
 | 
						|
                        r.Height = m_Container.ClientRectangle.Height;
 | 
						|
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            r.Height += m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, true).Height;
 | 
						|
                            r.Height += m_Container.GetSiteZOrderSize(m_Container.Owner.BottomDockSite, true).Height;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = fullSizeIndex;
 | 
						|
                        }
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            // Reduce by the size of the top and bottom dock site
 | 
						|
                            r.Height -= m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, false).Height;
 | 
						|
                            r.Height -= m_Container.GetSiteZOrderSize(m_Container.Owner.BottomDockSite, false).Height;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = partialSizeIndex;
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
                        r.Width = bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
                        Point p = Point.Empty;
 | 
						|
                        if (dockInfo.DockLine == -1)
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.X - r.Width, m_Container.ClientRectangle.Y));
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.Right - r.Width, m_Container.ClientRectangle.Y));
 | 
						|
                            p.X--;
 | 
						|
                        }
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                            p.Y -= m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, true).Height;
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                            p.Y += m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, false).Height;
 | 
						|
                        r.Location = p;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                default:
 | 
						|
                    {
 | 
						|
                        r.Height = m_Container.ClientRectangle.Height;
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            r.Height += m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, true).Height;
 | 
						|
                            r.Height += m_Container.GetSiteZOrderSize(m_Container.Owner.BottomDockSite, true).Height;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = fullSizeIndex;
 | 
						|
                        }
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                        {
 | 
						|
                            // Reduce by the size of the top and bottom dock site
 | 
						|
                            r.Height -= m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, false).Height;
 | 
						|
                            r.Height -= m_Container.GetSiteZOrderSize(m_Container.Owner.BottomDockSite, false).Height;
 | 
						|
                            dockInfo.DockSiteZOrderIndex = partialSizeIndex;
 | 
						|
 | 
						|
                        }
 | 
						|
                        r.Width = bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
 | 
						|
                        Point p = Point.Empty;
 | 
						|
                        if (dockInfo.DockLine == -1)
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.X, m_Container.ClientRectangle.Y));
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            p = m_Container.PointToScreen(new Point(m_Container.ClientRectangle.Right, m_Container.ClientRectangle.Y));
 | 
						|
                            p.X++;
 | 
						|
                        }
 | 
						|
                        if (fullSizeIndex >= 0)
 | 
						|
                            p.Y -= m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, true).Height;
 | 
						|
                        else if (partialSizeIndex >= 0)
 | 
						|
                            p.Y += m_Container.GetSiteZOrderSize(m_Container.Owner.TopDockSite, false).Height;
 | 
						|
                        r.Location = p;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
            }
 | 
						|
 | 
						|
            return r;
 | 
						|
        }
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Returns DocumentBaseContainer that holds the reference bar.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="bar">Bar to return document container for.</param>
 | 
						|
		/// <returns>Returns null if document container cannot  be found or reference to the document container.</returns>
 | 
						|
		public DocumentBaseContainer GetDocumentFromBar(Bar bar)
 | 
						|
		{
 | 
						|
			if(bar==null)
 | 
						|
				return null;
 | 
						|
			return GetDocumentFromBar(bar,m_DocumentDockContainer);
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentBaseContainer GetDocumentFromBar(Bar bar, DocumentDockContainer dockContainer)
 | 
						|
		{
 | 
						|
			foreach(DocumentBaseContainer doc in dockContainer.Documents)
 | 
						|
			{
 | 
						|
				if(doc is DocumentBarContainer && ((DocumentBarContainer)doc).Bar==bar)
 | 
						|
					return doc;
 | 
						|
				else if(doc is DocumentDockContainer)
 | 
						|
				{
 | 
						|
					DocumentBaseContainer d=GetDocumentFromBar(bar,doc as DocumentDockContainer);
 | 
						|
					if(d!=null)
 | 
						|
						return d;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
        private bool IsAddedInFront(eDockSide dockSide)
 | 
						|
        {
 | 
						|
            if (m_Container.Dock == DockStyle.Left && dockSide == eDockSide.Left ||
 | 
						|
                m_Container.Dock == DockStyle.Right && dockSide == eDockSide.Left ||
 | 
						|
                m_Container.Dock == DockStyle.Top && dockSide== eDockSide.Top || 
 | 
						|
                m_Container.Dock == DockStyle.Bottom && dockSide == eDockSide.Top)
 | 
						|
                return true;
 | 
						|
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Docks specified bar by appending it to the container. Bar will be added according to the container's orientation.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="barToDock">Bar to dock.</param>
 | 
						|
		public void Dock(Bar barToDock)
 | 
						|
		{
 | 
						|
			Dock(null,barToDock,eDockSide.None);
 | 
						|
		}
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Docks specified bar by appending it to the container. Bar will be added according to the container's orientation.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="barToDock">Bar to dock.</param>
 | 
						|
        /// <param name="dockSide">Side to dock bar at.</param>
 | 
						|
		public void Dock(Bar referenceBar, Bar barToDock, eDockSide dockSide)
 | 
						|
		{
 | 
						|
			if(dockSide==eDockSide.None && barToDock.Parent==m_Container)
 | 
						|
			{
 | 
						|
				ApplyBarStyle(barToDock);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			if(barToDock.Parent is DockSite && ((DockSite)barToDock.Parent).DocumentDockContainer!=null)
 | 
						|
				((DockSite)barToDock.Parent).GetDocumentUIManager().UnDock(barToDock);
 | 
						|
			else if(barToDock.Parent is DockSite && barToDock.Parent!=m_Container)
 | 
						|
				((DockSite)barToDock.Parent).RemoveBar(barToDock);
 | 
						|
            else if (barToDock.Parent != null && barToDock.Parent != m_Container)
 | 
						|
            {
 | 
						|
                if (barToDock.Parent is FloatingContainer)
 | 
						|
                {
 | 
						|
                    barToDock.RemoveFromFloatingContainer();
 | 
						|
                    barToDock.SetBarState(eBarState.Docked);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    barToDock.Parent.Controls.Remove(barToDock);
 | 
						|
            }
 | 
						|
 | 
						|
			if(!m_LoadingLayout)
 | 
						|
			{
 | 
						|
				// TODO: Add Docking as Document, i.e. add DockContainerItems from barToDock...
 | 
						|
				DocumentBarContainer doc=this.CreateDocumentBarContainer(barToDock);
 | 
						|
                DocumentBaseContainer referenceDoc = this.GetDocumentFromBar(referenceBar);
 | 
						|
 | 
						|
                if (referenceBar == null || dockSide == eDockSide.None || referenceBar == barToDock || referenceDoc == null)
 | 
						|
				{
 | 
						|
                    if (m_Container.Dock == DockStyle.Fill)
 | 
						|
                        m_DocumentDockContainer.Documents.Add(doc);
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        eOrientation containerOrientation = eOrientation.Horizontal; // Needed container orientation
 | 
						|
                        if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                            containerOrientation = eOrientation.Vertical;
 | 
						|
 | 
						|
                        // Switch orientation when adding new bar if possible
 | 
						|
                        if (m_DocumentDockContainer.Orientation != containerOrientation)
 | 
						|
                        {
 | 
						|
                            if (m_DocumentDockContainer.Documents.Count <= 1)
 | 
						|
                            {
 | 
						|
                                m_DocumentDockContainer.Orientation = containerOrientation;
 | 
						|
                                if (IsAddedInFront(dockSide))
 | 
						|
                                    m_DocumentDockContainer.Documents.Insert(0, doc);
 | 
						|
                                else
 | 
						|
                                    m_DocumentDockContainer.Documents.Add(doc);
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                DocumentBaseContainer[] docs = new DocumentBaseContainer[m_DocumentDockContainer.Documents.Count];
 | 
						|
                                m_DocumentDockContainer.Documents.CopyTo(docs);
 | 
						|
                                m_DocumentDockContainer.Documents.Clear();
 | 
						|
 | 
						|
                                DocumentDockContainer newParent = new DocumentDockContainer(docs, m_DocumentDockContainer.Orientation);
 | 
						|
								newParent.SetLayoutBounds(m_DocumentDockContainer.DisplayBounds);
 | 
						|
                                m_DocumentDockContainer.Orientation = containerOrientation;
 | 
						|
                                m_DocumentDockContainer.Documents.Add(newParent);
 | 
						|
                                if (IsAddedInFront(dockSide))
 | 
						|
                                    m_DocumentDockContainer.Documents.Insert(0, doc);
 | 
						|
                                else
 | 
						|
                                    m_DocumentDockContainer.Documents.Add(doc);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                        {
 | 
						|
                            if (IsAddedInFront(dockSide))
 | 
						|
                                m_DocumentDockContainer.Documents.Insert(0, doc);
 | 
						|
                            else
 | 
						|
                                m_DocumentDockContainer.Documents.Add(doc);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					DocumentDockContainer parent=referenceDoc.Parent as DocumentDockContainer;
 | 
						|
 | 
						|
					referenceDoc.SetLayoutBounds(Rectangle.Empty);
 | 
						|
					doc.SetLayoutBounds(Rectangle.Empty);
 | 
						|
 | 
						|
					if((parent.Orientation==eOrientation.Horizontal && (dockSide==eDockSide.Left || dockSide==eDockSide.Right)) ||
 | 
						|
						(parent.Orientation==eOrientation.Vertical && (dockSide==eDockSide.Top || dockSide==eDockSide.Bottom)))
 | 
						|
					{
 | 
						|
						if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom)
 | 
						|
							parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc)+1,doc);
 | 
						|
						else
 | 
						|
							parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),doc);
 | 
						|
					}
 | 
						|
					else if(parent.Documents.Count==1)
 | 
						|
					{
 | 
						|
						// Orientation of the parent dock container can be changed
 | 
						|
						if(parent.Orientation==eOrientation.Vertical)
 | 
						|
							parent.Orientation=eOrientation.Horizontal;
 | 
						|
						else
 | 
						|
							parent.Orientation=eOrientation.Vertical;
 | 
						|
 | 
						|
						if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom)
 | 
						|
							parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc)+1,doc);
 | 
						|
						else
 | 
						|
							parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),doc);
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						// New DocumentDockContainer needs to be inserted with appropriate orientation and referenceBar needs
 | 
						|
						// to be moved into it.
 | 
						|
						DocumentDockContainer newParent=new DocumentDockContainer();
 | 
						|
						if(parent.Orientation==eOrientation.Horizontal)
 | 
						|
							newParent.Orientation=eOrientation.Vertical;
 | 
						|
						else
 | 
						|
							newParent.Orientation=eOrientation.Horizontal;
 | 
						|
 | 
						|
						parent.Documents.Insert(parent.Documents.IndexOf(referenceDoc),newParent);
 | 
						|
						parent.Documents.Remove(referenceDoc);
 | 
						|
	                    
 | 
						|
						if(dockSide==eDockSide.Right || dockSide==eDockSide.Bottom)
 | 
						|
						{
 | 
						|
							newParent.Documents.Add(referenceDoc);
 | 
						|
							newParent.Documents.Add(doc);
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							newParent.Documents.Add(doc);
 | 
						|
							newParent.Documents.Add(referenceDoc);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
                AdjustContainerSize(barToDock, false);
 | 
						|
			}
 | 
						|
 | 
						|
			if(m_Container!=null)
 | 
						|
			{
 | 
						|
				if(barToDock.Parent==null)
 | 
						|
					m_Container.Controls.Add(barToDock);
 | 
						|
                ApplyBarStyle(barToDock);	
 | 
						|
				m_Container.RecalcLayout();
 | 
						|
			}
 | 
						|
			else
 | 
						|
				ApplyBarStyle(barToDock);
 | 
						|
		}
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Adjusts the size of the dock container if needed after a bar has been docked to it.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="barToDock">Bar object that has been docked.</param>
 | 
						|
        /// <param name="visibleChanged">Indicates that bar was already docked but its Visible property has changed</param>
 | 
						|
        internal void AdjustContainerSize(Bar barToDock, bool visibleChanged)
 | 
						|
        {
 | 
						|
            if (m_Container.Owner != null && m_Container.Owner.IsLoadingLayout) return;
 | 
						|
 | 
						|
            // Adjust the size of the container since it dictates the size of the bars docked inside
 | 
						|
            if (m_Container.Dock != DockStyle.Fill)
 | 
						|
            {
 | 
						|
                DocumentBaseContainer doc = this.GetDocumentFromBar(barToDock);
 | 
						|
                if (doc == null) return;
 | 
						|
                if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                {
 | 
						|
                    if (m_Container.Width == 0 || doc.Parent == m_DocumentDockContainer &&
 | 
						|
                        (m_DocumentDockContainer.Orientation == eOrientation.Horizontal || visibleChanged && m_DocumentDockContainer.Documents.Count == 1))
 | 
						|
                    {
 | 
						|
                        int width = barToDock.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
                        if (barToDock.Width > 0 && barToDock.Width<m_Container.Width) width = barToDock.Width;
 | 
						|
                        int clientWidth = GetClientWidth();
 | 
						|
 | 
						|
                        if (barToDock.Visible)
 | 
						|
                        {
 | 
						|
                            if (width > clientWidth)
 | 
						|
                                width = barToDock.MinimumDockSize(eOrientation.Vertical).Width * 2;
 | 
						|
                            if (width > clientWidth)
 | 
						|
                                width = barToDock.MinimumDockSize(eOrientation.Vertical).Width;
 | 
						|
                        }
 | 
						|
                        
 | 
						|
						if(doc.LayoutBounds.Width == 0)
 | 
						|
							doc.SetLayoutBounds(new Rectangle(doc.LayoutBounds.X, doc.LayoutBounds.Y, width, doc.LayoutBounds.Height));
 | 
						|
                        width += Dpi.Width(m_DocumentDockContainer.SplitterSize);
 | 
						|
                        if (visibleChanged)
 | 
						|
                        {
 | 
						|
                            if(barToDock.Visible)
 | 
						|
                                m_Container.Width += width;
 | 
						|
                            else if(m_Container.Width>0)
 | 
						|
                                m_Container.Width -= Math.Min(width, m_Container.Width);
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                            m_Container.Width += width;
 | 
						|
                        m_Container.Invalidate();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                {
 | 
						|
                    if (m_Container.Height == 0 || doc.Parent == m_DocumentDockContainer &&
 | 
						|
                        (m_DocumentDockContainer.Orientation == eOrientation.Vertical || visibleChanged && m_DocumentDockContainer.Documents.Count == 1))
 | 
						|
                    {
 | 
						|
                        int height = barToDock.GetBarDockedSize(eOrientation.Horizontal);
 | 
						|
                        if (barToDock.Height > 0 && barToDock.Height<m_Container.Height) height = barToDock.Height;
 | 
						|
                        int clientHeight = GetClientHeight();
 | 
						|
 | 
						|
                        if (barToDock.Visible)
 | 
						|
                        {
 | 
						|
                            if (height > clientHeight)
 | 
						|
                                height = barToDock.MinimumDockSize(eOrientation.Horizontal).Height * 2;
 | 
						|
                            if (height > clientHeight)
 | 
						|
                                height = barToDock.MinimumDockSize(eOrientation.Horizontal).Height;
 | 
						|
                        }
 | 
						|
                        
 | 
						|
						if(doc.LayoutBounds.Height == 0)
 | 
						|
							doc.SetLayoutBounds(new Rectangle(doc.LayoutBounds.X, doc.LayoutBounds.Y, doc.LayoutBounds.Width, height));
 | 
						|
                        height += Dpi.Width(m_DocumentDockContainer.SplitterSize);
 | 
						|
                        if (visibleChanged)
 | 
						|
                        {
 | 
						|
                            if (barToDock.Visible)
 | 
						|
                                m_Container.Height += height;
 | 
						|
                            else if (m_Container.Height > 0)
 | 
						|
                                m_Container.Height -= Math.Min(height, m_Container.Height);
 | 
						|
                        }
 | 
						|
                        else
 | 
						|
                            m_Container.Height += height;
 | 
						|
                        m_Container.Invalidate();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetClientWidth()
 | 
						|
        {
 | 
						|
            if (m_Container == null)
 | 
						|
                return 0;
 | 
						|
 | 
						|
            return m_Container.GetClientWidth();
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetClientHeight()
 | 
						|
        {
 | 
						|
            if (m_Container == null)
 | 
						|
                return 0;
 | 
						|
            return m_Container.GetClientHeight();
 | 
						|
        }
 | 
						|
 | 
						|
		public void UnDock(Bar barToUnDock)
 | 
						|
		{
 | 
						|
			UnDock(barToUnDock,true);
 | 
						|
		}
 | 
						|
 | 
						|
        internal void SaveLastDockInfo(Bar bar, DocumentBarContainer doc, DockSiteInfo info)
 | 
						|
        {
 | 
						|
            if (bar.m_LastDockSiteInfo == null) return;
 | 
						|
            //bar.m_LastDockSiteInfo.LastRelativeDockToBar = null;
 | 
						|
            //bar.m_LastDockSiteInfo.LastRelativeDocumentId = -1;
 | 
						|
            // Tries to find relative dock-to-bar so un-docked bar can be returned back
 | 
						|
            if (!(doc.Parent is DocumentDockContainer)) return;
 | 
						|
            DocumentDockContainer dockParent = (DocumentDockContainer)doc.Parent;
 | 
						|
            DocumentBaseContainer nextBarDocument = GetNextDocument(dockParent, dockParent.Documents.IndexOf(doc));
 | 
						|
            if (nextBarDocument == null)
 | 
						|
            {
 | 
						|
                DocumentBaseContainer prevBarDocument = GetPreviousDocument(dockParent, dockParent.Documents.IndexOf(doc));
 | 
						|
                if (prevBarDocument != null)
 | 
						|
                {
 | 
						|
                    Bar prevBar = null;
 | 
						|
                    if (prevBarDocument is DocumentBarContainer)
 | 
						|
                    {
 | 
						|
                        prevBar = ((DocumentBarContainer)prevBarDocument).Bar;
 | 
						|
                        bar.m_LastDockSiteInfo.LastRelativeDockToBar = prevBar;
 | 
						|
                        prevBar.m_LastDockSiteInfo.LastRelativeDockToBar = bar;
 | 
						|
                        prevBar.m_LastDockSiteInfo.LastRelativeDocumentId = doc.Id;
 | 
						|
                    }
 | 
						|
                    bar.m_LastDockSiteInfo.LastRelativeDocumentId = prevBarDocument.Id;
 | 
						|
                    if (dockParent.Orientation == eOrientation.Horizontal)
 | 
						|
                    {
 | 
						|
                        bar.LastDockSide = eDockSide.Right;
 | 
						|
                        if (prevBar != null) prevBar.LastDockSide = eDockSide.Left;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        bar.LastDockSide = eDockSide.Bottom;
 | 
						|
                        if (prevBar != null) prevBar.LastDockSide = eDockSide.Top;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                Bar nextBar = null;
 | 
						|
                if (nextBarDocument is DocumentBarContainer)
 | 
						|
                {
 | 
						|
                    nextBar = ((DocumentBarContainer)nextBarDocument).Bar;
 | 
						|
                    bar.m_LastDockSiteInfo.LastRelativeDockToBar = nextBar;
 | 
						|
                    nextBar.m_LastDockSiteInfo.LastRelativeDockToBar = bar;
 | 
						|
                    nextBar.m_LastDockSiteInfo.LastRelativeDocumentId = doc.Id;
 | 
						|
                }
 | 
						|
                bar.m_LastDockSiteInfo.LastRelativeDocumentId = nextBarDocument.Id;
 | 
						|
                if (dockParent.Orientation == eOrientation.Horizontal)
 | 
						|
                {
 | 
						|
                    bar.LastDockSide = eDockSide.Left;
 | 
						|
                    if (nextBar != null) nextBar.LastDockSide = eDockSide.Right;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    bar.LastDockSide = eDockSide.Top;
 | 
						|
                    if (nextBar != null) nextBar.LastDockSide = eDockSide.Bottom;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (GetDockSide(bar) != eDockSide.None)
 | 
						|
                bar.m_LastDockSiteInfo.LastDockSiteSide = GetDockSide(bar);
 | 
						|
        }
 | 
						|
 | 
						|
        private eDockSide GetDockSide(Bar bar)
 | 
						|
        {
 | 
						|
            if (bar.Parent == null)
 | 
						|
                return eDockSide.None;
 | 
						|
            else if (bar.Parent.Dock == DockStyle.Left)
 | 
						|
                return eDockSide.Left;
 | 
						|
            else if (bar.Parent.Dock == DockStyle.Right)
 | 
						|
                return eDockSide.Right;
 | 
						|
            else if (bar.Parent.Dock == DockStyle.Top)
 | 
						|
                return eDockSide.Top;
 | 
						|
            else if (bar.Parent.Dock == DockStyle.Bottom)
 | 
						|
                return eDockSide.Bottom;
 | 
						|
            else if (bar.Parent.Dock == DockStyle.Fill)
 | 
						|
                return eDockSide.Document;
 | 
						|
            return eDockSide.None;
 | 
						|
        }
 | 
						|
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public void UnDock(Bar barToUnDock, bool removeFromContainer)
 | 
						|
		{
 | 
						|
			DocumentBarContainer doc=m_DocumentDockContainer.GetBarDocumentContainer(barToUnDock);
 | 
						|
 | 
						|
            if (barToUnDock.DockSide != eDockSide.None) barToUnDock.LastDockSide = barToUnDock.DockSide;
 | 
						|
            if (doc != null)
 | 
						|
                SaveLastDockInfo(barToUnDock, doc, barToUnDock.m_LastDockSiteInfo);
 | 
						|
            
 | 
						|
            int containerSizeReduction = 0;
 | 
						|
            // Calculate the size reduction of container if needed
 | 
						|
            if (doc != null && m_Container != null && m_Container.Dock != DockStyle.Fill)
 | 
						|
            {
 | 
						|
                if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                {
 | 
						|
                    if (doc.Parent != null && doc.Parent == m_DocumentDockContainer && m_DocumentDockContainer.Orientation == eOrientation.Horizontal)
 | 
						|
                        containerSizeReduction = barToUnDock.Width + Dpi.Width(m_DocumentDockContainer.SplitterSize);
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                {
 | 
						|
                    if (doc.Parent != null && doc.Parent == m_DocumentDockContainer && m_DocumentDockContainer.Orientation == eOrientation.Vertical)
 | 
						|
                        containerSizeReduction = barToUnDock.Height + Dpi.Width(m_DocumentDockContainer.SplitterSize);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if(doc==null)
 | 
						|
            {
 | 
						|
                if (removeFromContainer && barToUnDock.Parent == m_Container)
 | 
						|
                    m_Container.Controls.Remove(barToUnDock);
 | 
						|
				RestoreBarStyle(barToUnDock);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
			
 | 
						|
			DocumentDockContainer parent=doc.Parent as DocumentDockContainer;
 | 
						|
			if(parent!=null)
 | 
						|
			{
 | 
						|
				parent.Documents.Remove(doc);
 | 
						|
				if(parent!=m_DocumentDockContainer)
 | 
						|
					RemoveEmptyContainers(parent);
 | 
						|
				else if(parent.Documents.Count==1 && parent.Documents[0] is DocumentDockContainer)
 | 
						|
					RemoveEmptyContainers(parent.Documents[0] as DocumentDockContainer);
 | 
						|
			}
 | 
						|
 | 
						|
			if(m_Container!=null)
 | 
						|
			{
 | 
						|
				if(removeFromContainer)
 | 
						|
					m_Container.Controls.Remove(barToUnDock);
 | 
						|
				RestoreBarStyle(barToUnDock);
 | 
						|
                bool isLoadingLayout = false;
 | 
						|
                if (m_Container.Owner != null) isLoadingLayout = m_Container.Owner.IsLoadingLayout;
 | 
						|
                if (!isLoadingLayout && !m_Container.IsAnyControlVisible)
 | 
						|
                {
 | 
						|
                    if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                        m_Container.Width = 0;
 | 
						|
                    else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                        m_Container.Height = 0;
 | 
						|
                }
 | 
						|
                else if (!isLoadingLayout && containerSizeReduction != 0)
 | 
						|
                {
 | 
						|
                    if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                        m_Container.Width -= containerSizeReduction;
 | 
						|
                    else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                        m_Container.Height -= containerSizeReduction;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    m_Container.RecalcLayout();
 | 
						|
			}
 | 
						|
			else
 | 
						|
				RestoreBarStyle(barToUnDock);
 | 
						|
		}
 | 
						|
 | 
						|
		private void RemoveEmptyContainers(DocumentDockContainer parent)
 | 
						|
		{
 | 
						|
			while(parent.Documents.Count==0 && parent.Parent!=null && parent.Parent is DocumentDockContainer ||
 | 
						|
				parent.Parent!=null && parent.Parent is DocumentDockContainer && (((DocumentDockContainer)parent.Parent).Documents.Count==1 ||
 | 
						|
                   parent.Documents.Count == 1))
 | 
						|
			{
 | 
						|
				if(parent.Parent!=null && parent.Parent is DocumentDockContainer && ((DocumentDockContainer)parent.Parent).Documents.Count==1)
 | 
						|
				{
 | 
						|
					// Removes the instances where DocumentDockContainer hosts another one and only one DocumentDockContainer object
 | 
						|
					DocumentDockContainer p=parent.Parent as DocumentDockContainer;
 | 
						|
                    p.Orientation = parent.Orientation;
 | 
						|
                    p.Documents.Remove(parent);
 | 
						|
					DocumentBaseContainer[] documents=new DocumentBaseContainer[parent.Documents.Count];
 | 
						|
					parent.Documents.CopyTo(documents);
 | 
						|
					p.Documents.AddRange(documents);
 | 
						|
					parent=p;
 | 
						|
				}
 | 
						|
                else if (parent.Parent != null && parent.Parent is DocumentDockContainer && parent.Documents.Count == 1)
 | 
						|
                {
 | 
						|
                    DocumentDockContainer p = parent.Parent as DocumentDockContainer;
 | 
						|
                    int index = p.Documents.IndexOf(parent);
 | 
						|
                    p.Documents.Remove(parent);
 | 
						|
                    DocumentBaseContainer document = parent.Documents[0];
 | 
						|
                    p.Documents.Insert(index, document);
 | 
						|
                    parent = p;
 | 
						|
                }
 | 
						|
				else
 | 
						|
				{
 | 
						|
					DocumentDockContainer p=parent.Parent as DocumentDockContainer;
 | 
						|
					p.Documents.Remove(parent);
 | 
						|
					parent=p;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void ApplyBarStyle(Bar bar)
 | 
						|
		{
 | 
						|
			if(m_Container!=null && m_Container.Owner!=null && m_Container.Owner.ApplyDocumentBarStyle && m_Container.Dock == DockStyle.Fill)
 | 
						|
			{
 | 
						|
				BarFunctions.ApplyAutoDocumentBarStyle(bar);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void RestoreBarStyle(Bar bar)
 | 
						|
		{
 | 
						|
            if (m_Container != null && m_Container.Owner != null && m_Container.Owner.ApplyDocumentBarStyle && m_Container.Dock == DockStyle.Fill)
 | 
						|
			{
 | 
						|
				BarFunctions.RestoreAutoDocumentBarStyle(bar);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentBarContainer CreateDocumentBarContainer(Bar bar)
 | 
						|
		{
 | 
						|
			DocumentBarContainer doc=new DocumentBarContainer(bar);
 | 
						|
			return doc;
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentDockContainer CreateDocumentDockContainer()
 | 
						|
		{
 | 
						|
			DocumentDockContainer dock=new DocumentDockContainer();
 | 
						|
			return dock;
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Mouse Resize Handling
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether document/bar is being resized.
 | 
						|
        /// </summary>
 | 
						|
        public bool IsResizingDocument
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return (m_ResizeDocument != null);
 | 
						|
            }
 | 
						|
        }
 | 
						|
		/// <summary>
 | 
						|
		/// Processes OnMouseMove events from DockSite. This routine assumes that mouse messages are received only when mouse is actually over
 | 
						|
		/// the dock site and not containing bars. This is significant because it will receive messages only if mouse is over the splitter
 | 
						|
		/// space between bars.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="e">Mouse event arguments.</param>
 | 
						|
		public void OnMouseMove(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			int x=e.X,y=e.Y;
 | 
						|
			if(e.Button==MouseButtons.None)
 | 
						|
			{
 | 
						|
				Cursor c=this.GetCursor(x,y);
 | 
						|
				if(c==null)
 | 
						|
				{
 | 
						|
					if(m_ContainerCursor!=null)
 | 
						|
						this.Container.Cursor=m_ContainerCursor;
 | 
						|
					m_ContainerCursor=null;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					if(m_ContainerCursor==null)
 | 
						|
						m_ContainerCursor=this.Container.Cursor;
 | 
						|
					this.Container.Cursor=c;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else if(e.Button==MouseButtons.Left)
 | 
						|
			{
 | 
						|
				Point p=GetResizeToPoint(x,y);
 | 
						|
				if(p.IsEmpty)
 | 
						|
					return;
 | 
						|
 | 
						|
				if(!m_ResizePreview)
 | 
						|
					SplitterMouseMove(p.X,p.Y);
 | 
						|
				else
 | 
						|
				{
 | 
						|
					ResizeTo(p.X,p.Y);
 | 
						|
					m_MouseDownPoint=p;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public Cursor GetCursor(int x, int y)
 | 
						|
		{
 | 
						|
			Cursor c=null;
 | 
						|
			DocumentDockContainer context=this.GetContainerFromRoot(x,y);
 | 
						|
			if(context!=null)
 | 
						|
			{
 | 
						|
				if(context.Orientation==eOrientation.Horizontal)
 | 
						|
					c=Cursors.VSplit;
 | 
						|
				else if(context.Orientation==eOrientation.Vertical)
 | 
						|
					c=Cursors.HSplit;
 | 
						|
			}
 | 
						|
            else if (m_Container != null && m_Container.Dock != DockStyle.Fill)
 | 
						|
            {
 | 
						|
                if(m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                    c = Cursors.HSplit;
 | 
						|
                else if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                    c = Cursors.VSplit;
 | 
						|
            }
 | 
						|
 | 
						|
			return c;
 | 
						|
		}
 | 
						|
 | 
						|
		public void OnMouseDown(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			int x=e.X, y=e.Y;
 | 
						|
			if(e.Button==MouseButtons.Left)
 | 
						|
			{
 | 
						|
				m_MouseDownPoint=new Point(x,y);
 | 
						|
				DocumentDockContainer context=this.GetContainerFromRoot(x,y);
 | 
						|
                
 | 
						|
                if(context!=null)
 | 
						|
				{
 | 
						|
					m_ResizeDocument=this.GetClosestDocument(context,x,y);
 | 
						|
					if(m_ResizeDocument==null)
 | 
						|
						return;
 | 
						|
					m_ResizeDockContainer=context;
 | 
						|
					if(!m_ResizePreview)
 | 
						|
					{
 | 
						|
						CreateSplitter();
 | 
						|
						SplitterMouseMove(x,y);
 | 
						|
					}
 | 
						|
				}
 | 
						|
                else if (m_Container != null && m_Container.Dock != DockStyle.Fill)
 | 
						|
                {
 | 
						|
                    m_ResizeDockContainer = m_DocumentDockContainer;
 | 
						|
                    if (!m_ResizePreview)
 | 
						|
                    {
 | 
						|
                        CreateSplitter();
 | 
						|
                        SplitterMouseMove(x, y);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public void OnMouseUp(MouseEventArgs e)
 | 
						|
		{
 | 
						|
			if(m_ResizeDockContainer!=null && !m_MouseDownPoint.IsEmpty)
 | 
						|
			{
 | 
						|
				ResizeTo(e.X,e.Y);
 | 
						|
			}
 | 
						|
 | 
						|
			m_MouseDownPoint=Point.Empty;
 | 
						|
			m_ResizeDockContainer=null;
 | 
						|
			m_ResizeDocument=null;
 | 
						|
			DestroySplitter();
 | 
						|
		}
 | 
						|
 | 
						|
		public void OnMouseLeave()
 | 
						|
		{
 | 
						|
			if(m_ContainerCursor!=null)
 | 
						|
				this.Container.Cursor=m_ContainerCursor;
 | 
						|
			m_ContainerCursor=null;
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentBaseContainer GetClosestDocument(DocumentDockContainer parent, int x, int y)
 | 
						|
		{
 | 
						|
			DocumentBaseContainer ret=null;
 | 
						|
			eOrientation orientation=parent.Orientation;
 | 
						|
			foreach(DocumentBaseContainer doc in parent.Documents)
 | 
						|
			{
 | 
						|
				if(orientation==eOrientation.Horizontal && doc.DisplayBounds.X>x && doc.Visible)
 | 
						|
                    break;
 | 
						|
                else if(orientation==eOrientation.Vertical && doc.DisplayBounds.Y>y && doc.Visible)
 | 
						|
					break;
 | 
						|
                if(doc.Visible)
 | 
						|
				    ret=doc;
 | 
						|
			}
 | 
						|
			return ret;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Returns reference to the DocumentDockContainer that contains specified coordinates. Searches through the Documents collection first.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="x">X coordinate</param>
 | 
						|
		/// <param name="y">Y coordinate</param>
 | 
						|
		/// <returns></returns>
 | 
						|
		private DocumentDockContainer GetContainerFromRoot(int x, int y)
 | 
						|
		{
 | 
						|
			return GetContainer(m_DocumentDockContainer,x,y);
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentDockContainer GetContainer(DocumentDockContainer parent, int x, int y)
 | 
						|
		{
 | 
						|
			if(parent==null || !parent.DisplayBounds.Contains(x,y) || !parent.Visible)
 | 
						|
				return null;
 | 
						|
			DocumentDockContainer ret=null;
 | 
						|
			foreach(DocumentBaseContainer doc in parent.Documents)
 | 
						|
			{
 | 
						|
				if(doc is DocumentDockContainer)
 | 
						|
				{
 | 
						|
					ret=this.GetContainer((DocumentDockContainer)doc,x,y);
 | 
						|
					if(ret!=null)
 | 
						|
						break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
            if (ret == null)
 | 
						|
                ret = parent;
 | 
						|
			return ret;
 | 
						|
		}
 | 
						|
		
 | 
						|
		private void CreateSplitter()
 | 
						|
		{
 | 
						|
            if (m_ResizeDockContainer == null)
 | 
						|
				return;
 | 
						|
 | 
						|
			if(m_Splitter==null)
 | 
						|
				m_Splitter=BarFunctions.CreateOutlineForm();
 | 
						|
		}
 | 
						|
 | 
						|
		private void SplitterMouseMove(int x, int y)
 | 
						|
		{
 | 
						|
			if(m_Splitter==null || m_ResizeDockContainer==null)
 | 
						|
				return;
 | 
						|
			
 | 
						|
            Rectangle splitterBounds=Rectangle.Empty;
 | 
						|
 | 
						|
			// Set splitter size
 | 
						|
		    int splitterWidth = Dpi.Width(m_SplitterWidth);
 | 
						|
		    if (m_ResizeDockContainer.Orientation == eOrientation.Horizontal && m_ResizeDocument != null || 
 | 
						|
                m_ResizeDocument == null && (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right))
 | 
						|
			{
 | 
						|
				Point p=m_Container.PointToScreen(new Point(x-splitterWidth/2,m_ResizeDockContainer.DisplayBounds.Y));
 | 
						|
				splitterBounds.X=p.X;
 | 
						|
				splitterBounds.Y=p.Y;
 | 
						|
				splitterBounds.Height=m_ResizeDockContainer.DisplayBounds.Height;
 | 
						|
				splitterBounds.Width=splitterWidth;
 | 
						|
			}
 | 
						|
            else if (m_ResizeDockContainer.Orientation == eOrientation.Vertical && m_ResizeDocument != null || 
 | 
						|
                m_ResizeDocument == null && (m_Container.Dock == DockStyle.Bottom || m_Container.Dock == DockStyle.Top))
 | 
						|
			{
 | 
						|
				Point p=m_Container.PointToScreen(new Point(m_ResizeDockContainer.DisplayBounds.X,y-splitterWidth/2));
 | 
						|
				splitterBounds.X=p.X;
 | 
						|
				splitterBounds.Y=p.Y;
 | 
						|
				splitterBounds.Width=m_ResizeDockContainer.DisplayBounds.Width;
 | 
						|
				splitterBounds.Height=splitterWidth;
 | 
						|
			}
 | 
						|
 | 
						|
			NativeFunctions.SetWindowPos(m_Splitter.Handle,new IntPtr(NativeFunctions.HWND_TOP),splitterBounds.X,splitterBounds.Y,splitterBounds.Width,splitterBounds.Height,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
 | 
						|
		}
 | 
						|
 | 
						|
		private void DestroySplitter()
 | 
						|
		{
 | 
						|
			if(m_Splitter!=null)
 | 
						|
			{
 | 
						|
				m_Splitter.Visible=false;
 | 
						|
				m_Splitter.Dispose();
 | 
						|
				m_Splitter=null;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        internal Size GetContainerMinimumSize(DocumentDockContainer dockContainer)
 | 
						|
        {
 | 
						|
            Size minimumSize = Size.Empty;
 | 
						|
 | 
						|
            foreach (DocumentBaseContainer d in dockContainer.Documents)
 | 
						|
            {
 | 
						|
                Size dm = Size.Empty;
 | 
						|
 | 
						|
                if (d is DocumentBarContainer)
 | 
						|
                {
 | 
						|
                    if (!((DocumentBarContainer)d).Visible) continue;
 | 
						|
                    dm = d.MinimumSize;
 | 
						|
                }
 | 
						|
                else if (d is DocumentDockContainer)
 | 
						|
                {
 | 
						|
                    dm = GetContainerMinimumSize(d as DocumentDockContainer);
 | 
						|
                }
 | 
						|
 | 
						|
                if (dockContainer.Orientation == eOrientation.Horizontal)
 | 
						|
                {
 | 
						|
                    minimumSize.Width += dm.Width + Dpi.Width(dockContainer.SplitterSize);
 | 
						|
                    if (dm.Height < minimumSize.Height || minimumSize.Height == 0)
 | 
						|
                        minimumSize.Height = dm.Height;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    minimumSize.Height += dm.Height + Dpi.Width(dockContainer.SplitterSize);
 | 
						|
                    if (dm.Width < minimumSize.Width || minimumSize.Width == 0)
 | 
						|
                        minimumSize.Width = dm.Width;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (minimumSize.Width > 0 && dockContainer.Orientation == eOrientation.Horizontal)
 | 
						|
                minimumSize.Width += Dpi.Width(dockContainer.SplitterSize);
 | 
						|
            else if (minimumSize.Height > 0 && dockContainer.Orientation == eOrientation.Vertical)
 | 
						|
                minimumSize.Height += Dpi.Width(dockContainer.SplitterSize);
 | 
						|
 | 
						|
            if (minimumSize.Width == 0)
 | 
						|
                minimumSize.Width = 32;
 | 
						|
            if (minimumSize.Height == 0)
 | 
						|
                minimumSize.Height = 32;
 | 
						|
 | 
						|
            return minimumSize;
 | 
						|
        }
 | 
						|
 | 
						|
		private Point GetResizeToPoint(int x, int y)
 | 
						|
		{
 | 
						|
			if(m_ResizeDockContainer==null)
 | 
						|
				return Point.Empty;
 | 
						|
 | 
						|
			Point resizeTo=new Point(x,y);
 | 
						|
 | 
						|
			int xDiff=x-m_MouseDownPoint.X;
 | 
						|
			int yDiff=y-m_MouseDownPoint.Y;
 | 
						|
 | 
						|
            if (m_ResizeDocument == null)
 | 
						|
            {
 | 
						|
                // Resizing the dock site
 | 
						|
                if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                {
 | 
						|
                    if (m_Container.Dock == DockStyle.Right) xDiff *= -1;
 | 
						|
 | 
						|
                    Size minimumSize = GetContainerMinimumSize(m_ResizeDockContainer);
 | 
						|
                    if (m_ResizeDockContainer.DisplayBounds.Width + xDiff < minimumSize.Width)
 | 
						|
                        resizeTo.X -= ((m_ResizeDockContainer.DisplayBounds.Width + xDiff) - minimumSize.Width) * ((m_Container.Dock == DockStyle.Right ? -1 : 1));
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        int clientWidth = GetClientWidth();
 | 
						|
                        int minClientWidth = 32;
 | 
						|
                        if (m_Container.Owner != null)
 | 
						|
                            minClientWidth = m_Container.Owner.MinimumClientSize.Width;
 | 
						|
 | 
						|
                        if (clientWidth - xDiff < minClientWidth)
 | 
						|
                            resizeTo.X -= (minClientWidth - (clientWidth - xDiff)) * ((m_Container.Dock == DockStyle.Right ? -1 : 1));
 | 
						|
                    }
 | 
						|
 | 
						|
                    return resizeTo;
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                {
 | 
						|
                    if (m_Container.Dock == DockStyle.Bottom) yDiff *= -1;
 | 
						|
 | 
						|
                    Size minimumSize = GetContainerMinimumSize(m_ResizeDockContainer);
 | 
						|
                    if (m_ResizeDockContainer.DisplayBounds.Height + yDiff < minimumSize.Height)
 | 
						|
                        resizeTo.Y -= ((m_ResizeDockContainer.DisplayBounds.Height + yDiff) - minimumSize.Height) * ((m_Container.Dock == DockStyle.Bottom ? -1 : 1));
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        int clientHeight = GetClientHeight();
 | 
						|
                        int minClientHeight = 32;
 | 
						|
                        if (m_Container.Owner != null)
 | 
						|
                            minClientHeight = m_Container.Owner.MinimumClientSize.Height;
 | 
						|
                        
 | 
						|
                        if (clientHeight - yDiff < minClientHeight)
 | 
						|
                            resizeTo.Y -= (minClientHeight - (clientHeight - yDiff)) * ((m_Container.Dock == DockStyle.Bottom ? -1 : 1));
 | 
						|
                    }
 | 
						|
 | 
						|
                    return resizeTo;
 | 
						|
                }
 | 
						|
 | 
						|
                return Point.Empty;
 | 
						|
            }
 | 
						|
			else if(m_ResizeDockContainer.Orientation==eOrientation.Horizontal)
 | 
						|
			{
 | 
						|
				if(m_ResizeDocument.DisplayBounds.Width+xDiff>=m_ResizeDocument.MinimumSize.Width)
 | 
						|
				{
 | 
						|
					// Verify document next to it
 | 
						|
					DocumentBaseContainer nextDoc=GetNextDocument(m_ResizeDockContainer,m_ResizeDockContainer.Documents.IndexOf(m_ResizeDocument));
 | 
						|
					if(nextDoc!=null)
 | 
						|
					{
 | 
						|
						if(nextDoc.DisplayBounds.Width-xDiff<nextDoc.MinimumSize.Width)
 | 
						|
							resizeTo.X+=(nextDoc.DisplayBounds.Width-xDiff-nextDoc.MinimumSize.Width);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else
 | 
						|
					resizeTo.X-=(m_ResizeDocument.DisplayBounds.Width+xDiff-m_ResizeDocument.MinimumSize.Width);
 | 
						|
			}
 | 
						|
			else if(m_ResizeDockContainer.Orientation==eOrientation.Vertical)
 | 
						|
			{
 | 
						|
				if(m_ResizeDocument.DisplayBounds.Height+yDiff>=m_ResizeDocument.MinimumSize.Height)
 | 
						|
				{
 | 
						|
					DocumentBaseContainer nextDoc=GetNextDocument(m_ResizeDockContainer,m_ResizeDockContainer.Documents.IndexOf(m_ResizeDocument));
 | 
						|
					if(nextDoc!=null)
 | 
						|
					{
 | 
						|
						if(nextDoc.DisplayBounds.Height-yDiff<nextDoc.MinimumSize.Height)
 | 
						|
							resizeTo.Y+=(nextDoc.DisplayBounds.Height-yDiff-nextDoc.MinimumSize.Height);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else
 | 
						|
					resizeTo.Y-=(m_ResizeDocument.DisplayBounds.Height+yDiff-m_ResizeDocument.MinimumSize.Height);
 | 
						|
			}
 | 
						|
 | 
						|
			return resizeTo;
 | 
						|
		}
 | 
						|
 | 
						|
		private void ResetLayoutBounds(DocumentDockContainer doc)
 | 
						|
		{
 | 
						|
			foreach(DocumentBaseContainer d in doc.Documents)
 | 
						|
				d.SetLayoutBounds(Rectangle.Empty);
 | 
						|
		}
 | 
						|
 | 
						|
		private void ResizeTo(int x, int y)
 | 
						|
		{
 | 
						|
			if(m_ResizeDockContainer==null)
 | 
						|
				return;
 | 
						|
 | 
						|
			Point resizeTo=GetResizeToPoint(x,y);
 | 
						|
			
 | 
						|
            int xDiff=resizeTo.X-m_MouseDownPoint.X;
 | 
						|
			int yDiff=resizeTo.Y-m_MouseDownPoint.Y;
 | 
						|
 | 
						|
            if (m_ResizeDocument == null)
 | 
						|
            {
 | 
						|
                m_Container.SuspendLayout();
 | 
						|
                if (m_Container.Dock == DockStyle.Left && xDiff!=0)
 | 
						|
                {
 | 
						|
                    if (m_DocumentDockContainer.Documents.Count > 0)
 | 
						|
                    {
 | 
						|
                        DocumentBaseContainer lastDoc = m_DocumentDockContainer.Documents[m_DocumentDockContainer.Documents.Count - 1];
 | 
						|
                        int docWidth = lastDoc.DisplayBounds.Width + xDiff;
 | 
						|
                        if (docWidth > lastDoc.MinimumSize.Width)
 | 
						|
                            lastDoc.SetLayoutBounds(new Rectangle(lastDoc.DisplayBounds.X, lastDoc.DisplayBounds.Y, docWidth, lastDoc.DisplayBounds.Height));
 | 
						|
						else
 | 
						|
							ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                    }
 | 
						|
 | 
						|
                    m_Container.Width = m_Container.Width + xDiff;
 | 
						|
					if(m_Container.Width <= this.GetContainerMinimumSize(m_DocumentDockContainer).Width)
 | 
						|
						ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Right && xDiff != 0)
 | 
						|
                {
 | 
						|
                    if (m_DocumentDockContainer.Documents.Count > 0)
 | 
						|
                    {
 | 
						|
                        DocumentBaseContainer lastDoc = m_DocumentDockContainer.Documents[0];
 | 
						|
                        int docWidth = lastDoc.DisplayBounds.Width - xDiff;
 | 
						|
                        if (docWidth > lastDoc.MinimumSize.Width)
 | 
						|
                            lastDoc.SetLayoutBounds(new Rectangle(lastDoc.DisplayBounds.X, lastDoc.DisplayBounds.Y, docWidth, lastDoc.DisplayBounds.Height));
 | 
						|
                        else
 | 
						|
                            ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                    }
 | 
						|
 | 
						|
                    m_Container.Width = m_Container.Width - xDiff;
 | 
						|
					if(m_Container.Width <= this.GetContainerMinimumSize(m_DocumentDockContainer).Width)
 | 
						|
						ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Top && yDiff != 0)
 | 
						|
                {
 | 
						|
                    if (m_DocumentDockContainer.Documents.Count > 0)
 | 
						|
                    {
 | 
						|
                        DocumentBaseContainer lastDoc = m_DocumentDockContainer.Documents[m_DocumentDockContainer.Documents.Count - 1];
 | 
						|
                        int docHeight = lastDoc.DisplayBounds.Height + yDiff;
 | 
						|
                        if (docHeight > lastDoc.MinimumSize.Height)
 | 
						|
                            lastDoc.SetLayoutBounds(new Rectangle(lastDoc.DisplayBounds.X, lastDoc.DisplayBounds.Y, lastDoc.DisplayBounds.Width, docHeight));
 | 
						|
                        else
 | 
						|
                            ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                    }
 | 
						|
 | 
						|
                    m_Container.Height = m_Container.Height + yDiff;
 | 
						|
					if(m_Container.Height <= this.GetContainerMinimumSize(m_DocumentDockContainer).Height)
 | 
						|
						ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                }
 | 
						|
                else if (m_Container.Dock == DockStyle.Bottom && yDiff != 0)
 | 
						|
                {
 | 
						|
                    if (m_DocumentDockContainer.Documents.Count > 0)
 | 
						|
                    {
 | 
						|
                        DocumentBaseContainer lastDoc = m_DocumentDockContainer.Documents[0];
 | 
						|
                        int docHeight = lastDoc.DisplayBounds.Height - yDiff;
 | 
						|
                        if (docHeight > lastDoc.MinimumSize.Height)
 | 
						|
                            lastDoc.SetLayoutBounds(new Rectangle(lastDoc.DisplayBounds.X, lastDoc.DisplayBounds.Y, lastDoc.DisplayBounds.Width, docHeight));
 | 
						|
                        else
 | 
						|
                            ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                    }
 | 
						|
 | 
						|
                    m_Container.Height = m_Container.Height - yDiff;
 | 
						|
					if(m_Container.Height <= this.GetContainerMinimumSize(m_DocumentDockContainer).Height)
 | 
						|
						ResetLayoutBounds(m_DocumentDockContainer);
 | 
						|
                }
 | 
						|
                m_Container.ResumeLayout();
 | 
						|
            }
 | 
						|
			else if(m_ResizeDockContainer.Orientation==eOrientation.Horizontal && xDiff!=0)
 | 
						|
			{
 | 
						|
				m_ResizeDocument.SetWidth(m_ResizeDocument.DisplayBounds.Width+xDiff);
 | 
						|
			}
 | 
						|
            else if (m_ResizeDockContainer.Orientation == eOrientation.Vertical && yDiff != 0)
 | 
						|
			{
 | 
						|
				m_ResizeDocument.SetHeight(m_ResizeDocument.DisplayBounds.Height+yDiff);
 | 
						|
			}
 | 
						|
 | 
						|
			m_Container.RecalcLayout();
 | 
						|
 | 
						|
            if (m_Container.Owner != null)
 | 
						|
                ((IOwner)m_Container.Owner).InvokeUserCustomize(m_ResizeDocument, EventArgs.Empty);
 | 
						|
		}
 | 
						|
 | 
						|
		private DocumentBaseContainer GetNextDocument(DocumentDockContainer parent, int refIndex)
 | 
						|
		{
 | 
						|
			int count=parent.Documents.Count;
 | 
						|
			for(int i=refIndex+1;i<count;i++)
 | 
						|
			{
 | 
						|
				if(parent.Documents[i].Visible)
 | 
						|
					return parent.Documents[i];
 | 
						|
			}
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
        private DocumentBaseContainer GetPreviousDocument(DocumentDockContainer parent, int refIndex)
 | 
						|
        {
 | 
						|
            int count = parent.Documents.Count;
 | 
						|
            for (int i = refIndex - 1; i >= 0; i--)
 | 
						|
            {
 | 
						|
                if (parent.Documents[i].Visible)
 | 
						|
                    return parent.Documents[i];
 | 
						|
            }
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Sets the width of the bar that is managed by this document layout. Width can be set only if parent container has
 | 
						|
		/// Horizontal orientation. Note that bar minimum size is respected by this method and
 | 
						|
		/// it will be enforced. If width is less than minimum width bar's width will be set to minimum width.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="bar">Reference to bar object.</param>
 | 
						|
		/// <param name="width">Desired width.</param>
 | 
						|
		public void SetBarWidth(Bar bar, int width)
 | 
						|
		{
 | 
						|
			DocumentBarContainer docBar=GetDocumentFromBar(bar) as DocumentBarContainer;
 | 
						|
			if(docBar==null)
 | 
						|
				return;
 | 
						|
			if(docBar.Parent == m_DocumentDockContainer && (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
				/*&& (m_DocumentDockContainer.Orientation == eOrientation.Vertical || m_DocumentDockContainer.Documents.Count == 1)*/)
 | 
						|
			{
 | 
						|
				m_Container.SuspendLayout();
 | 
						|
				int diff = width;
 | 
						|
				if(docBar.DisplayBounds.Width == 0)
 | 
						|
					diff -= bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
				else
 | 
						|
					diff -= docBar.DisplayBounds.Width;
 | 
						|
                if (diff != 0)
 | 
						|
                {
 | 
						|
                    m_Container.Width += diff;
 | 
						|
                    docBar.SetWidth(width);
 | 
						|
                }
 | 
						|
				//((DocumentDockContainer)docBar.Parent).SetWidth(width);
 | 
						|
				m_Container.ResumeLayout(true);
 | 
						|
			}
 | 
						|
            else if (docBar.Parent is DocumentDockContainer && ((DocumentDockContainer)docBar.Parent).Orientation == eOrientation.Vertical)
 | 
						|
            {
 | 
						|
                ((DocumentDockContainer)docBar.Parent).SetWidth(width);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (width < docBar.MinimumSize.Width)
 | 
						|
                    width = docBar.MinimumSize.Width;
 | 
						|
                docBar.SetWidth(width);
 | 
						|
            }
 | 
						|
			m_Container.RecalcLayout();
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Sets the height of the bar that is managed by this document layout. Height can be set only if parent container has
 | 
						|
		/// vertical orientation. Note that bar minimum size is respected by this method and
 | 
						|
		/// it will be enforced. If height is less than minimum height bar's height will be set to minimum height.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="bar">Reference to bar object.</param>
 | 
						|
		/// <param name="height">Desired height.</param>
 | 
						|
		public void SetBarHeight(Bar bar, int height)
 | 
						|
		{
 | 
						|
			DocumentBarContainer docBar=GetDocumentFromBar(bar) as DocumentBarContainer;
 | 
						|
			if(docBar==null)
 | 
						|
				return;
 | 
						|
 | 
						|
            if (m_Container!=null && (m_Container.Dock == DockStyle.Top || m_Container.Dock== DockStyle.Bottom) && 
 | 
						|
                docBar.Parent == m_DocumentDockContainer
 | 
						|
                /*&& (m_DocumentDockContainer.Orientation == eOrientation.Horizontal || m_DocumentDockContainer.Documents.Count == 1)*/)
 | 
						|
            {
 | 
						|
                //m_Container.Height += (height - bar.Height);
 | 
						|
                //m_DocumentDockContainer.SetHeight(height);
 | 
						|
                m_Container.SuspendLayout();
 | 
						|
                int diff = height;
 | 
						|
                if (docBar.DisplayBounds.Height == 0)
 | 
						|
                    diff -= bar.GetBarDockedSize(eOrientation.Vertical);
 | 
						|
                else
 | 
						|
                    diff -= docBar.DisplayBounds.Height;
 | 
						|
                m_Container.Height += diff;
 | 
						|
                //((DocumentDockContainer)docBar.Parent).SetHeight(height);
 | 
						|
                docBar.SetHeight(height);
 | 
						|
                m_Container.ResumeLayout(true);
 | 
						|
            }
 | 
						|
            else if (docBar.Parent is DocumentDockContainer && ((DocumentDockContainer)docBar.Parent).Orientation == eOrientation.Horizontal)
 | 
						|
            {
 | 
						|
                ((DocumentDockContainer)docBar.Parent).SetHeight(height);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (height < docBar.MinimumSize.Height)
 | 
						|
                    height = docBar.MinimumSize.Height;
 | 
						|
                docBar.SetHeight(height);
 | 
						|
            }
 | 
						|
			m_Container.RecalcLayout();
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Serialization
 | 
						|
		internal void SerializeDefinition(XmlElement parent)
 | 
						|
		{
 | 
						|
            XmlElement docs = null;
 | 
						|
            if (m_Container.Dock == DockStyle.Fill)
 | 
						|
                docs = parent.OwnerDocument.CreateElement(DocumentSerializationXml.Documents);
 | 
						|
            else
 | 
						|
            {
 | 
						|
                docs = parent.OwnerDocument.CreateElement(DocumentSerializationXml.DockSite);
 | 
						|
                docs.SetAttribute(DocumentSerializationXml.DockSiteSize, XmlConvert.ToString((m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right) ? m_Container.Width : m_Container.Height));
 | 
						|
                docs.SetAttribute(DocumentSerializationXml.DockingSide, Enum.GetName(typeof(DockStyle), m_Container.Dock));
 | 
						|
            }
 | 
						|
 | 
						|
			parent.AppendChild(docs);
 | 
						|
 | 
						|
			SerializeDocumentDockContainer(docs,m_DocumentDockContainer, true);
 | 
						|
		}
 | 
						|
 | 
						|
		internal void SerializeLayout(XmlElement parent)
 | 
						|
		{
 | 
						|
            XmlElement docs = null;
 | 
						|
            if (m_Container.Dock == DockStyle.Fill)
 | 
						|
                docs = parent.OwnerDocument.CreateElement(DocumentSerializationXml.Documents);
 | 
						|
            else
 | 
						|
            {
 | 
						|
                docs = parent.OwnerDocument.CreateElement(DocumentSerializationXml.DockSite);
 | 
						|
                docs.SetAttribute(DocumentSerializationXml.DockSiteSize, XmlConvert.ToString((m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right) ? m_Container.Width : m_Container.Height));
 | 
						|
                docs.SetAttribute(DocumentSerializationXml.DockingSide, Enum.GetName(typeof(DockStyle), m_Container.Dock));
 | 
						|
                docs.SetAttribute(DocumentSerializationXml.OriginalDockSiteSize, XmlConvert.ToString(m_Container.OriginalSize));
 | 
						|
            }
 | 
						|
 | 
						|
			parent.AppendChild(docs);
 | 
						|
 | 
						|
			SerializeDocumentDockContainer(docs,m_DocumentDockContainer,false);
 | 
						|
		}
 | 
						|
 | 
						|
        private bool SerializeDocument(DocumentDockContainer instance)
 | 
						|
        {
 | 
						|
            if (instance.Documents.Count == 0) return false;
 | 
						|
            foreach (DocumentBaseContainer doc in instance.Documents)
 | 
						|
            {
 | 
						|
                DocumentBarContainer bar = doc as DocumentBarContainer;
 | 
						|
                if (bar != null)
 | 
						|
                {
 | 
						|
                    if (bar.Bar != null && bar.Bar.SaveLayoutChanges) return true;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    return true;
 | 
						|
            }
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
		private void SerializeDocumentDockContainer(XmlElement parent, DocumentDockContainer instance, bool definitionSerialization)
 | 
						|
		{
 | 
						|
            if (!SerializeDocument(instance))
 | 
						|
				return;
 | 
						|
            XmlElement document = null;
 | 
						|
			
 | 
						|
            document=parent.OwnerDocument.CreateElement(DocumentSerializationXml.DockContainer);
 | 
						|
			parent.AppendChild(document);
 | 
						|
			document.SetAttribute(DocumentSerializationXml.Orientation,XmlConvert.ToString((int)instance.Orientation));
 | 
						|
            document.SetAttribute(DocumentSerializationXml.Width, instance.LayoutBounds.Width.ToString());
 | 
						|
            document.SetAttribute(DocumentSerializationXml.Height, instance.LayoutBounds.Height.ToString());
 | 
						|
 | 
						|
			foreach(DocumentBaseContainer doc in instance.Documents)
 | 
						|
			{
 | 
						|
				if(doc is DocumentDockContainer)
 | 
						|
                    SerializeDocumentDockContainer(document,(DocumentDockContainer)doc,definitionSerialization);
 | 
						|
				else if(doc is DocumentBarContainer)
 | 
						|
					SerializeDocumentBarContainer(document,(DocumentBarContainer)doc,definitionSerialization);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void SerializeDocumentBarContainer(XmlElement parent, DocumentBarContainer instance, bool definitionSerialization)
 | 
						|
		{
 | 
						|
			if(instance.Bar==null || !instance.Bar.SaveLayoutChanges)
 | 
						|
				return;
 | 
						|
            
 | 
						|
			XmlElement barDocument=parent.OwnerDocument.CreateElement(DocumentSerializationXml.BarContainer);
 | 
						|
			parent.AppendChild(barDocument);
 | 
						|
			
 | 
						|
			barDocument.SetAttribute(DocumentSerializationXml.Width,instance.LayoutBounds.Width.ToString());
 | 
						|
			barDocument.SetAttribute(DocumentSerializationXml.Height,instance.LayoutBounds.Height.ToString());
 | 
						|
			
 | 
						|
			XmlElement barElement=parent.OwnerDocument.CreateElement(BarSerializationXml.Bar);
 | 
						|
			barDocument.AppendChild(barElement);
 | 
						|
			
 | 
						|
			if(definitionSerialization)
 | 
						|
				instance.Bar.Serialize(barElement);
 | 
						|
			else
 | 
						|
				instance.Bar.SerializeLayout(barElement);
 | 
						|
		}
 | 
						|
 | 
						|
		internal void DeserializeLayout(XmlElement parent)
 | 
						|
		{
 | 
						|
            if (parent.Name != DocumentSerializationXml.Documents && parent.Name != DocumentSerializationXml.DockSite || m_LoadingLayout)
 | 
						|
				return;
 | 
						|
 | 
						|
			m_LoadingLayout=true;
 | 
						|
            ItemSerializationContext context = new ItemSerializationContext();
 | 
						|
			try
 | 
						|
			{
 | 
						|
				foreach(XmlElement elem in parent.ChildNodes)
 | 
						|
				{
 | 
						|
					if(elem.Name==DocumentSerializationXml.DockContainer)
 | 
						|
					{
 | 
						|
                        context.ItemXmlElement = elem;
 | 
						|
						DeserializeDocumentDockContainer(context,m_DocumentDockContainer,false);
 | 
						|
						break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			finally
 | 
						|
			{
 | 
						|
				m_LoadingLayout=false;
 | 
						|
			}
 | 
						|
            if (parent.Name == DocumentSerializationXml.DockSite)
 | 
						|
            {
 | 
						|
                if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                    m_Container.Width = XmlConvert.ToInt32(parent.GetAttribute(DocumentSerializationXml.DockSiteSize));
 | 
						|
                else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                    m_Container.Height = XmlConvert.ToInt32(parent.GetAttribute(DocumentSerializationXml.DockSiteSize));
 | 
						|
 | 
						|
                if (parent.HasAttribute(DocumentSerializationXml.OriginalDockSiteSize))
 | 
						|
                    m_Container.OriginalSize = XmlConvert.ToInt32(parent.GetAttribute(DocumentSerializationXml.OriginalDockSiteSize));
 | 
						|
            }
 | 
						|
 | 
						|
			m_Container.RecalcLayout();
 | 
						|
		}
 | 
						|
 | 
						|
		internal void DeserializeDefinition(ItemSerializationContext context)
 | 
						|
		{
 | 
						|
            XmlElement parent = context.ItemXmlElement;
 | 
						|
            if ((parent.Name != DocumentSerializationXml.Documents && parent.Name != DocumentSerializationXml.DockSite) || m_LoadingLayout)
 | 
						|
				return;
 | 
						|
 | 
						|
			m_LoadingLayout=true;
 | 
						|
			try
 | 
						|
			{
 | 
						|
				foreach(XmlElement elem in parent.ChildNodes)
 | 
						|
				{
 | 
						|
					if(elem.Name==DocumentSerializationXml.DockContainer)
 | 
						|
					{
 | 
						|
                        context.ItemXmlElement = elem;
 | 
						|
						DeserializeDocumentDockContainer(context,m_DocumentDockContainer,true);
 | 
						|
						break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
                if (parent.HasAttribute(DocumentSerializationXml.DockSiteSize))
 | 
						|
                {
 | 
						|
                    if (m_Container.Dock == DockStyle.Left || m_Container.Dock == DockStyle.Right)
 | 
						|
                        m_Container.Width = XmlConvert.ToInt32(parent.GetAttribute(DocumentSerializationXml.DockSiteSize));
 | 
						|
                    else if (m_Container.Dock == DockStyle.Top || m_Container.Dock == DockStyle.Bottom)
 | 
						|
                        m_Container.Height = XmlConvert.ToInt32(parent.GetAttribute(DocumentSerializationXml.DockSiteSize));
 | 
						|
                }
 | 
						|
			}
 | 
						|
			finally
 | 
						|
			{
 | 
						|
				m_LoadingLayout=false;
 | 
						|
			}
 | 
						|
			m_Container.RecalcLayout();
 | 
						|
		}
 | 
						|
 | 
						|
		private void DeserializeDocumentDockContainer(ItemSerializationContext context, DocumentDockContainer instance, bool deserializeDefinition)
 | 
						|
		{
 | 
						|
            XmlElement docElement = context.ItemXmlElement;
 | 
						|
			if(docElement.Name!=DocumentSerializationXml.DockContainer)
 | 
						|
				return;
 | 
						|
 | 
						|
			instance.Documents.Clear();
 | 
						|
			instance.Orientation=(eOrientation)XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Orientation));
 | 
						|
            if (docElement.HasAttribute(DocumentSerializationXml.Width) && docElement.HasAttribute(DocumentSerializationXml.Height))
 | 
						|
            {
 | 
						|
                instance.SetLayoutBounds(new Rectangle(0,0,
 | 
						|
                    XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Width)),
 | 
						|
                    XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Height))));
 | 
						|
            }
 | 
						|
 | 
						|
			foreach(XmlElement elem in docElement.ChildNodes)
 | 
						|
			{
 | 
						|
				bool add=true;
 | 
						|
				DocumentBaseContainer doc=DocumentSerializationXml.CreateDocument(elem.Name);
 | 
						|
                context.ItemXmlElement = elem;
 | 
						|
				if(doc is DocumentDockContainer)
 | 
						|
					DeserializeDocumentDockContainer(context,(DocumentDockContainer)doc,deserializeDefinition);
 | 
						|
				else if(doc is DocumentBarContainer)
 | 
						|
                    add=DeserializeDocumentBarContainer(context,(DocumentBarContainer)doc,deserializeDefinition);
 | 
						|
				if(add)
 | 
						|
					instance.Documents.Add(doc);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private bool DeserializeDocumentBarContainer(ItemSerializationContext context, DocumentBarContainer instance, bool deserializeDefinition)
 | 
						|
		{
 | 
						|
            XmlElement docElement = context.ItemXmlElement;
 | 
						|
			if(docElement.Name!=DocumentSerializationXml.BarContainer)
 | 
						|
				return false;
 | 
						|
			
 | 
						|
			instance.SetLayoutBounds(new Rectangle(0,0,XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Width)),XmlConvert.ToInt32(docElement.GetAttribute(DocumentSerializationXml.Height))));
 | 
						|
			
 | 
						|
			foreach(XmlElement elem in docElement.ChildNodes)
 | 
						|
			{
 | 
						|
				if(elem.Name==BarSerializationXml.Bar)
 | 
						|
				{
 | 
						|
					instance.Bar=m_Container.Owner.Bars[elem.GetAttribute(BarSerializationXml.Name)];
 | 
						|
					if(deserializeDefinition || instance.Bar==null && elem.HasAttribute(BarSerializationXml.Custom) && XmlConvert.ToBoolean(elem.GetAttribute(BarSerializationXml.Custom)))
 | 
						|
					{
 | 
						|
						// New bar that user has created try to deserialize but if it does not have items ignore it
 | 
						|
						instance.Bar=new Bar();
 | 
						|
						m_Container.Owner.Bars.Add(instance.Bar);
 | 
						|
						if(deserializeDefinition)
 | 
						|
							instance.Bar.Deserialize(elem, context);
 | 
						|
						else
 | 
						|
							instance.Bar.DeserializeLayout(elem);
 | 
						|
						if(instance.Bar.Items.Count==0 && !deserializeDefinition)
 | 
						|
						{
 | 
						|
							m_Container.Owner.Bars.Remove(instance.Bar);
 | 
						|
							return false;
 | 
						|
						}
 | 
						|
						return true;
 | 
						|
					}
 | 
						|
 | 
						|
                    if (instance.Bar != null)
 | 
						|
                    {
 | 
						|
                        instance.Bar.DeserializeLayout(elem);
 | 
						|
                        // Restore hidden dock container size so it can be used when bar is shown
 | 
						|
                        if (!instance.Bar.IsVisible)
 | 
						|
                        {
 | 
						|
                            if (instance.LayoutBounds.Height > 0 && (instance.Bar.DockSide == eDockSide.Top || instance.Bar.DockSide == eDockSide.Bottom))
 | 
						|
                            {
 | 
						|
                                instance.Bar.Height = instance.LayoutBounds.Height;
 | 
						|
                            }
 | 
						|
                            else if (instance.LayoutBounds.Width > 0 && (instance.Bar.DockSide == eDockSide.Left || instance.Bar.DockSide == eDockSide.Right))
 | 
						|
                            {
 | 
						|
                                instance.Bar.Width = instance.LayoutBounds.Width;
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                        return false;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		
 | 
						|
		#endregion
 | 
						|
	}
 | 
						|
}
 |