#if FRAMEWORK20
using System.Drawing;
using System.Drawing.Drawing2D;
using DevComponents.DotNetBar.Rendering;
using DevComponents.UI.ContentManager;
namespace DevComponents.DotNetBar
{
    internal class SuperTabStripBaseDisplay
    {
        #region Constants
        private const int MarkerSize = 10;
        #endregion
        #region Private Variables
        private int _TabHeight;
        private SuperTabStripItem _TabStripItem;
        private SerialContentLayoutManager _ContentManager;
        private SuperTabItemLayoutManager _BlockManager;
        private SuperTabColorTable _DefaultColorTable;
        private Bitmap _CloseButton;
        private Color _CloseButtonColor;
        private Bitmap _MenuButton1;
        private Bitmap _MenuButton2;
        private Color _MenuButtonColor;
        private Bitmap _TopInsertMarker;
        private Bitmap _LeftInsertMarker;
        private Color _InsertMarkerColor;
		#endregion
        /// 
        /// Constructor
        /// 
        /// Associated SuperTabStripItem
        public SuperTabStripBaseDisplay(SuperTabStripItem tabStripItem)
        {
            _TabStripItem = tabStripItem;
            _ContentManager = new SerialContentLayoutManager();
            _ContentManager.NextPosition += ContentManagerNextPosition;
            _BlockManager = new SuperTabItemLayoutManager(tabStripItem);
            _DefaultColorTable = SuperTabStyleColorFactory.GetColorTable(tabStripItem.TabStyle, ColorFactory.Empty);
        }
        #region Internal properties
        #region Alignment
        /// 
        /// Gets the TabAlignment
        /// 
        internal eTabStripAlignment Alignment
        {
            get { return (_TabStripItem.TabAlignment); }
        }
        #endregion
        #region DefaultColorTable
        /// 
        /// gets or sets the default color table
        /// 
        internal SuperTabColorTable DefaultColorTable
        {
            get { return (_DefaultColorTable); }
            set
            {
                _DefaultColorTable = value;
                for (int i = 0; i < Tabs.Count; i++)
                {
                    SuperTabItem tab = Tabs[i] as SuperTabItem;
                    if (tab != null)
                        tab.TabItemDisplay.SetDefaultColorTable();
                }
            }
        }
        #endregion
        #region IsRightToLeft
        /// 
        /// Gets if display is RightToLeft
        /// 
        internal bool IsRightToLeft
        {
            get { return (_TabStripItem.IsRightToLeft); }
        }
        #endregion
        #region IsVertical
        /// 
        /// Gets tab vertical orientation
        /// 
        internal bool IsVertical
        {
            get { return (_TabStripItem.IsVertical); }
        }
        #endregion
        #region MinTabStripHeight
        /// 
        /// Gets the minimum TabStrip height
        /// 
        internal virtual int MinTabStripHeight
        {
            get
            {
                if (TabItemsBounds.IsEmpty)
                    return (TabHeight + Dpi.Height6);
                if (Alignment == eTabStripAlignment.Top || Alignment == eTabStripAlignment.Bottom)
                    return (TabItemsBounds.Height + Dpi.Height2);
                return (TabItemsBounds.Width + Dpi.Width2);
            }
        }
        #endregion
        #region ShowFocusRectangle
        /// 
        /// Gets whether we are to show the Focus rectangle
        /// 
        internal bool ShowFocusRectangle
        {
            get { return (_TabStripItem.ShowFocusRectangle); }   // && _TabStripItem.Focused
        }
        #endregion
        #region Tab properties
        #region CloseButtonOnTabs
        /// 
        /// Gets CloseButtonOnTabsVisible
        /// 
        internal bool CloseButtonOnTabs
        {
            get { return (_TabStripItem.CloseButtonOnTabsVisible); }
        }
        #endregion
        #region FixedTabSize
        /// 
        /// Gets FixedTabSize
        /// 
        internal Size FixedTabSize
        {
            get { return (_TabStripItem.FixedTabSize); }
        }
        #endregion
        #region MinTabSize
        /// 
        /// Gets the minimum tab size
        /// 
        internal virtual Size MinTabSize
        {
            get { return Dpi.Size(new Size(13, 13)); }
        }
        #endregion
        #region SelectedTab
        /// 
        /// Gets the selected tab
        /// 
        internal SuperTabItem SelectedTab
        {
            get { return (_TabStripItem.SelectedTab); }
        }
        #endregion
        #region SelectedTabFont
        /// 
        /// Gets the selected font
        /// 
        internal Font SelectedTabFont
        {
            get { return (_TabStripItem.SelectedTabFont); }
        }
        #endregion
        #region TabControlBox
        /// 
        /// Gets the tab ControlBox
        /// 
        internal SuperTabControlBox TabControlBox
        {
            get { return (_TabStripItem.ControlBox); }
        }
        #endregion
        #region TabHeight
        /// 
        /// Gets the tab height
        /// 
        internal int TabHeight
        {
            get
            {
                if (_TabHeight <= 0)
                {
                    _TabHeight = (FixedTabSize.Height > 0)
                        ? Dpi.Height(FixedTabSize.Height) : GetTabHeight();
                }
                return (Dpi.Height(_TabHeight));
            }
            set { _TabHeight = value; }
        }
        #endregion
        #region TabItemsBounds
        /// 
        /// Gets the tab bounds
        /// 
        internal Rectangle TabItemsBounds
        {
            get { return (_TabStripItem.TabItemsBounds); }
            set { _TabStripItem.TabItemsBounds = value; }
        }
        #endregion
        #region Tabs
        /// 
        /// Gets the Tabs collection
        /// 
        internal SubItemsCollection Tabs
        {
            get { return (_TabStripItem.SubItems); }
        }
        #endregion
        #endregion
        #region TabStrip
        /// 
        /// Gets the TabStrip
        /// 
        internal SuperTabStrip TabStrip
        {
            get { return (TabStripItem.TabStrip); }
        }
        #endregion
        #region TabStripItem
        /// 
        /// Gets the TabStripItem
        /// 
        internal SuperTabStripItem TabStripItem
        {
            get { return (_TabStripItem); }
        }
        #endregion
        #region Virtual properties
        /// 
        ///  Gets the PreDrawStripBorder state
        /// 
        internal virtual bool PreDrawStripBorder
        {
            get { return (false); }
        }
        /// 
        ///  Gets the SelectedPaddingWidth
        /// 
        internal virtual int SelectedPaddingWidth
        {
            get { return (0); }
        }
        /// 
        /// Gets the TabOverlap
        /// 
        internal virtual int TabOverlap
        {
            get { return (0); }
        }
        /// 
        /// Gets the TabSpacing
        /// 
        internal virtual int TabSpacing
        {
            get { return (0); }
        }
        /// 
        /// Gets the TabOverlapLeft
        /// 
        internal virtual bool TabOverlapLeft
        {
            get { return (false); }
        }
        /// 
        /// Gets the TabLayoutOffset
        /// 
        internal virtual Size TabLayoutOffset
        {
            get { return (Size.Empty); }
        }
        #endregion
        #endregion
        #region Events
        /// 
        /// Handles ContentManager NextPosition events
        /// 
        /// 
        /// 
        void ContentManagerNextPosition(object sender, LayoutManagerPositionEventArgs e)
        {
            SuperTabItem item = e.Block as SuperTabItem;
            if (item != null)
            {
                int index = item.TabStrip.Tabs.IndexOf(item);
                if (index >= 0)
                {
                    for (int i = index + 1; i < item.TabStrip.Tabs.Count; i++)
                    {
                        BaseItem nextItem = item.TabStrip.Tabs[i];
                        if (nextItem == null || nextItem.Visible == true)
                        {
                            if (nextItem is SuperTabItem)
                                e.SwitchToNewLine = ((SuperTabItem)nextItem).StartsNewTabLine;
                            break;
                        }
                    }
                }
            }
            NextBlockPosition(e);
        }
        #endregion
        #region RecalcSize
        /// 
        /// Handles RecalcSize requests
        /// 
        /// 
        internal virtual void RecalcSize(Graphics g)
        {
            RecalcLayoutInit(g);
            RecLayoutContent();
            int n = MinTabStripHeight;
            switch (_TabStripItem.TabAlignment)
            {
                case eTabStripAlignment.Left:
                case eTabStripAlignment.Right:
                    _TabStripItem.TabStrip.Width = n;
                    _TabStripItem.WidthInternal = n;
                    _TabStripItem.HeightInternal = _TabStripItem.TabStrip.Height;
                    break;
                default:
                    _TabStripItem.TabStrip.Height = n;
                    _TabStripItem.HeightInternal = n;
                    _TabStripItem.WidthInternal = _TabStripItem.TabStrip.Width;
                    break;
            }
        }
        #endregion
        #region RecLayoutContent
        /// 
        /// Handles RecLayoutContent requests
        /// 
        internal virtual void RecLayoutContent()
        {
            if (TabControlBox.MenuBox.AutoHide == true && TabControlBox.Visible == true)
            {
                RecalcLayout(GetTabClientArea(false));
                TabControlBox.MenuBox.Visible = !AllItemsVisible();
            }
            RecalcLayout(GetTabClientArea());
        }
        #endregion
        #region RecalcLayoutInit
        /// 
        /// Initializes the layout engine
        /// 
        /// 
        protected virtual void RecalcLayoutInit(Graphics g)
        {
            _BlockManager.Graphics = g;
            g.CompositingMode = g.CompositingMode;
            _BlockManager.FixedTabSize = FixedTabSize;
            _BlockManager.TabLayoutOffset = TabLayoutOffset;
            _ContentManager.RightToLeft = IsRightToLeft;
            _ContentManager.EvenHeight = true;
            switch (Alignment)
            {
                case eTabStripAlignment.Bottom:
                    _ContentManager.ContentAlignment = eContentAlignment.Left;
                    _ContentManager.ContentVerticalAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.BlockLineAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.ContentOrientation = eContentOrientation.Horizontal;
                    break;
                case eTabStripAlignment.Top:
                    _ContentManager.ContentAlignment = eContentAlignment.Left;
                    _ContentManager.ContentVerticalAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.BlockLineAlignment = eContentVerticalAlignment.Bottom;
                    _ContentManager.ContentOrientation = eContentOrientation.Horizontal;
                    break;
                case eTabStripAlignment.Left:
                    _ContentManager.ContentAlignment = eContentAlignment.Left;
                    _ContentManager.ContentVerticalAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.BlockLineAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.ContentOrientation = eContentOrientation.Vertical;
                    break;
                case eTabStripAlignment.Right:
                    _ContentManager.ContentAlignment = eContentAlignment.Left;
                    _ContentManager.ContentVerticalAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.BlockLineAlignment = eContentVerticalAlignment.Top;
                    _ContentManager.ContentOrientation = eContentOrientation.Vertical;
                    break;
            }
            switch (_TabStripItem.TabLayoutType)
            {
                case eSuperTabLayoutType.SingleLine:
                    _ContentManager.MultiLine = false;
                    _ContentManager.FitContainer = false;
                    break;
                case eSuperTabLayoutType.SingleLineFit:
                    _ContentManager.MultiLine = false;
                    _ContentManager.FitContainer = true;
                    break;
                case eSuperTabLayoutType.MultiLine:
                    _ContentManager.MultiLine = true;
                    _ContentManager.FitContainer = false;
                    break;
                case eSuperTabLayoutType.MultiLineFit:
                    _ContentManager.MultiLine = true;
                    _ContentManager.FitContainer = true;
                    break;
            }
        }
        #endregion
        #region RecalcLayout
        /// 
        /// Performs the Recalc Layout
        /// 
        /// 
        protected virtual void RecalcLayout(Rectangle r)
        {
            if (Tabs.Count > 0)
            {
                IBlock[] blocks = new IBlock[Tabs.Count];
                for (int i = 0; i < Tabs.Count; i++)
                    blocks[i] = Tabs[i];
                if (IsRightToLeft)
                {
                    Rectangle tabArea = r;
                    if (_TabStripItem.ControlBox.Visible)
                        tabArea.X += TabControlBox.Size.Width;
                    TabItemsBounds = _ContentManager.Layout(tabArea, blocks, _BlockManager);
                    RecalcSizeTabControlBox(r, tabArea);
                }
                else
                {
                    TabItemsBounds = _ContentManager.Layout(r, blocks, _BlockManager);
                    RecalcSizeTabControlBox(r, TabItemsBounds);
                }
            }
            else
            {
                TabItemsBounds = Rectangle.Empty;
            }
        }
        #endregion
        #region RecalcSizeTabSystemBox
        /// 
        /// Recalculates the bounds for the TabControlBox
        /// 
        /// 
        /// 
        protected virtual void RecalcSizeTabControlBox(Rectangle dispRect, Rectangle tabsBounds)
        {
            if (_TabStripItem.ControlBox.Visible == true)
            {
                int dx, dy;
                Size boxSize = TabControlBox.Size;
                switch (Alignment)
                {
                    case eTabStripAlignment.Left:
                    case eTabStripAlignment.Right:
                        dx = dispRect.X + (dispRect.Width - boxSize.Width) / 2;
                        dy = _TabStripItem.DisplayRectangle.Bottom - boxSize.Height;
                        break;
                    default:
                        if (IsRightToLeft)
                            dx = dispRect.X;
                        else
                            dx = _TabStripItem.DisplayRectangle.Right - boxSize.Width;
                        dy = tabsBounds.Y + (dispRect.Height - boxSize.Height) / 2;
                        break;
                }
                TabControlBox.Bounds =
                    new Rectangle(dx, dy, boxSize.Width, boxSize.Height);
            }
        }
        #endregion
        #region GetTabClientArea
        /// 
        /// Gets the tab client area
        /// 
        /// 
        protected virtual Rectangle GetTabClientArea()
        {
            return (GetTabClientArea(TabControlBox.MenuBox.Visible));
        }
        /// 
        /// Gets the tab client area
        /// 
        /// 
        protected virtual Rectangle GetTabClientArea(bool mbVisible)
        {
            Rectangle r = new Rectangle();
            r.Size = TabStripItem.TabStrip.Size;
            if (TabStripItem.ControlBox.Visible == true)
            {
                if (Alignment == eTabStripAlignment.Right || Alignment == eTabStripAlignment.Left)
                {
                    r.Height -= TabStripItem.ControlBox.Size.Height;
                    if (TabStripItem.ControlBox.MenuBox.Visible != mbVisible)
                    {
                        if (mbVisible == true)
                            r.Height -= TabStripItem.ControlBox.MenuBox.HeightInternal;
                        else
                            r.Height += TabStripItem.ControlBox.MenuBox.HeightInternal;
                    }
                    if (r.Height < TabStripItem.ControlBox.Size.Height)
                        r.Height = TabStripItem.ControlBox.Size.Height;
                }
                else
                {
                    r.Width -= TabStripItem.ControlBox.Size.Width;
                    if (TabStripItem.ControlBox.MenuBox.Visible != mbVisible)
                    {
                        if (mbVisible == true)
                            r.Width -= TabStripItem.ControlBox.MenuBox.WidthInternal;
                        else
                            r.Width += TabStripItem.ControlBox.MenuBox.WidthInternal;
                    }
                    if (r.Width < TabStripItem.ControlBox.Size.Width)
                        r.Width = TabStripItem.ControlBox.Size.Width;
                }
            }
            return (r);
        }
        #endregion
        #region GetTabHeight
        /// 
        /// Gets the tab height
        /// 
        /// 
        protected virtual int GetTabHeight()
        {
            if (FixedTabSize.Height > 0)
                return Dpi.Height(FixedTabSize.Height);
            int iHeight = (Alignment == eTabStripAlignment.Left ||
                Alignment == eTabStripAlignment.Right) ? Dpi.Height20 : Dpi.Height16;
            Font font = (_TabStripItem.SelectedTabFont ?? _TabStripItem.TabFont) ?? TabStrip.Font;
            if (font.Height > iHeight)
                iHeight = font.Height;
            iHeight = GetMaxHeight(iHeight) + Dpi.Height4;
            return (iHeight);
        }
        private int GetMaxHeight(int height)
        {
            int maxHeight = 0;
            foreach (BaseItem item in Tabs)
            {
                SuperTabItem tab = item as SuperTabItem;
                if (tab != null)
                {
                    CompositeImage image = tab.GetTabImage();
                    if (image != null)
                    {
                        int h = Dpi.ImageHeight(image.Height);
                        switch (tab.EffectiveImageAlignment)
                        {
                            case ImageAlignment.TopLeft:
                            case ImageAlignment.TopCenter:
                            case ImageAlignment.TopRight:
                            case ImageAlignment.BottomLeft:
                            case ImageAlignment.BottomCenter:
                            case ImageAlignment.BottomRight:
                                h += height;
                                break;
                        }
                        if (h > maxHeight)
                            maxHeight = h;
                    }
                }
            }
            return (maxHeight);
        }
        #endregion
        #region AddDefaultPadding
        internal virtual void AddDefaultPadding(ref Size size)
        {
            size.Width += Dpi.Width(_TabStripItem.TabHorizontalSpacing) * 2;
            size.Height += Dpi.Height(_TabStripItem.TabVerticalSpacing) * 2;
        }
        #endregion
        #region NextBlockPosition
        /// 
        /// Layout manager NextBlockPosition
        /// 
        /// 
        protected virtual void NextBlockPosition(LayoutManagerPositionEventArgs e)
        {
        }
        /// 
        /// PromoteTab NextBlockPosition
        /// 
        /// 
        /// 
        /// 
        internal virtual Rectangle NextBlockPosition(BaseItem item, BaseItem vItem)
        {
            Rectangle r = item.Bounds;
            if (IsVertical == true)
            {
                r.X = vItem.Bounds.X;
                r.Y += item.Bounds.Height;
            }
            else
            {
                r.X += item.Bounds.Width;
                r.Y = vItem.Bounds.Y;
            }
            r.Size = vItem.Size;
            return (r);
        }
        #endregion
        #region AllItemsVisible
        /// 
        /// Determines if all tabs are visible
        /// 
        /// 
        private bool AllItemsVisible()
        {
            foreach (BaseItem item in Tabs)
            {
                if (item.Visible == true && item.Displayed == false)
                    return (false);
            }
            return (true);
        }
        #endregion
        #region Paint
        /// 
        /// Paint processing
        /// 
        /// 
        public void Paint(ItemPaintArgs p)
        {
            Rectangle r = _TabStripItem.DisplayRectangle;
            if (r.Width > 0 && r.Height > 0)
            {
                using (SuperTabColorTable ct = GetColorTable())
                {
                    DrawBackground(p, ct);
                    _TabStripItem.OnPaintBackground(p.Graphics, ct);
                    if (Tabs.Count > 0)
                    {
                        // Draw the ControlBox
                        if (_TabStripItem.ControlBox.Visible == true)
                            TabControlBox.Paint(p);
                        if (PreDrawStripBorder == true)
                            DrawStripBorder(p, ct);
                        DrawTabs(p);
                        DrawTabInsertMarker(p, ct);
                        if (PreDrawStripBorder == false)
                            DrawStripBorder(p, ct);
                    }
                }
            }
        }
        #region DrawBackground
        /// 
        /// Draws the background
        /// 
        /// 
        /// 
        protected virtual void DrawBackground(ItemPaintArgs p, SuperTabColorTable ct)
        {
            Graphics g = p.Graphics;
            Rectangle r = _TabStripItem.DisplayRectangle;
            int angle = ct.Background.GradientAngle;
            switch (_TabStripItem.TabAlignment)
            {
                case eTabStripAlignment.Bottom:
                    angle += 180;
                    r.Y -= 1;
                    break;
                case eTabStripAlignment.Left:
                    angle += -90;
                    break;
                case eTabStripAlignment.Right:
                    angle += 90;
                    r.X -= 1;
                    break;
            }
            using (Brush lbr = ct.Background.GetBrush(r, angle))
            {
                if (lbr != null)
                    g.FillRectangle(lbr, r);
            }
        }
        #endregion
        #region DrawTabs
        /// 
        /// Draws the tabs
        /// 
        /// 
        protected virtual void DrawTabs(ItemPaintArgs p)
        {
            // Draw all but the selected tab item
            for (int i = Tabs.Count - 1; i >= 0; i--)
            {
                BaseItem item = Tabs[i];
                if (item != null && item.Displayed == true)
                {
                    if (p.ClipRectangle.IntersectsWith(item.DisplayRectangle))
                    {
                        SuperTabItem tab = item as SuperTabItem;
                        if (tab == null || tab.IsSelected == false)
                            item.Paint(p);
                    }
                }
            }
            // Draw the selected tab
            if (SelectedTab != null && SelectedTab.Displayed == true)
                SelectedTab.Paint(p);
            
            // Lastly draw tab insert markers
            for (int i = Tabs.Count - 1; i >= 0; i--)
            {
                BaseItem item = Tabs[i];
                if (item != null && item.Displayed == true)
                    item.DrawInsertMarker(p.Graphics);
            }
        }
        #endregion
        #region DrawTabInsertMarker
        #region DrawTabInsertMarker
        /// 
        /// Draws the Drag and Drop insert marker
        /// 
        /// ItemPaintArgs
        /// Color table
        private void DrawTabInsertMarker(ItemPaintArgs p, SuperTabColorTable ct)
        {
            if (_TabStripItem.InsertTab != null)
            {
                if (_InsertMarkerColor != ct.InsertMarker)
                {
                    if (_TopInsertMarker != null)
                    {
                        _TopInsertMarker.Dispose();
                        _TopInsertMarker = null;
                    }
                    if (_LeftInsertMarker != null)
                    {
                        _LeftInsertMarker.Dispose();
                        _LeftInsertMarker = null;
                    }
                    _InsertMarkerColor = ct.InsertMarker;
                }
                switch (_TabStripItem.TabAlignment)
                {
                    case eTabStripAlignment.Top:
                    case eTabStripAlignment.Bottom:
                        DrawTopInsertMarker(p.Graphics);
                        break;
                    case eTabStripAlignment.Left:
                    case eTabStripAlignment.Right:
                        DrawLeftInsertMarker(p.Graphics);
                        break;
                }
            }
        }
        #endregion
        #region DrawTopInsertMarker
        /// 
        /// Draws the top insert marker
        /// 
        /// 
        private void DrawTopInsertMarker(Graphics g)
        {
            Rectangle r = GetTopInsertRect();
            Bitmap b = GetTopInsertMarker(g);
            g.DrawImageUnscaled(b, r);
        }
        #region GetTopInsertRect
        private Rectangle GetTopInsertRect()
        {
            BaseItem item = _TabStripItem.InsertTab;
            SuperTabStripBaseDisplay tabDisplay = _TabStripItem.TabDisplay;
            int x1 = item.Bounds.X;
            int x2 = item.Bounds.Right;
            int n = Tabs.IndexOf(item);
            if (n > 0)
            {
                int p = _TabStripItem.GetPrevVisibleTab(Tabs, n - 1);
                if (p >= 0)
                {
                    if (IsSameLine(item, Tabs[p]) == true)
                    {
                        if (tabDisplay.TabOverlap > 0)
                        {
                            if (tabDisplay.TabOverlapLeft == true)
                                x1 = Tabs[p].Bounds.Right;
                        }
                        else
                        {
                            x1 = (item.Bounds.X + Tabs[p].Bounds.Right) / 2;
                        }
                    }
                }
            }
            if (n + 1 < Tabs.Count)
            {
                int p = _TabStripItem.GetNextVisibleTab(Tabs, n + 1);
                if (p >= 0)
                {
                    if (IsSameLine(item, Tabs[p]) == true)
                    {
                        if (tabDisplay.TabOverlap > 0)
                        {
                            if (tabDisplay.TabOverlapLeft == false)
                                x2 = Tabs[p].Bounds.X;
                        }
                        else
                        {
                            x2 = (item.Bounds.Right + Tabs[p].Bounds.X) / 2;
                        }
                    }
                }
            }
            Rectangle r = item.Bounds;
            r.X = x1;
            r.Width = x2 - x1;
            r.Height = MarkerSize;
            if (_TabStripItem.InsertBefore == true)
            {
                r.X -= MarkerSize / 2;
                if (r.X < 0)
                    r.X = 0;
            }
            else
            {
                r.X = r.Right - MarkerSize / 2;
                if (r.X + MarkerSize > _TabStripItem.Bounds.Right)
                    r.X = _TabStripItem.Bounds.Right - MarkerSize;
            }
            r.Width = MarkerSize;
            return (r);
        }
        #endregion
        #region GetTopInsertMarker
        private Bitmap GetTopInsertMarker(Graphics g)
        {
            if (_TopInsertMarker == null)
                _TopInsertMarker = CreateTopInsertMarker(g);
            return (_TopInsertMarker);
        }
        #endregion
        #region CreateTopInsertMarker
        private Bitmap CreateTopInsertMarker(Graphics g)
        {
            Bitmap bmp = new Bitmap(MarkerSize, MarkerSize, g);
            using (Graphics gBmp = Graphics.FromImage(bmp))
            {
                gBmp.SmoothingMode = g.SmoothingMode;
                using (GraphicsPath path = new GraphicsPath())
                {
                    path.AddPolygon(new Point[]
                    {
                        new Point(6, 0),
                        new Point(6, 5),
                        new Point(9, 5),
                        new Point(5, 9),
                        new Point(4, 9),
                        new Point(0, 5),
                        new Point(3, 5),
                        new Point(3, 0),
                        new Point(6, 0),
                    });
                    path.CloseFigure();
                    Color color = Color.FromArgb(200, _InsertMarkerColor);
                    using (SolidBrush br = new SolidBrush(color))
                        gBmp.FillPath(br, path);
                    using (Pen pen = new Pen(color))
                        gBmp.DrawPath(pen, path);
                }
            }
            return (bmp);
        }
        #endregion
        #endregion
        #region DrawLeftInsertMarker
        /// 
        /// Draws the left insert marker
        /// 
        /// 
        private void DrawLeftInsertMarker(Graphics g)
        {
            Rectangle r = GetLeftInsertRect();
            Bitmap b = GetLeftInsertMarker(g);
            g.DrawImageUnscaled(b, r);
        }
        #region GetLeftInsertRect
        private Rectangle GetLeftInsertRect()
        {
            BaseItem item = _TabStripItem.InsertTab;
            SuperTabStripBaseDisplay tabDisplay = _TabStripItem.TabDisplay;
            int y1 = item.Bounds.Y;
            int y2 = item.Bounds.Bottom;
            int n = Tabs.IndexOf(item);
            if (n > 0)
            {
                if (IsSameLine(item, Tabs[n - 1]) == true)
                {
                    if (tabDisplay.TabOverlap > 0)
                    {
                        if (tabDisplay.TabOverlapLeft == true)
                            y1 = Tabs[n - 1].Bounds.Bottom;
                    }
                    else
                    {
                        y1 = (item.Bounds.Y + Tabs[n - 1].Bounds.Bottom) / 2;
                    }
                }
            }
            if (n + 1 < Tabs.Count)
            {
                if (IsSameLine(item, Tabs[n + 1]) == true)
                {
                    if (tabDisplay.TabOverlap > 0)
                    {
                        if (tabDisplay.TabOverlapLeft == false)
                            y2 = Tabs[n + 1].Bounds.Y;
                    }
                    else
                    {
                        y2 = (item.Bounds.Bottom + Tabs[n + 1].Bounds.Y) / 2;
                    }
                }
            }
            Rectangle r = item.Bounds;
            r.Y = y1;
            r.Height = y2 - y1;
            r.Width = MarkerSize;
            if (_TabStripItem.InsertBefore == true)
            {
                r.Y -= MarkerSize / 2;
                if (r.Y < 0)
                    r.Y = 0;
            }
            else
            {
                r.Y = r.Bottom - MarkerSize / 2;
                if (r.Y + MarkerSize > _TabStripItem.Bounds.Bottom)
                    r.Y = _TabStripItem.Bounds.Bottom - MarkerSize;
            }
            r.Height = MarkerSize;
            return (r);
        }
        #endregion
        #region GetLeftInsertMarker
        private Bitmap GetLeftInsertMarker(Graphics g)
        {
            if (_LeftInsertMarker == null)
                _LeftInsertMarker = CreateLeftInsertMarker(g);
            return (_LeftInsertMarker);
        }
        #endregion
        #region CreateLeftInsertMarker
        private Bitmap CreateLeftInsertMarker(Graphics g)
        {
            Bitmap bmp = new Bitmap(MarkerSize, MarkerSize, g);
            using (Graphics gBmp = Graphics.FromImage(bmp))
            {
                gBmp.SmoothingMode = g.SmoothingMode;
                using (GraphicsPath path = new GraphicsPath())
                {
                    path.AddPolygon(new Point[]
                     {
                         new Point(0, 6),
                         new Point(5, 6),
                         new Point(5, 9),
                         new Point(9, 5),
                         new Point(9, 4),
                         new Point(5, 0),
                         new Point(5, 3),
                         new Point(0, 3),
                         new Point(0, 6),
                     });
                    path.CloseFigure();
                    Color color = Color.FromArgb(200, _InsertMarkerColor);
                    using (SolidBrush br = new SolidBrush(color))
                        gBmp.FillPath(br, path);
                    using (Pen pen = new Pen(color))
                        gBmp.DrawPath(pen, path);
                }
            }
            return (bmp);
        }
        #endregion
        #endregion
        #region IsSameLine
        /// 
        /// Determines if the given items are on the same line
        /// 
        /// 
        /// 
        /// 
        private bool IsSameLine(BaseItem item1, BaseItem item2)
        {
            if (_TabStripItem.TabLines == 1)
                return (true);
            switch (_TabStripItem.TabAlignment)
            {
                case eTabStripAlignment.Top:
                    return (item1.Bounds.Bottom == item2.Bounds.Bottom);
                case eTabStripAlignment.Left:
                    return (item1.Bounds.Right == item2.Bounds.Right);
                case eTabStripAlignment.Bottom:
                    return (item1.Bounds.Top == item2.Bounds.Top);
                default:
                    return (item1.Bounds.Left == item2.Bounds.Left);
            }
        }
        #endregion
        #endregion
        #region DrawStripBorder
        /// 
        /// Draws the TabStrip border
        /// 
        /// 
        /// 
        protected virtual void DrawStripBorder(ItemPaintArgs p, SuperTabColorTable ct)
        {
            Graphics g = p.Graphics;
            SuperTabItem selTab = TabStripItem.SelectedTab;
            Rectangle r = TabStripItem.Bounds;
            Rectangle t = (selTab != null) ? selTab.DisplayRectangle : Rectangle.Empty;
            Color iColor = ct.InnerBorder;
            Color oColor = ct.OuterBorder;
            if (selTab != null)
            {
                if (SuperTabStyleColorFactory.IsOfficeMobile2014Color(selTab.PredefinedColor))
                {
                    SuperTabLinearGradientColorTable lgt =
                       SuperTabStyleColorFactory.GetPredefinedSelectedBackground(selTab.PredefinedColor, new ColorFactory());
                    iColor = (lgt.Colors != null && lgt.Colors.Length > 0)
                        ? lgt.Colors[lgt.Colors.Length - 1] : Color.DimGray;
                    oColor = iColor;
                }
            }
            using (Pen iPen = new Pen(iColor))
            {
                using (Pen oPen = new Pen(oColor))
                {
                    int inner, outer;
                    GetBorderLines(out inner, out outer);
                    switch (TabStripItem.TabAlignment)
                    {
                        case eTabStripAlignment.Top:
                        case eTabStripAlignment.Bottom:
                            if (t.X > r.X)
                            {
                                g.DrawLine(iPen, r.X, inner, t.X + 1, inner);
                                g.DrawLine(oPen, r.X, outer, t.X, outer);
                            }
                            if (t.Right < r.Right)
                            {
                                g.DrawLine(iPen, t.Right - 2, inner, r.Right - 1, inner);
                                g.DrawLine(oPen, t.Right, outer, r.Right - 2, outer);
                            }
                            g.DrawLine(oPen, r.X, outer, r.X, inner);
                            g.DrawLine(oPen, r.Right - 1, outer, r.Right - 1, inner);
                            break;
                        case eTabStripAlignment.Left:
                        case eTabStripAlignment.Right:
                            if (t.Y > 0)
                            {
                                g.DrawLine(iPen, inner, r.Y, inner, t.Y + 1);
                                g.DrawLine(oPen, outer, r.Y, outer, t.Y);
                            }
                            if (t.Bottom < r.Bottom)
                            {
                                g.DrawLine(iPen, inner, t.Bottom - 2, inner, r.Bottom - 1);
                                g.DrawLine(oPen, outer, t.Bottom - 1, outer, r.Bottom - 1);
                            }
                            g.DrawLine(oPen, inner, r.Y, outer, r.Y);
                            g.DrawLine(oPen, inner, r.Bottom - 1, outer, r.Bottom - 1);
                            break;
                    }
                }
            }
        }
        #region GetBorderLines
        /// 
        /// Gets the inner and outer border lines
        /// 
        /// 
        /// 
        private void GetBorderLines(out int inner, out int outer)
        {
            Rectangle r = TabStripItem.Bounds;
            switch (TabStripItem.TabAlignment)
            {
                case eTabStripAlignment.Top:
                    inner = r.Bottom - 1;
                    outer = r.Bottom - 2;
                    break;
                case eTabStripAlignment.Bottom:
                    inner = r.Y;
                    outer = r.Y + 1;
                    break;
                case eTabStripAlignment.Left:
                    inner = r.Right - 1;
                    outer = r.Right - 2;
                    break;
                default:
                    inner = r.X;
                    outer = r.X + 1;
                    break;
            }
        }
        #endregion
        #endregion
        #endregion
        #region SetDefaultColorTable
        /// 
        /// Sets the default color table
        /// 
        internal void SetDefaultColorTable()
        {
            DefaultColorTable =
                SuperTabStyleColorFactory.GetColorTable(TabStrip.TabStyle, ColorFactory.Empty);
        }
        #endregion
        #region GetColorTable
        /// 
        /// Gets the tab color table
        /// 
        /// Tab color table
        internal virtual SuperTabColorTable GetColorTable()
        {
            SuperTabColorTable ct = TabStripItem.TabStripColor;
            SuperTabColorTable sct = (SuperTabColorTable)_DefaultColorTable.Clone();
            
            if (ct != null)
            {
                if (ct.Background.IsEmpty == false)
                    sct.Background = ct.Background;
                if (ct.InnerBorder != Color.Empty)
                    sct.InnerBorder = ct.InnerBorder;
                if (ct.OuterBorder != Color.Empty)
                    sct.OuterBorder = ct.OuterBorder;
                GetControlBoxColors(sct.ControlBoxDefault, ct.ControlBoxDefault);
                GetControlBoxColors(sct.ControlBoxMouseOver, ct.ControlBoxMouseOver);
                GetControlBoxColors(sct.ControlBoxPressed, ct.ControlBoxPressed);
                if (ct.InsertMarker != Color.Empty)
                    sct.InsertMarker = ct.InsertMarker;
                if (ct.SelectionMarker != Color.Empty)
                    sct.SelectionMarker = ct.SelectionMarker;
            }
            if (SelectedTab != null)
            {
                if (SuperTabStyleColorFactory.IsOfficeMobile2014Color(SelectedTab.PredefinedColor) == true)
                {
                    SuperTabItemStateColorTable tct = SelectedTab.GetTabColorTableEx(eTabState.Selected);
                    if (tct != null)
                    {
                        if (tct.InnerBorder != Color.Empty)
                            sct.InnerBorder = tct.InnerBorder;
                        if (tct.OuterBorder != Color.Empty)
                            sct.OuterBorder = tct.OuterBorder;
                    }
                }
            }
            return (sct);
        }
        private void GetControlBoxColors(
            SuperTabControlBoxStateColorTable sbc, SuperTabControlBoxStateColorTable bc)
        {
            if (bc.Background != Color.Empty)
                sbc.Background = bc.Background;
            if (bc.Border != Color.Empty)
                sbc.Border = bc.Border;
            if (bc.Image != Color.Empty)
                sbc.Image = bc.Image;
        }
        #endregion
        #region GetCloseButton
        /// 
        /// Gets the tab close button bitmap
        /// 
        /// 
        /// 
        /// 
        public Bitmap GetCloseButton(Graphics g, Color color)
        {
            if (color != _CloseButtonColor && _CloseButton != null)
            {
                _CloseButton.Dispose();
                _CloseButton = null;
            }
            _CloseButtonColor = color;
            if (_CloseButton == null)
                _CloseButton = CreateCloseButton(g);
            return (_CloseButton);
        }
        #region CreateCloseButton
        /// 
        /// Creates the tab close button bitmap
        /// 
        /// 
        /// 
        public virtual Bitmap CreateCloseButton(Graphics g)
        {
            Bitmap bmp = new Bitmap(Dpi.Width16, Dpi.Height16, g);
            using (Graphics gBmp = Graphics.FromImage(bmp))
            {
                gBmp.CompositingQuality = CompositingQuality.HighQuality;
                gBmp.SmoothingMode = g.SmoothingMode;
                using (Pen pen = new Pen(_CloseButtonColor, Dpi.Width2))
                {
                    gBmp.DrawLine(pen, new Point(Dpi.Width3, Dpi.Height3), new Point(Dpi.Width11, Dpi.Height11));
                    gBmp.DrawLine(pen, new Point(Dpi.Width11, Dpi.Height3), new Point(Dpi.Width3, Dpi.Height11));
                }
            }
            return (bmp);
        }
        #endregion
        #endregion
        #region GetMenuButton1
        /// 
        /// Gets the Menu button bitmap
        /// 
        /// 
        /// 
        /// 
        public Bitmap GetMenuButton1(Graphics g, Color color)
        {
            if (color != _MenuButtonColor)
            {
                if (_MenuButton1 != null)
                {
                    _MenuButton1.Dispose();
                    _MenuButton1 = null;
                }
                if (_MenuButton2 != null)
                {
                    _MenuButton2.Dispose();
                    _MenuButton2 = null;
                }
            }
            _MenuButtonColor = color;
            if (_MenuButton1 == null)
                _MenuButton1 = CreateMenuButton1(g);
            return (_MenuButton1);
        }
        #region CreateMenuButton1
        /// 
        /// Create the Menu button bitmap
        /// 
        /// 
        /// 
        public virtual Bitmap CreateMenuButton1(Graphics g)
        {
            Bitmap bmp = new Bitmap(Dpi.Width16, Dpi.Height16, g);
            using (Graphics gBmp = Graphics.FromImage(bmp))
            {
                gBmp.CompositingQuality = CompositingQuality.HighQuality;
                gBmp.SmoothingMode = g.SmoothingMode;
                using (GraphicsPath path = GetMenuButtonPath1())
                {
                    using (Brush br = new SolidBrush(_MenuButtonColor))
                        gBmp.FillPath(br, path);
                    using (Pen pen = new Pen(_MenuButtonColor))
                        gBmp.DrawPath(pen, path);
                }
            }
            return (bmp);
        }
        #endregion
        #region GetMenuButtonPath1
        /// 
        /// Gets the Menu button path
        /// 
        /// 
        private GraphicsPath GetMenuButtonPath1()
        {
            GraphicsPath path = new GraphicsPath();
            path.AddLines(new Point[] 
            {
                new Point(Dpi.Width4, Dpi.Height5), 
                new Point(Dpi.Width8, Dpi.Height9), 
                new Point(Dpi.Width12, Dpi.Height5) 
            });
            path.CloseAllFigures();
            return (path);
        }
        #endregion
        #endregion
        #region GetMenuButton2
        /// 
        /// Gets the Menu button bitmap
        /// 
        /// 
        /// 
        /// 
        public Bitmap GetMenuButton2(Graphics g, Color color)
        {
            if (color != _MenuButtonColor)
            {
                if (_MenuButton1 != null)
                {
                    _MenuButton1.Dispose();
                    _MenuButton1 = null;
                }
                if (_MenuButton2 != null)
                {
                    _MenuButton2.Dispose();
                    _MenuButton2 = null;
                }
            }
            _MenuButtonColor = color;
            if (_MenuButton2 == null)
                _MenuButton2 = CreateMenuButton2(g);
            return (_MenuButton2);
        }
        #region CreateMenuButton2
        /// 
        /// Create the Menu button bitmap
        /// 
        /// 
        /// 
        public virtual Bitmap CreateMenuButton2(Graphics g)
        {
            Bitmap bmp = new Bitmap(Dpi.Width16, Dpi.Height16, g);
            using (Graphics gBmp = Graphics.FromImage(bmp))
            {
                gBmp.CompositingQuality = CompositingQuality.HighQuality;
                gBmp.SmoothingMode = g.SmoothingMode;
                using (GraphicsPath path = GetMenuButtonPath2())
                {
                    using (Brush br = new SolidBrush(_MenuButtonColor))
                        gBmp.FillPath(br, path);
                    using (Pen pen = new Pen(_MenuButtonColor))
                        gBmp.DrawPath(pen, path);
                }
            }
            return (bmp);
        }
        #endregion
        #region GetMenuButtonPath2
        /// 
        /// Gets the Menu button path
        /// 
        /// 
        private GraphicsPath GetMenuButtonPath2()
        {
            GraphicsPath path = new GraphicsPath();
            path.AddLines(new Point[]
            {
                new Point(Dpi.Width3, Dpi.Height4),
                new Point(Dpi.Width6, Dpi.Height7),
                new Point(Dpi.Width3, Dpi.Height11)
            });
            path.CloseFigure();
            path.AddLines(new Point[]
            {
                new Point(Dpi.Width9, Dpi.Height4),
                new Point(Dpi.Width12, Dpi.Height7),
                new Point(Dpi.Width9, Dpi.Height11)
            });
            path.CloseFigure();
            return (path);
        }
        #endregion
        #endregion
    }
}
#endif