520 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			520 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Drawing.Text;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Represents base class for tab display.
 | 
						|
	/// </summary>
 | 
						|
	internal class TabStripBaseDisplay
 | 
						|
	{
 | 
						|
		#region Private Variables
 | 
						|
		private bool m_AntiAlias=true;
 | 
						|
		private bool m_HorizontalText=false;
 | 
						|
        private bool m_CloseButtonOnTabs = false;
 | 
						|
        private Size m_TabCloseButtonSize = new Size(11, 11);
 | 
						|
        private int m_TabCloseButtonSpacing = 3;
 | 
						|
		#endregion
 | 
						|
 | 
						|
		public TabStripBaseDisplay()
 | 
						|
		{
 | 
						|
		}
 | 
						|
 | 
						|
		#region Methods
 | 
						|
		/// <summary>
 | 
						|
		/// Main method for painting.
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="g">Reference to graphics object</param>
 | 
						|
		/// <param name="tabStrip">TabStrip to paint</param>
 | 
						|
		public virtual void Paint(Graphics g, TabStrip tabStrip)
 | 
						|
		{
 | 
						|
			if(this.AntiAlias)
 | 
						|
			{
 | 
						|
				g.SmoothingMode=SmoothingMode.AntiAlias;
 | 
						|
                g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void PaintTab(Graphics g, TabItem tab, bool first, bool last)
 | 
						|
		{
 | 
						|
			if(!tab.Visible)
 | 
						|
				return;
 | 
						|
 | 
						|
            if (tab.Parent!=null && tab.Parent.HasPreRenderTabItem)
 | 
						|
            {
 | 
						|
                RenderTabItemEventArgs re = new RenderTabItemEventArgs(tab, g);
 | 
						|
                tab.Parent.InvokePreRenderTabItem(re);
 | 
						|
                if (re.Cancel) return;
 | 
						|
            }
 | 
						|
 | 
						|
            using (GraphicsPath path = GetTabItemPath(tab, first, last))
 | 
						|
            {
 | 
						|
                TabColors colors = tab.Parent.GetTabColors(tab);
 | 
						|
 | 
						|
                DrawTabItemBackground(tab, path, colors, g);
 | 
						|
 | 
						|
                DrawTabText(tab, colors, g);
 | 
						|
            }
 | 
						|
 | 
						|
            if (tab.Parent != null && tab.Parent.HasPostRenderTabItem)
 | 
						|
            {
 | 
						|
                RenderTabItemEventArgs re = new RenderTabItemEventArgs(tab, g);
 | 
						|
                tab.Parent.InvokePostRenderTabItem(re);
 | 
						|
            }
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual Region GetTabsRegion(TabsCollection tabs, TabItem lastTab)
 | 
						|
		{
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void DrawTabItemBackground(TabItem tab, GraphicsPath path, TabColors colors, Graphics g)
 | 
						|
		{
 | 
						|
			RectangleF rf=path.GetBounds();
 | 
						|
			Rectangle tabRect=new Rectangle((int)rf.X, (int)rf.Y, (int)rf.Width, (int)rf.Height);
 | 
						|
 | 
						|
            SmoothingMode sm = g.SmoothingMode;
 | 
						|
            g.SmoothingMode = SmoothingMode.Default;
 | 
						|
 | 
						|
            eBackgroundColorBlendType blendType = colors.BackgroundColorBlend.GetBlendType();
 | 
						|
            int ga = colors.BackColorGradientAngle;
 | 
						|
            if (tab.TabAlignment == eTabStripAlignment.Left || tab.TabAlignment == eTabStripAlignment.Right)
 | 
						|
                ga -= 90;
 | 
						|
 | 
						|
            if (blendType != eBackgroundColorBlendType.Invalid)
 | 
						|
            {
 | 
						|
                if (blendType == eBackgroundColorBlendType.Relative)
 | 
						|
                {
 | 
						|
                    if (!colors.BackColor.IsEmpty || !colors.BackColor2.IsEmpty)
 | 
						|
                    {
 | 
						|
                        try
 | 
						|
                        {
 | 
						|
                            Rectangle rb = Rectangle.Ceiling(rf);
 | 
						|
                            rb.Inflate(1, 1);
 | 
						|
                            using (LinearGradientBrush brush = DisplayHelp.CreateLinearGradientBrush(rb, colors.BackColor, colors.BackColor2, ga))
 | 
						|
                            {
 | 
						|
                                brush.InterpolationColors = colors.BackgroundColorBlend.GetColorBlend();
 | 
						|
                                g.FillPath(brush, path);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        catch
 | 
						|
                        {
 | 
						|
                            blendType = eBackgroundColorBlendType.Invalid;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    Rectangle bounds = Rectangle.Ceiling(rf);
 | 
						|
                    BackgroundColorBlendCollection bc = colors.BackgroundColorBlend;
 | 
						|
                    Region oldClip = g.Clip;
 | 
						|
                    g.SetClip(path, CombineMode.Intersect);
 | 
						|
                    for (int i = 0; i < bc.Count; i += 2)
 | 
						|
                    {
 | 
						|
                        BackgroundColorBlend b1 = bc[i];
 | 
						|
                        BackgroundColorBlend b2 = null;
 | 
						|
                        if (i < bc.Count)
 | 
						|
                            b2 = bc[i + 1];
 | 
						|
                        if (b1 != null && b2 != null)
 | 
						|
                        {
 | 
						|
                            Rectangle rb = new Rectangle(bounds.X, bounds.Y + (int)b1.Position, bounds.Width,
 | 
						|
                                (b2.Position == 1f ? bounds.Height : (int)b2.Position) - (int)b1.Position);
 | 
						|
                            using (LinearGradientBrush brush = DisplayHelp.CreateLinearGradientBrush(rb, b1.Color, b2.Color, ga))
 | 
						|
                                g.FillRectangle(brush, rb);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    g.Clip = oldClip;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (blendType == eBackgroundColorBlendType.Invalid)
 | 
						|
            {
 | 
						|
                if (colors.BackColor2.IsEmpty)
 | 
						|
                {
 | 
						|
                    if (!colors.BackColor.IsEmpty)
 | 
						|
                    {
 | 
						|
                        using (SolidBrush brush = new SolidBrush(colors.BackColor))
 | 
						|
                            g.FillPath(brush, path);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    using (SolidBrush brush = new SolidBrush(Color.White))
 | 
						|
                        g.FillPath(brush, path);
 | 
						|
                    using (LinearGradientBrush brush = CreateTabGradientBrush(tabRect, colors.BackColor, colors.BackColor2, ga))
 | 
						|
                        g.FillPath(brush, path);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            g.SmoothingMode = sm;
 | 
						|
 | 
						|
            DrawTabBorder(tab, path, colors, g);
 | 
						|
		}
 | 
						|
 | 
						|
        protected virtual void DrawTabBorder(TabItem tab, GraphicsPath path, TabColors colors, Graphics g)
 | 
						|
        {
 | 
						|
            if (!colors.BorderColor.IsEmpty)
 | 
						|
            {
 | 
						|
                using (Pen pen = new Pen(colors.BorderColor, 1))
 | 
						|
                    g.DrawPath(pen, path);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
		protected virtual LinearGradientBrush CreateTabGradientBrush(Rectangle r,Color color1,Color color2,int gradientAngle)
 | 
						|
		{
 | 
						|
			if(r.Width<=0)
 | 
						|
				r.Width=1;
 | 
						|
			if(r.Height<=0)
 | 
						|
				r.Height=1;
 | 
						|
			LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(r.X,r.Y-1,r.Width,r.Height+1),color1,color2,gradientAngle);
 | 
						|
			return brush;
 | 
						|
		}
 | 
						|
 | 
						|
        private Rectangle DrawCloseButton(Graphics g, bool vertical, bool mouseOver, bool isSelected, ref Rectangle tabRect, TabStrip tabStrip)
 | 
						|
        {
 | 
						|
            return DrawCloseButton(g, vertical, mouseOver, isSelected, ref tabRect, tabStrip, true);
 | 
						|
        }
 | 
						|
        private Rectangle DrawCloseButton(Graphics g, bool vertical, bool mouseOver, bool isSelected, ref Rectangle tabRect, TabStrip tabStrip, bool performPaint)
 | 
						|
        {
 | 
						|
            Size closeSize = Dpi.Size(m_TabCloseButtonSize);
 | 
						|
            int spacing = m_TabCloseButtonSpacing;
 | 
						|
            bool closeOnLeftSide = (tabStrip.CloseButtonPosition == eTabCloseButtonPosition.Left);
 | 
						|
 | 
						|
            Rectangle close = Rectangle.Empty; //new Rectangle(tabRect.X + spacing, tabRect.Y + (tabRect.Height - closeSize.Height) / 2, closeSize.Width, closeSize.Height);
 | 
						|
 | 
						|
            if (closeOnLeftSide)
 | 
						|
            {
 | 
						|
                if (vertical)
 | 
						|
                    close = new Rectangle(tabRect.X + (tabRect.Width - closeSize.Width) / 2, tabRect.Y + spacing, closeSize.Width, closeSize.Height);
 | 
						|
                else
 | 
						|
                    close = new Rectangle(tabRect.X + spacing, tabRect.Y + (tabRect.Height - closeSize.Height) / 2, closeSize.Width, closeSize.Height);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (vertical)
 | 
						|
                    close = new Rectangle(tabRect.X + (tabRect.Width - closeSize.Width) / 2, tabRect.Bottom - spacing - closeSize.Height, closeSize.Width, closeSize.Height);
 | 
						|
                else
 | 
						|
                    close = new Rectangle(tabRect.Right - spacing - closeSize.Width, tabRect.Y + (tabRect.Height - closeSize.Height) / 2, closeSize.Width, closeSize.Height);
 | 
						|
            }
 | 
						|
            AdjustCloseButtonRectangle(ref close, closeOnLeftSide, vertical);
 | 
						|
            if (performPaint)
 | 
						|
                TabStripBaseDisplay.PaintTabItemCloseButton(g, close, mouseOver, isSelected, tabStrip);
 | 
						|
            if (vertical)
 | 
						|
            {
 | 
						|
                if (closeOnLeftSide)
 | 
						|
                    tabRect.Y += close.Height + spacing * 2;
 | 
						|
                tabRect.Height -= close.Height + spacing * 2;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (closeOnLeftSide)
 | 
						|
                    tabRect.X += close.Width + spacing * 2;
 | 
						|
                tabRect.Width -= close.Width + spacing * 2;
 | 
						|
            }
 | 
						|
 | 
						|
            return close;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void AdjustCloseButtonRectangle(ref Rectangle close, bool closeOnLeftSide, bool vertical) { }
 | 
						|
 | 
						|
        protected virtual void DrawTabText(TabItem tab, TabColors colors, Graphics g)
 | 
						|
        {
 | 
						|
            int MIN_TEXT_WIDTH = 4;
 | 
						|
            eTextFormat strFormat = eTextFormat.Default | eTextFormat.SingleLine | eTextFormat.EndEllipsis | eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter;
 | 
						|
            eTabStripAlignment align = tab.Parent.TabAlignment;
 | 
						|
            Rectangle rText = tab.DisplayRectangle;
 | 
						|
            bool isVertical = ((align == eTabStripAlignment.Left || align == eTabStripAlignment.Right) && !m_HorizontalText);
 | 
						|
 | 
						|
            if (m_CloseButtonOnTabs && tab.CloseButtonVisible)
 | 
						|
            {
 | 
						|
                if (isVertical)
 | 
						|
                {
 | 
						|
                    rText.Y++;
 | 
						|
                    rText.Height--;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    rText.X += 2;
 | 
						|
                    rText.Width -= 2;
 | 
						|
                }
 | 
						|
                bool renderCloseButton = tab.IsSelected || tab.IsMouseOver || tab.Parent.CloseButtonOnTabsAlwaysDisplayed;
 | 
						|
                tab.CloseButtonBounds = DrawCloseButton(g, isVertical, tab.CloseButtonMouseOver, tab.IsSelected, ref rText, tab.Parent, renderCloseButton);
 | 
						|
            }
 | 
						|
 | 
						|
            // Draw image
 | 
						|
            CompositeImage image = GetTabImage(tab);
 | 
						|
            if (image != null && image.Width + 4 <= rText.Width)
 | 
						|
            {
 | 
						|
                if (align == eTabStripAlignment.Top || align == eTabStripAlignment.Bottom || m_HorizontalText)
 | 
						|
                {
 | 
						|
                    image.DrawImage(g, new Rectangle(rText.X + 3, rText.Y + (rText.Height - image.Height) / 2, image.Width, image.Height));
 | 
						|
                    int offset = image.Width + 2;
 | 
						|
                    rText.X += offset;
 | 
						|
                    rText.Width -= offset;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    image.DrawImage(g, new Rectangle(rText.X + (rText.Width - image.Width) / 2, rText.Y + 3, image.Width, image.Height));
 | 
						|
                    int offset = image.Height + 2;
 | 
						|
                    rText.Y += offset;
 | 
						|
                    rText.Height -= offset;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (image != null) image.Dispose();
 | 
						|
 | 
						|
            // Draw text
 | 
						|
            bool isSelected = tab == tab.Parent.SelectedTab;
 | 
						|
            if (!tab.Parent.DisplaySelectedTextOnly || isSelected)
 | 
						|
            {
 | 
						|
                if (!tab.Parent.AntiAlias)
 | 
						|
                    g.TextRenderingHint = TextRenderingHint.SystemDefault;
 | 
						|
 | 
						|
                Font font = tab.Parent.Font;
 | 
						|
                if (isSelected && tab.Parent.SelectedTabFont != null)
 | 
						|
                    font = tab.Parent.SelectedTabFont;
 | 
						|
                AdjustTextRectangle(ref rText, align);
 | 
						|
                if (isVertical)
 | 
						|
                {
 | 
						|
                    g.RotateTransform(90);
 | 
						|
                    rText = new Rectangle(rText.Top, -rText.Right, rText.Height, rText.Width);
 | 
						|
                }
 | 
						|
 | 
						|
                if (rText.Width > MIN_TEXT_WIDTH)
 | 
						|
                {
 | 
						|
                    if ((align == eTabStripAlignment.Left || align == eTabStripAlignment.Right) && !m_HorizontalText)
 | 
						|
                        TextDrawing.DrawStringLegacy(g, tab.Text, font, colors.TextColor, rText, strFormat);
 | 
						|
                    else
 | 
						|
                        TextDrawing.DrawString(g, tab.Text, font, colors.TextColor, rText, strFormat);
 | 
						|
                }
 | 
						|
                //using (Pen pen = new Pen(Color.Red))
 | 
						|
                //    g.DrawRectangle(pen, rText);
 | 
						|
                if (isVertical)
 | 
						|
                    g.ResetTransform();
 | 
						|
                if (!tab.Parent.AntiAlias)
 | 
						|
                    g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
 | 
						|
 | 
						|
                if (tab.Parent.ShowFocusRectangle && tab.Parent.Focused && isSelected)
 | 
						|
                    ControlPaint.DrawFocusRectangle(g, GetFocusRectangle(tab.DisplayRectangle));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void AdjustTextRectangle(ref Rectangle rText, eTabStripAlignment tabAlignment) {}
 | 
						|
 | 
						|
		protected virtual CompositeImage GetTabImage(TabItem tab)
 | 
						|
		{
 | 
						|
			Image image=tab.GetImage();
 | 
						|
			if(image!=null)
 | 
						|
				return new CompositeImage(image,false);
 | 
						|
			Icon icon=tab.Icon;
 | 
						|
			if(icon!=null)
 | 
						|
				return new CompositeImage(icon,false,tab.IconSize);
 | 
						|
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual Rectangle GetFocusRectangle(Rectangle rText)
 | 
						|
		{
 | 
						|
			rText.Inflate(-1,-1);
 | 
						|
			return rText;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual TabItem GetLastVisibleTab(TabsCollection tabs)
 | 
						|
		{
 | 
						|
			int c=tabs.Count-1;
 | 
						|
			for(int i=c;i>=0;i--)
 | 
						|
			{
 | 
						|
				if(tabs[i].Visible)
 | 
						|
					return tabs[i];
 | 
						|
			}
 | 
						|
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
        protected virtual void DrawBackground(TabStrip tabStrip, Rectangle tabStripRect, Graphics g, TabColorScheme colors, Region tabsRegion, eTabStripAlignment tabAlignment, Rectangle selectedTabRect)
 | 
						|
		{
 | 
						|
			if(colors.TabBackground2.IsEmpty)
 | 
						|
			{
 | 
						|
                if (!colors.TabBackground.IsEmpty)
 | 
						|
                {
 | 
						|
                    using (SolidBrush brush = new SolidBrush(colors.TabBackground))
 | 
						|
                        g.FillRegion(brush, tabsRegion);
 | 
						|
                }
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				using(LinearGradientBrush brush=BarFunctions.CreateLinearGradientBrush(tabsRegion.GetBounds(g),colors.TabBackground,colors.TabBackground2,colors.TabBackgroundGradientAngle))
 | 
						|
					g.FillRegion(brush, tabsRegion);
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Tab Path Functions
 | 
						|
		protected virtual GraphicsPath GetTabItemPath(TabItem tab, bool bFirst, bool bLast)
 | 
						|
		{
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual ArcData GetCornerArc(Rectangle bounds, int cornerDiameter, eCornerArc corner)
 | 
						|
		{
 | 
						|
			ArcData a;
 | 
						|
			int diameter=cornerDiameter*2;
 | 
						|
			switch(corner)
 | 
						|
			{
 | 
						|
				case eCornerArc.TopLeft:
 | 
						|
					a=new ArcData(bounds.X,bounds.Y,diameter,diameter,180,90);
 | 
						|
					break;
 | 
						|
				case eCornerArc.TopRight:
 | 
						|
					a=new ArcData(bounds.Right-diameter,bounds.Y,diameter,diameter,270,90);
 | 
						|
					break;
 | 
						|
				case eCornerArc.BottomLeft:
 | 
						|
					a=new ArcData(bounds.X,bounds.Bottom-diameter,diameter,diameter,90,90);
 | 
						|
					break;
 | 
						|
				default: // eCornerArc.BottomRight:
 | 
						|
					a=new ArcData(bounds.Right-diameter,bounds.Bottom-diameter,diameter,diameter,0,90);
 | 
						|
					break;
 | 
						|
			}
 | 
						|
			return a; 
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
 | 
						|
		#region Properties
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets whether anti-alias is used for painting the tabs. Default value is true.
 | 
						|
		/// </summary>
 | 
						|
		public virtual bool AntiAlias
 | 
						|
		{
 | 
						|
			get {return m_AntiAlias;}
 | 
						|
			set {m_AntiAlias=value;}
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// Gets or sets whether text is drawn horizontaly regardless of tab orientation.
 | 
						|
		/// </summary>
 | 
						|
		public bool HorizontalText
 | 
						|
		{
 | 
						|
			get {return m_HorizontalText;}
 | 
						|
			set {m_HorizontalText=value;}
 | 
						|
		}
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether close button is painted on each tab.
 | 
						|
        /// </summary>
 | 
						|
        public bool CloseButtonOnTabs
 | 
						|
        {
 | 
						|
            get { return m_CloseButtonOnTabs; }
 | 
						|
            set { m_CloseButtonOnTabs = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        public int TabCloseButtonSpacing
 | 
						|
        {
 | 
						|
            get { return m_TabCloseButtonSpacing; }
 | 
						|
            set { m_TabCloseButtonSpacing=value; }
 | 
						|
        }
 | 
						|
		#endregion
 | 
						|
 | 
						|
        #region Static Methods
 | 
						|
        public static void PaintTabItemCloseButton(Graphics g, Rectangle r, bool mouseOver, bool isSelected, TabStrip tabStrip)
 | 
						|
        {
 | 
						|
            if (tabStrip.TabCloseButtonNormal != null)
 | 
						|
            {
 | 
						|
                Image image = tabStrip.TabCloseButtonNormal;
 | 
						|
                if (mouseOver && tabStrip.TabCloseButtonHot != null)
 | 
						|
                    image = tabStrip.TabCloseButtonHot;
 | 
						|
                g.DrawImageUnscaled(image, r);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            
 | 
						|
            Color fillColor = tabStrip.ColorScheme.TabItemBorder;
 | 
						|
            Color lineColor = tabStrip.ColorScheme.TabItemBorderLight;
 | 
						|
            if (!fillColor.IsEmpty && Math.Abs(fillColor.GetBrightness() - lineColor.GetBrightness()) <= .38)
 | 
						|
            {
 | 
						|
                lineColor = BarFunctions.Ligten(lineColor, 60);
 | 
						|
                fillColor = BarFunctions.Darken(fillColor, 40);
 | 
						|
            }
 | 
						|
 | 
						|
            if (fillColor.IsEmpty)
 | 
						|
            {
 | 
						|
                if(tabStrip.Style == eTabStripStyle.Office2003)
 | 
						|
                {
 | 
						|
                    fillColor = tabStrip.ColorScheme.TabPanelBackground;
 | 
						|
                    lineColor = tabStrip.ColorScheme.TabItemText;
 | 
						|
                }
 | 
						|
                else if (!tabStrip.ColorScheme.TabItemSelectedBorder.IsEmpty)
 | 
						|
                {
 | 
						|
                    fillColor = tabStrip.ColorScheme.TabItemSelectedBorder;
 | 
						|
                    if (!tabStrip.ColorScheme.TabItemSelectedBorderLight.IsEmpty)
 | 
						|
                        lineColor = tabStrip.ColorScheme.TabItemSelectedBorderLight;
 | 
						|
                    else if (isSelected && fillColor == tabStrip.ColorScheme.TabItemSelectedBackground && !tabStrip.ColorScheme.TabItemSelectedText.IsEmpty)
 | 
						|
                        lineColor = tabStrip.ColorScheme.TabItemSelectedText;
 | 
						|
                    else if (tabStrip.Style == eTabStripStyle.Metro)
 | 
						|
                        lineColor = tabStrip.ColorScheme.TabBackground;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    fillColor = SystemColors.ControlDark;
 | 
						|
                    lineColor = SystemColors.ControlLightLight;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if(lineColor.IsEmpty)
 | 
						|
                lineColor = SystemColors.ControlLightLight;
 | 
						|
 | 
						|
            //if (!fillColor.IsEmpty && Math.Abs(fillColor.GetBrightness() - lineColor.GetBrightness()) <= .38)
 | 
						|
            //{
 | 
						|
            //    if (lineColor.GetBrightness() < .5)
 | 
						|
            //    {
 | 
						|
            //        fillColor = lineColor;
 | 
						|
            //        lineColor = SystemColors.ControlLightLight;
 | 
						|
            //    }
 | 
						|
            //    else
 | 
						|
            //        fillColor = (lineColor.GetBrightness() < .5 ? SystemColors.ControlLightLight : SystemColors.ControlDarkDark);
 | 
						|
            //}
 | 
						|
 | 
						|
            fillColor = Color.FromArgb(mouseOver ? 255 : 200, fillColor);
 | 
						|
 | 
						|
            if ((tabStrip.Style == eTabStripStyle.Metro || tabStrip.Style == eTabStripStyle.Office2003) && !mouseOver)
 | 
						|
            {
 | 
						|
                if (StyleManager.Style == eStyle.Metro || StyleManager.Style == eStyle.OfficeMobile2014 || StyleManager.Style == eStyle.Office2016)
 | 
						|
                    lineColor = fillColor;
 | 
						|
                fillColor = Color.Empty;
 | 
						|
            }
 | 
						|
 | 
						|
            if (!fillColor.IsEmpty)
 | 
						|
            {
 | 
						|
                SmoothingMode sm = g.SmoothingMode;
 | 
						|
                g.SmoothingMode = SmoothingMode.AntiAlias;
 | 
						|
                using (Pen pen = new Pen(Color.White, Dpi.Width1))
 | 
						|
                    g.DrawEllipse(pen, r);
 | 
						|
                using (Pen pen = new Pen(fillColor, Dpi.Width1))
 | 
						|
                {
 | 
						|
                    g.DrawEllipse(pen, r);
 | 
						|
                }
 | 
						|
                using (SolidBrush brush = new SolidBrush(Color.White))
 | 
						|
                    g.FillEllipse(brush, r);
 | 
						|
                using (SolidBrush brush = new SolidBrush(fillColor))
 | 
						|
                {
 | 
						|
                    g.FillEllipse(brush, r);
 | 
						|
                }
 | 
						|
                g.SmoothingMode = sm;
 | 
						|
            }
 | 
						|
 | 
						|
            using (Pen pen = new Pen(lineColor, Dpi.Width1))
 | 
						|
            {
 | 
						|
                Rectangle close = r;
 | 
						|
                close.Inflate(-Dpi.Width3, -Dpi.Height3);
 | 
						|
                close.Width--;
 | 
						|
                g.DrawLine(pen, close.X, close.Y, close.Right, close.Bottom);
 | 
						|
                g.DrawLine(pen, close.X, close.Bottom, close.Right, close.Y);
 | 
						|
                close.Offset(1, 0);
 | 
						|
                g.DrawLine(pen, close.X, close.Y, close.Right, close.Bottom);
 | 
						|
                g.DrawLine(pen, close.X, close.Bottom, close.Right, close.Y);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |