305 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.ComponentModel.Design;
 | 
						|
using System.Drawing;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Windows.Forms.Design;
 | 
						|
using DevComponents.UI.ContentManager;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Represents item container that arranges items horizontally or vertically.
 | 
						|
	/// </summary>
 | 
						|
	[ToolboxItem(false),DesignTimeVisible(false),Designer(typeof(ItemContainerDesigner))]
 | 
						|
	public class ItemContainer:ImageItem , IDesignTimeProvider
 | 
						|
	{
 | 
						|
		#region Private Variables & Constructor
 | 
						|
		private eOrientation m_LayoutOrientation=eOrientation.Horizontal;
 | 
						|
		private Size m_EmptyDesignTimeSize=new Size(24,24);
 | 
						|
		private bool m_SystemContainer=false;
 | 
						|
		
 | 
						|
		/// <summary>
 | 
						|
		/// Creates new instance of the ItemContainer object.
 | 
						|
		/// </summary>
 | 
						|
		public ItemContainer()
 | 
						|
		{
 | 
						|
			m_IsContainer=true;
 | 
						|
			this.AutoCollapseOnClick=true;
 | 
						|
			this.AccessibleRole=System.Windows.Forms.AccessibleRole.Grouping;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Internal Implementation
 | 
						|
		/// <summary>
 | 
						|
		/// Must be overriden by class that is inheriting to provide the painting for the item.
 | 
						|
		/// </summary>
 | 
						|
		public override void Paint(ItemPaintArgs p)
 | 
						|
		{
 | 
						|
			ItemDisplay display=GetItemDisplay();
 | 
						|
			display.Paint(this,p);
 | 
						|
 | 
						|
			if(this.DesignMode && !this.SystemContainer && p.DesignerSelection)
 | 
						|
			{
 | 
						|
				Graphics g=p.Graphics;
 | 
						|
				Rectangle r=this.DisplayRectangle;
 | 
						|
				using(Pen pen=new Pen(Color.FromArgb(120,Color.Red),1))
 | 
						|
				{
 | 
						|
					pen.DashStyle=DashStyle.Dash;
 | 
						|
					Display.DrawRoundedRectangle(g,pen,r,3);
 | 
						|
				}
 | 
						|
 | 
						|
				Image image=BarFunctions.LoadBitmap("SystemImages.AddMoreItemsContainer.png");
 | 
						|
				g.DrawImageUnscaled(image,r.X+1,r.Y+1);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Recalcualtes the size of the container. Assumes that DisplayRectangle.Location is set to the upper left location of this container.
 | 
						|
		/// </summary>
 | 
						|
		public override void RecalcSize()
 | 
						|
		{
 | 
						|
			if(this.SuspendLayout)
 | 
						|
				return;
 | 
						|
 | 
						|
			if(this.SubItems.Count==0)
 | 
						|
			{
 | 
						|
				if(this.DesignMode && !this.SystemContainer)
 | 
						|
				{
 | 
						|
					m_Rect.Size=m_EmptyDesignTimeSize;
 | 
						|
					if(m_LayoutOrientation==eOrientation.Horizontal)
 | 
						|
						m_Rect.Width+=12;
 | 
						|
					else
 | 
						|
						m_Rect.Height+=12;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					m_Rect=Rectangle.Empty;
 | 
						|
				}
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			
 | 
						|
			IContentLayout layout=this.GetContentLayout();
 | 
						|
			BlockLayoutManager blockLayout=this.GetBlockLayoutManager();
 | 
						|
			BaseItem[] elements=new BaseItem[this.SubItems.Count];
 | 
						|
			this.SubItems.CopyTo(elements,0);
 | 
						|
			if(m_Rect.Width==0)
 | 
						|
				m_Rect.Width=16;
 | 
						|
			if(m_Rect.Height==0)
 | 
						|
				m_Rect.Height=16;
 | 
						|
			m_Rect=layout.Layout(m_Rect,elements,blockLayout);
 | 
						|
			base.RecalcSize();
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when the mouse pointer is over the item and a mouse button is pressed. This is used by internal implementation only.
 | 
						|
		/// </summary>
 | 
						|
		[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 | 
						|
		public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
 | 
						|
		{
 | 
						|
			if(this.DesignMode && !this.SystemContainer)
 | 
						|
			{
 | 
						|
				Rectangle r=this.DisplayRectangle;
 | 
						|
				r.Width=14;
 | 
						|
				r.Height=14;
 | 
						|
				if(r.Contains(objArg.X,objArg.Y))
 | 
						|
				{
 | 
						|
					IOwner owner=this.GetOwner() as IOwner;
 | 
						|
					if(owner!=null)
 | 
						|
					{
 | 
						|
						owner.SetFocusItem(this);
 | 
						|
						return;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			base.InternalMouseDown(objArg);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets orientation inside the container. Do not change the value of this property. It is managed by system only.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(false),DevCoBrowsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
		public override eOrientation Orientation
 | 
						|
		{
 | 
						|
			get {return eOrientation.Horizontal;}
 | 
						|
			set	{}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets orientation inside the container.
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(true),DevCoBrowsable(true),DefaultValue(eOrientation.Horizontal),DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 | 
						|
		public virtual eOrientation LayoutOrientation
 | 
						|
		{
 | 
						|
			get {return m_LayoutOrientation;}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_LayoutOrientation=value;
 | 
						|
				OnOrientationChanged();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void OnOrientationChanged()
 | 
						|
		{
 | 
						|
			m_NeedRecalcSize=true;
 | 
						|
			if(m_LayoutManager!=null)
 | 
						|
				m_LayoutManager.ContentOrientation=(this.LayoutOrientation==eOrientation.Horizontal?eContentOrientation.Horizontal:eContentOrientation.Vertical);
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// IBlock member implementation
 | 
						|
		/// </summary>
 | 
						|
		[Browsable(false),DevCoBrowsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
		public override System.Drawing.Rectangle Bounds
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				return base.Bounds;
 | 
						|
			}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				Point offset=new Point(value.X-m_Rect.X,value.Y-m_Rect.Y);
 | 
						|
				m_Rect=value;
 | 
						|
				if(!offset.IsEmpty)
 | 
						|
				{
 | 
						|
					foreach(IBlock b in this.SubItems)
 | 
						|
					{
 | 
						|
						Rectangle r=b.Bounds;
 | 
						|
						r.Offset(offset);
 | 
						|
						b.Bounds=r;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Returns copy of the item.
 | 
						|
		/// </summary>
 | 
						|
		public override BaseItem Copy()
 | 
						|
		{
 | 
						|
			ItemContainer objCopy=new ItemContainer();
 | 
						|
			this.CopyToItem(objCopy);
 | 
						|
			return objCopy;
 | 
						|
		}
 | 
						|
		/// <summary>
 | 
						|
		/// Copies the ButtonItem specific properties to new instance of the item.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="c">New ButtonItem instance.</param>
 | 
						|
		protected override void CopyToItem(BaseItem c)
 | 
						|
		{
 | 
						|
			ItemContainer copy=c as ItemContainer;
 | 
						|
			base.CopyToItem(copy);
 | 
						|
			
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
 | 
						|
		/// </summary>
 | 
						|
		[System.ComponentModel.Browsable(false),System.ComponentModel.DefaultValue(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
 | 
						|
		public override bool Expanded
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				return m_Expanded;
 | 
						|
			}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				base.Expanded=value;
 | 
						|
				if(!value)
 | 
						|
					BaseItem.CollapseSubItems(this);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Occurs when sub item expanded state has changed.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="item">Sub item affected.</param>
 | 
						|
		protected internal override void OnSubItemExpandChange(BaseItem item)
 | 
						|
		{
 | 
						|
			base.OnSubItemExpandChange(item);
 | 
						|
			if(item.Expanded)
 | 
						|
				this.Expanded=true;
 | 
						|
		}
 | 
						|
		
 | 
						|
		/// <summary>
 | 
						|
		/// Returns whether instance of the item container is used as system container internally by DotNetBar.
 | 
						|
		/// </summary>
 | 
						|
		public bool SystemContainer
 | 
						|
		{
 | 
						|
			get {return m_SystemContainer;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Sets whether container is used as system container internally by DotNetBar.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="b">true or false to indicate whether container is system container or not.</param>
 | 
						|
		internal void SetSystemContainer(bool b)
 | 
						|
		{
 | 
						|
			m_SystemContainer=b;
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets the accessible role of the item.
 | 
						|
		/// </summary>
 | 
						|
		[DevCoBrowsable(true),Browsable(true),Category("Accessibility"),Description("Gets or sets the accessible role of the item."),DefaultValue(System.Windows.Forms.AccessibleRole.Grouping)]
 | 
						|
		public override System.Windows.Forms.AccessibleRole AccessibleRole
 | 
						|
		{
 | 
						|
			get {return base.AccessibleRole;}
 | 
						|
			set {base.AccessibleRole=value;}
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Factories
 | 
						|
		private SerialContentLayoutManager m_LayoutManager=null;
 | 
						|
		internal IContentLayout GetContentLayout()
 | 
						|
		{
 | 
						|
			if(m_LayoutManager==null)
 | 
						|
			{
 | 
						|
				m_LayoutManager=new SerialContentLayoutManager();
 | 
						|
				m_LayoutManager.BlockSpacing=1;
 | 
						|
				m_LayoutManager.ContentAlignment=eContentAlignment.Left;
 | 
						|
				m_LayoutManager.ContentLineAlignment=eContentLineAlignment.Top;
 | 
						|
				m_LayoutManager.ContentOrientation=(this.LayoutOrientation==eOrientation.Horizontal?eContentOrientation.Horizontal:eContentOrientation.Vertical);
 | 
						|
				m_LayoutManager.EvenHeight=(this.LayoutOrientation==eOrientation.Horizontal?true:false);
 | 
						|
				m_LayoutManager.FitContainer=false;
 | 
						|
				m_LayoutManager.FitContainerOversize=false;
 | 
						|
				m_LayoutManager.MultiLine=false;
 | 
						|
			}
 | 
						|
			return m_LayoutManager;
 | 
						|
		}
 | 
						|
 | 
						|
		private BlockLayoutManager GetBlockLayoutManager()
 | 
						|
		{
 | 
						|
			return new ItemBlockLayoutManager();
 | 
						|
		}
 | 
						|
		
 | 
						|
		private ItemDisplay m_ItemDisplay=null;
 | 
						|
		private ItemDisplay GetItemDisplay()
 | 
						|
		{
 | 
						|
			if(m_ItemDisplay==null)
 | 
						|
				m_ItemDisplay=new ItemDisplay();
 | 
						|
			return m_ItemDisplay;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region IDesignTimeProvider Implementation
 | 
						|
		
 | 
						|
		InsertPosition IDesignTimeProvider.GetInsertPosition(Point pScreen, BaseItem dragItem)
 | 
						|
		{
 | 
						|
			return DesignTimeProviderContainer.GetInsertPosition(this,pScreen,dragItem);
 | 
						|
		}
 | 
						|
		void IDesignTimeProvider.DrawReversibleMarker(int iPos, bool Before)
 | 
						|
		{
 | 
						|
			DesignTimeProviderContainer.DrawReversibleMarker(this,iPos,Before);
 | 
						|
		}
 | 
						|
		void IDesignTimeProvider.InsertItemAt(BaseItem objItem, int iPos, bool Before)
 | 
						|
		{
 | 
						|
			DesignTimeProviderContainer.InsertItemAt(this,objItem,iPos,Before);
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
	}
 | 
						|
}
 |