217 lines
9.0 KiB
C#
217 lines
9.0 KiB
C#
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Drawing.Text;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Represents class performing the display of tabs with RoundHeader style.
|
|
/// </summary>
|
|
internal class TabStripRoundHeaderDisplay:TabStripBaseDisplay
|
|
{
|
|
#region Methods
|
|
public override void Paint(Graphics g, TabStrip tabStrip)
|
|
{
|
|
base.Paint(g,tabStrip);
|
|
|
|
TabsCollection tabs=tabStrip.Tabs;
|
|
TabColorScheme colorScheme=tabStrip.ColorScheme;
|
|
Rectangle clientRect=tabStrip.ClientRectangle;
|
|
|
|
Rectangle r=tabStrip.DisplayRectangle;
|
|
r.Inflate(2,2);
|
|
using(SolidBrush brush=new SolidBrush(tabStrip.BackColor))
|
|
g.FillRectangle(brush,r);
|
|
//g.Clear(tabStrip.BackColor);
|
|
|
|
TabItem lastTab=GetLastVisibleTab(tabs);
|
|
|
|
Rectangle selectedRect = Rectangle.Empty;
|
|
if (tabStrip.SelectedTab != null)
|
|
selectedRect = tabStrip.SelectedTab.DisplayRectangle;
|
|
DrawBackground(tabStrip, clientRect, g, colorScheme, GetTabsRegion(tabs, lastTab), tabStrip.TabAlignment, selectedRect);
|
|
|
|
bool bFirstVisible=true;
|
|
|
|
foreach(TabItem tab in tabs)
|
|
{
|
|
if(!tab.Visible)
|
|
continue;
|
|
if(tab.DisplayRectangle.IntersectsWith(clientRect))
|
|
PaintTab(g,tab,bFirstVisible,(tab==lastTab));
|
|
|
|
bFirstVisible=false;
|
|
}
|
|
}
|
|
|
|
protected override Region GetTabsRegion(TabsCollection tabs, TabItem lastTab)
|
|
{
|
|
bool bFirstVisible=true;
|
|
Region tabRegion=new Region();
|
|
tabRegion.MakeEmpty();
|
|
foreach(TabItem tab in tabs)
|
|
{
|
|
if(!tab.Visible)
|
|
continue;
|
|
GraphicsPath path=GetTabItemPath(tab,bFirstVisible,(tab==lastTab));
|
|
tabRegion.Union(path);
|
|
bFirstVisible=false;
|
|
}
|
|
return tabRegion;
|
|
}
|
|
|
|
protected override LinearGradientBrush CreateTabGradientBrush(Rectangle r,Color color1,Color color2,int gradientAngle)
|
|
{
|
|
LinearGradientBrush brush=base.CreateTabGradientBrush(r,color1,color2,gradientAngle);
|
|
|
|
Blend blend=new Blend(5);
|
|
blend.Factors=new float[]{0,.6f,1f,.6f,0f};
|
|
blend.Positions=new float[]{0,.3f,.5f,.7f,1f};
|
|
brush.Blend=blend;
|
|
|
|
return brush;
|
|
}
|
|
|
|
protected override void DrawBackground(TabStrip tabStrip, Rectangle tabStripRect, Graphics g, TabColorScheme colors, Region tabsRegion, eTabStripAlignment tabAlignment, Rectangle selectedTabRect)
|
|
{
|
|
int cornerDiameter=5;
|
|
Rectangle br;
|
|
GraphicsPath path=new GraphicsPath();
|
|
if(tabAlignment==eTabStripAlignment.Top)
|
|
{
|
|
br=new Rectangle(tabStripRect.X,tabStripRect.Y+tabStripRect.Height/2,tabStripRect.Width-1,tabStripRect.Height-tabStripRect.Height/2);
|
|
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);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
br=new Rectangle(tabStripRect.X,tabStripRect.Y,tabStripRect.Width-1,tabStripRect.Height/2);
|
|
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);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Left)
|
|
{
|
|
br=new Rectangle(tabStripRect.X+tabStripRect.Width/2,tabStripRect.Y,tabStripRect.Width/2+1,tabStripRect.Height-1);
|
|
path.AddLine(br.Right,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,br.Y);
|
|
}
|
|
else if(tabAlignment==eTabStripAlignment.Right)
|
|
{
|
|
br=new Rectangle(tabStripRect.X,tabStripRect.Y,tabStripRect.Width/2,tabStripRect.Height-1);
|
|
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);
|
|
}
|
|
|
|
// Paint background of the tab control
|
|
GraphicsPath backPath=path.Clone() as GraphicsPath;
|
|
backPath.CloseAllFigures();
|
|
g.SetClip(backPath,CombineMode.Replace);
|
|
g.SetClip(tabsRegion,CombineMode.Exclude);
|
|
g.Clear(colors.TabPanelBackground);
|
|
g.ResetClip();
|
|
backPath.Dispose();
|
|
|
|
g.SetClip(tabsRegion,CombineMode.Exclude);
|
|
|
|
using(Pen pen=new Pen(colors.TabBorder,1))
|
|
g.DrawPath(pen,path);
|
|
path.Dispose();
|
|
g.ResetClip();
|
|
}
|
|
#endregion
|
|
|
|
#region Tab Path Functions
|
|
protected override GraphicsPath GetTabItemPath(TabItem tab, bool bFirst, bool bLast)
|
|
{
|
|
GraphicsPath path=new GraphicsPath();
|
|
int cornerDiameter=3;
|
|
|
|
Rectangle clientRectangle=tab.DisplayRectangle;
|
|
|
|
if(!bFirst && !bLast)
|
|
path.AddRectangle(clientRectangle);
|
|
else
|
|
{
|
|
if(bFirst)
|
|
{
|
|
if(tab.Parent.TabAlignment==eTabStripAlignment.Top || tab.Parent.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
path.AddLine(clientRectangle.Right-(bLast?cornerDiameter:0),clientRectangle.Bottom,clientRectangle.X+cornerDiameter,clientRectangle.Bottom);
|
|
ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.X,clientRectangle.Bottom-cornerDiameter,clientRectangle.X,clientRectangle.Y+cornerDiameter);
|
|
ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.X+cornerDiameter,clientRectangle.Y,clientRectangle.Right-(bLast?cornerDiameter:0),clientRectangle.Y);
|
|
}
|
|
else
|
|
{
|
|
ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.X+cornerDiameter,clientRectangle.Y,clientRectangle.Right-cornerDiameter,clientRectangle.Y);
|
|
ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.Right,clientRectangle.Y+cornerDiameter,clientRectangle.Right,clientRectangle.Bottom-(bLast?cornerDiameter:0));
|
|
}
|
|
}
|
|
else
|
|
path.AddLine(clientRectangle.X,clientRectangle.Y,clientRectangle.Right,clientRectangle.Y);
|
|
if(bLast)
|
|
{
|
|
if(tab.Parent.TabAlignment==eTabStripAlignment.Top || tab.Parent.TabAlignment==eTabStripAlignment.Bottom)
|
|
{
|
|
if(!bFirst)
|
|
path.AddLine(clientRectangle.X,clientRectangle.Y,clientRectangle.Right-cornerDiameter,clientRectangle.Y);
|
|
ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.Right,clientRectangle.Y+cornerDiameter,clientRectangle.Right,clientRectangle.Bottom-cornerDiameter);
|
|
ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
if(!bFirst)
|
|
path.AddLine(clientRectangle.Right-cornerDiameter,clientRectangle.Bottom,clientRectangle.X,clientRectangle.Bottom);
|
|
}
|
|
else
|
|
{
|
|
if(!bFirst)
|
|
path.AddLine(clientRectangle.Right,clientRectangle.Y,clientRectangle.Right,clientRectangle.Bottom-cornerDiameter);
|
|
ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomRight);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
path.AddLine(clientRectangle.Right-cornerDiameter,clientRectangle.Bottom,clientRectangle.X+cornerDiameter,clientRectangle.Bottom);
|
|
ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomLeft);
|
|
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
|
|
if(!bFirst)
|
|
path.AddLine(clientRectangle.X,clientRectangle.Bottom-cornerDiameter,clientRectangle.X,clientRectangle.Y);
|
|
}
|
|
}
|
|
else
|
|
path.AddLine(clientRectangle.Right,clientRectangle.Bottom,clientRectangle.X,clientRectangle.Bottom);
|
|
path.CloseAllFigures();
|
|
|
|
}
|
|
|
|
return path;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|