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
{
///
/// Represents item container that arranges items horizontally or vertically.
///
[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;
///
/// Creates new instance of the ItemContainer object.
///
public ItemContainer()
{
m_IsContainer=true;
this.AutoCollapseOnClick=true;
this.AccessibleRole=System.Windows.Forms.AccessibleRole.Grouping;
}
#endregion
#region Internal Implementation
///
/// Must be overriden by class that is inheriting to provide the painting for the item.
///
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;
}
}
///
/// Recalcualtes the size of the container. Assumes that DisplayRectangle.Location is set to the upper left location of this container.
///
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();
}
///
/// Occurs when the mouse pointer is over the item and a mouse button is pressed. This is used by internal implementation only.
///
[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);
}
///
/// Gets or sets orientation inside the container. Do not change the value of this property. It is managed by system only.
///
[Browsable(false),DevCoBrowsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override eOrientation Orientation
{
get {return eOrientation.Horizontal;}
set {}
}
///
/// Gets or sets orientation inside the container.
///
[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);
}
///
/// IBlock member implementation
///
[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;
}
}
}
}
///
/// Returns copy of the item.
///
public override BaseItem Copy()
{
ItemContainer objCopy=new ItemContainer();
this.CopyToItem(objCopy);
return objCopy;
}
///
/// Copies the ButtonItem specific properties to new instance of the item.
///
/// New ButtonItem instance.
protected override void CopyToItem(BaseItem c)
{
ItemContainer copy=c as ItemContainer;
base.CopyToItem(copy);
}
///
/// 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.
///
[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);
}
}
///
/// Occurs when sub item expanded state has changed.
///
/// Sub item affected.
protected internal override void OnSubItemExpandChange(BaseItem item)
{
base.OnSubItemExpandChange(item);
if(item.Expanded)
this.Expanded=true;
}
///
/// Returns whether instance of the item container is used as system container internally by DotNetBar.
///
public bool SystemContainer
{
get {return m_SystemContainer;}
}
///
/// Sets whether container is used as system container internally by DotNetBar.
///
/// true or false to indicate whether container is system container or not.
internal void SetSystemContainer(bool b)
{
m_SystemContainer=b;
}
///
/// Gets or sets the accessible role of the item.
///
[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
}
}