1727 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1727 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Constructor
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="tabStripItem">Associated SuperTabStripItem</param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabAlignment
 | 
						|
        /// </summary>
 | 
						|
        internal eTabStripAlignment Alignment
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.TabAlignment); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DefaultColorTable
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// gets or sets the default color table
 | 
						|
        /// </summary>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets if display is RightToLeft
 | 
						|
        /// </summary>
 | 
						|
        internal bool IsRightToLeft
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.IsRightToLeft); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsVertical
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets tab vertical orientation
 | 
						|
        /// </summary>
 | 
						|
        internal bool IsVertical
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.IsVertical); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MinTabStripHeight
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the minimum TabStrip height
 | 
						|
        /// </summary>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether we are to show the Focus rectangle
 | 
						|
        /// </summary>
 | 
						|
        internal bool ShowFocusRectangle
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.ShowFocusRectangle); }   // && _TabStripItem.Focused
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Tab properties
 | 
						|
 | 
						|
        #region CloseButtonOnTabs
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets CloseButtonOnTabsVisible
 | 
						|
        /// </summary>
 | 
						|
        internal bool CloseButtonOnTabs
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.CloseButtonOnTabsVisible); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region FixedTabSize
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets FixedTabSize
 | 
						|
        /// </summary>
 | 
						|
        internal Size FixedTabSize
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.FixedTabSize); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MinTabSize
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the minimum tab size
 | 
						|
        /// </summary>
 | 
						|
        internal virtual Size MinTabSize
 | 
						|
        {
 | 
						|
            get { return Dpi.Size(new Size(13, 13)); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region SelectedTab
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the selected tab
 | 
						|
        /// </summary>
 | 
						|
        internal SuperTabItem SelectedTab
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.SelectedTab); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region SelectedTabFont
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the selected font
 | 
						|
        /// </summary>
 | 
						|
        internal Font SelectedTabFont
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.SelectedTabFont); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TabControlBox
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab ControlBox
 | 
						|
        /// </summary>
 | 
						|
        internal SuperTabControlBox TabControlBox
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.ControlBox); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TabHeight
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab height
 | 
						|
        /// </summary>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab bounds
 | 
						|
        /// </summary>
 | 
						|
        internal Rectangle TabItemsBounds
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.TabItemsBounds); }
 | 
						|
            set { _TabStripItem.TabItemsBounds = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Tabs
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Tabs collection
 | 
						|
        /// </summary>
 | 
						|
        internal SubItemsCollection Tabs
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem.SubItems); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TabStrip
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabStrip
 | 
						|
        /// </summary>
 | 
						|
        internal SuperTabStrip TabStrip
 | 
						|
        {
 | 
						|
            get { return (TabStripItem.TabStrip); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TabStripItem
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabStripItem
 | 
						|
        /// </summary>
 | 
						|
        internal SuperTabStripItem TabStripItem
 | 
						|
        {
 | 
						|
            get { return (_TabStripItem); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Virtual properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        ///  Gets the PreDrawStripBorder state
 | 
						|
        /// </summary>
 | 
						|
        internal virtual bool PreDrawStripBorder
 | 
						|
        {
 | 
						|
            get { return (false); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        ///  Gets the SelectedPaddingWidth
 | 
						|
        /// </summary>
 | 
						|
        internal virtual int SelectedPaddingWidth
 | 
						|
        {
 | 
						|
            get { return (0); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabOverlap
 | 
						|
        /// </summary>
 | 
						|
        internal virtual int TabOverlap
 | 
						|
        {
 | 
						|
            get { return (0); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabSpacing
 | 
						|
        /// </summary>
 | 
						|
        internal virtual int TabSpacing
 | 
						|
        {
 | 
						|
            get { return (0); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabOverlapLeft
 | 
						|
        /// </summary>
 | 
						|
        internal virtual bool TabOverlapLeft
 | 
						|
        {
 | 
						|
            get { return (false); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the TabLayoutOffset
 | 
						|
        /// </summary>
 | 
						|
        internal virtual Size TabLayoutOffset
 | 
						|
        {
 | 
						|
            get { return (Size.Empty); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Events
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles ContentManager NextPosition events
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles RecalcSize requests
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles RecLayoutContent requests
 | 
						|
        /// </summary>
 | 
						|
        internal virtual void RecLayoutContent()
 | 
						|
        {
 | 
						|
            if (TabControlBox.MenuBox.AutoHide == true && TabControlBox.Visible == true)
 | 
						|
            {
 | 
						|
                RecalcLayout(GetTabClientArea(false));
 | 
						|
 | 
						|
                TabControlBox.MenuBox.Visible = !AllItemsVisible();
 | 
						|
            }
 | 
						|
 | 
						|
            RecalcLayout(GetTabClientArea());
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RecalcLayoutInit
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes the layout engine
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Performs the Recalc Layout
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="r"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Recalculates the bounds for the TabControlBox
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="dispRect"></param>
 | 
						|
        /// <param name="tabsBounds"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab client area
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        protected virtual Rectangle GetTabClientArea()
 | 
						|
        {
 | 
						|
            return (GetTabClientArea(TabControlBox.MenuBox.Visible));
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab client area
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab height
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Layout manager NextBlockPosition
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        protected virtual void NextBlockPosition(LayoutManagerPositionEventArgs e)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// PromoteTab NextBlockPosition
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item"></param>
 | 
						|
        /// <param name="vItem"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Determines if all tabs are visible
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        private bool AllItemsVisible()
 | 
						|
        {
 | 
						|
            foreach (BaseItem item in Tabs)
 | 
						|
            {
 | 
						|
                if (item.Visible == true && item.Displayed == false)
 | 
						|
                    return (false);
 | 
						|
            }
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Paint
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Paint processing
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="p"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the background
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="p"></param>
 | 
						|
        /// <param name="ct"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the tabs
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="p"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the Drag and Drop insert marker
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="p">ItemPaintArgs</param>
 | 
						|
        /// <param name="ct">Color table</param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the top insert marker
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the left insert marker
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Determines if the given items are on the same line
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item1"></param>
 | 
						|
        /// <param name="item2"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Draws the TabStrip border
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="p"></param>
 | 
						|
        /// <param name="ct"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the inner and outer border lines
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inner"></param>
 | 
						|
        /// <param name="outer"></param>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the default color table
 | 
						|
        /// </summary>
 | 
						|
        internal void SetDefaultColorTable()
 | 
						|
        {
 | 
						|
            DefaultColorTable =
 | 
						|
                SuperTabStyleColorFactory.GetColorTable(TabStrip.TabStyle, ColorFactory.Empty);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetColorTable
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab color table
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>Tab color table</returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the tab close button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="color"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Creates the tab close button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Menu button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="color"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Create the Menu button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Menu button path
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Menu button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <param name="color"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Create the Menu button bitmap
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Menu button path
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        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 |