#if FRAMEWORK20
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar
{
    public class SuperTabMenuBox : PopupItem
    {
        #region Private variables
        private SuperTabControlBox _ControlBox;
        private Size _ItemSize = new Size(16, 16);
        private bool _IsMouseOver;
        private bool _IsMouseDown;
        private bool _AutoHide;
        private bool _ShowTabsOnly = true;
        private bool _ShowImages = true;
        private bool _RaiseClickOnSelection;
        #endregion
        /// 
        /// Constructor
        /// 
        /// Associated SuperTabControlBox
        public SuperTabMenuBox(SuperTabControlBox controlBox)
        {
            _ControlBox = controlBox;
            Style = eDotNetBarStyle.Office2007;
        }
        #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 AutoHide
        /// 
        /// Gets or sets whether the MenuBox is automatically hidden when the tab items size does not exceed the size of the control
        /// 
        [Browsable(true), DefaultValue(false), Category("Behavior")]
        [Description("Indicates whether the MenuBox is automatically hidden when the tab items size does not exceed the size of the control.")]
        public bool AutoHide
        {
            get { return (_AutoHide); }
            set
            {
                if (_AutoHide != value)
                {
                    _AutoHide = value;
                    Visible = (value == true) ? AllItemsVisible() == false : true;
                    MyRefresh();
                }
            }
        }
        #endregion
        #region RaiseClickOnSelection
        /// 
        /// Gets or sets whether the MenuBox raises a ClickEvent when selected
        /// 
        [Browsable(true), DefaultValue(false), Category("Behavior")]
        [Description("Indicates whether the MenuBox raises a ClickEvent when selected.")]
        public bool RaiseClickOnSelection
        {
            get { return (_RaiseClickOnSelection); }
            set { _RaiseClickOnSelection = value; }
        }
        #endregion
        #region ShowTabsOnly
        /// 
        /// Gets or sets whether MenuBox shows only Tabs entries
        /// 
        [Browsable(true), DefaultValue(true), Category("Behavior")]
        [Description("Indicates whether MenuBox shows only Tabs entries.")]
        public bool ShowTabsOnly
        {
            get { return (_ShowTabsOnly); }
            set { _ShowTabsOnly = value; }
        }
        #endregion
        #region ShowImages
        /// 
        /// Gets or sets whether the MenuBox displays each menu entry with its associated Image/Icon
        /// 
        [Browsable(true), DefaultValue(true), Category("Behavior")]
        [Description("Indicates whether the MenuBox displays each menu entry with its associated Image/Icon.")]
        public bool ShowImages
        {
            get { return (_ShowImages); }
            set { _ShowImages = value; }
        }
        #endregion
        #region Visible
        /// 
        /// Gets or sets MenuBox Visible state
        /// 
        [Browsable(true), DefaultValue(true), Category("Behavior")]
        [Description("Indicates MenuBox 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
        #endregion
        #region RecalcSize
        /// 
        /// RecalcSize
        /// 
        public override void RecalcSize()
        {
            base.RecalcSize();
            WidthInternal = Dpi.Width(_ItemSize.Width);
            HeightInternal = Dpi.Height(_ItemSize.Height);
        }
        #endregion
        #region MyRefresh
        /// 
        /// Refreshes the display
        /// 
        private void MyRefresh()
        {
            if (_ControlBox.TabDisplay != null)
            {
                SuperTabStripItem tsi = _ControlBox.TabDisplay.TabStripItem;
                if (tsi != null)
                {
                    _ControlBox.NeedRecalcSize = true;
                    _ControlBox.RecalcSize();
                    tsi.NeedRecalcSize = true;
                    tsi.Refresh();
                }
            }
        }
        #endregion
        #region Paint
        /// 
        /// Paint processing
        /// 
        /// 
        public override void Paint(ItemPaintArgs p)
        {
            Graphics g = p.Graphics;
            using (SuperTabColorTable sct = _ControlBox.TabDisplay.GetColorTable())
            {
                Color imageColor = sct.ControlBoxDefault.Image;
                if (IsMouseOver == true)
                {
                    Rectangle r = Bounds;
                    r.Width--;
                    r.Height--;
                    imageColor = sct.ControlBoxMouseOver.Image;
                    using (Brush br = new SolidBrush(sct.ControlBoxMouseOver.Background))
                        g.FillRectangle(br, r);
                    using (Pen pen = new Pen(sct.ControlBoxMouseOver.Border))
                        g.DrawRectangle(pen, r);
                }
                if (AllItemsVisible() == true)
                    g.DrawImageUnscaled(GetMenuButton1(g, imageColor), Bounds);
                else
                    g.DrawImageUnscaled(GetMenuButton2(g, imageColor), Bounds);
            }
        }
        #region AllItemsVisible
        /// 
        /// Determines if all the items are visible
        /// 
        /// true if all visible
        private bool AllItemsVisible()
        {
            SubItemsCollection tabs = _ControlBox.TabDisplay.Tabs;
            for (int i = 0; i < tabs.Count; i++)
            {
                if (tabs[i].Visible == true && tabs[i].Displayed == false)
                    return (false);
            }
            return (true);
        }
        #endregion
        #region GetMenuButton1
        /// 
        /// Gets MenuButton1
        /// 
        /// 
        /// 
        /// 
        private Bitmap GetMenuButton1(Graphics g, Color color)
        {
            return (_ControlBox.TabDisplay.GetMenuButton1(g, color));
        }
        #endregion
        #region GetMenuButton2
        /// 
        /// Gets MenuButton2
        /// 
        /// 
        /// 
        /// 
        private Bitmap GetMenuButton2(Graphics g, Color color)
        {
            return (_ControlBox.TabDisplay.GetMenuButton2(g, color));
        }
        #endregion
        #endregion
        #region Mouse support
        #region InternalMouseEnter
        /// 
        /// InternalMouseEnter
        /// 
        public override void InternalMouseEnter()
        {
            base.InternalMouseEnter();
            _IsMouseOver = true;
            Refresh();
        }
        #endregion
        #region InternalMouseLeave
        /// 
        /// InternalMouseLeave
        /// 
        public override void InternalMouseLeave()
        {
            base.InternalMouseLeave();
            _IsMouseOver = false;
            Refresh();
        }
        #endregion
        #region InternalMouseDown
        /// 
        /// InternalMouseDown
        /// 
        /// 
        public override void InternalMouseDown(MouseEventArgs objArg)
        {
            _IsMouseDown = true;
            if (DesignMode == false && objArg.Button == MouseButtons.Left)
            {
                LoadTabMenu();
                Point pt = GetPopupPosition();
                Popup(pt);
            }
        }
        #region GetPopupPosition
        /// 
        /// Gets the popup menu position
        /// 
        /// 
        private Point GetPopupPosition()
        {
            Point pt = new Point(Bounds.X, Bounds.Bottom);
            Control c = (Control)_ControlBox.GetContainerControl(true);
            if (c != null)
                pt = c.PointToScreen(pt);
            return (pt);
        }
        #endregion
        #region LoadTabMenu
        /// 
        /// Loads the TabMenu
        /// 
        private void LoadTabMenu()
        {
            SubItems.Clear();
            SubItemsCollection tabs = _ControlBox.TabDisplay.Tabs;
            if (_ShowTabsOnly == true)
                LoadTabsMenu(tabs);
            else
                LoadItemsMenu(tabs);
        }
        #region LoadTabsMenu
        /// 
        /// Loads Tabs only into the TabMenu
        /// 
        /// 
        private void LoadTabsMenu(SubItemsCollection tabs)
        {
            for (int i = 0; i < tabs.Count; i++)
            {
                SuperTabItem tab = tabs[i] as SuperTabItem;
                if (tab != null && tab.Visible == true)
                {
                    ButtonItem bi = new ButtonItem();
                    bi.Tag = tab;
                    bi.Text = tab.Text;
                    if (tab.Enabled == true)
                        bi.Click += SuperTabMenuBoxClick;
                    else
                        bi.Enabled = false;
                    SubItems.Add(bi);
                    if (_ShowImages == true)
                        SetMenuImage(bi, tab);
                    if (tab.IsSelected == true)
                        bi.Checked = true;
                }
            }
        }
        #endregion
        #region LoadItemsMenu
        /// 
        /// Loads all items into the TabMenu
        /// 
        /// 
        private void LoadItemsMenu(SubItemsCollection tabs)
        {
            ButtonItem[] items = new ButtonItem[tabs.Count];
            for (int i = 0; i < tabs.Count; i++)
            {
                if (tabs[i].Visible == true)
                {
                    items[i] = new ButtonItem();
                    items[i].Tag = tabs[i];
                    items[i].Text = tabs[i].Text;
                    if (tabs[i].Enabled == true)
                        items[i].Click += SuperTabMenuBoxClick;
                    else
                        items[i].Enabled = false;
                    if (_ShowImages == true)
                    {
                        if (tabs[i] is SuperTabItem)
                            SetMenuImage(items[i], ((SuperTabItem) tabs[i]).GetTabImage());
                        else if (tabs[i] is ButtonItem)
                            SetMenuImage(items[i], ((ButtonItem) tabs[i]).GetImage());
                    }
                }
            }
            int index = _ControlBox.TabDisplay.TabStripItem.SelectedTabIndex;
            if (index >= 0 && index < tabs.Count)
                items[index].Checked = true;
            SubItems.AddRange(items);
        }
        #endregion
        #region SetMenuImage
        /// 
        /// Sets the TabMenu entry image
        /// 
        /// 
        /// 
        private void SetMenuImage(ButtonItem bi, SuperTabItem tab)
        {
            if (string.IsNullOrEmpty(tab.SymbolRealized) == false)
            {
                bi.Symbol = tab.Symbol;
                bi.SymbolSize = tab.SymbolSize;
                bi.SymbolColor = tab.TabItemDisplay.GetSymbolColor();
            }
            else
            {
                SetMenuImage(bi, tab.GetTabImage());
            }
        }
        private void SetMenuImage(ButtonItem bi, CompositeImage image)
        {
            if (image != null)
            {
                if (image.Icon != null)
                    bi.Icon = image.Icon;
                else if (image.Image != null)
                {
                    if (ImageAnimator.CanAnimate(image.Image) == true)
                    {
                        FrameDimension frameDimensions =
                            new FrameDimension(image.Image.FrameDimensionsList[0]);
                        image.Image.SelectActiveFrame(frameDimensions, 0);
                        bi.Image = new Bitmap(image.Image);
                        bi.NeedRecalcSize = true;
                    }
                    else
                    {
                        bi.Image = image.Image;
                    }
                }
            }
        }
        #endregion
        #endregion
        #region SuperTabMenuBox_Click
        /// 
        /// Handles SuperTabMenuBox_Click event
        /// 
        /// 
        /// 
        void SuperTabMenuBoxClick(object sender, EventArgs e)
        {
            ButtonItem bi = sender as ButtonItem;
            if (bi != null)
            {
                BaseItem item = bi.Tag as BaseItem;
                if (item != null)
                {
                    SuperTabItem tab = bi.Tag as SuperTabItem;
                    if (tab != null)
                        _ControlBox.TabDisplay.TabStripItem.SelectedTab = tab;
                    else
                        _ControlBox.TabDisplay.TabStripItem.VisibleTab = item;
                    if (_RaiseClickOnSelection == true)
                        item.RaiseClick(eEventSource.Code);
                }
            }
        }
        #endregion
        #endregion
        #region InternalMouseUp
        /// 
        /// InternalMouseUp
        /// 
        /// 
        public override void InternalMouseUp(MouseEventArgs objArg)
        {
            base.InternalMouseUp(objArg);
            _IsMouseDown = false;
            Refresh();
        }
        #endregion
        #endregion
        #region Copy object support
        /// 
        /// Returns copy of the item.
        /// 
        public override BaseItem Copy()
        {
            SuperTabMenuBox objCopy = new SuperTabMenuBox(_ControlBox);
            CopyToItem(objCopy);
            return (objCopy);
        }
        protected override void CopyToItem(BaseItem copy)
        {
            SuperTabMenuBox objCopy = copy as SuperTabMenuBox;
            base.CopyToItem(objCopy);
        }
        #endregion
    }
    #region enums
    #region TabMenuOpenEventArgs
    public class TabMenuOpenEventArgs : CancelEventArgs
    {
        #region Private variables
        private ButtonItem _TabMenu;
        #endregion
        public TabMenuOpenEventArgs(ButtonItem tabMenu)
        {
            _TabMenu = tabMenu;
        }
        #region Public properties
        public ButtonItem TabMenu
        {
            get { return (_TabMenu); }
        }
        #endregion
    }
    #endregion
    #region TabMenuCloseEventArgs
    public class TabMenuCloseEventArgs : EventArgs
    {
        #region Private variables
        private ButtonItem _TabMenu;
        #endregion
        public TabMenuCloseEventArgs(ButtonItem tabMenu)
        {
            _TabMenu = tabMenu;
        }
        #region Public properties
        public ButtonItem TabMenu
        {
            get { return (_TabMenu); }
        }
        #endregion
    }
    #endregion
    #endregion
}
#endif