201 lines
8.5 KiB
C#
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
|
|
}
|
|
}
|