DotNet 4.8.1 build of DotNetBar
This commit is contained in:
216
PROMS/DotNetBar Source Code/TabStripRoundHeaderDisplay.cs
Normal file
216
PROMS/DotNetBar Source Code/TabStripRoundHeaderDisplay.cs
Normal file
@@ -0,0 +1,216 @@
|
||||
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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user