namespace DevComponents.DotNetBar
{
	using System;
	using System.Windows.Forms;
	using System.Collections;
	/// 
	///		
	/// 
	internal class ItemsListBox : System.Windows.Forms.ListBox
	{
		private ArrayList m_Items;
		internal eDotNetBarStyle Style=eDotNetBarStyle.Office2003;
		internal ItemsListBox()
		{
			this.DrawMode=DrawMode.OwnerDrawFixed;
			m_Items=null;
			this.IntegralHeight=false;
			this.BackColor=System.Drawing.SystemColors.Control;
		}
		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			base.OnDrawItem(e);
			if(m_Items==null || e.Index<0)
				return;
			BaseItem objItem=this.Items[e.Index] as BaseItem;
			e.DrawBackground();
			if(objItem==null)
			{
				//e.DrawBackground();
				return;
			}
			objItem.LeftInternal=e.Bounds.Left;
			objItem.TopInternal=e.Bounds.Top;
			
			objItem.WidthInternal=e.Bounds.Width;
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
            {
                objItem.InternalMouseEnter();
                objItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, objItem.LeftInternal + 2, objItem.TopInternal + 2, 0));
            }
			ItemPaintArgs pa=new ItemPaintArgs(null,this,e.Graphics,new ColorScheme(Style)); // TODO: ADD COLOR SCHEME
            pa.Renderer = GetRenderer();
			objItem.Paint(pa);
			if((e.State & DrawItemState.Selected)==DrawItemState.Selected)
				objItem.InternalMouseLeave();
		}
        /// 
        /// Returns the renderer control will be rendered with.
        /// 
        /// The current renderer.
        private Rendering.BaseRenderer GetRenderer()
        {
            return Rendering.GlobalManager.Renderer;
        }
		/*protected virtual void OnMeasureItem(MeasureItemEventArgs e)
		{
			base.OnMeasureItem(e);
		}*/
		internal void SetItems(ArrayList DotNetBarItems)
		{
			m_Items=DotNetBarItems;
			this.Items.Clear();
			int iMaxHeight=0;
			foreach(BaseItem objItem in m_Items)
			{
				objItem.ContainerControl=this;
				objItem.SetIsOnCustomizeDialog(true);
				objItem.Visible=true;
				objItem.WidthInternal=this.ClientSize.Width;
				objItem.RecalcSize();
				if(objItem.HeightInternal>iMaxHeight)
					iMaxHeight=objItem.HeightInternal;
			}
			if(iMaxHeight==0)
				iMaxHeight=16;
			this.ItemHeight=iMaxHeight;
			foreach(BaseItem objItem in m_Items)
			{
				objItem.HeightInternal=iMaxHeight;
				this.Items.Add(objItem);
			}
		}
	}
}