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