namespace DevComponents.DotNetBar
{
    using System;
	using System.Drawing;
	using System.Collections;
    using System.Windows.Forms;
	
	/// 
    ///  Defines the generic container item that is used by toolbar, menu bar and other control for item layout.
    /// 
    [System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
    public class GenericItemContainer:ImageItem, IDesignTimeProvider
    {
        #region Private Variables
        protected int m_PaddingLeft, m_PaddingTop, m_PaddingBottom, m_PaddingRight, m_ItemSpacing;
        private int m_FirstItemSpacing = 0;
		protected eBorderType m_BorderType;
		protected internal Color m_BackgroundColor;
		protected bool m_WrapItems;
		protected DisplayMoreItem m_MoreItems;
		private bool m_MoreItemsOnMenu;
		private bool m_EqualButtonSize;
		private int m_DisplayedItems=0;
		//private bool m_Stretch;
		private bool m_SystemContainer;
		private bool m_HaveCustomizeItem=false;
		private eLayoutType m_LayoutType=eLayoutType.Toolbar;
		private bool m_Scroll=false;  // Indicates whether we use scrolling in container. Applies only to the "Task List" container.
		private int m_ScrollTopPosition=0; // Indicates the first visible item from the top when scroll is used.
		private bool m_TopScroll=false, m_BottomScroll=false;
		private ScrollButton m_TopScrollButton=null,m_BottomScrollButton=null;
		// Used to eat the mouse move messages when user is using the keyboard to browse through the
		// top level menus. The problem was that on each repaint the mouse move was fired even though the
		// mouse did not move at all. So if mouse was over an menu item it was not possible to switch to the
		// new menu item becouse mouse was "holding" the focus.
		private bool m_IgnoreDuplicateMouseMove=false;
		private System.Windows.Forms.MouseEventArgs m_LastMouseMoveEvent=null;
		private int m_MinWidth=0, m_MinHeight=0;
		private bool m_Painting=false;
		private bool m_EventHeight=true;
		private bool m_UseMoreItemsButton=true;
        private eContainerVerticalAlignment m_ToolbarItemsAlign = eContainerVerticalAlignment.Bottom;
        private bool m_TrackSubItemsImageSize = true;
        internal bool OverflowEnabled = true;
        #endregion
        #region Events
        /// 
        /// Occurs when new item is added to the container.
        /// 
        internal EventHandler ItemAdded;
        #endregion
        public GenericItemContainer()
        {
			// We contain other controls
			m_IsContainer=true;
			m_PaddingLeft=1;
			m_PaddingTop=1;
			m_PaddingBottom=1;
			m_PaddingRight=1;
			m_ItemSpacing=0;
			m_BackgroundColor=Color.Empty;
			m_BorderType=eBorderType.None;
			m_WrapItems=false;
			m_MoreItems=null;
			m_EqualButtonSize=false;
			//m_Stretch=false;
			m_MoreItemsOnMenu=false;
			m_SystemContainer=false;
			this.AccessibleRole=System.Windows.Forms.AccessibleRole.Grouping;
        }
        protected override void Dispose(bool disposing)
		{
			if(m_TopScrollButton!=null)
			{
				if(m_TopScrollButton.Parent!=null)
					m_TopScrollButton.Parent.Controls.Remove(m_TopScrollButton);
				m_TopScrollButton.Dispose();
				m_TopScrollButton=null;
			}
			if(m_BottomScrollButton!=null)
			{
				if(m_BottomScrollButton.Parent!=null)
					m_BottomScrollButton.Parent.Controls.Remove(m_BottomScrollButton);
				m_BottomScrollButton.Dispose();
				m_BottomScrollButton=null;
			}
			
			base.Dispose(disposing);
		}
		internal int MinHeight
		{
			get {return m_MinHeight;}
			set {m_MinHeight=value;}
		}
		internal int MinWidth
		{
			get {return m_MinWidth;}
			set {m_MinWidth=value;}
		}
		/// 
		/// Returns copy of GenericItemContainer item
		/// 
		public override BaseItem Copy()
		{
			GenericItemContainer objCopy=new GenericItemContainer();
			this.CopyToItem(objCopy);
			
			return objCopy;
		}
		protected override void CopyToItem(BaseItem copy)
		{
			GenericItemContainer objCopy=copy as GenericItemContainer;
			base.CopyToItem(objCopy);
			objCopy.WrapItems=m_WrapItems;
			objCopy.EqualButtonSize=m_EqualButtonSize;
		}
		/// 
		/// Paints this base container
		/// 
        public override void Paint(ItemPaintArgs pa)
        {
            if (this.SuspendLayout || m_Painting)
                return;
            eDotNetBarStyle effectiveStyle = EffectiveStyle;
            m_Painting = true;
            try
            {
                System.Drawing.Graphics g = pa.Graphics;
                if (m_NeedRecalcSize)
                {
                    RecalcSize();
                }
                int x = m_Rect.Left, y = m_Rect.Top;
                Rectangle thisRect = new Rectangle(m_Rect.Left, m_Rect.Top, m_Rect.Width, m_Rect.Height);
                switch (m_BorderType)
                {
                    case eBorderType.Bump:
                        System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Bump, System.Windows.Forms.Border3DSide.All);
                        thisRect.Inflate(-2, -2);
                        break;
                    case eBorderType.Etched:
                        System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.All);
                        thisRect.Inflate(-2, -2);
                        break;
                    case eBorderType.Raised:
                        System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.RaisedInner, System.Windows.Forms.Border3DSide.All);
                        thisRect.Inflate(-2, -2);
                        break;
                    case eBorderType.Sunken:
                        System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect, System.Windows.Forms.Border3DStyle.SunkenOuter, System.Windows.Forms.Border3DSide.All);
                        thisRect.Inflate(-2, -2);
                        break;
                    case eBorderType.SingleLine:
                        // TODO: Beta 2 fix --> g.DrawRectangle(new Pen(SystemBrushes.ControlDark,1),m_Rect);
                        Pen pen = new Pen(SystemBrushes.ControlDark, 1);
                        NativeFunctions.DrawRectangle(g, pen, m_Rect);
                        pen.Dispose();
                        thisRect.Inflate(-1, -1);
                        break;
                    default:
                        break;
                }
                if (!m_BackgroundColor.IsEmpty)
                {
                    SolidBrush brush = new SolidBrush(m_BackgroundColor);
                    g.FillRectangle(brush, thisRect);
                    brush.Dispose();
                }
                //else if(m_Style==eDotNetBarStyle.Office2000 || this.IsOnMenuBar)
                //	g.FillRectangle(SystemBrushes.Control,thisRect);
                //else
                //	g.FillRectangle(new SolidBrush(ColorFunctions.ToolMenuFocusBackColor(g)),thisRect);
                g.SetClip(thisRect);
                if (m_SubItems != null)
                {
                    BaseItem objItem = null;
                    int iDisplayed = 0;
                    ThemeToolbar theme = null;
                    ThemeToolbarParts part = ThemeToolbarParts.Separator;
                    ThemeToolbarStates state = ThemeToolbarStates.Normal;
                    if (this.IsThemed)
                        theme = pa.ThemeToolbar;
                    for (int iCurrentItem = 0; iCurrentItem < m_SubItems.Count; iCurrentItem++)
                    {
                        objItem = m_SubItems[iCurrentItem] as BaseItem;
                        if (objItem.Visible && objItem.Displayed)
                        {
                            if (objItem.BeginGroup && iDisplayed > 0 && m_LayoutType != eLayoutType.DockContainer && !(objItem is ItemContainer && BarFunctions.IsOffice2007Style(objItem.EffectiveStyle)))
                            {
                                if (m_Orientation == eOrientation.Vertical || m_LayoutType == eLayoutType.TaskList)
                                {
                                    if (objItem.TopInternal == m_PaddingTop + m_Rect.Top || objItem.LeftInternal > m_PaddingLeft + m_Rect.Left)
                                    {
                                        // Vertical line on the left side
                                        if (effectiveStyle == eDotNetBarStyle.Office2000)
                                            System.Windows.Forms.ControlPaint.DrawBorder3D(g, objItem.LeftInternal - 4, objItem.TopInternal + 1, 2, m_Rect.Height - m_PaddingTop - m_PaddingBottom - 4, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Left);
                                        else
                                        {
                                            if (theme != null)
                                            {
                                                part = ThemeToolbarParts.Separator;
                                                theme.DrawBackground(g, part, state, new Rectangle(objItem.LeftInternal - 4, objItem.TopInternal + 1, 6, m_Rect.Height - m_PaddingBottom - 2));
                                            }
                                            else
                                            {
                                                using (Pen pen = new Pen(pa.Colors.ItemSeparator))
                                                {
                                                    if (effectiveStyle == eDotNetBarStyle.OfficeXP)
                                                        g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 1, objItem.LeftInternal - 2, m_Rect.Bottom - m_PaddingBottom - 2);
                                                    else
                                                    {
                                                        g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 2, objItem.LeftInternal - 2, m_Rect.Bottom - m_PaddingBottom - 4);
                                                        Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
                                                        g.DrawLine(penLight, objItem.LeftInternal - 1, objItem.TopInternal + 3, objItem.LeftInternal - 1, m_Rect.Bottom - m_PaddingBottom - 5);
                                                        penLight.Dispose();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Point start = new Point(objItem.LeftInternal + m_PaddingLeft, objItem.TopInternal - 2);
                                        Point end = new Point(objItem.DisplayRectangle.Right - m_PaddingRight, objItem.TopInternal - 2);
                                        if (this.LayoutType == eLayoutType.TaskList)
                                        {
                                            start.X = this.LeftInternal + 1;
                                            end.X = this.DisplayRectangle.Right - 2;
                                        }
                                        // Horizontal line
                                        if (effectiveStyle == eDotNetBarStyle.Office2000)
                                            System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, objItem.WidthInternal - 2, 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Top);
                                        else
                                        {
                                            if (theme != null)
                                            {
                                                part = ThemeToolbarParts.SeparatorVert;
                                                theme.DrawBackground(g, part, state, new Rectangle(start.X, start.Y, end.X - start.X, 6));
                                            }
                                            else
                                            {
                                                using (Pen pen = new Pen(pa.Colors.ItemSeparator))
                                                {
                                                    if (effectiveStyle == eDotNetBarStyle.OfficeXP)
                                                        g.DrawLine(pen, start, end);
                                                    else
                                                    {
                                                        g.DrawLine(pen, start, end);
                                                        start.Offset(0, 1);
                                                        end.Offset(0, 1);
                                                        using (Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1))
                                                            g.DrawLine(penLight, start, end);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (objItem.TopInternal == m_PaddingTop + m_Rect.Top || objItem.LeftInternal > m_PaddingLeft + m_Rect.Left)
                                    {
                                        // Vertical line on the left side
                                        if (effectiveStyle == eDotNetBarStyle.Office2000)
                                            System.Windows.Forms.ControlPaint.DrawBorder3D(g, objItem.LeftInternal - 4, objItem.TopInternal + 1, 2, objItem.HeightInternal - 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Left);
                                        else
                                        {
                                            if (theme != null)
                                            {
                                                part = ThemeToolbarParts.Separator;
                                                theme.DrawBackground(g, part, state, new Rectangle(objItem.LeftInternal - 4, objItem.TopInternal + 1, 6, objItem.HeightInternal - 3));
                                            }
                                            else
                                            {
                                                using (Pen pen = new Pen(pa.Colors.ItemSeparator))
                                                {
                                                    if (effectiveStyle == eDotNetBarStyle.OfficeXP)
                                                        g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 1, objItem.LeftInternal - 2, objItem.TopInternal + 1 + objItem.HeightInternal - 3);
                                                    else
                                                    {
                                                        g.DrawLine(pen, objItem.LeftInternal - 2, objItem.TopInternal + 4, objItem.LeftInternal - 2, objItem.TopInternal + 4 + objItem.HeightInternal - 8);
                                                        Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
                                                        g.DrawLine(penLight, objItem.LeftInternal - 1, objItem.TopInternal + 5, objItem.LeftInternal - 1, objItem.TopInternal + 5 + objItem.HeightInternal - 8);
                                                        penLight.Dispose();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        // Horizontal line
                                        if (effectiveStyle == eDotNetBarStyle.Office2000)
                                            System.Windows.Forms.ControlPaint.DrawBorder3D(g, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, m_Rect.Width - m_PaddingLeft - m_PaddingRight - 4, 2, System.Windows.Forms.Border3DStyle.Etched, System.Windows.Forms.Border3DSide.Top);
                                        else
                                        {
                                            if (theme != null)
                                            {
                                                part = ThemeToolbarParts.SeparatorVert;
                                                theme.DrawBackground(g, part, state, new Rectangle(m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 4, m_Rect.Width - m_PaddingRight - 2, 6));
                                            }
                                            else
                                            {
                                                using (Pen pen = new Pen(pa.Colors.ItemSeparator))
                                                {
                                                    if (effectiveStyle == eDotNetBarStyle.OfficeXP)
                                                        g.DrawLine(pen, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 2, m_Rect.Right - m_PaddingRight - 2, objItem.TopInternal - 2);
                                                    else
                                                    {
                                                        g.DrawLine(pen, m_Rect.Left + m_PaddingLeft + 2, objItem.TopInternal - 2, m_Rect.Right - m_PaddingRight - 2, objItem.TopInternal - 2);
                                                        Pen penLight = new Pen(pa.Colors.ItemSeparatorShade, 1);
                                                        g.DrawLine(penLight, m_Rect.Left + m_PaddingLeft + 6, objItem.TopInternal - 1, m_Rect.Right - m_PaddingRight - 4, objItem.TopInternal - 1);
                                                        penLight.Dispose();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            if (g.ClipBounds.IntersectsWith(objItem.DisplayRectangle))
                                objItem.Paint(pa);
                            iDisplayed++;
                        }
                        // Paint the Display More Items button if needed
                        if (m_MoreItems != null)
                        {
                            //Point loc = GetMoreItemsLocation();
                            //m_MoreItems.LeftInternal = loc.X;
                            //m_MoreItems.TopInternal = loc.Y;
                            //if(m_Orientation==eOrientation.Vertical)
                            //{
                            //    m_MoreItems.LeftInternal=m_Rect.Left+m_PaddingLeft;
                            //    m_MoreItems.TopInternal=m_Rect.Bottom-m_MoreItems.HeightInternal-m_PaddingBottom;
                            //}
                            //else
                            //{
                            //    m_MoreItems.LeftInternal=m_Rect.Right-m_MoreItems.WidthInternal-m_PaddingRight;
                            //    m_MoreItems.TopInternal=m_Rect.Top+m_PaddingTop;
                            //}
                            m_MoreItems.Paint(pa);
                        }
                        //					if(m_LayoutType==eLayoutType.TaskList && m_Scroll)
                        //					{
                        //
                        //					}
                    }
                }
                g.ResetClip();
            }
            finally
            {
                m_Painting = false;
            }
        }
		public eBorderType BorderType
		{
			get
			{
				return m_BorderType;
			}
			set
			{
				m_BorderType=value;
			}
		}
		
		/// 
		/// Set/Get does container wraps item into the new line when they exceed the container size
		/// 
		public bool WrapItems
		{
			get
			{
				return m_WrapItems;
			}
			set
			{
				m_WrapItems=value;
			}
		}
		public int ItemSpacing
		{
			get
			{
				return m_ItemSpacing;
			}
			set
			{
				if(m_ItemSpacing==value)
					return;
				m_ItemSpacing=value;
				NeedRecalcSize=true;
			}
		}
        protected virtual int FirstItemSpacing
        {
            get { return m_FirstItemSpacing; }
            set { m_FirstItemSpacing = value; }
        }
		/// 
		/// Specifies whether to display more items on popup menu or Bar.
		/// 
		public bool MoreItemsOnMenu
		{
			get
			{
				return m_MoreItemsOnMenu;
			}
			set
			{
				m_MoreItemsOnMenu=value;
			}
		}
		internal DisplayMoreItem MoreItems
		{
			get
			{
				return m_MoreItems;
			}
		}
		public override void RecalcSize()
		{
			if(this.SuspendLayout)
				return;
		    this.IsLayoutPass = true;
			m_RecalculatingSize=true;
			switch(m_LayoutType)
			{
				case eLayoutType.Toolbar:
                    RecalcSizeToolbar();
					break;
				case eLayoutType.TaskList:
					RecalcSizeTaskList();
					break;
				case eLayoutType.DockContainer:
					RecalcSizeDockContainer(false);
					break;
			}
			base.RecalcSize();
			m_RecalculatingSize=false;
		    this.IsLayoutPass = false;
		}
		private void RecalcSizeDockContainer(bool bFitContainer)
		{
			int iX=0, iY=0, iMaxWidth=0, iMaxHeight=0;
			bool bOneDisplayed=false;
			if(this.SuspendLayout)
				return;
			m_DisplayedItems=0;
		    int paddingLeft = Dpi.Width(m_PaddingLeft);
		    iX=paddingLeft+m_Rect.Left;
		    int paddingTop = Dpi.Height(m_PaddingTop);
		    iY=paddingTop+m_Rect.Top;
			if(m_SubItems!=null)
			{
				for(int itemIndex=0;itemIndexiMaxWidth)
						iMaxWidth=item.WidthInternal;
					if(item.HeightInternal>iMaxHeight)
						iMaxHeight=item.HeightInternal;
					
					item.LeftInternal=iX;
					item.TopInternal=iY;
					if(!item.Visible)
					{
						item.Displayed=false;
						continue;
					}
					else
						m_DisplayedItems++;
					if(!bOneDisplayed && (item.Displayed || itemIndex==this.SubItems.Count-1))
					{
						item.Displayed=true;
						bOneDisplayed=true;
					}
					else
					{
						item.Displayed=false;
					}
				}
				if(!bOneDisplayed)
				{
					foreach(BaseItem item in m_SubItems)
						if(item.Visible)
						{
							item.Displayed=true;
							break;
						}
				}
			}
		    int paddingRight = Dpi.Width(m_PaddingRight);
		    int paddingBottom = Dpi.Height(m_PaddingBottom);
		    if((bFitContainer || this.Stretch))
			{
				if(iMaxWidth+paddingLeft+paddingRight0 && iMaxWidth+paddingLeft+paddingRight0 && iMaxHeight+paddingTop+paddingBottom
		/// Recalculate Size of this item
		/// 
		private void RecalcSizeToolbar()
		{
			if(this.SuspendLayout)
				return;
            bool isRightToLeft = false;
            Control containerControl = this.ContainerControl as Control;
            if (containerControl != null)
                isRightToLeft = (containerControl.RightToLeft == RightToLeft.Yes);
			// This object for now have only border but it will have more potentially
			int iX=0, iY=0, iMaxItem=0, iMaxItemWidth=0, iMaxItemHeight=0;
			int iWidth=0, iHeight=0;
			int iGroupLineSize=3;
			int iLines=0;
			bool bDisplayed=true;
			bool bAdjustSize=false, bSetSize=false;  // If horizontal orientation we need to make sure that Height of all items is same
			int iDisplayed=0;
			BaseItem objItem=null;
			ArrayList FarAlignLines=null;
			Stack FarAlignItems=null;
			ArrayList StretchLines=null;
			ArrayList StretchLinesISCount=null;  // Holds the count of number of items stretched per line
			ArrayList ItemsToStretch=null;
			if(m_MoreItems!=null && m_MoreItems.Expanded)
				m_MoreItems.Expanded=false;
            if (EffectiveStyle == eDotNetBarStyle.Office2000)
				iGroupLineSize=6;
		    int paddingLeft = Dpi.Width(m_PaddingLeft);
		    iX=paddingLeft+m_Rect.Left;
		    int paddingTop = Dpi.Height(m_PaddingTop);
		    iY=paddingTop+m_Rect.Top;
			int iVisibleCount=this.VisibleSubItems;
			int iVisible=0;
		    int paddingRight = Dpi.Width(m_PaddingRight);
		    int paddingBottom = Dpi.Height(m_PaddingBottom);
		    if(m_SubItems!=null)
			{
				bool bRepeat=false;
				int iRepeatCount=0;
				
				if(m_WrapItems || this.Stretch)
					FarAlignLines=new ArrayList(3);
				if(this.Stretch)
				{
					StretchLines=new ArrayList(3);
					StretchLinesISCount=new ArrayList(3);
				}
                bool callRecalcSize = OnBeforeLayout();
                int mItemSpacing = Dpi.Width(m_ItemSpacing);
                int firstItemSpacing = Dpi.Width(m_FirstItemSpacing);
				do
				{
					iDisplayed=0;
					for (int iCurrentItem=0;iCurrentItem 1 || firstItemSpacing == 0) ? mItemSpacing : firstItemSpacing;
                            if(callRecalcSize)
							    objItem.RecalcSize();
							if(bSetSize)
							{
								if(m_Orientation==eOrientation.Vertical)
									objItem.WidthInternal=iMaxItemWidth;
								else
									objItem.HeightInternal=iMaxItemHeight;
							}
							switch(m_Orientation)
							{
								case eOrientation.Horizontal:
								{
									// Wrap to next line if needed
									if(m_WrapItems)
									{
										if(objItem.BeginGroup && iDisplayed>0)
											iX+=iGroupLineSize;
                                        if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + m_Rect.Left)
										{
                                            iY += (iMaxItem + itemSpacing);
											if(objItem.BeginGroup)
												iY+=iGroupLineSize;
											iX=paddingLeft+m_Rect.Left;
											iMaxItem=0;
											iLines++;
											if(FarAlignItems!=null)
												FarAlignItems=null;
											if(ItemsToStretch!=null)
												ItemsToStretch=null;
										}
									}
									else if(bDisplayed)
									{
										if(objItem.BeginGroup && iDisplayed>0)
											iX+=iGroupLineSize;
										// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
                                        if (OverflowEnabled && (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right - paddingRight && iX > paddingLeft + m_Rect.Left || (iX + objItem.WidthInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Right && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount)))
										{
											if(iCurrentItem==0)
												iMaxItem=objItem.HeightInternal;
											// Items don't fit any more the rest won't be visible
                                            iX += (itemSpacing + DisplayMoreItem.FixedSize);
					                        bDisplayed=false;
										}
									}
									
									if(bDisplayed)
									{
										if(iDisplayed>0)
                                            iX += itemSpacing;
                                        objItem.LeftInternal = GetItemLayoutX(objItem, iX);
                                        objItem.TopInternal = GetItemLayoutY(objItem, iY);
										//iX+=objItem.WidthInternal+m_ItemSpacing;
										iX+=GetItemLayoutWidth(objItem);
										if(objItem.HeightInternal>iMaxItem)
										{
											iMaxItem=objItem.HeightInternal;
										}
									}
									break;
								}
								case eOrientation.Vertical:
								{
									// Wrap to next line if needed
									if(m_WrapItems)
									{
										if(objItem.BeginGroup && iDisplayed>0)
											iY+=iGroupLineSize;
                                        if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top)
										{
                                            iX += (iMaxItem + itemSpacing);
											if(objItem.BeginGroup)
												iX+=iGroupLineSize;
											iY=paddingTop+m_Rect.Top;
											iMaxItem=0;
											iLines++;
											if(FarAlignItems!=null)
												FarAlignItems=null;
											if(ItemsToStretch!=null)
												ItemsToStretch=null;
										}
									}
									else if(bDisplayed)
									{
										if(objItem.BeginGroup && iDisplayed>0)
											iY+=iGroupLineSize;
										// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
                                        if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top || (iY + objItem.HeightInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Bottom && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
										{
											if(iCurrentItem==0)
												iMaxItem=objItem.WidthInternal;
											// Items don't fit any more the rest won't be visible
                                            iY += (itemSpacing + DisplayMoreItem.FixedSize);
					                        bDisplayed=false;
										}
									}
									if(bDisplayed)
									{
										if(iDisplayed>0)
                                            iY += itemSpacing;
										objItem.LeftInternal=iX;
										objItem.TopInternal=iY;
										iY+=GetItemLayoutHeight(objItem);
										if(objItem.WidthInternal>iMaxItem)
										{
											iMaxItem=objItem.WidthInternal;
										}
									}
									break;
								}
								default:
									break;
							}
							if(bDisplayed)
							{
								if(objItem.WidthInternal!=iMaxItemWidth)
								{
									if(m_Orientation==eOrientation.Vertical && iMaxItemWidth!=0 && !bSetSize)
										bAdjustSize=true;
									if(objItem.WidthInternal>iMaxItemWidth)
										iMaxItemWidth=objItem.WidthInternal;
								}
								if(objItem.HeightInternal!=iMaxItemHeight)
								{
									if(m_Orientation==eOrientation.Horizontal && iMaxItemHeight!=0 && !bSetSize)
										bAdjustSize=true;
									if(objItem.HeightInternal>iMaxItemHeight)
										iMaxItemHeight=objItem.HeightInternal;
								}
								iDisplayed++;
							}
							objItem.Displayed=bDisplayed;
							// Save right (Far) aligned items so we can adjust thiere position at the end
							if(bDisplayed && FarAlignLines!=null && objItem.ItemAlignment==eItemAlignment.Far || FarAlignItems!=null)
							{
								if(FarAlignItems==null)
								{
									FarAlignItems=new Stack();
									FarAlignLines.Add(FarAlignItems);
								}
								FarAlignItems.Push(objItem);
								// no stretch after item has been far aligned
								StretchLines=null;
							}
							// Save Items that we need to stretch
							if(bDisplayed && objItem.Stretch && StretchLines!=null || ItemsToStretch!=null)
							{
								if(ItemsToStretch==null)
								{
									ItemsToStretch=new ArrayList(5);
									StretchLines.Add(ItemsToStretch);
									StretchLinesISCount.Add(0);
								}
								ItemsToStretch.Add(objItem);
								if(objItem.Stretch)
									StretchLinesISCount[StretchLinesISCount.Count-1]=(int)StretchLinesISCount[StretchLinesISCount.Count-1]+1;
							}
							// Track the size if this container
							if(iX>iWidth)
								iWidth=iX;
							if(iY>iHeight)
								iHeight=iY;
						}
						else if(objItem!=null)
							objItem.Displayed=false;
					}
					// Check do we have to repeat the process
					// This is needed if container is in wrap mode and some items do not fit
					// This is done to ensure the minimum size of the container for example
					// if container with is smaller than width of one single item inside the
					// container width has to be set to widest item in the list and then the
					// size has to be recalculated again.
					if(m_WrapItems && iLines>0 && iRepeatCount<1)
					{
						if(m_Orientation==eOrientation.Horizontal && (iWidth>m_Rect.Width || bAdjustSize))
						{
							bRepeat=true;
							m_Rect.Width=iWidth+paddingLeft+paddingRight;
							iX=paddingLeft+m_Rect.Left;
							iY=paddingTop+m_Rect.Top;
							iWidth=0;
							iHeight=0;
						}
						else if(m_Orientation==eOrientation.Vertical && (iHeight>m_Rect.Height || bAdjustSize))
						{
							bRepeat=true;
							m_Rect.Height=iHeight+paddingTop+paddingBottom;
							iX=paddingLeft+m_Rect.Left;
							iY=paddingTop+m_Rect.Top;
							iWidth=0;
							iHeight=0;
						}
						if(bAdjustSize)
						{
							if(m_EventHeight)
								bSetSize=true;
							bAdjustSize=false;
						}
						// Reset alignment collections since new iteration can cause different lines
						if(bRepeat && iRepeatCount+1<2)
						{
							if(FarAlignLines!=null && FarAlignLines.Count>0)
								FarAlignLines=new ArrayList(3);
							// Reset stretch collection for same reason
							if(StretchLines!=null && StretchLines.Count>0)
							{
								StretchLines=new ArrayList(3);
								StretchLinesISCount=new ArrayList(3);
							}
						}
					}
					iRepeatCount++;
				} while (bRepeat && iRepeatCount<2);
			}
			if(m_EqualButtonSize)
			{
				// Make all buttons same width, do the same thing as loop above
				iX=paddingLeft+m_Rect.Left;
				iY=paddingTop+m_Rect.Top;
				iWidth=0;
				iHeight=0;
				bDisplayed=true;
				iLines=0;
				bAdjustSize=false;  // Size will be adjusted reset
				iDisplayed=0;
				// Reset alignment collections since new iteration can cause different lines
				if(FarAlignLines!=null && FarAlignLines.Count>0)
					FarAlignLines=new ArrayList(3);
				// Reset stretch collection for same reason
				if(StretchLines!=null && StretchLines.Count>0)
				{
					StretchLines=new ArrayList(3);
					StretchLinesISCount=new ArrayList(3);
				}
				for (int iCurrentItem=0;iCurrentItem 1 || m_FirstItemSpacing == 0) ? m_ItemSpacing : m_FirstItemSpacing;
						if(objItem.SystemItem)
						{
							if(m_Orientation==eOrientation.Vertical)
								objItem.WidthInternal=iMaxItemWidth;
							else
								objItem.HeightInternal=iMaxItemHeight;
						}
						else
						{
							objItem.WidthInternal=iMaxItemWidth;
							objItem.HeightInternal=iMaxItemHeight;
						}
						switch(m_Orientation)
						{
							case eOrientation.Horizontal:
							{
								// Wrap to next line if needed
								if(m_WrapItems)
								{
									if(objItem.BeginGroup)
										iX+=iGroupLineSize;
                                    if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + paddingRight)
									{
                                        iY += (iMaxItem + itemSpacing);
										if(objItem.BeginGroup)
											iY+=iGroupLineSize;
										iX=paddingLeft+m_Rect.Left;
										iMaxItem=0;
										iLines++;
										if(FarAlignItems!=null)
											FarAlignItems=null;
										if(ItemsToStretch!=null)
											ItemsToStretch=null;
									}
								}
								else if(bDisplayed)
								{
									if(objItem.BeginGroup)
										iX+=iGroupLineSize;
									// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
                                    if (iX + objItem.WidthInternal + itemSpacing > m_Rect.Right && iX > paddingLeft + m_Rect.Left || (iX + objItem.WidthInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Right && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
									{
										// Items don't fit any more the rest won't be visible
                                        iX += (itemSpacing + DisplayMoreItem.FixedSize);
                                        bDisplayed=false;
									}
								}
								
								if(bDisplayed)
								{
									objItem.LeftInternal=iX;
									objItem.TopInternal=iY;
                                    iX += objItem.WidthInternal + itemSpacing;
									if(objItem.HeightInternal>iMaxItem)
									{
										iMaxItem=objItem.HeightInternal;
									}
								}
								break;
							}
							case eOrientation.Vertical:
							{
								// Wrap to next line if needed
								if(m_WrapItems)
								{
                                    if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + paddingBottom)
									{
                                        iX += (iMaxItem + itemSpacing);
										iY=paddingTop+m_Rect.Top;
										iMaxItem=0;
										iLines++;
										if(FarAlignItems!=null)
											FarAlignItems=null;
										if(ItemsToStretch!=null)
											ItemsToStretch=null;
									}
								}
								else if(bDisplayed)
								{
									// If not wrapping then make sure that items fits into one line, otherwise we need to display the mark that lets them see the rest
                                    if (iY + objItem.HeightInternal + itemSpacing > m_Rect.Bottom && iY > paddingTop + m_Rect.Top || (iY + objItem.HeightInternal + itemSpacing + DisplayMoreItem.FixedSize > m_Rect.Bottom && iCurrentItem + 1 < m_SubItems.Count && iVisible < iVisibleCount))
									{
										// Items don't fit any more the rest won't be visible
                                        iY += (itemSpacing + DisplayMoreItem.FixedSize);
                                        bDisplayed=false;
									}
								}
								
								if(bDisplayed)
								{
									objItem.LeftInternal=iX;
									objItem.TopInternal=iY;
                                    iY += objItem.HeightInternal + itemSpacing;
									if(objItem.WidthInternal>iMaxItem)
									{
										iMaxItem=objItem.WidthInternal;
									}
								}
								break;
							}
							default:
								break;
						}
						objItem.Displayed=bDisplayed;
						if(bDisplayed)
							iDisplayed++;
						// Save right (Far) aligned items so we can adjust thiere position at the end
						if(bDisplayed && FarAlignLines!=null && objItem.ItemAlignment==eItemAlignment.Far || FarAlignItems!=null)
						{
							if(FarAlignItems==null)
							{
								FarAlignItems=new Stack();
								FarAlignLines.Add(FarAlignItems);
							}
							FarAlignItems.Push(objItem);
							// no stretch after item has been far aligned
							StretchLines=null;
						}
						// Save Items that we need to stretch, but not after item is far aligned
						if(bDisplayed && objItem.Stretch && StretchLines!=null || ItemsToStretch!=null)
						{
							if(ItemsToStretch==null)
							{
								ItemsToStretch=new ArrayList(5);
								StretchLines.Add(ItemsToStretch);
								StretchLinesISCount.Add(0);
							}
							ItemsToStretch.Add(objItem);
							if(objItem.Stretch)
								StretchLinesISCount[StretchLinesISCount.Count-1]=(int)StretchLinesISCount[StretchLinesISCount.Count-1]+1;
						}
						// Track the size if this container
						if(iX>iWidth)
							iWidth=iX;
						if(iY>iHeight)
							iHeight=iY;
					}
				}
			}
			m_DisplayedItems=iDisplayed;
            if (_FillsContainerControl)
            {
                if (m_Orientation == eOrientation.Vertical)
                    iMaxItemWidth = m_Rect.Width - paddingLeft;
                else
                    iMaxItemHeight = m_Rect.Height - paddingTop;
                bAdjustSize = true;
            }
            if (bAdjustSize)
			{
				if(m_Orientation==eOrientation.Vertical)
				{
					foreach(BaseItem objTmp in this.SubItems)
					{
						if(m_EventHeight)
							objTmp.WidthInternal=iMaxItemWidth;
                        else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Bottom)
							objTmp.LeftInternal+=(iMaxItemWidth-objTmp.WidthInternal);
                        else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Middle)
                            objTmp.LeftInternal += (iMaxItemWidth - objTmp.WidthInternal) / 2;
					}
				}
				else
				{
					foreach(BaseItem objTmp in this.SubItems)
					{
                        if (m_EventHeight)
                            objTmp.HeightInternal = iMaxItemHeight;
                        else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Bottom)
                            objTmp.TopInternal += (iMaxItemHeight - objTmp.HeightInternal);
                        else if (m_ToolbarItemsAlign == eContainerVerticalAlignment.Middle && iMaxItemHeight != objTmp.HeightInternal)
                            objTmp.TopInternal += (int)Math.Ceiling((float)(iMaxItemHeight - objTmp.HeightInternal) / 2) /*+ 1*/;
					}
				}
			}
			// Add max width or height depending on arrange type...
			switch(m_Orientation)
			{
				case eOrientation.Horizontal:
				{
					iHeight+=iMaxItem;
					break;
				}
				case eOrientation.Vertical:
				{
					iWidth+=iMaxItem;
					break;
				}
				default:
					break;
			}
			if(this.Stretch)
			{
				if(m_Orientation==eOrientation.Horizontal)
				{
					m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
					// Only if suggested Width is less than our width change it
					// This will disable stretchable items support for wrapable containers, every line width
					// would have to be tracked so stretchable items can work
					if(StretchLines!=null && StretchLines.Count>0)
						StretchItems(StretchLines,StretchLinesISCount,iWidth+paddingRight-m_Rect.Left);
					if(m_Rect.Width0)
					//	StretchItems(StretchLines,StretchLinesISCount,iWidth+m_PaddingRight-m_Rect.Left);
				}
				else if(m_Orientation==eOrientation.Vertical)
				{
					m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
					if(StretchLines!=null && StretchLines.Count>0)
						StretchItems(StretchLines,StretchLinesISCount,iHeight+paddingBottom-m_Rect.Top);
					// Only if suggested Height is less than our height change it
					if(m_Rect.Height0)
					//	StretchItems(StretchLines,StretchLinesISCount,iHeight+m_PaddingBottom-m_Rect.Top);
				}
				else
				{
					m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
					m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
				}
			}
			else
			{
				// If all items did not fit and we are not wrapping take suggested sizes
				if(!m_WrapItems && !bDisplayed)
				{
					// Horizontal, just adjust Height, we will honor width
					if(m_Orientation==eOrientation.Horizontal)
						m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
					else if(m_Orientation==eOrientation.Vertical)
						m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
				}
				else
				{
					// If there are no items take suggested width by container control
					if(m_DisplayedItems>0)
					{
						m_Rect.Width=iWidth+paddingRight-m_Rect.Left;
						m_Rect.Height=iHeight+paddingBottom-m_Rect.Top;
					}
					/*else
					{
						m_Rect.Width=m_PaddingLeft+m_PaddingRight;
						m_Rect.Height=m_PaddingTop+m_PaddingBottom;
					}*/
				}
			}
			// If we don't wrap and there are items left to display
			if(!m_WrapItems && !bDisplayed && m_UseMoreItemsButton)
				CreateMoreItemsButton(isRightToLeft);
			else if(m_MoreItems!=null)
			{
				// Clean up, we don't need this anymore
				m_MoreItems.Dispose();
				m_MoreItems=null;
			}
			// Align Items if needed
			if(FarAlignLines!=null && FarAlignLines.Count>0)
				AlignItemsFar(FarAlignLines);
            if (isRightToLeft && m_Orientation == eOrientation.Horizontal)
                MirrorPositionItems();
			
			m_NeedRecalcSize=false;
			if(m_Parent!=null)
			{
				m_Parent.SubItemSizeChanged(this);
			}
		}
        protected virtual int GetItemLayoutX(BaseItem objItem, int iX)
        {
            return iX;
        }
        protected virtual int GetItemLayoutY(BaseItem objItem, int iY)
        {
            return iY;
        }
        protected virtual int GetItemLayoutHeight(BaseItem objItem)
        {
            return objItem.HeightInternal;
        }
        protected virtual int GetItemLayoutWidth(BaseItem objItem)
        {
            return objItem.WidthInternal;
        }
        protected virtual bool OnBeforeLayout()
        {
            return true;
        }
        protected void MirrorPositionItems()
        {
            Rectangle bounds = this.DisplayRectangle;
            foreach (BaseItem item in this.SubItems)
            {
                item.LeftInternal = bounds.Right - ((item.DisplayRectangle.X-bounds.X) + item.DisplayRectangle.Width);
            }
        }
		private void RecalcSizeTaskList()
		{
		    int paddingTop = Dpi.Width(m_PaddingTop);
		    int paddingLeft = Dpi.Height(m_PaddingLeft);
		    int iX=m_Rect.Left+paddingLeft, iY=m_Rect.Top+paddingTop, iMaxItemWidth=0, iMaxItemHeight=0;
			int iWidth=0, iHeight=0;
			int iGroupLineSize=3;
			bool bDisplayed=true;
			int iDisplayed=0;
			Stack FarAlignItems=null;
            if (EffectiveStyle == eDotNetBarStyle.Office2000)
				iGroupLineSize=6;
			if(m_EqualButtonSize)
			{
				foreach(BaseItem item in m_SubItems)
				{
					item.Orientation=eOrientation.Horizontal;
					item.RecalcSize();
					if(item.WidthInternal>iMaxItemWidth)
						iMaxItemWidth=item.WidthInternal;
					if(item.HeightInternal>iMaxItemHeight)
						iMaxItemHeight=item.HeightInternal;
				}
			}
            for(int iCurrentItem=0;iCurrentItem0)
					iY+=iGroupLineSize;
				if(!m_EqualButtonSize)
				{
					if(objItem.WidthInternal>iMaxItemWidth)
						iMaxItemWidth=objItem.WidthInternal;
					if(objItem.HeightInternal>iMaxItemHeight)
						iMaxItemHeight=objItem.HeightInternal;
				}
				else
				{
					objItem.WidthInternal=iMaxItemWidth;
					objItem.HeightInternal=iMaxItemHeight;
				}
				objItem.TopInternal=iY;
				objItem.LeftInternal=iX;
				iY+=objItem.HeightInternal;
				objItem.Displayed=bDisplayed;
				if(!bDisplayed)
					continue;
				if(iY>m_Rect.Bottom)
				{
					bDisplayed=false;
					FarAlignItems=null;
					objItem.Displayed=false;
					continue;
				}
				if(FarAlignItems!=null && FarAlignItems.Count>0)
					FarAlignItems.Push(objItem);
				iDisplayed++;
				if(objItem.ItemAlignment==eItemAlignment.Far)
				{
					if(FarAlignItems==null)
						FarAlignItems=new Stack(10);
					FarAlignItems.Push(objItem);
				}
			}
		    int paddingRight = Dpi.Width(m_PaddingRight);
		    iWidth=iMaxItemWidth+paddingLeft+paddingRight;
		    int paddingBottom = Dpi.Width(m_PaddingBottom);
		    iHeight=iY+paddingBottom-m_Rect.Top;
			m_DisplayedItems=iDisplayed;
			if(this.Stretch)
			{
				if(bDisplayed && FarAlignItems!=null && FarAlignItems.Count>0)
				{
					// We need to move "far" align items to the appropriate position at the bottom
					AlignItemsFar(FarAlignItems, eOrientation.Vertical); // Vertical becouse this is "vertical layout"
				}
				Bar bar=this.ContainerControl as Bar;
				if(bar==null || bar!=null && bar.DockSide!=eDockSide.Top && bar.DockSide!=eDockSide.Bottom)
					m_Rect.Width=iWidth;
				if(m_Rect.HeightiHeight && bDisplayed)
					m_Rect.Height=iHeight;
				if(!bDisplayed)
				{
					if(m_Rect.Height<36)
						m_Rect.Height=36;
					// We need to scroll content
					m_Scroll=true;
					RepositionItems();
				}
				else
				{
					m_Scroll=false;
					m_ScrollTopPosition=0;
				}
			}
			if(m_MoreItems!=null)
			{
				m_MoreItems.Dispose();
				m_MoreItems=null;
			}
            
			SetupScrollButtons();
		}
		private int GroupLineSize
		{
			get
			{
                if (EffectiveStyle == eDotNetBarStyle.Office2000)
					return 6;
				return 3;
			}
		}
		private void RepositionItems()
		{
			int iTop=0;
			int iDisplayed=0;
			int iGroupLineSize=this.GroupLineSize;
			bool bDisplayed=true;
			m_TopScroll=false;
			m_BottomScroll=false;
			// Move "invisible" items up
			for(int i=m_ScrollTopPosition-1;i>=0;i--)
			{
				BaseItem objItem=m_SubItems[i];
				if(!objItem.Visible)
					continue;
				iTop-=objItem.HeightInternal;
				objItem.TopInternal=iTop;
				objItem.Displayed=false;
				if(objItem.BeginGroup && i>0)
					iTop-=iGroupLineSize;
			}
			// Move visible items down
			iTop=m_Rect.Top;
			for(int i=m_ScrollTopPosition;i0)
					iTop+=iGroupLineSize;
				objItem.TopInternal=iTop;
				iTop+=objItem.HeightInternal;
				if(iTop>m_Rect.Bottom)
				{
					objItem.Displayed=false;
					bDisplayed=false;
					continue;
				}
				iDisplayed++;
			}
			m_DisplayedItems=iDisplayed;
			if(!bDisplayed)
				m_BottomScroll=true;
			if(m_ScrollTopPosition>0)
				m_TopScroll=true;
		}
		private void SetupScrollButtons()
		{
			bool bDestroyTop=false,bDestroyBottom=false;
			if(!m_Scroll)
			{
				bDestroyTop=true;
				bDestroyBottom=true;
			}
			else
			{
				if(!m_TopScroll)
					bDestroyTop=true;
				if(!m_BottomScroll)
					bDestroyBottom=true;
			}
			if(bDestroyTop)
			{
				if(m_TopScrollButton!=null)
				{
					if(m_TopScrollButton.Parent!=null)
						m_TopScrollButton.Parent.Controls.Remove(m_TopScrollButton);
					m_TopScrollButton.Dispose();
					m_TopScrollButton=null;
				}
			}
			else
			{
				if(m_TopScrollButton==null)
				{
					System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
					if(ctrl!=null)
					{
						m_TopScrollButton=new ScrollButton();
						m_TopScrollButton.Orientation=eOrientation.Vertical;
						m_TopScrollButton.ButtonAlignment=eItemAlignment.Near;
						ctrl.Controls.Add(m_TopScrollButton);
						m_TopScrollButton.Click+=new EventHandler(ScrollClick);
					}
				}
				if(m_TopScrollButton!=null)
				{
					m_TopScrollButton.Location=m_Rect.Location;
					m_TopScrollButton.Size=new Size(m_Rect.Width,10);
					m_TopScrollButton.BringToFront();
				}
			}
			if(bDestroyBottom)
			{
				if(m_BottomScrollButton!=null)
				{
					if(m_BottomScrollButton.Parent!=null)
						m_BottomScrollButton.Parent.Controls.Remove(m_BottomScrollButton);
					m_BottomScrollButton.Dispose();
					m_BottomScrollButton=null;
				}
			}
			else
			{
				if(m_BottomScrollButton==null)
				{
					System.Windows.Forms.Control ctrl=this.ContainerControl as System.Windows.Forms.Control;
					if(ctrl!=null)
					{
						m_BottomScrollButton=new ScrollButton();
						m_BottomScrollButton.Orientation=eOrientation.Vertical;
						m_BottomScrollButton.ButtonAlignment=eItemAlignment.Far;
						ctrl.Controls.Add(m_BottomScrollButton);
						m_BottomScrollButton.Click+=new EventHandler(ScrollClick);
					}
				}
				if(m_BottomScrollButton!=null)
				{
					m_BottomScrollButton.Location=new Point(m_Rect.X,m_Rect.Bottom-10);
					m_BottomScrollButton.Size=new Size(m_Rect.Width,10);
					m_BottomScrollButton.BringToFront();
				}
			}
		}
		private void ScrollClick(object sender, EventArgs e)
		{
			if(sender==m_TopScrollButton)
			{
				m_ScrollTopPosition--;
			}
			else
			{
				m_ScrollTopPosition++;
			}
			RepositionItems();
			SetupScrollButtons();
			this.Refresh();
		}
		private void AlignItemsFar(Stack FarAlignItems, eOrientation orientation)
		{
			int iPos=0;
			int iGroupLineSize=this.GroupLineSize;
			if(orientation==eOrientation.Horizontal)
			{
			    int paddingRight = Dpi.Width(m_PaddingRight);
			    iPos=m_Rect.Right-paddingRight;
				if(m_MoreItems!=null)
					iPos-=m_MoreItems.WidthInternal;
				while(FarAlignItems.Count>0)
				{
					BaseItem objItem=FarAlignItems.Pop() as BaseItem;
					if(objItem.Displayed && objItem.Visible)
					{
						objItem.LeftInternal=iPos- GetItemLayoutWidth(objItem);
						iPos=objItem.LeftInternal-m_ItemSpacing;
						if(objItem.BeginGroup)
							iPos-=iGroupLineSize;
					}
				}
			}
			else
			{
			    int paddingBottom = Dpi.Height(m_PaddingBottom);
			    iPos=m_Rect.Bottom-paddingBottom;
				if(m_MoreItems!=null)
					iPos-=m_MoreItems.HeightInternal;
				while(FarAlignItems.Count>0)
				{
					BaseItem objItem=FarAlignItems.Pop() as BaseItem;
					if(objItem.Displayed && objItem.Visible)
					{
						objItem.TopInternal=iPos-GetItemLayoutHeight(objItem);
						iPos=objItem.TopInternal-m_ItemSpacing;
						if(objItem.BeginGroup)
							iPos-=iGroupLineSize;
					}
				}
			}
		}
		private void AlignItemsFar(ArrayList FarAlignLines, eOrientation orientation)
		{
			if(orientation==eOrientation.Horizontal)
			{
				foreach(Stack FarAlignItems in FarAlignLines)
					AlignItemsFar(FarAlignItems,orientation);
			}
			else
			{
				foreach(Stack FarAlignItems in FarAlignLines)
					AlignItemsFar(FarAlignItems,orientation);
			}
		}
		private void AlignItemsFar(ArrayList FarAlignLines)
		{
			AlignItemsFar(FarAlignLines, this.Orientation);
		}
		private void StretchItems(ArrayList StretchLines, ArrayList StretchLinesISCount, int CalculatedSize)
		{
            int iOffset=0;
            int iStretch=0;
			for(int i=0;i
		/// This must be called by child item to let the parent know that its size
		/// has been changed.
		/// 
		public override void SubItemSizeChanged(BaseItem objChildItem)
		{
			//if(!objChildItem.Visible || !objChildItem.Displayed)
			//{
			//	return;
			//}
			NeedRecalcSize=true;
			if(this.Displayed)
			{
				if(m_Parent==null)
				{
					if(this.ContainerControl is Bar)
						((Bar)this.ContainerControl).RecalcLayout();
					else if(this.ContainerControl is MenuPanel)
						((MenuPanel)this.ContainerControl).RecalcSize();
				}
				else
					m_Parent.SubItemSizeChanged(this);
			}
			else
			{
				if(m_Parent==null)
					this.RecalcSize();
				else
					m_Parent.SubItemSizeChanged(this);
			}
		}
		public override void InternalMouseHover()
		{
			if(m_MoreItems!=null && m_MoreItems.Expanded && m_HotSubItem!=m_MoreItems && this.DesignMode)
			{
				m_MoreItems.Expanded=false;
			}
			base.InternalMouseHover();
		}
		public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
		{
			if(m_MoreItems!=null && m_MoreItems.Expanded && m_HotSubItem!=m_MoreItems && !this.DesignMode)
			{
				m_MoreItems.Expanded=false;
			}
			base.InternalMouseDown(objArg);
		}
		/// 
		/// Occurs when the mouse pointer is over the item and a mouse button is released. This is used by internal implementation only.
		/// 
		[System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
		{
			base.InternalMouseUp(objArg);
			if(m_HotSubItem==null && (this.IsOnMenuBar || this.LayoutType==eLayoutType.Toolbar))
			{
				BaseItem expanded=this.ExpandedItem();
				if(expanded!=null && expanded is PopupItem)
					expanded.InternalMouseUp(objArg);
			}
		}
		public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
		{
			if(m_IgnoreDuplicateMouseMove)
			{
				if(m_LastMouseMoveEvent==null)
				{
					m_LastMouseMoveEvent=new System.Windows.Forms.MouseEventArgs(objArg.Button,objArg.Clicks,objArg.X,objArg.Y,objArg.Delta);
					return;
				}
				if(m_LastMouseMoveEvent.X!=objArg.X || m_LastMouseMoveEvent.Y!=objArg.Y ||
					m_LastMouseMoveEvent.Button!=objArg.Button)
				{
					m_IgnoreDuplicateMouseMove=false;
					m_LastMouseMoveEvent=null;
				}
				else
					return;
			}
			//DotNetBarManager owner=this.GetOwner();
			//if(!this.DesignMode && owner!=null && owner.GetFocusItem()!=null)
			//	return;
			// Call base implementation if we don't have the more items button
			if(m_MoreItems==null || !m_MoreItems.DisplayRectangle.Contains(objArg.X,objArg.Y) || this.DesignMode)
			{
				bool bMenuBar=this.IsOnMenuBar;
                if (bMenuBar || this.LayoutType == eLayoutType.Toolbar)
                {
                    BaseItem expanded = this.ExpandedItem();
                    if (expanded != null)
                        expanded.InternalMouseMove(objArg);
                    m_CheckMouseMovePressed = true;
                }
                else
                    m_CheckMouseMovePressed = false;
				
				if(objArg.Button==System.Windows.Forms.MouseButtons.None || this.DesignMode || (bMenuBar || this.LayoutType==eLayoutType.Toolbar))
					base.InternalMouseMove(objArg);
				return;
			}
			// Mouse is over our more items button
			BaseItem objNew=m_MoreItems;
			if(objNew!=m_HotSubItem)
			{
				if(m_HotSubItem!=null)
				{
					m_HotSubItem.InternalMouseLeave();
					//if(objNew!=null && m_AutoExpand && m_HotSubItem.Expanded)
					if(objNew!=null && m_HotSubItem.Expanded)
						m_HotSubItem.Expanded=false;
				}
				
				if(objNew!=null)
				{
					if(m_AutoExpand)
					{
						BaseItem objItem=ExpandedItem();
						if(objItem!=null && objItem!=objNew)
							objItem.Expanded=false;
					}
					objNew.InternalMouseEnter();
					objNew.InternalMouseMove(objArg);
                    if (m_AutoExpand && objNew.GetEnabled() && objNew.ShowSubItems)
					{
						if(objNew is PopupItem)
						{
							PopupItem pi=objNew as PopupItem;
							ePopupAnimation oldAnim=pi.PopupAnimation;
							pi.PopupAnimation=ePopupAnimation.None;
							objNew.Expanded=true;
                            pi.PopupAnimation=oldAnim;
						}
						else
							objNew.Expanded=true;
					}
					m_HotSubItem=objNew;
				}
				else
					m_HotSubItem=null;
			}
			else if(m_HotSubItem!=null)
			{
				m_HotSubItem.InternalMouseMove(objArg);
			}
		}
		public override void InternalKeyDown(System.Windows.Forms.KeyEventArgs objArg)
		{
			base.InternalKeyDown(objArg);
			if(SubItems.Count==0 || objArg.Handled)
				return;
			BaseItem objExpanded=this.ExpandedItem();
			if(objExpanded!=null)
			{
				objExpanded.InternalKeyDown(objArg);
				if(objArg.Handled)
					return;
			}
			
			if(objArg.KeyCode==System.Windows.Forms.Keys.Right || objArg.KeyCode==System.Windows.Forms.Keys.Tab || objArg.KeyCode==System.Windows.Forms.Keys.Left)
			{
				m_IgnoreDuplicateMouseMove=true;
				// Select next object
				if(m_HotSubItem!=null)
				{
					m_HotSubItem.InternalMouseLeave();
					if(m_AutoExpand && m_HotSubItem.Expanded)
					{
						m_HotSubItem.Expanded=false;
					}
				}
				if(objArg.KeyCode==System.Windows.Forms.Keys.Left)
				{
					int iIndex=0;
					if(m_HotSubItem!=null)
						iIndex=this.SubItems.IndexOf(m_HotSubItem)-1;
					if(iIndex<0)
						iIndex=this.SubItems.Count-1;
					BaseItem objNew=null;
					bool bRepeat=false;
					do
					{
						for(int i=iIndex;i>=0;i--)
						{
							objNew=this.SubItems[i];
                            if (objNew.Visible && objNew.GetEnabled())
							{
								iIndex=i;
								break;
							}
						}
                        if (!this.SubItems[iIndex].Visible || !this.SubItems[iIndex].GetEnabled())
						{
							if(!bRepeat)
							{
								iIndex=this.SubItems.Count-1;
								bRepeat=true;
							}
							else
								bRepeat=false;
						}
						else
							bRepeat=false;
					} while(bRepeat);
					m_HotSubItem=this.SubItems[iIndex];
				}
				else
				{
					int iIndex=0;
					if(m_HotSubItem!=null)
						iIndex=this.SubItems.IndexOf(m_HotSubItem)+1;
                    while (iIndex < this.SubItems.Count && (!this.SubItems[iIndex].Visible || !this.SubItems[iIndex].GetEnabled()))
						iIndex++;
					if(iIndex>=this.SubItems.Count)
						iIndex=0;
					BaseItem objNew=null;
					for(int i=iIndex;i0))
				{
					m_HotSubItem.Expanded=true;
					if(m_HotSubItem is PopupItem && ((PopupItem)m_HotSubItem).PopupControl is MenuPanel)
						((MenuPanel)((PopupItem)m_HotSubItem).PopupControl).SelectFirstItem();
				}
				objArg.Handled=true;
			}
            if (objArg.KeyCode == System.Windows.Forms.Keys.Down && this.IsOnMenuBar)
            {
                m_IgnoreDuplicateMouseMove = true;
                // Select next object
                if (m_HotSubItem != null && !m_HotSubItem.Expanded && m_HotSubItem.VisibleSubItems > 0)
                    m_HotSubItem.Expanded = true;
                
            }
            else if (objArg.KeyCode == System.Windows.Forms.Keys.Escape)
            {
                if (objExpanded != null)
                {
                    objExpanded.Expanded = false;
                    objArg.Handled = true;
                }
                else
                {
                    Control cc = this.ContainerControl as Control;
                    if (cc is Bar)
                    {
                        Bar bar = cc as Bar;
                        if (bar.BarState == eBarState.Popup)
                        {
                            bar.ParentItem.Expanded = false;
                        }
                        else
                        {
                            if (this.AutoExpand)
                                this.AutoExpand = false;
                            else if (bar.Focused || bar.MenuFocus)
                            {
                                bar.MenuFocus = false;
                                bar.ReleaseFocus();
                            }
                        }
                        objArg.Handled = true;
                    }
                    else if (cc is ItemControl)
                    {
                        ItemControl ic = cc as ItemControl;
                        if (this.AutoExpand)
                            this.AutoExpand = false;
                        else if (ic.Focused || ic.MenuFocus)
                        {
                            ic.MenuFocus = false;
                            ic.ReleaseFocus();
                        }
                    }
                }
            }
            else
            {
                BaseItem objItem = this.ExpandedItem();
                if (objItem != null)
                    objItem.InternalKeyDown(objArg);
                else
                {
                    int key = 0;
                    if (objArg.Shift)
                    {
                        try
                        {
                            byte[] keyState = new byte[256];
                            if (NativeFunctions.GetKeyboardState(keyState))
                            {
                                byte[] chars = new byte[2];
                                if (NativeFunctions.ToAscii((uint)objArg.KeyValue, 0, keyState, chars, 0) != 0)
                                {
                                    key = chars[0];
                                }
                            }
                        }
                        catch (Exception)
                        {
                            key = 0;
                        }
                    }
                    if (key == 0)
                        key = (int)NativeFunctions.MapVirtualKey((uint)objArg.KeyValue, 2);
                    bool b = false;
                    if (key > 0)
                        b = AccessKeyDown(key);
                    if (b)
                        objArg.Handled = true;
                    if (!b && m_HotSubItem != null)
                        m_HotSubItem.InternalKeyDown(objArg);
                }
            }
		}
		// Checks whether Access key is pressed and expands item if it was. Applies to menu bar items only
		// Assumes that NO item is expanded when call is made
		private bool AccessKeyDown(int KeyCode)
		{
			char[] ch=new char[1];
			byte[] by=new byte[1];
			try
			{
				by[0]=System.Convert.ToByte(KeyCode);
				System.Text.Encoding.Default.GetDecoder().GetChars(by,0,1,ch,0);
			}
			catch(Exception)
			{
				return false;
			}
			string s=ch[0].ToString();
			if(s=="")
				return false;
			ch[0]=(s.ToLower())[0];
			BaseItem expandedItem=this.ExpandedItem();
			if(expandedItem!=null && expandedItem is PopupItem && ((PopupItem)expandedItem).PopupType==ePopupType.Menu)
			{
				System.Windows.Forms.KeyEventArgs ke=new System.Windows.Forms.KeyEventArgs((System.Windows.Forms.Keys)KeyCode);
				expandedItem.InternalKeyDown(ke);
				if(ke.Handled)
				{
					m_IgnoreDuplicateMouseMove=true;
					return true;
				}
			}
			foreach(BaseItem objItem in this.SubItems)
			{
                if (objItem.Visible && objItem.GetEnabled() && objItem.Displayed && objItem.AccessKey == ch[0])
				{
					if(objItem is ButtonItem && ((ButtonItem)objItem).ButtonStyle==eButtonStyle.Default && !this.IsOnMenuBar && !this.IsOnMenu)
						continue;
                    if (objItem.SubItems.Count > 0 && objItem.ShowSubItems && objItem.GetEnabled())
					{
						if(objItem.Expanded)
						{
							objItem.InternalKeyDown(new System.Windows.Forms.KeyEventArgs((System.Windows.Forms.Keys)KeyCode));
						}
						else
							ExpandItem(objItem);
					}
					else
						objItem.RaiseClick();
					m_IgnoreDuplicateMouseMove=true;
					return true;
				}
			}
			return false;
		}
		internal bool SysKeyDown(int KeyCode)
		{
			return AccessKeyDown(KeyCode);
//			char[] ch=new char[1];
//			byte[] by=new byte[1];
//			by[0]=System.Convert.ToByte(KeyCode);
//			System.Text.Encoding.Default.GetDecoder().GetChars(by,0,1,ch,0);
//			string s=ch[0].ToString();
//			ch[0]=(s.ToLower())[0];
//			foreach(BaseItem objItem in this.SubItems)
//			{
//				if(objItem.Displayed && objItem.AccessKey==ch[0])
//				{
//					if(!objItem.Expanded)
//					{
//						ExpandItem(objItem);
////						// Set the focus here so it can be properly released...
////						Bar bar=this.ContainerControl as Bar;
////						if(bar!=null)
////							bar.Focus();
////						if(m_HotSubItem!=null)
////							m_HotSubItem.InternalMouseLeave();
////						m_HotSubItem=objItem;
////						objItem.InternalMouseEnter();
////						objItem.Expanded=true;
////						if(objItem is PopupItem)
////							this.AutoExpand=true;
//					}
//					return true;
//				}
//			}
//			return false;
		}
		private void ExpandItem(BaseItem objItem)
		{
			// Set the focus here so it can be properly released...
            Control cc = this.ContainerControl as Control;
			//if(bar!=null && !bar.Focused) // Commented out to fix menu bar taking the focus
			//	bar.Focus();
            if (cc is Bar && !cc.Focused)
                ((Bar)cc).MenuFocus = true;
			if(m_HotSubItem!=null)
				m_HotSubItem.InternalMouseLeave();
			m_HotSubItem=objItem;
			objItem.InternalMouseEnter();
            objItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, objItem.LeftInternal + 2, objItem.TopInternal + 2, 0));
			objItem.Expanded=true;
			if(objItem is PopupItem)
			{
				this.AutoExpand=true;
				// If it is a menu select first menu item inside...
				PopupItem popup=objItem as PopupItem;
				if(popup.PopupType==ePopupType.Menu && popup.PopupControl is MenuPanel)
				{
					((MenuPanel)popup.PopupControl).SelectFirstItem();
				}
			}
		}
		public bool EqualButtonSize
		{
			get
			{
				return m_EqualButtonSize;
			}
			set
			{
				if(m_EqualButtonSize!=value)
				{
					m_EqualButtonSize=value;
					NeedRecalcSize=true;
				}
			}
		}
		/*public bool Stretch
		{
			get
			{
				return m_Stretch;
			}
			set
			{
				if(m_Stretch!=value)
				{
					m_Stretch=value;
					m_NeedRecalcSize=true;
				}
			}
		}*/
		public override void ContainerLostFocus(bool appLostFocus)
		{
            base.ContainerLostFocus(appLostFocus);
			if(m_MoreItems!=null)
                m_MoreItems.ContainerLostFocus(appLostFocus);
			IOwnerMenuSupport ownersupport=this.GetOwner() as IOwnerMenuSupport;
			if(this.IsOnMenuBar && ownersupport!=null)
				ownersupport.PersonalizedAllVisible=false;
				
		}
		/// 
		/// Called when item owner has changed.
		/// 
		protected override void OnOwnerChanged()
		{
			base.OnOwnerChanged();
			if(this.GetOwner() is Bar)
			{
				this.RefreshImageSize();
			}
		}
		protected internal override void OnSubItemExpandChange(BaseItem objItem)
		{
			base.OnSubItemExpandChange(objItem);
			if(objItem.Expanded)
			{
				foreach(BaseItem objExp in this.SubItems)
				{
					if(objExp!=objItem && objExp is PopupItem && objExp.Expanded)
						objExp.Expanded=false;
				}
			}
		}
		/// 
		/// 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 && this.ContainerControl is ItemControl)
					BaseItem.CollapseSubItems(this);
			}
		}
		internal void SetSystemFocus()
		{
			if(m_HotSubItem!=null || this.SubItems.Count==0)
				return;
            BaseItem exp = this.ExpandedItem();
            if (exp != null)
            {
                m_HotSubItem = exp;
                m_HotSubItem.InternalMouseEnter();
                m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
                return;
            }
			foreach(BaseItem objItem in this.SubItems)
			{
				if(!objItem.SystemItem && objItem.Displayed && objItem.Visible)
				{
					m_HotSubItem=objItem;
					m_HotSubItem.InternalMouseEnter();
                    m_HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, m_HotSubItem.LeftInternal + 2, m_HotSubItem.TopInternal + 2, 0));
					break;
				}
			}
		}
		internal void ReleaseSystemFocus()
		{
			CollapseSubItems(this);
			if(m_HotSubItem!=null)
			{
                Control c = this.ContainerControl as Control;
                if (c != null)
                {
                    Point p = c.PointToClient(Control.MousePosition);
                    if (m_HotSubItem.DisplayRectangle.Contains(p))
                        return;
                }
				m_HotSubItem.InternalMouseLeave();
				m_HotSubItem=null;
			}
		}
		/// 
		/// Gets or sets whether container is system container used internally by DotNetBar.
		/// 
		[System.ComponentModel.Browsable(false),DevCoBrowsable(false),System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
		public bool SystemContainer
		{
			get
			{
				return m_SystemContainer;
			}
			set
			{
				m_SystemContainer=value;
			}
		}
		public bool HaveCustomizeItem
		{
			get
			{
				return m_HaveCustomizeItem;
			}
		}
		protected internal override void OnItemAdded(BaseItem objItem)
		{
			base.OnItemAdded(objItem);
            if (ItemAdded != null)
                ItemAdded(objItem, new EventArgs());
			if(objItem is CustomizeItem)
				m_HaveCustomizeItem=true;
			else if(this.SystemContainer && objItem is DockContainerItem)
			{
				Bar bar=this.ContainerControl as Bar;
				if(bar!=null && bar.LayoutType==eLayoutType.DockContainer)
				{
					if(this.VisibleSubItems>1)
					{
						objItem.Displayed=false;
					}
					bar.RefreshDockTab(true);
				}
			}
		}
        protected internal override void OnAfterItemRemoved(BaseItem objItem, int itemIndex)
		{
			base.OnAfterItemRemoved(objItem, itemIndex);
			if(objItem is CustomizeItem)
				m_HaveCustomizeItem=false;
			else if(this.SystemContainer)
			{
				Bar bar=this.ContainerControl as Bar;
				if(bar!=null)
					bar.OnSubItemRemoved(objItem);
			}
		}
		protected internal override bool IsAnyOnHandle(IntPtr iHandle)
		{
			if(m_MoreItems!=null)
			{
				if(m_MoreItems.IsAnyOnHandle(iHandle))
					return true;
			}
			return base.IsAnyOnHandle(iHandle);
		}
        /// 
        /// Return Sub Item at specified location
        /// 
        public override BaseItem ItemAtLocation(int x, int y)
        {
            if (m_SubItems != null)
            {
                foreach (BaseItem objSub in m_SubItems)
                {
                    if (objSub.IsContainer)
                    {
                        BaseItem item = objSub.ItemAtLocation(x, y);
                        if (item != null)
                            return item;
                    }
                    else
                    {
                        if ((objSub.Visible || this.IsOnCustomizeMenu) && objSub.Displayed && objSub.DisplayRectangle.Contains(x, y))
                        {
                            return objSub;
                        }
                    }
                }
            }
            return null;
        }
		public override bool AutoExpand
		{
			get
			{
				return base.AutoExpand;
			}
			set
			{
				base.AutoExpand=value;
				if(this.SystemContainer)
				{
					Bar bar=this.ContainerControl as Bar;
					if(bar!=null)
					{
						// TODO: To fix the focus menu expand comment this out
//						if(this.AutoExpand && !bar.Focused)
//                            bar.Focus();
//						else if(!this.AutoExpand && bar.Focused)
//							bar.ReleaseFocus();
						if(this.AutoExpand && !bar.MenuFocus)
						    bar.MenuFocus=true;
						else if(!this.AutoExpand && bar.MenuFocus)
							bar.MenuFocus=false;
					}
				}
			}
		}
		internal bool EventHeight
		{
			get {return m_EventHeight;}
			set {m_EventHeight=value;}
		}
		internal bool UseMoreItemsButton
		{
			get {return m_UseMoreItemsButton;}
			set {m_UseMoreItemsButton=value;}
		}
        internal eContainerVerticalAlignment ToolbarItemsAlign
        {
            get { return m_ToolbarItemsAlign; }
            set { m_ToolbarItemsAlign = value; }
        }
		public virtual eLayoutType LayoutType
		{
			get
			{
				return m_LayoutType;
			}
			set
			{
				if(m_LayoutType==value)
					return;
				m_LayoutType=value;
				NeedRecalcSize=true;
				if(m_LayoutType==eLayoutType.TaskList)
				{
					base.Orientation=eOrientation.Horizontal;
				}
				else
				{
					if(this.ContainerControl!=null && this.ContainerControl is Bar)
					{
						Bar bar=this.ContainerControl as Bar;
						if(bar.DockedSite!=null && bar.DockedSite is DockSite)
                            base.Orientation=((DockSite)bar.DockedSite).DockOrientation;
					}
				}
			}
		}
		[System.ComponentModel.Browsable(false)]
		public override eOrientation Orientation
		{
			get
			{
				if(m_LayoutType==eLayoutType.TaskList)
					return eOrientation.Vertical;
				return base.Orientation;
			}
			set
			{
				if(m_LayoutType==eLayoutType.TaskList)
					return;
				base.Orientation=value;
			}
		}
		public Color BackColor
		{
			get
			{
				if(!m_BackgroundColor.IsEmpty)
					return m_BackgroundColor;
                else if (EffectiveStyle == eDotNetBarStyle.Office2000 || this.IsOnMenuBar)
					return SystemColors.Control;
				else
					return ColorFunctions.ToolMenuFocusBackColor();
			}
			set
			{
				if(m_BackgroundColor!=value)
				{
					m_BackgroundColor=value;
					this.Refresh();
				}
			}
		}
        /// 
        /// When parent items does recalc size for its sub-items it should query
        /// image size and store biggest image size into this property.
        /// 
        [System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
        public override System.Drawing.Size SubItemsImageSize
        {
            get
            {
                return base.SubItemsImageSize;
            }
            set
            {
                if(m_TrackSubItemsImageSize)
                    base.SubItemsImageSize = value;
            }
        }
        internal bool TrackSubItemsImageSize
        {
            get { return m_TrackSubItemsImageSize; }
            set
            {
                m_TrackSubItemsImageSize = value;
                if (!m_TrackSubItemsImageSize)
                    base.SubItemsImageSize = new Size(16, 16);
            }
        }
		//***********************************************
		// IDesignTimeProvider Implementation
		//***********************************************
		public InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem)
		{
            return DesignTimeProviderContainer.GetInsertPosition(this, pScreen, DragItem);
		}
		public void DrawReversibleMarker(int iPos, bool Before)
		{
            DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
            return;
		}
		public void InsertItemAt(BaseItem objItem, int iPos, bool Before)
		{
            DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
            return;
		}
		private int GetAppendPosition(BaseItem objParent)
		{
			int iPos=-1;
			for(int i=objParent.SubItems.Count-1;i>=0;i--)
			{
				if(objParent.SubItems[i].SystemItem)
					iPos=i;
				else
					break;
			}
			return iPos;
		}
		public int PaddingLeft
		{
			get{return m_PaddingLeft;}
			set{m_PaddingLeft=value;}
		}
		public int PaddingRight
		{
			get{return m_PaddingRight;}
			set{m_PaddingRight=value;}
		}
		public int PaddingTop
		{
			get{return m_PaddingTop;}
			set{m_PaddingTop=value;}
		}
		public int PaddingBottom
		{
			get{return m_PaddingBottom;}
			set{m_PaddingBottom=value;}
		}
        private bool _FillsContainerControl = false;
        /// 
        /// Gets or sets whether item container fills the container control completely.
        /// 
        public bool FillsContainerControl
        {
            get { return _FillsContainerControl; }
            set { _FillsContainerControl = value; }
        }
    }
}