#if FRAMEWORK20
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
    public class SuperTabControlBox : BaseItem
    {
        #region Private variables
        private SuperTabStripItem _TabStripItem;
        private SuperTabCloseBox _CloseBox;
        private SuperTabMenuBox _MenuBox;
        private BaseItem _HotItem;
        private BaseItem _MouseDownItem;
        private bool _IsMouseOver;
        private bool _IsMouseDown;
        #endregion
        /// 
        /// Constructor
        /// 
        /// Associated SuperTabStripItem
        public SuperTabControlBox(SuperTabStripItem tabStripItem)
        {
            _TabStripItem = tabStripItem;
            MouseDownCapture = true;
            MouseUpNotification = true;
            Style = eDotNetBarStyle.Office2007;
            _MenuBox = new SuperTabMenuBox(this);
            _CloseBox = new SuperTabCloseBox(this);
            _MenuBox.Visible = true;
            _CloseBox.Visible = false;
            SetParent(tabStripItem);
            SetIsContainer(true);
            SubItems.Add(_MenuBox);
            SubItems.Add(_CloseBox);
        }
        #region Public override designer hiding
        [Browsable(false)]
        public override bool BeginGroup
        {
            get { return base.BeginGroup; }
            set { base.BeginGroup = value; }
        }
        [Browsable(false)]
        public override bool AutoCollapseOnClick
        {
            get { return base.AutoCollapseOnClick; }
            set { base.AutoCollapseOnClick = value; }
        }
        [Browsable(false)]
        public override bool CanCustomize
        {
            get { return base.CanCustomize; }
            set { base.CanCustomize = value; }
        }
        [Browsable(false)]
        public override string Category
        {
            get { return base.Category; }
            set { base.Category = value; }
        }
        [Browsable(false)]
        public override bool ClickAutoRepeat
        {
            get { return base.ClickAutoRepeat; }
            set { base.ClickAutoRepeat = value; }
        }
        [Browsable(false)]
        public override int ClickRepeatInterval
        {
            get { return base.ClickRepeatInterval; }
            set { base.ClickRepeatInterval = value; }
        }
        [Browsable(false)]
        public override Cursor Cursor
        {
            get { return base.Cursor; }
            set { base.Cursor = value; }
        }
        [Browsable(false)]
        public override bool Enabled
        {
            get { return base.Enabled; }
            set { base.Enabled = value; }
        }
        [Browsable(false)]
        public override bool Stretch
        {
            get { return base.Stretch; }
            set { base.Stretch = value; }
        }
        [Browsable(false)]
        public override string Text
        {
            get { return base.Text; }
            set { base.Text = value; }
        }
        [Browsable(false)]
        public override bool ThemeAware
        {
            get { return base.ThemeAware; }
            set { base.ThemeAware = value; }
        }
        [Browsable(false)]
        public override string Tooltip
        {
            get { return base.Tooltip; }
            set { base.Tooltip = value; }
        }
        [Browsable(false)]
        public override eItemAlignment ItemAlignment
        {
            get { return base.ItemAlignment; }
            set { base.ItemAlignment = value; }
        }
        [Browsable(false)]
        public override string KeyTips
        {
            get { return base.KeyTips; }
            set { base.KeyTips = value; }
        }
        [Browsable(false)]
        public override ShortcutsCollection Shortcuts
        {
            get { return base.Shortcuts; }
            set { base.Shortcuts = value; }
        }
        [Browsable(false)]
        public override string Description
        {
            get { return base.Description; }
            set { base.Description = value; }
        }
        [Browsable(false)]
        public override bool GlobalItem
        {
            get { return base.GlobalItem; }
            set { base.GlobalItem = value; }
        }
        [Browsable(false)]
        public override bool ShowSubItems
        {
            get { return base.ShowSubItems; }
            set { base.ShowSubItems = value; }
        }
        [Browsable(false)]
        public override string GlobalName
        {
            get { return base.GlobalName; }
            set { base.GlobalName = value; }
        }
        [Browsable(false)]
        public override Command Command
        {
            get { return base.Command; }
            set { base.Command = value; }
        }
        [Browsable(false)]
        public override object CommandParameter
        {
            get { return base.CommandParameter; }
            set { base.CommandParameter = value; }
        }
        #endregion
        #region Public properties
        #region Bounds
        /// 
        /// Gets or sets the ControlBox Bounds
        /// 
        [Browsable(false)]
        public override Rectangle Bounds
        {
            get { return (base.Bounds); }
            set
            {
                if (base.Bounds.Equals(value) == false)
                {
                    base.Bounds = value;
                    RecalcLayout();
                }
            }
        }
        #endregion
        #region CloseBox
        /// 
        /// Gets the CloseBox
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SuperTabCloseBox CloseBox
        {
            get { return (_CloseBox); }
        }
        #endregion
        #region MenuBox
        /// 
        /// Gets the MenuBox
        /// 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SuperTabMenuBox MenuBox
        {
            get { return (_MenuBox); }
        }
        #endregion
        #region Visible
        /// 
        /// Gets or sets the ControlBox Visible state
        /// 
        public override bool Visible
        {
            get { return base.Visible; }
            set
            {
                if (base.Visible != value)
                {
                    base.Visible = value;
                    MyRefresh();
                }
            }
        }
        #endregion
        #endregion
        #region Internal properties
        #region IsMouseDown
        /// 
        /// Gets the MouseDown state
        /// 
        internal bool IsMouseDown
        {
            get { return (_IsMouseDown); }
        }
        #endregion
        #region IsMouseOver
        /// 
        /// Gets the MouseOver state
        /// 
        internal bool IsMouseOver
        {
            get { return (_IsMouseOver); }
        }
        #endregion
        #region TabDisplay
        /// 
        /// Gets the TabStrip TabDisplay
        /// 
        internal SuperTabStripBaseDisplay TabDisplay
        {
            get { return (_TabStripItem.TabDisplay); }
        }
        #endregion
        #endregion
        #region RecalcSize
        /// 
        /// Performs RecalcSize processing
        /// 
        public override void RecalcSize()
        {
            Size size = Size.Empty;
            foreach (BaseItem item in SubItems)
                size = LayoutItem(item, size, true);
            WidthInternal = size.Width;
            HeightInternal = size.Height;
        }
        #endregion
        #region RecalcLayout
        /// 
        /// Performs RecalcLayout processing
        /// 
        private void RecalcLayout()
        {
            Size size = Size.Empty;
            if (_TabStripItem.IsRightToLeft)
            {
                int closeIndex = SubItems.IndexOf(_CloseBox);
                int menuIndex = SubItems.IndexOf(_MenuBox);
                if (menuIndex >= 0 && closeIndex > menuIndex)
                {
                    SubItems.Remove(_CloseBox);
                    SubItems.Insert(menuIndex, _CloseBox);
                }
            }
            foreach (BaseItem item in SubItems)
                size = LayoutItem(item, size, false);
            Refresh();
        }
        #endregion
        #region LayoutItem
        /// 
        /// Performs individual running layout processing for the given BaseItem
        /// 
        /// Item to Layout
        /// Running Layout Size
        /// Whether a recalcSize is needed
        /// New running Size
        private Size LayoutItem(BaseItem item, Size size, bool recalc)
        {
            if (item.Visible == true)
            {
                // Recalc if requested
                if (recalc == true)
                    item.RecalcSize();
                // If this is the first item, then give
                // us a little padding around the ControlBox
                if (size.IsEmpty == true)
                {
                    if (Orientation == eOrientation.Horizontal)
                        size.Width += Dpi.Width5;
                    else
                        size.Height += Dpi.Height5;
                }
                // Get the item Bounds
                Rectangle r = new Rectangle(Bounds.X, Bounds.Y, item.WidthInternal, item.HeightInternal);
                // Set the item location
                if (_TabStripItem.IsVertical == true)
                {
                    r.Y += size.Height;
                    r.X += (Bounds.Width - r.Width) / 2;
                }
                else
                {
                    r.X += size.Width;
                    r.Y += (Bounds.Height - r.Height) / 2;
                }
                // Set the Bounds
                item.Bounds = r;
                // Set the item Size
                if (_TabStripItem.IsVertical == true)
                {
                    size.Height += item.HeightInternal + Dpi.Height2;
                    if (item.WidthInternal > size.Width)
                        size.Width = item.WidthInternal;
                }
                else
                {
                    size.Width += item.WidthInternal + Dpi.Width2;
                    if (item.HeightInternal > size.Height)
                        size.Height = item.HeightInternal;
                }
                // Set its display status
                if (DesignMode == false)
                    item.Displayed = true;
            }
            return (size);
        }
        #endregion
        #region MyRefresh
        /// 
        /// Refresh code
        /// 
        private void MyRefresh()
        {
            if (TabDisplay != null)
            {
                SuperTabStripItem tsi = TabDisplay.TabStripItem;
                if (tsi != null)
                {
                    tsi.NeedRecalcSize = true;
                    tsi.Refresh();
                }
            }
        }
        #endregion
        #region Paint
        /// 
        /// Paint processing
        /// 
        /// 
        public override void Paint(ItemPaintArgs p)
        {
            foreach (BaseItem item in SubItems)
            {
                if (item.Visible == true)
                    item.Paint(p);
            }
        }
        #endregion
        #region Mouse support
        #region InternalMouseEnter
        /// 
        /// InternalMouseEnter
        /// 
        public override void InternalMouseEnter()
        {
            base.InternalMouseEnter();
            _IsMouseOver = true;
        }
        #endregion
        #region InternalMouseLeave
        /// 
        /// InternalMouseLeave
        /// 
        public override void InternalMouseLeave()
        {
            base.InternalMouseLeave();
            _IsMouseOver = false;
            if (_HotItem != null)
            {
                _HotItem.InternalMouseLeave();
                _HotItem = null;
            }
        }
        #endregion        
        #region InternalMouseMove
        /// 
        /// InternalMouseMove
        /// 
        /// 
        public override void InternalMouseMove(MouseEventArgs objArg)
        {
            base.InternalMouseMove(objArg);
            _HotItem = GetBoxItemFromPoint(objArg.Location);
        }
        #endregion
        #region InternalMouseDown
        /// 
        /// InternalMouseDown
        /// 
        /// 
        public override void InternalMouseDown(MouseEventArgs objArg)
        {
            base.InternalMouseDown(objArg);
            _IsMouseDown = true;
            _MouseDownItem = _HotItem;
        }
        #endregion
        #region InternalMouseUp
        /// 
        /// InternalMouseUp
        /// 
        /// 
        public override void InternalMouseUp(MouseEventArgs objArg)
        {
            base.InternalMouseUp(objArg);
            _IsMouseDown = false;
            if (_MouseDownItem != null)
            {
                if (_MouseDownItem != _HotItem)
                    _MouseDownItem.InternalMouseUp(objArg);
                _MouseDownItem = null;
            }
        }
        #endregion
        #endregion
        #region GetBoxItemFromPoint
        /// 
        /// Gets the ControlBoxItem from the given Point
        /// 
        /// 
        /// 
        private BaseItem GetBoxItemFromPoint(Point pt)
        {
            foreach (BaseItem item in SubItems)
            {
                if (item.Visible == true)
                {
                    if (item.Bounds.Contains(pt))
                        return (item);
                }
            }
            return (null);
        }
        #endregion
        #region OnItemAdded
        /// 
        /// OnItemAdded
        /// 
        /// 
        protected internal override void OnItemAdded(BaseItem item)
        {
            base.OnItemAdded(item);
            MyRefresh();
        }
        #endregion
        #region OnAfterItemRemoved
        /// 
        /// OnAfterItemRemoved
        /// 
        /// 
        protected internal override void OnAfterItemRemoved(BaseItem item, int itemIndex)
        {
            base.OnAfterItemRemoved(item, itemIndex);
            MyRefresh();
        }
        #endregion
        #region RemoveUserItems
        /// 
        /// Removes all user added items from the ControlBox
        /// 
        public void RemoveUserItems()
        {
            for (int i = SubItems.Count - 1; i >= 0; i--)
            {
                if (SubItems[i] != _MenuBox && SubItems[i] != _CloseBox)
                    SubItems._RemoveAt(i);
            }
            MyRefresh();
        }
        #endregion
        #region Copy object support
        /// 
        /// Returns copy of the item.
        /// 
        public override BaseItem Copy()
        {
            SuperTabControlBox objCopy = new SuperTabControlBox(_TabStripItem);
            CopyToItem(objCopy);
            return (objCopy);
        }
        protected override void CopyToItem(BaseItem copy)
        {
            SuperTabControlBox objCopy = copy as SuperTabControlBox;
            base.CopyToItem(objCopy);
        }
        #endregion
    }
}
#endif