201 lines
8.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
namespace DevComponents.DotNetBar.Rendering
{
internal class OfficeStepItemPainter : StepItemPainter
{
#region Implementation
/// <summary>
/// Paints StepItem.
/// </summary>
/// <param name="e">Provides arguments for the operation.</param>
public override void Paint(StepItemRendererEventArgs e)
{
StepItem item = e.Item;
OfficeStepItemColorTable table = ColorTable.StepItem;
OfficeStepItemStateColorTable ct = table.Default;
if (item.HotTracking && item.IsMouseDown)
ct = table.Pressed;
else if (item.HotTracking && item.IsMouseOver)
ct = table.MouseOver;
OfficeStepItemStateColorTable ctProgress = table.Progress;
Rectangle clip = Rectangle.Empty;
Rectangle r = item.Bounds;
int pointerSize = item.GetPointerSize();
Graphics g = e.ItemPaintArgs.Graphics;
GraphicsPath path = GetPath(item, pointerSize);
item.ItemPath = path;
using (Brush brush = DisplayHelp.CreateBrush(path.GetBounds(), (item.BackColors != null && item.BackColors.Length > 0) ? item.BackColors : ct.BackColors, ct.BackColorsGradientAngle, ct.BackColorsPositions))
{
g.FillPath(brush, path);
}
if (item.Value > item.Minimum) // Render progress marker
{
float percent = Math.Min(1, (item.Value / (float)(item.Maximum - item.Minimum)));
if (percent > 0)
{
clip = item.Bounds;
clip.Width = (int)(clip.Width * percent);
}
if (!clip.IsEmpty)
{
Region oldClip = g.Clip;
g.SetClip(clip, CombineMode.Intersect);
using (Brush brush = DisplayHelp.CreateBrush(path.GetBounds(),
(item.ProgressColors != null && item.ProgressColors.Length > 0) ? item.ProgressColors : ctProgress.BackColors, ctProgress.BackColorsGradientAngle, ctProgress.BackColorsPositions))
{
g.FillPath(brush, path);
}
g.Clip = oldClip;
oldClip.Dispose();
}
}
if (ct.BorderColors.Length > 0)
{
for (int i = ct.BorderColors.Length - 1; i > 0; i--)
{
Rectangle rb = item.Bounds;
rb.Inflate(-i, -i);
using (GraphicsPath borderPath = GetPath(item, pointerSize, rb))
{
using (Pen pen = new Pen(ct.BorderColors[i]))
g.DrawPath(pen, borderPath);
}
}
using (Pen pen = new Pen(ct.BorderColors[0]))
g.DrawPath(pen, path);
}
// Render content
r.X += item.Padding.Left;
r.Y += item.Padding.Top;
r.Width -= item.Padding.Horizontal;
r.Height -= item.Padding.Vertical;
if (!item.IsFirst)
{
r.X += pointerSize;
r.Width -= pointerSize;
}
Color textColor = ct.TextColor;
if (!string.IsNullOrEmpty(item.SymbolRealized))
{
Color symbolColor = item.SymbolColor;
if (symbolColor.IsEmpty) symbolColor = textColor;
TextDrawing.DrawStringLegacy(g, item.SymbolRealized, Symbols.GetFont(item.SymbolSize, item.SymbolSet), symbolColor, new Rectangle(r.X, r.Y + r.Height / 2, 0, 0), eTextFormat.Default | eTextFormat.VerticalCenter);
int imageSize = item.ActualSymbolSize.Width + item.ImageTextSpacing;
r.Width -= imageSize;
r.X += imageSize;
}
else if (item.Image != null)
{
g.DrawImage(item.Image, new Rectangle(r.X, r.Y + (r.Height - item.Image.Height) / 2, item.Image.Width, item.Image.Height));
int imageSize = item.Image.Width + item.ImageTextSpacing;
r.Width -= imageSize;
r.X += imageSize;
}
if (!string.IsNullOrEmpty(item.Text))
{
if (!item.TextColor.IsEmpty) textColor = item.TextColor;
Font font = e.ItemPaintArgs.Font;
if (item.TextMarkupBody == null)
{
eTextFormat textFormat = eTextFormat.Default | eTextFormat.VerticalCenter;
if (item.TextAlignment == eButtonTextAlignment.Center)
{
textFormat |= eTextFormat.HorizontalCenter;
if (!item.IsLast)
r.Width -= pointerSize;
}
else if (item.TextAlignment == eButtonTextAlignment.Right)
{
textFormat |= eTextFormat.Right;
if (!item.IsLast)
r.Width -= pointerSize;
}
TextDrawing.DrawString(g, item.Text, font, textColor, r, textFormat);
}
else
{
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, e.ItemPaintArgs.RightToLeft);
d.HotKeyPrefixVisible = false;
d.ContextObject = item;
Rectangle mr = new Rectangle(r.X, r.Y + (r.Height - item.TextMarkupBody.Bounds.Height) / 2, item.TextMarkupBody.Bounds.Width, item.TextMarkupBody.Bounds.Height);
item.TextMarkupBody.Bounds = mr;
item.TextMarkupBody.Render(d);
}
}
}
private GraphicsPath GetPath(StepItem item, int arrowSize)
{
Rectangle r = item.Bounds;
return GetPath(item, arrowSize, r);
}
private GraphicsPath GetPath(StepItem item, int arrowSize, Rectangle r)
{
r.Width--;
r.Height--;
if (item.IsFirst)
return GetFirstItemPath(r, arrowSize);
else if (item.IsLast)
return GetLastItemPath(r, arrowSize);
else
return GetItemPath(r, arrowSize);
}
private GraphicsPath GetItemPath(Rectangle r, int arrowSize)
{
GraphicsPath path = new GraphicsPath();
path.AddLine(r.X, r.Y, r.X + arrowSize, r.Y + r.Height / 2);
path.AddLine(r.X + arrowSize, r.Y + r.Height / 2, r.X, r.Bottom);
path.AddLine(r.X, r.Bottom, r.Right - arrowSize, r.Bottom);
path.AddLine(r.Right - arrowSize, r.Bottom, r.Right, r.Y + r.Height / 2);
path.AddLine(r.Right, r.Y + r.Height / 2, r.Right - arrowSize, r.Y);
path.CloseAllFigures();
return path;
}
private GraphicsPath GetLastItemPath(Rectangle r, int arrowSize)
{
GraphicsPath path = new GraphicsPath();
ArcData ad = ElementStyleDisplay.GetCornerArc(r, 2, eCornerArc.TopRight);
path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle);
ad = ElementStyleDisplay.GetCornerArc(r, 2, eCornerArc.BottomRight);
path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle);
path.AddLine(r.X, r.Bottom, r.X + arrowSize, r.Y + r.Height / 2);
path.AddLine(r.X + arrowSize, r.Y + r.Height / 2, r.X, r.Y);
path.CloseAllFigures();
return path;
}
private GraphicsPath GetFirstItemPath(Rectangle r, int arrowSize)
{
GraphicsPath path = new GraphicsPath();
ArcData ad = ElementStyleDisplay.GetCornerArc(r, 2, eCornerArc.BottomLeft);
path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle);
ad = ElementStyleDisplay.GetCornerArc(r, 2, eCornerArc.TopLeft);
path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle);
path.AddLine(r.Right - arrowSize, r.Y, r.Right, r.Y + r.Height / 2);
path.AddLine(r.Right, r.Y + r.Height / 2, r.Right - arrowSize, r.Bottom);
path.CloseAllFigures();
return path;
}
#endregion
}
}