395 lines
13 KiB
C#
395 lines
13 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Provides display support for SimualtedTheme tab style.
|
|
/// </summary>
|
|
internal class TabStripSimulatedThemeDisplay:TabStripBaseDisplay
|
|
{
|
|
public TabStripSimulatedThemeDisplay()
|
|
{
|
|
this.HorizontalText=true;
|
|
}
|
|
|
|
#region Methods
|
|
public override void Paint(Graphics g, TabStrip tabStrip)
|
|
{
|
|
base.Paint(g,tabStrip);
|
|
|
|
TabColorScheme colorScheme=tabStrip.ColorScheme;
|
|
Rectangle clientRect=tabStrip.ClientRectangle;
|
|
|
|
if (tabStrip.BackColor != Color.Transparent || colorScheme.TabBackground != Color.Transparent)
|
|
{
|
|
if (colorScheme.TabPanelBackground2.IsEmpty)
|
|
{
|
|
if (!colorScheme.TabPanelBackground.IsEmpty)
|
|
{
|
|
using (SolidBrush brush = new SolidBrush(colorScheme.TabPanelBackground))
|
|
g.FillRectangle(brush, clientRect);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
using (SolidBrush brush = new SolidBrush(Color.White))
|
|
g.FillRectangle(brush, clientRect);
|
|
using (LinearGradientBrush brush = CreateTabGradientBrush(clientRect, colorScheme.TabPanelBackground, colorScheme.TabPanelBackground2, colorScheme.TabPanelBackgroundGradientAngle))
|
|
g.FillRectangle(brush, clientRect);
|
|
}
|
|
}
|
|
|
|
tabStrip.ClipExcludeSystemBox(g);
|
|
|
|
DrawBackgroundInternal(clientRect,g,colorScheme,new Region(tabStrip.DisplayRectangle),tabStrip.TabAlignment, tabStrip.TabItemsBounds);
|
|
|
|
for(int i=tabStrip.Tabs.Count-1;i>=0;i--)
|
|
{
|
|
TabItem tab=tabStrip.Tabs[i];
|
|
|
|
if(!tab.Visible || tab.IsSelected || !tab.DisplayRectangle.IntersectsWith(clientRect))
|
|
continue;
|
|
|
|
PaintTab(g,tab,false,false);
|
|
}
|
|
|
|
if(tabStrip.SelectedTab!=null && tabStrip.Tabs.Contains(tabStrip.SelectedTab))
|
|
PaintTab(g,tabStrip.SelectedTab,false,false);
|
|
|
|
g.ResetClip();
|
|
tabStrip.PaintTabSystemBox(g);
|
|
}
|
|
|
|
|
|
protected override GraphicsPath GetTabItemPath(TabItem tab, bool bFirst, bool bLast)
|
|
{
|
|
Rectangle r=tab.DisplayRectangle;
|
|
|
|
GraphicsPath path=new GraphicsPath();
|
|
|
|
if(!tab.IsSelected && !tab.IsMouseOver)
|
|
{
|
|
if(tab.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
r.Height--;
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Top)
|
|
{
|
|
r.Height--;
|
|
r.Y++;
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Left)
|
|
{
|
|
r.Width--;
|
|
r.X++;
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
r.Width--;
|
|
}
|
|
|
|
path.AddRectangle(r);
|
|
}
|
|
else
|
|
{
|
|
if(tab.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
//r.Height++;
|
|
path.AddLine(r.X+2,r.Bottom,r.X,r.Bottom-2);
|
|
path.AddLine(r.X,r.Y,r.Right,r.Y);
|
|
path.AddLine(r.Right,r.Bottom-2,r.Right-2,r.Bottom);
|
|
path.AddLine(r.Right-2,r.Bottom,r.X+2,r.Bottom);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Top)
|
|
{
|
|
//r.Height++;
|
|
//r.Y--;
|
|
path.AddLine(r.X,r.Y+2,r.X+2,r.Y);
|
|
path.AddLine(r.Right-2,r.Y,r.Right,r.Y+2);
|
|
path.AddLine(r.Right,r.Bottom,r.X,r.Bottom);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Left)
|
|
{
|
|
//r.Width++;
|
|
//r.X--;
|
|
path.AddLine(r.Right,r.Bottom,r.X+2,r.Bottom);
|
|
path.AddLine(r.X+2,r.Bottom,r.X,r.Bottom-2);
|
|
path.AddLine(r.X,r.Bottom-2,r.X,r.Y+2);
|
|
path.AddLine(r.X,r.Y+2,r.X+2,r.Y);
|
|
path.AddLine(r.Right-1,r.Y,r.Right-1,r.Bottom);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
//r.Width++;
|
|
path.AddLine(r.X,r.Y,r.Right-2,r.Y);
|
|
path.AddLine(r.Right-2,r.Y,r.Right,r.Y+2);
|
|
path.AddLine(r.Right,r.Y+2,r.Right,r.Bottom-2);
|
|
path.AddLine(r.Right,r.Bottom-2,r.Right-2,r.Bottom);
|
|
path.AddLine(r.X,r.Bottom,r.X,r.Y);
|
|
}
|
|
path.CloseAllFigures();
|
|
}
|
|
|
|
return path;
|
|
}
|
|
|
|
private GraphicsPath GetTabEdge(TabItem tab)
|
|
{
|
|
GraphicsPath path=new GraphicsPath();
|
|
Rectangle r=tab.DisplayRectangle;
|
|
|
|
if(tab.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
r.Height++;
|
|
path.AddLine(r.Right,r.Bottom-2,r.Right-2,r.Bottom);
|
|
path.AddLine(r.Right-2,r.Bottom,r.X+2,r.Bottom);
|
|
path.AddLine(r.X+2,r.Bottom,r.X,r.Bottom-2);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Top)
|
|
{
|
|
r.Height++;
|
|
r.Y--;
|
|
path.AddLine(r.X,r.Y+2,r.X+2,r.Y);
|
|
path.AddLine(r.X+2,r.Y,r.Right-2,r.Y);
|
|
path.AddLine(r.Right-2,r.Y,r.Right,r.Y+2);
|
|
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Left)
|
|
{
|
|
r.Width++;
|
|
r.X--;
|
|
//path.AddLine(r.Right,r.Bottom,r.X+2,r.Bottom);
|
|
path.AddLine(r.X+2,r.Bottom,r.X,r.Bottom-2);
|
|
path.AddLine(r.X,r.Bottom-2,r.X,r.Y+2);
|
|
path.AddLine(r.X,r.Y+2,r.X+2,r.Y);
|
|
//path.AddLine(r.Right,r.Y,r.Right,r.Bottom);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
r.Width++;
|
|
//path.AddLine(r.X,r.Y,r.Right-2,r.Y);
|
|
path.AddLine(r.Right-2,r.Y,r.Right,r.Y+2);
|
|
path.AddLine(r.Right,r.Y+2,r.Right,r.Bottom-2);
|
|
path.AddLine(r.Right,r.Bottom-2,r.Right-2,r.Bottom);
|
|
//path.AddLine(r.X,r.Bottom,r.X,r.Y);
|
|
}
|
|
//path.CloseAllFigures();
|
|
|
|
return path;
|
|
}
|
|
|
|
private void DrawBackgroundInternal(Rectangle tabStripRect, Graphics g, TabColorScheme colors, Region tabsRegion, eTabStripAlignment tabAlignment, Rectangle tabItemsBounds)
|
|
{
|
|
int cornerDiameter=3;
|
|
Rectangle br;
|
|
GraphicsPath path=new GraphicsPath();
|
|
GraphicsPath backPath=null;
|
|
|
|
if(!tabItemsBounds.IsEmpty)
|
|
{
|
|
if(tabAlignment==eTabStripAlignment.Top)
|
|
{
|
|
tabItemsBounds.Width+=3;
|
|
br=new Rectangle(tabStripRect.X,tabItemsBounds.Y+1,(tabItemsBounds.Right>tabStripRect.Right?tabStripRect.Width:tabItemsBounds.Right),tabItemsBounds.Height-1);
|
|
path.AddLine(br.X,br.Bottom,br.X,br.Top+cornerDiameter);
|
|
ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.X+cornerDiameter,br.Y,br.Right-cornerDiameter,br.Y);
|
|
ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.Right,br.Y+cornerDiameter,br.Right,br.Bottom);
|
|
|
|
backPath=path.Clone() as GraphicsPath;
|
|
backPath.CloseAllFigures();
|
|
|
|
if(tabItemsBounds.Right<tabStripRect.Right)
|
|
path.AddLine(br.Right,br.Bottom,tabStripRect.Right,br.Bottom);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
tabItemsBounds.Width+=3;
|
|
br=new Rectangle(tabStripRect.X,tabStripRect.Y,(tabItemsBounds.Right>tabStripRect.Right?tabStripRect.Width:tabItemsBounds.Right),tabItemsBounds.Height-1);
|
|
path.AddLine(br.Right,br.Y,br.Right,br.Bottom-cornerDiameter);
|
|
ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.Right-cornerDiameter,br.Bottom,br.X+cornerDiameter,br.Bottom);
|
|
ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.X,br.Bottom-cornerDiameter,br.X,br.Y);
|
|
|
|
backPath=path.Clone() as GraphicsPath;
|
|
backPath.CloseAllFigures();
|
|
|
|
if(tabItemsBounds.Right<tabStripRect.Right)
|
|
path.AddLine(br.Right,br.Y,tabStripRect.Right,br.Y);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Left)
|
|
{
|
|
tabItemsBounds.Height+=3;
|
|
br=new Rectangle(tabItemsBounds.X+1,tabStripRect.Y,tabItemsBounds.Width-1,(tabItemsBounds.Bottom>tabStripRect.Bottom?tabStripRect.Height:tabItemsBounds.Bottom));
|
|
|
|
path.AddLine(br.Right-1,br.Bottom,br.X+cornerDiameter,br.Bottom);
|
|
ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.X,br.Bottom-cornerDiameter,br.X,br.Y+cornerDiameter);
|
|
ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.X+cornerDiameter,br.Y,br.Right-1,br.Y);
|
|
|
|
backPath=path.Clone() as GraphicsPath;
|
|
backPath.CloseAllFigures();
|
|
|
|
if(tabItemsBounds.Bottom<tabStripRect.Bottom)
|
|
path.AddLine(br.Right-1,br.Bottom,br.Right-1,tabStripRect.Bottom);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
tabItemsBounds.Height+=3;
|
|
br=new Rectangle(tabStripRect.X,tabStripRect.Y,tabItemsBounds.Width-1,(tabItemsBounds.Bottom>tabStripRect.Bottom?tabStripRect.Height:tabItemsBounds.Bottom));
|
|
path.AddLine(br.X,br.Y,br.Right-cornerDiameter,br.Y);
|
|
ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.Right,br.Y+cornerDiameter,br.Right,br.Bottom-cornerDiameter);
|
|
ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(br.Right-cornerDiameter,br.Bottom,br.X,br.Bottom);
|
|
|
|
backPath=path.Clone() as GraphicsPath;
|
|
backPath.CloseAllFigures();
|
|
|
|
if(tabItemsBounds.Bottom<tabStripRect.Bottom)
|
|
path.AddLine(br.X,br.Bottom,br.X,tabStripRect.Bottom);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
path.AddRectangle(tabStripRect);
|
|
}
|
|
|
|
// Paint background of the tab control
|
|
//g.SetClip(backPath,CombineMode.Replace);
|
|
//g.SetClip(tabsRegion,CombineMode.Exclude);
|
|
|
|
if(colors.TabPanelBackground2.IsEmpty)
|
|
{
|
|
if(!colors.TabPanelBackground.IsEmpty)
|
|
{
|
|
using(SolidBrush brush=new SolidBrush(colors.TabPanelBackground))
|
|
g.FillPath(brush,path);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
using(SolidBrush brush=new SolidBrush(Color.White))
|
|
g.FillPath(brush,path);
|
|
using(LinearGradientBrush brush=CreateTabGradientBrush(tabStripRect,colors.TabPanelBackground,colors.TabPanelBackground2,colors.TabPanelBackgroundGradientAngle))
|
|
g.FillPath(brush,path);
|
|
}
|
|
|
|
if(!colors.TabBorder.IsEmpty)
|
|
{
|
|
path.CloseAllFigures();
|
|
using(Pen pen=new Pen(colors.TabBorder,1))
|
|
g.DrawPath(pen,path);
|
|
}
|
|
|
|
if (backPath != null)
|
|
backPath.Dispose();
|
|
if (path != null)
|
|
path.Dispose();
|
|
}
|
|
|
|
protected override 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);
|
|
|
|
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,colors.BackColorGradientAngle))
|
|
g.FillPath(brush,path);
|
|
}
|
|
|
|
using(Pen pen=new Pen(colors.BorderColor,1))
|
|
{
|
|
if(!colors.BorderColor.IsEmpty && (tab.IsSelected || tab.IsMouseOver))
|
|
{
|
|
g.DrawPath(pen,path);
|
|
}
|
|
else
|
|
{
|
|
if(tab.TabAlignment==eTabStripAlignment.Top || tab.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
if(!colors.LightBorderColor.IsEmpty)
|
|
{
|
|
using(Pen border=new Pen(colors.LightBorderColor,1))
|
|
g.DrawLine(border,tabRect.Right-1,tabRect.Y+4,tabRect.Right-1,tabRect.Bottom-4);
|
|
}
|
|
if(!colors.DarkBorderColor.IsEmpty)
|
|
{
|
|
using(Pen border=new Pen(colors.DarkBorderColor,1))
|
|
g.DrawLine(border,tabRect.Right,tabRect.Y+4,tabRect.Right,tabRect.Bottom-4);
|
|
}
|
|
|
|
g.DrawLine(pen,tabRect.X,tabRect.Y,tabRect.Right,tabRect.Y);
|
|
g.DrawLine(pen,tabRect.X,tabRect.Bottom,tabRect.Right,tabRect.Bottom);
|
|
}
|
|
else if(tab.TabAlignment==eTabStripAlignment.Left || tab.TabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
if(!colors.LightBorderColor.IsEmpty)
|
|
{
|
|
using(Pen border=new Pen(colors.LightBorderColor,1))
|
|
g.DrawLine(border,tabRect.X+4,tabRect.Bottom-1,tabRect.Right-4,tabRect.Bottom-1);
|
|
}
|
|
if(!colors.DarkBorderColor.IsEmpty)
|
|
{
|
|
using(Pen border=new Pen(colors.DarkBorderColor,1))
|
|
g.DrawLine(border,tabRect.X+4,tabRect.Bottom,tabRect.Right-4,tabRect.Bottom);
|
|
}
|
|
|
|
g.DrawLine(pen,tabRect.X,tabRect.Y,tabRect.X,tabRect.Bottom);
|
|
if(tab.TabAlignment==eTabStripAlignment.Left)
|
|
g.DrawLine(pen,tabRect.Right-1,tabRect.Y,tabRect.Right-1,tabRect.Bottom);
|
|
else
|
|
g.DrawLine(pen,tabRect.Right,tabRect.Y,tabRect.Right,tabRect.Bottom);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(tab.IsSelected || tab.IsMouseOver)
|
|
{
|
|
GraphicsPath edge=GetTabEdge(tab);
|
|
if(!colors.LightBorderColor.IsEmpty)
|
|
{
|
|
GraphicsPath edgeFill=edge.Clone() as GraphicsPath;
|
|
edgeFill.CloseAllFigures();
|
|
using(SolidBrush brush=new SolidBrush(colors.LightBorderColor))
|
|
g.FillPath(brush,edgeFill);
|
|
edgeFill.Dispose();
|
|
}
|
|
if(!colors.DarkBorderColor.IsEmpty)
|
|
{
|
|
using(Pen pen=new Pen(colors.DarkBorderColor,1))
|
|
g.DrawPath(pen,edge);
|
|
}
|
|
edge.Dispose();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|