283 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Drawing.Text;
 | |
| 
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Provides display capabilities for TabStrip with Office 2007 Dock style.
 | |
|     /// </summary>
 | |
|     internal class TabStripOffice2007DockDisplay : TabStripBaseDisplay
 | |
|     {
 | |
|         #region Private Variables
 | |
|         private int m_CornerSize = 1;
 | |
|         #endregion
 | |
| 
 | |
|         #region Methods
 | |
|         public override void Paint(Graphics g, TabStrip tabStrip)
 | |
|         {
 | |
|             base.Paint(g, tabStrip);
 | |
| 
 | |
|             TabColorScheme colorScheme = tabStrip.ColorScheme;
 | |
|             Rectangle clientRect = tabStrip.DisplayRectangle;
 | |
| 
 | |
|             if (colorScheme.TabBackgroundImage != null)
 | |
|                 BarFunctions.PaintBackgroundImage(g, clientRect, colorScheme.TabBackgroundImage, eBackgroundImagePosition.Tile, 255);
 | |
| 
 | |
|             if (colorScheme.TabBackground != Color.Transparent && !colorScheme.TabBackground.IsEmpty)
 | |
|             {
 | |
|                 if (colorScheme.TabBackground2.IsEmpty)
 | |
|                 {
 | |
|                     if (!colorScheme.TabBackground.IsEmpty)
 | |
|                     {
 | |
|                         using (SolidBrush brush = new SolidBrush(colorScheme.TabBackground))
 | |
|                             g.FillRectangle(brush, clientRect);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     using (SolidBrush brush = new SolidBrush(Color.White))
 | |
|                         g.FillRectangle(brush, clientRect);
 | |
|                     using (LinearGradientBrush brush = CreateTabGradientBrush(clientRect, colorScheme.TabBackground, colorScheme.TabBackground2, colorScheme.TabBackgroundGradientAngle))
 | |
|                         g.FillRectangle(brush, clientRect);
 | |
|                 }
 | |
|             }
 | |
|             Rectangle selectedRect = Rectangle.Empty;
 | |
|             if (tabStrip.SelectedTab != null)
 | |
|                 selectedRect = tabStrip.SelectedTab.DisplayRectangle;
 | |
| 
 | |
|             using (Region tabRegion = new Region(tabStrip.DisplayRectangle))
 | |
|                 DrawBackground(tabStrip, clientRect, g, colorScheme, tabRegion, tabStrip.TabAlignment, selectedRect);
 | |
| 
 | |
|             Rectangle systemBoxRect = tabStrip.GetSystemBoxRectangle();
 | |
| 
 | |
|             for (int i = tabStrip.Tabs.Count - 1; i >= 0; i--)
 | |
|             {
 | |
|                 TabItem tab = tabStrip.Tabs[i];
 | |
| 
 | |
|                 if (!tab.Visible || tab == tabStrip.SelectedTab)
 | |
|                     continue;
 | |
|                 if (!tab.DisplayRectangle.IntersectsWith(systemBoxRect))
 | |
|                 {   if(tab.DisplayRectangle.IntersectsWith(clientRect))
 | |
|                         PaintTab(g, tab, false, false);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Region oldClip = g.Clip;
 | |
|                     g.SetClip(systemBoxRect, CombineMode.Exclude);
 | |
|                     PaintTab(g, tab, false, false);
 | |
|                     g.Clip = oldClip;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (tabStrip.SelectedTab != null && tabStrip.Tabs.Contains(tabStrip.SelectedTab))
 | |
|             {
 | |
|                 if (!tabStrip.SelectedTab.DisplayRectangle.IntersectsWith(systemBoxRect))
 | |
|                     PaintTab(g, tabStrip.SelectedTab, false, false);
 | |
|                 else
 | |
|                 {
 | |
|                     Region oldClip = g.Clip;
 | |
|                     g.SetClip(systemBoxRect, CombineMode.Exclude);
 | |
|                     PaintTab(g, tabStrip.SelectedTab, false, false);
 | |
|                     g.Clip = oldClip;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             g.ResetClip();
 | |
|             tabStrip.PaintTabSystemBox(g);
 | |
|         }
 | |
| 
 | |
|         protected override GraphicsPath GetTabItemPath(TabItem tab, bool bFirst, bool bLast)
 | |
|         {
 | |
|             return GetTabItemPath(tab.DisplayRectangle, tab.TabAlignment, true);
 | |
|         }
 | |
| 
 | |
|         private GraphicsPath GetTabItemPath(Rectangle tabRect, eTabStripAlignment align, bool closePath)
 | |
|         {
 | |
|             GraphicsPath path = new GraphicsPath();
 | |
|             switch (align)
 | |
|             {
 | |
|                 case eTabStripAlignment.Top:
 | |
|                     {
 | |
|                         //tabRect.Width--;
 | |
|                         if (closePath) tabRect.Height+=2;
 | |
|                         path.AddLine(tabRect.X, tabRect.Bottom, tabRect.X, tabRect.Y + m_CornerSize);
 | |
|                         path.AddLine(tabRect.X, tabRect.Y + m_CornerSize, tabRect.X+m_CornerSize, tabRect.Y);
 | |
|                         path.AddLine(tabRect.X + m_CornerSize, tabRect.Y, tabRect.Right-m_CornerSize, tabRect.Y);
 | |
|                         path.AddLine(tabRect.Right - m_CornerSize, tabRect.Y, tabRect.Right, tabRect.Y+m_CornerSize);
 | |
|                         path.AddLine(tabRect.Right, tabRect.Y + m_CornerSize, tabRect.Right, tabRect.Bottom);
 | |
|                         break;
 | |
|                     }
 | |
|                 case eTabStripAlignment.Bottom:
 | |
|                     {
 | |
|                         //tabRect.Width--;
 | |
|                         if (!closePath)
 | |
|                             tabRect.Y++;
 | |
|                         tabRect.Height--;
 | |
|                         path.AddLine(tabRect.X, tabRect.Y, tabRect.X, tabRect.Bottom - m_CornerSize);
 | |
|                         path.AddLine(tabRect.X, tabRect.Bottom - m_CornerSize, tabRect.X + m_CornerSize, tabRect.Bottom);
 | |
|                         path.AddLine(tabRect.X + m_CornerSize, tabRect.Bottom, tabRect.Right - m_CornerSize, tabRect.Bottom);
 | |
|                         path.AddLine(tabRect.Right - m_CornerSize, tabRect.Bottom, tabRect.Right, tabRect.Bottom - m_CornerSize);
 | |
|                         path.AddLine(tabRect.Right, tabRect.Bottom - m_CornerSize, tabRect.Right, tabRect.Y);
 | |
|                         break;
 | |
|                     }
 | |
|                 case eTabStripAlignment.Left:
 | |
|                     {
 | |
|                         tabRect.X--;
 | |
|                         tabRect.Height--;
 | |
|                         if (closePath)
 | |
|                             tabRect.Width++;
 | |
|                         path.AddLine(tabRect.Right, tabRect.Y, tabRect.X + m_CornerSize, tabRect.Y);
 | |
|                         path.AddLine(tabRect.X + m_CornerSize, tabRect.Y, tabRect.X, tabRect.Y+m_CornerSize);
 | |
|                         path.AddLine(tabRect.X, tabRect.Y + m_CornerSize, tabRect.X, tabRect.Bottom - m_CornerSize);
 | |
|                         path.AddLine(tabRect.X, tabRect.Bottom - m_CornerSize, tabRect.X+m_CornerSize, tabRect.Bottom);
 | |
|                         path.AddLine(tabRect.X + m_CornerSize, tabRect.Bottom, tabRect.Right, tabRect.Bottom);
 | |
| 
 | |
|                         break;
 | |
|                     }
 | |
|                 case eTabStripAlignment.Right:
 | |
|                     {
 | |
|                         if (!closePath)
 | |
|                             tabRect.X++;
 | |
|                         //if (closePath)
 | |
|                         //    tabRect.Width--;
 | |
|                         path.AddLine(tabRect.X, tabRect.Y, tabRect.Right - m_CornerSize, tabRect.Y);
 | |
|                         path.AddLine(tabRect.Right - m_CornerSize, tabRect.Y, tabRect.Right, tabRect.Y + m_CornerSize);
 | |
|                         path.AddLine(tabRect.Right, tabRect.Y + m_CornerSize, tabRect.Right, tabRect.Bottom - m_CornerSize);
 | |
|                         path.AddLine(tabRect.Right, tabRect.Bottom - m_CornerSize, tabRect.Right - m_CornerSize, tabRect.Bottom);
 | |
|                         path.AddLine(tabRect.Right - m_CornerSize, tabRect.Bottom, tabRect.X, tabRect.Bottom);
 | |
| 
 | |
|                         break;
 | |
|                     }
 | |
|             }
 | |
| 
 | |
|             if (closePath)
 | |
|                 path.CloseAllFigures();
 | |
| 
 | |
|             return path;
 | |
|         }
 | |
| 
 | |
|         protected override void DrawTabBorder(TabItem tab, GraphicsPath path, TabColors colors, Graphics g)
 | |
|         {
 | |
|             Rectangle r = tab.DisplayRectangle;
 | |
|             eTabStripAlignment align = tab.TabAlignment;
 | |
|             //Region oldClip = g.Clip;
 | |
|             //Rectangle rClip = Rectangle.Ceiling(path.GetBounds());
 | |
|             //if (tab.TabAlignment == eTabStripAlignment.Right || tab.TabAlignment == eTabStripAlignment.Bottom)
 | |
|             //    rClip.Inflate(1, 1);
 | |
| 
 | |
|             //g.SetClip(rClip);
 | |
| 
 | |
|             if (!colors.BorderColor.IsEmpty)
 | |
|             {
 | |
|                 using (GraphicsPath borderPath = GetTabItemPath(r, align, false))
 | |
|                 {
 | |
|                     using (Pen pen = new Pen(colors.BorderColor, Dpi.Width1))
 | |
|                         g.DrawPath(pen, borderPath);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (align == eTabStripAlignment.Top)
 | |
|             {
 | |
|                 r.Offset(1, 1);
 | |
|                 r.Width-=2;
 | |
|                 r.Height--;
 | |
|             }
 | |
|             else if (align == eTabStripAlignment.Bottom)
 | |
|             {
 | |
|                 r.Offset(1, 0);
 | |
|                 r.Height--;
 | |
|                 r.Width-=2;
 | |
|             }
 | |
|             else if (align == eTabStripAlignment.Left)
 | |
|             {
 | |
|                 r.Offset(1, 1);
 | |
|                 r.Height-=2;
 | |
|                 r.Width-=2;
 | |
|             }
 | |
|             else if (align == eTabStripAlignment.Right)
 | |
|             {
 | |
|                 r.Offset(1, 1);
 | |
|                 r.Height -= 2;
 | |
|                 r.Width -= 2;
 | |
|             }
 | |
| 
 | |
|             if (!colors.LightBorderColor.IsEmpty)
 | |
|             {
 | |
|                 using (GraphicsPath borderPath = GetTabItemPath(r, align, false))
 | |
|                 {
 | |
|                     //rClip = Rectangle.Ceiling(path.GetBounds());
 | |
|                     //g.SetClip(rClip);
 | |
| 
 | |
|                     using (Pen pen = new Pen(colors.LightBorderColor, Dpi.Width1))
 | |
|                         g.DrawPath(pen, borderPath);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //g.Clip = oldClip;
 | |
|         }
 | |
| 
 | |
|         protected override void DrawBackground(TabStrip tabStrip, Rectangle tabStripRect, Graphics g, TabColorScheme colors, Region tabsRegion, eTabStripAlignment tabAlignment, Rectangle selectedTabRect)
 | |
|         {
 | |
|             base.DrawBackground(tabStrip, tabStripRect, g, colors, tabsRegion, tabAlignment, selectedTabRect);
 | |
| 
 | |
|             SmoothingMode sm = g.SmoothingMode;
 | |
|             g.SmoothingMode = SmoothingMode.Default;
 | |
|             if (!colors.TabItemBorder.IsEmpty)
 | |
|             {
 | |
|                 using (Pen pen = new Pen(colors.TabItemBorder, Dpi.Width1))
 | |
|                 {
 | |
|                     if (tabAlignment == eTabStripAlignment.Top)
 | |
|                     {
 | |
|                         if (selectedTabRect.X > tabStripRect.Right)
 | |
|                             selectedTabRect = Rectangle.Empty;
 | |
|                         Rectangle r = new Rectangle(tabStripRect.X, tabStripRect.Bottom - 1, tabStripRect.Width, 2);
 | |
|                         DisplayHelp.FillRectangle(g, r, colors.TabItemBackground, Color.Empty);
 | |
|                         g.DrawLine(pen, r.X, r.Y, selectedTabRect.X - 1, r.Y);
 | |
|                         g.DrawLine(pen, selectedTabRect.Right, r.Y, r.Right, r.Y);
 | |
|                         g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom);
 | |
|                         g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, r.Bottom);
 | |
|                     }
 | |
|                     else if (tabAlignment == eTabStripAlignment.Bottom)
 | |
|                     {
 | |
|                         if (selectedTabRect.X > tabStripRect.Right)
 | |
|                             selectedTabRect = Rectangle.Empty;
 | |
|                         Rectangle r = new Rectangle(tabStripRect.X, tabStripRect.Y, tabStripRect.Width, 1);
 | |
|                         DisplayHelp.FillRectangle(g, r, colors.TabItemBackground, Color.Empty);
 | |
|                         g.DrawLine(pen, r.X, r.Bottom - 1, selectedTabRect.X - 1, r.Bottom - 1);
 | |
|                         g.DrawLine(pen, selectedTabRect.Right, r.Bottom - 1, r.Right, r.Bottom - 1);
 | |
|                         g.DrawLine(pen, r.X, r.Y, r.X, r.Bottom - 1);
 | |
|                         g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, r.Bottom - 1);
 | |
|                     }
 | |
|                     else if (tabAlignment == eTabStripAlignment.Left)
 | |
|                     {
 | |
|                         if (selectedTabRect.Y > tabStripRect.Bottom)
 | |
|                             selectedTabRect = Rectangle.Empty;
 | |
|                         Rectangle r = new Rectangle(tabStripRect.Right - 1, tabStripRect.Y, 1, tabStripRect.Height);
 | |
|                         DisplayHelp.FillRectangle(g, r, colors.TabItemBackground, Color.Empty);
 | |
|                         g.DrawLine(pen, r.X, r.Y, r.X, selectedTabRect.Y - 1);
 | |
|                         g.DrawLine(pen, r.X, selectedTabRect.Bottom, r.X, r.Bottom);
 | |
|                         g.DrawLine(pen, r.X, r.Y, r.Right, r.Y);
 | |
|                         g.DrawLine(pen, r.X, r.Bottom - 1, r.Right, r.Bottom - 1);
 | |
|                     }
 | |
|                     else if (tabAlignment == eTabStripAlignment.Right)
 | |
|                     {
 | |
|                         if (selectedTabRect.Y > tabStripRect.Bottom)
 | |
|                             selectedTabRect = Rectangle.Empty;
 | |
|                         Rectangle r = new Rectangle(tabStripRect.X, tabStripRect.Y, 1, tabStripRect.Height);
 | |
|                         DisplayHelp.FillRectangle(g, r, colors.TabItemBackground, Color.Empty);
 | |
|                         g.DrawLine(pen, r.Right - 1, r.Y, r.Right - 1, selectedTabRect.Y - 1);
 | |
|                         g.DrawLine(pen, r.Right - 1, selectedTabRect.Bottom, r.Right - 1, r.Bottom);
 | |
|                         g.DrawLine(pen, r.X, r.Y, r.Right - 1, r.Y);
 | |
|                         g.DrawLine(pen, r.X, r.Bottom - 1, r.Right - 1, r.Bottom - 1);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             g.SmoothingMode = sm;
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |