SourceCode/PROMS/DotNetBar Source Code/Ribbon/Office2003RibbonTabItemPainter.cs

172 lines
5.0 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
/// <summary>
/// Summary description for Office2003RibbonTabItemPainter.
/// </summary>
internal class Office2003RibbonTabItemPainter:Office2003ButtonItemPainter
{
/// <summary>
/// Paints state of the button, either hot, pressed or checked
/// </summary>
/// <param name="button"></param>
/// <param name="pa"></param>
/// <param name="image"></param>
public override void PaintButtonMouseOver(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r)
{
PaintButtonCheck(button,pa,image,r);
}
public override void PaintButtonBackground(ButtonItem button, ItemPaintArgs pa, CompositeImage image)
{
bool isOnMenu = IsOnMenu(button, pa);
if(isOnMenu)
base.PaintButtonBackground(button,pa, image);
else
PaintButtonCheck(button,pa,image,button.DisplayRectangle);
}
public override void PaintButtonCheck(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r)
{
bool isOnMenu = IsOnMenu(button, pa);
if(isOnMenu)
{
base.PaintButtonCheck(button,pa,image,r);
return;
}
// TODO: Cleanup code here, tabs were drawn for every state that code is still left
if(!button.IsMouseOver && !button.Checked)
return;
Color topColor=pa.Colors.BarBackground2;
Color bottomColor=pa.Colors.BarBackground;
Color borderColor=pa.Colors.BarFloatingBorder;
int angle=pa.Colors.BarBackgroundGradientAngle;
if(button.IsMouseOver && !button.Checked)
{
topColor=pa.Colors.ItemHotBackground2;
bottomColor=pa.Colors.ItemHotBackground;
angle=pa.Colors.ItemHotBackgroundGradientAngle;
}
else if(button.Checked)
{
topColor=Color.White;//pa.Colors.BarBackground2;
bottomColor=pa.Colors.BarBackground; //pa.Colors.BarBackground;
//topColor=pa.Colors.ItemPressedBackground;
//bottomColor=pa.Colors.ItemPressedBackground2;
angle=pa.Colors.ItemPressedBackgroundGradientAngle;
}
Color lightColor=ControlPaint.LightLight(bottomColor);
Color darkColor=Color.FromArgb(100,ControlPaint.Dark(topColor));
int cornerDiameter=4;
Graphics g=pa.Graphics;
GraphicsPath path=GetTabPath(r,cornerDiameter);
path.CloseAllFigures();
// Background
using(LinearGradientBrush brush=DisplayHelp.CreateLinearGradientBrush(r,topColor,bottomColor,angle))
{
brush.GammaCorrection=true;
g.FillPath(brush,path);
}
path.Dispose();
// Border light
using(path=GetTabPathLight(r,cornerDiameter-1))
{
using(Pen pen=new Pen(darkColor/*lightColor*/,1))
g.DrawPath(pen,path);
}
// Border dark
using(path=GetTabPathDark(r,cornerDiameter-1))
{
using(Pen pen=new Pen(darkColor,1))
g.DrawPath(pen,path);
}
// Border
using(path=GetTabPath(r,cornerDiameter))
{
using(Pen pen=new Pen(borderColor,1))
g.DrawPath(pen,path);
}
}
private GraphicsPath GetTabPathLight(Rectangle r, int cornerDiameter)
{
r.X++;
r.Y++;
r.Width-=2;
r.Height--;
// Get graphics path for the tab bounds
GraphicsPath path=new GraphicsPath();
path.AddLine(r.X,r.Bottom,r.X,r.Y+cornerDiameter);
ArcData ad=ElementStyleDisplay.GetCornerArc(r,cornerDiameter,eCornerArc.TopLeft);
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
//path.AddLine(r.X,r.Y+cornerDiameter,r.X+cornerDiameter,r.Y);
path.AddLine(r.X+cornerDiameter,r.Y,r.Right-cornerDiameter,r.Y);
return path;
}
private GraphicsPath GetTabPathDark(Rectangle r, int cornerDiameter)
{
r.X++;
r.Y++;
r.Width-=3;
r.Height--;
// Get graphics path for the tab bounds
GraphicsPath path=new GraphicsPath();
ArcData ad=ElementStyleDisplay.GetCornerArc(r,cornerDiameter,eCornerArc.TopRight);
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
//path.AddLine(r.Right-cornerDiameter,r.Y,r.Right,r.Y+cornerDiameter);
path.AddLine(r.Right,r.Y+cornerDiameter,r.Right,r.Bottom);
return path;
}
private GraphicsPath GetTabPath(Rectangle r, int cornerDiameter)
{
r.Width--;
//r.Height--;
// Get graphics path for the tab bounds
GraphicsPath path=new GraphicsPath();
path.AddLine(r.X,r.Bottom,r.X,r.Y+cornerDiameter);
//path.AddLine(r.X,r.Y+cornerDiameter,r.X+cornerDiameter,r.Y);
ArcData ad=ElementStyleDisplay.GetCornerArc(r,cornerDiameter,eCornerArc.TopLeft);
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
path.AddLine(r.X+cornerDiameter,r.Y,r.Right-cornerDiameter,r.Y);
//path.AddLine(r.Right-cornerDiameter,r.Y,r.Right,r.Y+cornerDiameter);
ad=ElementStyleDisplay.GetCornerArc(r,cornerDiameter,eCornerArc.TopRight);
path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
path.AddLine(r.Right,r.Y+cornerDiameter,r.Right,r.Bottom);
return path;
}
public override void PaintButtonText(ButtonItem button, ItemPaintArgs pa, Color textColor, CompositeImage image)
{
base.PaintButtonText(button,pa,textColor,image);
}
}
}