SourceCode/PROMS/DotNetBar Source Code/TabStripSimulatedThemeDisplay.cs

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
}
}