104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Collections;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Provides fill layout for the dock site.
 | 
						|
	/// </summary>
 | 
						|
	public class DockSiteDocumentLayout
 | 
						|
	{
 | 
						|
		private int m_BarSpacing=2;
 | 
						|
		private eOrientation m_Orientation=eOrientation.Horizontal;
 | 
						|
 | 
						|
		public DockSiteDocumentLayout()
 | 
						|
		{
 | 
						|
		}
 | 
						|
 | 
						|
		public void Layout(DockSite site)
 | 
						|
		{
 | 
						|
			if(m_Orientation==eOrientation.Horizontal)
 | 
						|
				LayoutHorizontal(site);
 | 
						|
			//else
 | 
						|
			//	LayoutVertical(site);
 | 
						|
		}
 | 
						|
 | 
						|
		private void LayoutHorizontal(DockSite site)
 | 
						|
		{
 | 
						|
			int height=site.ClientRectangle.Height;
 | 
						|
			Rectangle containerRectangle=site.ClientRectangle;
 | 
						|
			int totalWidth=0, specifiedWidth=0;
 | 
						|
			int variableCount=0;
 | 
						|
			ArrayList visibleBars=new ArrayList();
 | 
						|
 | 
						|
			// Calculate fixed/specified and variable width
 | 
						|
			for(int i=0;i<site.Controls.Count;i++)
 | 
						|
			{
 | 
						|
				Bar bar=site.Controls[i] as Bar;
 | 
						|
				bar.SetDockLine(0);
 | 
						|
				if(bar==null || !bar.Visible)
 | 
						|
					continue;
 | 
						|
				if(bar.SplitDockWidth>0)
 | 
						|
				{
 | 
						|
					totalWidth+=bar.SplitDockWidth;
 | 
						|
					specifiedWidth+=bar.SplitDockWidth;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					totalWidth+=bar.MinimumSize(m_Orientation).Width;
 | 
						|
					variableCount++;
 | 
						|
				}
 | 
						|
 | 
						|
				if(i+1<site.Controls.Count)
 | 
						|
					totalWidth+=m_BarSpacing;
 | 
						|
				visibleBars.Add(bar);
 | 
						|
			}
 | 
						|
			if(specifiedWidth>0 && visibleBars.Count-variableCount-1>0)
 | 
						|
				specifiedWidth+=(visibleBars.Count-variableCount-1)*m_BarSpacing;
 | 
						|
 | 
						|
			int x=containerRectangle.X, y=containerRectangle.Y;
 | 
						|
 | 
						|
			int variableWidth=0;
 | 
						|
			int totalVariableWidth=(containerRectangle.Width-specifiedWidth-m_BarSpacing*(variableCount-1));
 | 
						|
			if(variableCount>0)
 | 
						|
				variableWidth=totalVariableWidth/variableCount;
 | 
						|
 | 
						|
 | 
						|
			int availableWidth=containerRectangle.Width;
 | 
						|
			int count=visibleBars.Count;
 | 
						|
			for(int i=0;i<count;i++)
 | 
						|
			{
 | 
						|
				Bar bar=visibleBars[i] as Bar;
 | 
						|
				bar.Location=new Point(x,y);
 | 
						|
				
 | 
						|
				if(i+1==count)
 | 
						|
					variableWidth=availableWidth;
 | 
						|
 | 
						|
				if(bar.SplitDockWidth>0)
 | 
						|
				{
 | 
						|
					if(i+1==count)
 | 
						|
						bar.RecalcSize(new Size(availableWidth,containerRectangle.Height));
 | 
						|
					else
 | 
						|
						bar.RecalcSize(new Size(bar.SplitDockWidth,containerRectangle.Height));
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					bar.SplitDockWidth=variableWidth;
 | 
						|
					bar.RecalcSize(new Size(variableWidth,containerRectangle.Height));
 | 
						|
					totalVariableWidth-=variableWidth;
 | 
						|
				}
 | 
						|
				x+=(m_BarSpacing+bar.Width);
 | 
						|
				availableWidth-=(m_BarSpacing+bar.Width);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public eOrientation Orientation
 | 
						|
		{
 | 
						|
			get {return m_Orientation;}
 | 
						|
			set {m_Orientation=value;}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |