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
 | |
| 	}
 | |
| }
 |