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

969 lines
45 KiB
C#

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Rendering;
using System;
namespace DevComponents.DotNetBar
{
internal class Office2007ButtonItemPainter : Office2003ButtonItemPainter, IOffice2007Painter
{
#region Private Variables
private int m_CornerSize = 2;
private Office2007ColorTable m_ColorTable = null; //new Office2007ColorTable();
private static RoundRectangleShapeDescriptor _DefaultOffice2007Shape = new RoundRectangleShapeDescriptor(2);
private static RoundRectangleShapeDescriptor _DefaultOffice2007LeftShape = new RoundRectangleShapeDescriptor(2, 0, 2, 0);
private static RoundRectangleShapeDescriptor _DefaultOffice2007RightShape = new RoundRectangleShapeDescriptor(0, 2, 0, 2);
private static RoundRectangleShapeDescriptor _DefaultOffice2007TopShape = new RoundRectangleShapeDescriptor(2, 2, 0, 0);
private static RoundRectangleShapeDescriptor _DefaultOffice2007BottomShape = new RoundRectangleShapeDescriptor(0, 0, 2, 2);
private static RoundRectangleShapeDescriptor _DefaultMetroShape = new RoundRectangleShapeDescriptor(0);
#endregion
#region Implementation
private bool IsOffice2003Rendering(ButtonItem button, ItemPaintArgs pa)
{
if (button.ColorTable == eButtonColor.Flat || pa.Owner is DotNetBarManager && string.IsNullOrEmpty(button.CustomColorName))
return true;
return false;
}
/// <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)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintButtonMouseOver(button, pa, image, r);
return;
}
//PaintState(button, pa, image, r, button.IsMouseDown);
}
public override void PaintButtonCheck(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintButtonCheck(button, pa, image, r);
return;
}
bool isOnMenu = IsOnMenu(button, pa);
if (isOnMenu)
base.PaintButtonCheck(button, pa, image, r);
//else
// PaintState(button, pa, image, r, button.IsMouseDown);
}
protected virtual IShapeDescriptor GetButtonShape(ButtonItem button, ItemPaintArgs pa)
{
IShapeDescriptor shape = Office2007ButtonItemPainter.GetButtonShape(button);
if (pa.ContainerControl is ButtonX)
shape = ((ButtonX)pa.ContainerControl).GetButtonShape();
else if (pa.ContainerControl is NavigationBar)
shape = ((NavigationBar)pa.ContainerControl).ButtonShape;
return shape;
}
protected virtual void PaintState(ButtonItem button, ItemPaintArgs pa, CompositeImage image, Rectangle r, bool isMouseDown)
{
if (r.IsEmpty)
return;
bool isOnMenu = pa.IsOnMenu;
Office2007ColorTable colorTable = this.ColorTable;
Graphics g = pa.Graphics;
IShapeDescriptor shape = GetButtonShape(button, pa);
eButtonContainer buttonCont = GetButtonContainerQualifier(pa, button);
Office2007ButtonItemColorTable buttonColorTable = GetColorTable(button, buttonCont);
Region oldClip = g.Clip;
try
{
g.SetClip(r, CombineMode.Intersect);
Office2007ButtonItemStateColorTable stateColors = buttonColorTable.Default;
if (IsOnMenu(button, pa))
{
Rectangle sideRect = new Rectangle(button.DisplayRectangle.Left, button.DisplayRectangle.Top, button.ImageDrawRect.Right, button.DisplayRectangle.Height);
if (pa.RightToLeft)
sideRect = new Rectangle(button.DisplayRectangle.Right - button.ImageDrawRect.Width, button.DisplayRectangle.Top, button.ImageDrawRect.Width, button.DisplayRectangle.Height);
PaintMenuItemSide(button, pa, sideRect);
}
if (!IsItemEnabled(button, pa))
{
if (!isOnMenu)
PaintStateBackground(button, g, buttonColorTable.Disabled, r, shape, pa.IsDefaultButton, true);
g.Clip = oldClip;
return;
}
bool mouseOver = false;
bool expanded = false;
if (!button.DesignMode)
{
if (button.IsMouseOver && button.HotTrackingStyle != eHotTrackingStyle.Image && button.HotTrackingStyle != eHotTrackingStyle.None)
{
stateColors = buttonColorTable.MouseOver;
mouseOver = true;
}
if (isMouseDown && button.HotTrackingStyle != eHotTrackingStyle.Image && button.HotTrackingStyle != eHotTrackingStyle.None)
{
if (buttonColorTable.Pressed != null)
stateColors = buttonColorTable.Pressed;
}
else if (button.Checked && !button.IsMouseOver && !IsOnMenu(button, pa))
{
stateColors = buttonColorTable.Checked;
}
else if (button.Expanded && button.HotTrackingStyle != eHotTrackingStyle.Image && !(!mouseOver && pa.IsOnMenu))
{
stateColors = buttonColorTable.Expanded;
expanded = true;
}
}
else
{
if (button.Checked && !IsOnMenu(button, pa))
{
stateColors = buttonColorTable.Checked;
}
else if (button.Expanded && button.HotTrackingStyle != eHotTrackingStyle.Image)
{
stateColors = buttonColorTable.Expanded;
expanded = true;
}
}
Rectangle subRect = GetTotalSubItemsRect(button);
bool isSplitButton = (mouseOver || expanded) && !button.AutoExpandOnClick && !subRect.IsEmpty && !IsOnMenu(button, pa);
eDotNetBarStyle effectiveStyle = button.EffectiveStyle;
subRect.Offset(button.DisplayRectangle.Location);
if (isSplitButton && !button.Checked &&
(effectiveStyle == eDotNetBarStyle.Office2010 || effectiveStyle == eDotNetBarStyle.Windows7 || StyleManager.IsMetro(effectiveStyle)))
{
Rectangle[] rects = DisplayHelp.ExcludeRectangle(r, subRect);
if (rects.Length > 0 && (button.IsMouseOverExpand || button.Expanded))
rects = DisplayHelp.ExcludeRectangle(r, rects[0]);
if (rects.Length > 0)
{
PaintStateBackground(button, g, buttonColorTable.MouseOverSplitInactive, r, shape, pa.IsDefaultButton, !pa.IsOnNavigationBar);
if (rects[0].X == r.X && rects[0].Right < r.Right) // Left aligned
shape = (StyleManager.IsMetro(effectiveStyle)) ? _DefaultMetroShape : _DefaultOffice2007LeftShape;
else if (rects[0].X > r.X && rects[0].Right == r.Right) // Right aligned
shape = (StyleManager.IsMetro(effectiveStyle)) ? _DefaultMetroShape : _DefaultOffice2007RightShape;
else if (rects[0].Y == r.Y && rects[0].Bottom < r.Bottom) // Top aligned
shape = (StyleManager.IsMetro(effectiveStyle)) ? _DefaultMetroShape : _DefaultOffice2007TopShape;
else if (rects[0].Y > r.Y && rects[0].Bottom == r.Bottom) // Bottom aligned
shape = (StyleManager.IsMetro(effectiveStyle)) ? _DefaultMetroShape : _DefaultOffice2007BottomShape;
PaintStateBackground(button, g, stateColors, rects[0], shape, pa.IsDefaultButton, !pa.IsOnNavigationBar);
}
else
PaintStateBackground(button, g, stateColors, r, shape, pa.IsDefaultButton, !pa.IsOnNavigationBar);
}
else
PaintStateBackground(button, g, stateColors, r, shape, pa.IsDefaultButton, !pa.IsOnNavigationBar);
if (isSplitButton && !(effectiveStyle == eDotNetBarStyle.Office2010 || effectiveStyle == eDotNetBarStyle.Windows7 || StyleManager.IsMetro(effectiveStyle)))
{
using (Brush brush = GetOverlayInactiveBrush())
{
Rectangle backRect = button.DisplayRectangle;
backRect.Inflate(-1, -1);
if (!button.IsMouseOverExpand && !expanded)
{
subRect.Inflate(-1, -1);
g.SetClip(subRect, CombineMode.Intersect);
GraphicsPath backPath = shape.GetShape(backRect);
if (backPath != null)
{
g.FillPath(brush, backPath);
backPath.Dispose();
}
}
else if (!mouseOver || button.IsMouseOverExpand)
{
g.SetClip(subRect, CombineMode.Exclude);
GraphicsPath backPath = shape.GetShape(backRect);
if (backPath != null)
{
g.FillPath(brush, backPath);
backPath.Dispose();
}
}
}
}
g.Clip = oldClip;
}
finally
{
if (oldClip != null) oldClip.Dispose();
}
}
protected virtual void PaintStateBackground(ButtonItem button, Graphics g, Office2007ButtonItemStateColorTable stateColors, Rectangle r, IShapeDescriptor shape, bool isDefault, bool paintBorder)
{
PaintBackground(g, stateColors, r, shape, isDefault, paintBorder);
}
public static void PaintBackground(Graphics g, Office2007ButtonItemStateColorTable stateColors, Rectangle r, IShapeDescriptor shape)
{
PaintBackground(g, stateColors, r, shape, false);
}
public static void PaintBackground(Graphics g, Office2007ButtonItemStateColorTable stateColors, Rectangle r, IShapeDescriptor shape, bool isDefault)
{
PaintBackground(g, stateColors, r, shape, isDefault, true);
}
public static void PaintBackground(Graphics g, Office2007ButtonItemStateColorTable stateColors, Rectangle r, IShapeDescriptor shape, bool isDefault, bool paintBorder)
{
float topSplit = .35f;
float bottomSplit = .65f;
if (!shape.CanDrawShape(r)) return;
if (stateColors != null)
{
Rectangle fillRectangle = r;
Rectangle backRect = new Rectangle(fillRectangle.X, fillRectangle.Y, fillRectangle.Width, (int)(fillRectangle.Height * topSplit));
if (!stateColors.OuterBorder.IsEmpty && paintBorder)
fillRectangle.Width--;
GraphicsPath backPath = shape.GetShape(fillRectangle);
if (stateColors.Background != null)
{
if (backPath != null)
{
if (stateColors.Background.End.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(stateColors.Background.Start))
g.FillPath(brush, backPath);
}
else
{
using (LinearGradientBrush lb = new LinearGradientBrush(fillRectangle, stateColors.Background.Start, stateColors.Background.End, stateColors.Background.GradientAngle))
{
g.FillPath(lb, backPath);
}
}
backPath.Dispose();
}
}
else
{
if (backPath != null && stateColors.TopBackground!= null && stateColors.BottomBackground!=null)
{
if (stateColors.TopBackground.End.IsEmpty && stateColors.BottomBackground.End.IsEmpty)
{
if (stateColors.TopBackground.Start == stateColors.BottomBackground.Start)
using (SolidBrush lb = new SolidBrush(stateColors.TopBackground.Start))
g.FillPath(lb, backPath);
else
{
using (LinearGradientBrush lb = new LinearGradientBrush(fillRectangle, stateColors.TopBackground.Start, stateColors.BottomBackground.Start, stateColors.TopBackground.GradientAngle))
{
g.FillPath(lb, backPath);
}
}
}
else
{
using (LinearGradientBrush lb = new LinearGradientBrush(fillRectangle, stateColors.TopBackground.Start, stateColors.BottomBackground.End, stateColors.TopBackground.GradientAngle))
{
ColorBlend cb = new ColorBlend(4);
cb.Colors = new Color[] { stateColors.TopBackground.Start, stateColors.TopBackground.End, stateColors.BottomBackground.Start, stateColors.BottomBackground.End };
cb.Positions = new float[] { 0, topSplit, topSplit, 1f };
lb.InterpolationColors = cb;
g.FillPath(lb, backPath);
}
}
backPath.Dispose();
}
if (stateColors.TopBackgroundHighlight!=null && !stateColors.TopBackgroundHighlight.IsEmpty)
{
Rectangle ellipse = new Rectangle(fillRectangle.X, fillRectangle.Y, fillRectangle.Width, fillRectangle.Height);
GraphicsPath path = new GraphicsPath();
path.AddEllipse(ellipse);
PathGradientBrush brush = new PathGradientBrush(path);
brush.CenterColor = stateColors.TopBackgroundHighlight.Start;
brush.SurroundColors = new Color[] { stateColors.TopBackgroundHighlight.End };
brush.CenterPoint = new PointF(ellipse.X + ellipse.Width / 2, fillRectangle.Bottom);
Blend blend = new Blend();
blend.Factors = new float[] { 0f, .5f, 1f };
blend.Positions = new float[] { .0f, .4f, 1f };
brush.Blend = blend;
g.FillRectangle(brush, backRect);
brush.Dispose();
path.Dispose();
}
// Draw Bottom part
int bottomHeight = (int)(fillRectangle.Height * bottomSplit);
backRect = new Rectangle(fillRectangle.X, fillRectangle.Y + backRect.Height, fillRectangle.Width, fillRectangle.Height - backRect.Height);
if (stateColors.BottomBackgroundHighlight!=null && !stateColors.BottomBackgroundHighlight.IsEmpty)
{
Rectangle ellipse = new Rectangle(fillRectangle.X, fillRectangle.Y + bottomHeight - 2, fillRectangle.Width, fillRectangle.Height + 4);
GraphicsPath path = new GraphicsPath();
path.AddEllipse(ellipse);
PathGradientBrush brush = new PathGradientBrush(path);
brush.CenterColor = stateColors.BottomBackgroundHighlight.Start;
brush.SurroundColors = new Color[] { stateColors.BottomBackgroundHighlight.End };
brush.CenterPoint = new PointF(ellipse.X + ellipse.Width / 2, fillRectangle.Bottom);
Blend blend = new Blend();
blend.Factors = new float[] { 0f, .5f, .6f };
blend.Positions = new float[] { .0f, .4f, 1f };
brush.Blend = blend;
g.FillRectangle(brush, backRect);
brush.Dispose();
path.Dispose();
}
}
if (paintBorder)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
// Draw Border
if (!stateColors.OuterBorder.IsEmpty && stateColors.OuterBorderWidth>0)
{
Rectangle br = r;
br.Width--;
br.Height--;
if (shape is EllipticalShapeDescriptor && stateColors.OuterBorder.End.IsEmpty)
{
br.Width -= (stateColors.OuterBorderWidth / 2);
br.Height -= (stateColors.OuterBorderWidth / 2);
using (Pen pen = new Pen(stateColors.OuterBorder.Start, stateColors.OuterBorderWidth))
g.DrawEllipse(pen, br);
}
else
{
GraphicsPath path = shape.GetShape(br);
if (path != null)
{
DisplayHelp.DrawGradientPath(g, path, r, stateColors.OuterBorder, stateColors.OuterBorderWidth);
path.Dispose();
}
}
//if (cornerSize > 1)
// DisplayHelp.DrawRoundGradientRectangle(g, r, stateColors.OuterBorder, 1, cornerSize);
//else
// DisplayHelp.DrawGradientRectangle(g, r, stateColors.OuterBorder, 1);
if (isDefault)
{
Color clr = Color.FromArgb(128, stateColors.OuterBorder.Start);
r.Inflate(-1, -1);
DisplayHelp.DrawRectangle(g, clr, r);
r.Inflate(-1, -1);
DisplayHelp.DrawRectangle(g, clr, r);
}
}
if (!isDefault && !stateColors.InnerBorder.IsEmpty)
{
Rectangle innerRect = r;
innerRect.Inflate(-1, -1);
innerRect.Width--;
innerRect.Height--;
using (GraphicsPath path = shape.GetInnerShape(innerRect, 1))
DisplayHelp.DrawGradientPath(g, path, innerRect, stateColors.InnerBorder, 1);
//cornerSize--;
//if (cornerSize > 1)
// DisplayHelp.DrawRoundGradientRectangle(g, innerRect, stateColors.InnerBorder, 1, cornerSize);
//else
// DisplayHelp.DrawGradientRectangle(g, innerRect, stateColors.InnerBorder, 1);
}
g.SmoothingMode = sm;
}
}
}
public override void PaintButtonBackground(ButtonItem button, ItemPaintArgs pa, CompositeImage image)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintButtonBackground(button, pa, image);
return;
}
if (button is ApplicationButton && m_ColorTable.RibbonControl.StartButtonDefault != null)
{
Image backImage = m_ColorTable.RibbonControl.StartButtonDefault;
if (button.IsMouseDown || button.Expanded)
backImage = m_ColorTable.RibbonControl.StartButtonPressed;
else if (button.IsMouseOver)
backImage = m_ColorTable.RibbonControl.StartButtonMouseOver;
if (backImage != null)
{
if (Office2007ColorTable.CloneImagesOnAccess)
backImage = backImage.Clone() as Image;
pa.Graphics.DrawImageUnscaled(backImage, new Point(button.LeftInternal + (button.WidthInternal - backImage.Width) / 2, button.TopInternal + (button.HeightInternal - backImage.Height) / 2));
if (Office2007ColorTable.CloneImagesOnAccess)
backImage.Dispose();
}
}
PaintState(button, pa, image, button.DisplayRectangle, button.IsMouseDown);
}
private Brush GetOverlayInactiveBrush()
{
return new SolidBrush(Color.FromArgb(76, Color.White));
}
private static IShapeDescriptor GetButtonShape(ButtonItem button)
{
if (button.Shape != null)
return button.Shape;
return _DefaultOffice2007Shape;
}
public override void PaintExpandButton(ButtonItem button, ItemPaintArgs pa)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintExpandButton(button, pa);
return;
}
Graphics g = pa.Graphics;
bool isOnMenu = IsOnMenu(button, pa);
Rectangle itemRect = button.DisplayRectangle;
bool mouseOver = button.IsMouseOver;
bool enabled = IsItemEnabled(button, pa);
Color textColor = Color.Empty;
eButtonContainer buttonCont = GetButtonContainerQualifier(pa, button);
Office2007ButtonItemColorTable buttonColorTable = GetColorTable(button, buttonCont);
if (buttonCont == eButtonContainer.RibbonStrip)
{
textColor = GetTextColor(button, pa);
}
if (textColor.IsEmpty)
textColor = GetTextColor(button, pa, buttonColorTable, true);
using (SolidBrush textBrush = new SolidBrush(textColor))
{
// If it has subitems draw the triangle to indicate that
if ((button.SubItems.Count > 0 || button.PopupType == ePopupType.Container) && button.ShowSubItems)
{
if (isOnMenu)
{
Point[] p = new Point[3];
if (pa.RightToLeft)
{
p[0].X = itemRect.Left + 8;
p[0].Y = itemRect.Top + (itemRect.Height - 8) / 2;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 8;
p[2].X = p[0].X - 4;
p[2].Y = p[0].Y + 4;
}
else
{
p[0].X = itemRect.Left + itemRect.Width - 12;
p[0].Y = itemRect.Top + (itemRect.Height - 8) / 2;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 8;
p[2].X = p[0].X + 4;
p[2].Y = p[0].Y + 4;
}
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
g.FillPolygon(textBrush, p);
g.SmoothingMode = sm;
}
else if (!button.SubItemsRect.IsEmpty)
{
Point[] p = new Point[3];
Rectangle sr = button.SubItemsRect;
if (pa.IsOnRibbonBar && button.ImagePosition == eImagePosition.Top && !button.SplitButton && button.Text.Length > 0)
sr.Y -= 3;
if (button.PopupSide == ePopupSide.Default)
{
if (pa.IsOnMenu)
{
if (pa.RightToLeft)
{
p[0].X = itemRect.Left + sr.Left + sr.Width / 2 + 3;
p[0].Y = itemRect.Top + sr.Top + sr.Height / 2 - 3;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 6;
p[2].X = p[0].X - 3;
p[2].Y = p[0].Y + 3;
}
else
{
p[0].X = itemRect.Left + sr.Left + sr.Width / 2;
p[0].Y = itemRect.Top + sr.Top + sr.Height / 2 - 3;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 6;
p[2].X = p[0].X + 3;
p[2].Y = p[0].Y + 3;
}
}
else if (button.Orientation == eOrientation.Horizontal)
{
p[0].X = itemRect.Left + sr.Left + (sr.Width - Dpi.Width5) / 2;
p[0].Y = itemRect.Top + sr.Top + (sr.Height - Dpi.Height3) / 2 + 1;
p[1].X = p[0].X + Dpi.Width5;
p[1].Y = p[0].Y;
p[2].X = p[0].X + Dpi.Width2;
p[2].Y = p[0].Y + Dpi.Height3;
}
else
{
p[0].X = itemRect.Left + sr.Left + (sr.Width - 3) / 2 + 1;
p[0].Y = itemRect.Top + sr.Top + (sr.Height - 5) / 2;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 6;
p[2].X = p[0].X - 3;
p[2].Y = p[0].Y + 3;
}
}
else
{
switch (button.PopupSide)
{
case ePopupSide.Right:
{
p[0].X = itemRect.Left + sr.Left + sr.Width / 2;
p[0].Y = itemRect.Top + sr.Top + sr.Height / 2 - 3;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 6;
p[2].X = p[0].X + 3;
p[2].Y = p[0].Y + 3;
break;
}
case ePopupSide.Left:
{
p[0].X = itemRect.Left + sr.Left + sr.Width / 2 + 3;
p[0].Y = itemRect.Top + sr.Top + sr.Height / 2 - 3;
p[1].X = p[0].X;
p[1].Y = p[0].Y + 6;
p[2].X = p[0].X - 3;
p[2].Y = p[0].Y + 3;
break;
}
case ePopupSide.Top:
{
p[0].X = itemRect.Left + sr.Left + (sr.Width - 5) / 2;
p[0].Y = itemRect.Top + sr.Top + (sr.Height - 3) / 2 + 4;
p[1].X = p[0].X + 6;
p[1].Y = p[0].Y;
p[2].X = p[0].X + 3;
p[2].Y = p[0].Y - 4;
break;
}
case ePopupSide.Bottom:
{
p[0].X = itemRect.Left + sr.Left + (sr.Width - 5) / 2 + 1;
p[0].Y = itemRect.Top + sr.Top + (sr.Height - 3) / 2 + 1;
p[1].X = p[0].X + 5;
p[1].Y = p[0].Y;
p[2].X = p[0].X + 2;
p[2].Y = p[0].Y + 3;
break;
}
}
}
if (button.SplitButton && !button.TextDrawRect.IsEmpty && (button.ImagePosition == eImagePosition.Top))
{
p[0].Y -= 3;
p[1].Y -= 3;
p[2].Y -= 3;
}
if (enabled)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
g.FillPolygon(textBrush, p);
g.SmoothingMode = sm;
}
else
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
using (SolidBrush mybrush = new SolidBrush(pa.Colors.ItemDisabledText))
g.FillPolygon(mybrush, p);
g.SmoothingMode = sm;
}
}
Rectangle r = GetTotalSubItemsRect(button);
if (enabled && !r.IsEmpty && (mouseOver || button.Expanded && !pa.IsOnMenu) && !button.AutoExpandOnClick)
{
r.Offset(itemRect.Location);
Point[] pt = new Point[4];
if (pa.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))
{
pt[0] = new Point(r.X + 1, r.Y);
pt[1] = new Point(r.Right - 2, r.Y);
pt[2] = new Point(r.X + 1, r.Y + 1);
pt[3] = new Point(r.Right - 2, r.Y + 1);
if (button.SplitButton)
{
pt[0].Y--;
pt[1].Y--;
pt[2].Y--;
pt[3].Y--;
}
}
else
{
r.Y += 1;
r.Height -= 3;
if (pa.RightToLeft)
r.X = r.Right - 1;
pt[0] = new Point(r.X, r.Y);
pt[1] = new Point(r.X, r.Bottom);
pt[2] = new Point(r.X + 1, r.Y);
pt[3] = new Point(r.X + 1, r.Bottom);
}
eDotNetBarStyle effectiveStyle = button.EffectiveStyle;
if (effectiveStyle != eDotNetBarStyle.Office2010 && effectiveStyle != eDotNetBarStyle.Windows7 && !StyleManager.IsMetro(effectiveStyle) || button.Checked)
{
using (Pen pen = new Pen(buttonColorTable.MouseOver.SplitBorder.Start))
g.DrawLine(pen, pt[0], pt[1]); //r.X, r.Y, r.X, r.Bottom);
using (Pen pen = new Pen(buttonColorTable.MouseOver.SplitBorderLight.Start))
g.DrawLine(pen, pt[2], pt[3]); //r.X + 1, r.Y, r.X + 1, r.Bottom);
}
}
}
}
}
protected override void PaintMenuItemSide(ButtonItem button, ItemPaintArgs pa, Rectangle sideRect)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintMenuItemSide(button, pa, sideRect);
return;
}
Graphics g = pa.Graphics;
Office2007MenuColorTable ct = m_ColorTable.Menu;
Region oldClip = g.Clip.Clone() as Region;
g.SetClip(sideRect);
sideRect.Inflate(0, 1);
// Draw side bar
if (button.MenuVisibility == eMenuVisibility.VisibleIfRecentlyUsed && !button.RecentlyUsed)
DisplayHelp.FillRectangle(g, sideRect, ct.SideUnused);
else
DisplayHelp.FillRectangle(g, sideRect, ct.Side);
if (pa.RightToLeft)
{
Point p = new Point(sideRect.X, sideRect.Y);
DisplayHelp.DrawGradientLine(g, p, new Point(p.X, p.Y + sideRect.Height), ct.SideBorder, 1);
p.X++;
DisplayHelp.DrawGradientLine(g, p, new Point(p.X, p.Y + sideRect.Height), ct.SideBorderLight, 1);
}
else
{
Point p = new Point(sideRect.Right - 2, sideRect.Y);
DisplayHelp.DrawGradientLine(g, p, new Point(p.X, p.Y + sideRect.Height), ct.SideBorder, 1);
p.X++;
DisplayHelp.DrawGradientLine(g, p, new Point(p.X, p.Y + sideRect.Height), ct.SideBorderLight, 1);
}
if (oldClip != null)
g.Clip = oldClip;
else
g.ResetClip();
}
protected override void PaintButtonCheckBackground(ButtonItem button, ItemPaintArgs pa, Rectangle r)
{
if (IsOffice2003Rendering(button, pa))
{
base.PaintButtonCheckBackground(button, pa, r);
return;
}
Graphics g = pa.Graphics;
bool isOnMenu = IsOnMenu(button, pa);
int cornerSize = m_CornerSize;
if (pa.ContainerControl is ButtonX)
cornerSize = ((ButtonX)pa.ContainerControl).CornerSize;
if (!button.IsMouseOver || isOnMenu)
{
Rectangle backRect = r;
backRect.Inflate(-1, -1);
DisplayHelp.FillRectangle(g, backRect, pa.Colors.ItemCheckedBackground, pa.Colors.ItemCheckedBackground2, pa.Colors.ItemCheckedBackgroundGradientAngle);
DisplayHelp.DrawRoundedRectangle(g, pa.Colors.ItemCheckedBorder, r, cornerSize);
}
}
protected static readonly Type ButtonColorTableType = typeof(Office2007ButtonItemColorTable);
public virtual Office2007ButtonItemColorTable GetColorTable(ButtonItem button, eButtonContainer buttonCont)
{
Office2007ColorTable colorTable = this.ColorTable;
Office2007ButtonItemColorTable buttonColorTable = null;
if (buttonCont == eButtonContainer.StatusBar)
{
object st = null;
if (colorTable.ContextualTables.TryGetValue(Office2007ColorTable.GetContextualKey(ButtonColorTableType, "StatusBar"), out st))
return (Office2007ButtonItemColorTable)st;
}
if (buttonCont == eButtonContainer.RibbonBar && colorTable.RibbonButtonItemColors.Count > 0)
{
if (button.CustomColorName != "")
buttonColorTable = colorTable.RibbonButtonItemColors[button.CustomColorName];
if (buttonColorTable == null)
buttonColorTable = colorTable.RibbonButtonItemColors[button.GetColorTableName()];
if (buttonColorTable != null)
return buttonColorTable;
}
else if ((buttonCont == eButtonContainer.MenuBar || buttonCont == eButtonContainer.StatusBar) && colorTable.MenuButtonItemColors.Count > 0)
{
if (button.CustomColorName != "")
buttonColorTable = colorTable.MenuButtonItemColors[button.CustomColorName];
if (buttonColorTable == null)
buttonColorTable = colorTable.MenuButtonItemColors[button.GetColorTableName()];
if (buttonColorTable != null)
return buttonColorTable;
}
else if (buttonCont == eButtonContainer.Backstage && colorTable.BackstageButtonItemColors.Count > 0)
{
if (button.CustomColorName != "")
buttonColorTable = colorTable.BackstageButtonItemColors[button.CustomColorName];
if (buttonColorTable == null)
buttonColorTable = colorTable.BackstageButtonItemColors[button.GetColorTableName()];
if (buttonColorTable != null)
return buttonColorTable;
}
else if (buttonCont == eButtonContainer.NavigationPane && colorTable.NavigationPaneButtonItemColors.Count > 0)
{
if (button.CustomColorName != "")
buttonColorTable = colorTable.NavigationPaneButtonItemColors[button.CustomColorName];
if (buttonColorTable == null)
buttonColorTable = colorTable.NavigationPaneButtonItemColors[button.GetColorTableName()];
if (buttonColorTable != null)
return buttonColorTable;
}
if (button.CustomColorName != "")
buttonColorTable = colorTable.ButtonItemColors[button.CustomColorName];
try
{
if (buttonColorTable == null)
buttonColorTable = colorTable.ButtonItemColors[button.GetColorTableName()];
if (buttonColorTable == null)
return colorTable.ButtonItemColors[0];
}
catch
{
buttonColorTable = Office2007ColorTable.GetFallBackButtonItemColorTable();
}
return buttonColorTable;
}
private eButtonContainer GetButtonContainerQualifier(ItemPaintArgs pa, ButtonItem button)
{
eButtonContainer buttonCont = eButtonContainer.None;
if (pa.ContainerControl is RibbonBar)
buttonCont = eButtonContainer.RibbonBar;
else if (pa.ContainerControl is RibbonStrip)
buttonCont = eButtonContainer.RibbonStrip;
else if (pa.ContainerControl is DevComponents.DotNetBar.Metro.MetroTabStrip)
buttonCont = eButtonContainer.MetroTabStrip;
else if (pa.ContainerControl is Bar)
{
Bar bar = pa.ContainerControl as Bar;
if (bar.MenuBar)
buttonCont = eButtonContainer.MenuBar;
else if (bar.LayoutType == eLayoutType.Toolbar)
{
if (bar.BarType == eBarType.StatusBar || bar.GrabHandleStyle == eGrabHandleStyle.ResizeHandle || bar.Dock == DockStyle.Bottom || bar.DockSide == eDockSide.Bottom)
buttonCont = eButtonContainer.StatusBar;
else
buttonCont = eButtonContainer.Toolbar;
}
}
else if (pa.IsOnMenu || pa.IsOnPopupBar)
buttonCont = eButtonContainer.Popup;
else if (pa.ContainerControl is SuperTabStrip && ((SuperTabStrip)pa.ContainerControl).ApplicationButton != null)
buttonCont = eButtonContainer.Backstage;
else if (pa.ContainerControl is NavigationBar)
buttonCont = eButtonContainer.NavigationPane;
return buttonCont;
}
protected virtual Color GetTextColor(ButtonItem button, ItemPaintArgs pa, Office2007ButtonItemColorTable buttonColorTable)
{
return GetTextColor(button, pa, buttonColorTable, false);
}
protected virtual Color GetTextColor(ButtonItem button, ItemPaintArgs pa, Office2007ButtonItemColorTable buttonColorTable, bool isExpandPart)
{
Color textColor = Color.Empty;
bool isMouseOver = button.IsMouseOver;
if (isMouseOver)
{
if (isExpandPart)
{
if (!button.IsMouseOverExpand)
isMouseOver = false;
}
else if (button.IsMouseOverExpand && button.SplitButton && !button.AutoExpandOnClick)
isMouseOver = false;
else if (button.IsMouseOverExpand && !isExpandPart && !button.AutoExpandOnClick)
isMouseOver = false;
}
if (isMouseOver)
{
if (!button.HotForeColor.IsEmpty)
textColor = button.HotForeColor;
}
else if (!button.ForeColor.IsEmpty)
textColor = button.ForeColor;
if (textColor.IsEmpty)
{
if (buttonColorTable != null)
{
if (!button.GetEnabled(pa.ContainerControl))
{
if (buttonColorTable.Disabled != null)
textColor = buttonColorTable.Disabled.Text;
}
else if (button.IsMouseDown)
textColor = buttonColorTable.Pressed.Text;
else if (isMouseOver && !(StyleManager.IsMetro(button.EffectiveStyle) && button.Expanded))
textColor = buttonColorTable.MouseOver.Text;
else if (button.Expanded && (button.AutoExpandOnClick && !button.SplitButton))
textColor = buttonColorTable.Expanded.Text;
else if (button.Checked && !IsOnMenu(button, pa))
textColor = buttonColorTable.Checked.Text;
else
textColor = buttonColorTable.Default.Text;
}
}
if (textColor.IsEmpty)
return base.GetTextColor(button, pa);
return textColor;
}
protected override Color GetTextColor(ButtonItem button, ItemPaintArgs pa)
{
bool enabled = IsItemEnabled(button, pa);
if (enabled && button.IsMouseOver && !button.HotForeColor.IsEmpty)
return button.HotForeColor;
if (enabled && !button.ForeColor.IsEmpty)
return button.ForeColor;
if (enabled && button.ForeColorColorSchemePart != eColorSchemePart.None)
return (Color)pa.Colors.GetType().GetProperty(button.ForeColorColorSchemePart.ToString()).GetValue(pa.Colors, null);
eButtonContainer buttonCont = GetButtonContainerQualifier(pa, button);
if (!enabled || IsOffice2003Rendering(button, pa))
{
if (enabled && buttonCont == eButtonContainer.MenuBar && !button.IsMouseDown && !button.IsMouseOver && !button.Expanded && !button.Checked)
{
Office2007ButtonItemColorTable bt = GetColorTable(button, buttonCont);
return bt.Default.Text;
}
return base.GetTextColor(button, pa);
}
Color textColor = Color.Empty;
if (buttonCont == eButtonContainer.RibbonStrip && !button.IsMouseOver && !button.IsMouseDown && !button.Expanded)
{
Office2007RibbonTabItemColorTable rtc = Office2007RibbonTabItemPainter.GetColorTable(m_ColorTable);
if (pa.GlassEnabled && !rtc.Default.GlassText.IsEmpty)
return rtc.Default.GlassText;
return rtc.Default.Text;
}
Office2007ButtonItemColorTable buttonColorTable = GetColorTable(button, buttonCont);
textColor = GetTextColor(button, pa, buttonColorTable);
return textColor;
}
#endregion
#region IOffice2007Painter Members
public Office2007ColorTable ColorTable
{
get
{
return m_ColorTable;
}
set
{
m_ColorTable = value;
}
}
#endregion
}
internal enum eButtonContainer
{
None,
RibbonBar,
Popup,
RibbonStrip,
MenuBar,
StatusBar,
Toolbar,
Backstage,
NavigationPane,
MetroTabStrip
}
}