163 lines
6.4 KiB
C#
163 lines
6.4 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace DevComponents.DotNetBar.Rendering
|
|
{
|
|
internal class Office2007ProgressBarItemPainter : ProgressBarItemPainter, IOffice2007Painter
|
|
{
|
|
#region IOffice2007Painter
|
|
private Office2007ColorTable m_ColorTable = null; //new Office2007ColorTable();
|
|
|
|
/// <summary>
|
|
/// Gets or sets color table used by renderer.
|
|
/// </summary>
|
|
public Office2007ColorTable ColorTable
|
|
{
|
|
get { return m_ColorTable; }
|
|
set { m_ColorTable = value; }
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
public override void Paint(ProgressBarItemRenderEventArgs e)
|
|
{
|
|
Rectangle r = e.ProgressBarItem.DisplayRectangle;
|
|
if (r.Width <= 0 || r.Height <= 0)
|
|
return;
|
|
|
|
ProgressBarItem item = e.ProgressBarItem;
|
|
Office2007ProgressBarColorTable ct = m_ColorTable.ProgressBarItem;
|
|
if(item.ColorTable == eProgressBarItemColor.Paused)
|
|
ct = m_ColorTable.ProgressBarItemPaused;
|
|
else if (item.ColorTable == eProgressBarItemColor.Error)
|
|
ct = m_ColorTable.ProgressBarItemError;
|
|
|
|
Graphics g = e.Graphics;
|
|
|
|
SmoothingMode sm = g.SmoothingMode;
|
|
g.SmoothingMode = SmoothingMode.Default;
|
|
|
|
if (StyleManager.IsMetro(item.EffectiveStyle))
|
|
{
|
|
DisplayHelp.DrawRectangle(g, ct.OuterBorder, r);
|
|
}
|
|
else
|
|
DisplayHelp.DrawRoundedRectangle(g, ct.OuterBorder, r, 2);
|
|
r.Inflate(-Dpi.Width1, -Dpi.Height1);
|
|
|
|
|
|
Brush brush = DisplayHelp.CreateBrush(r, ct.BackgroundColors);
|
|
if (brush != null)
|
|
{
|
|
g.FillRectangle(brush, r);
|
|
brush.Dispose();
|
|
}
|
|
g.SmoothingMode = sm;
|
|
if (!ct.InnerBorder.IsEmpty)
|
|
DisplayHelp.DrawRoundedRectangle(g, ct.InnerBorder, r, 2);
|
|
r.Inflate(-Dpi.Width1, -Dpi.Height1);
|
|
|
|
Region oldClip = g.Clip;
|
|
try
|
|
{
|
|
g.SetClip(r, CombineMode.Intersect);
|
|
|
|
Rectangle chunkRect = r;
|
|
if (item.ProgressType == eProgressItemType.Marquee)
|
|
{
|
|
// Horizontal
|
|
if (item.Orientation == eOrientation.Horizontal)
|
|
{
|
|
chunkRect.Width = (int)(chunkRect.Width * .3);
|
|
chunkRect.X += r.Width * item.MarqueeValue / 100 - (int)(chunkRect.Width / 2);
|
|
}
|
|
// Vertical
|
|
else if (item.Orientation == eOrientation.Vertical)
|
|
{
|
|
chunkRect.Height = (int)(chunkRect.Height * .3);
|
|
chunkRect.Y += r.Height * item.MarqueeValue / 100 - (int)(chunkRect.Height / 2);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Horizontal
|
|
if (item.Orientation == eOrientation.Horizontal)
|
|
chunkRect.Width = (int)(chunkRect.Width * ((float)(item.Value - item.Minimum) / (float)(item.Maximum - item.Minimum)));
|
|
// Vertical
|
|
else if (item.Orientation == eOrientation.Vertical)
|
|
{
|
|
int height = (int)(chunkRect.Height * ((float)(item.Value - item.Minimum) / (float)(item.Maximum - item.Minimum)));
|
|
chunkRect.Y = chunkRect.Bottom - height;
|
|
chunkRect.Height = height;
|
|
}
|
|
}
|
|
if (chunkRect.Width <= 0 || chunkRect.Height<=0) return;
|
|
|
|
brush = DisplayHelp.CreateBrush(chunkRect, ct.Chunk);
|
|
if (brush != null)
|
|
{
|
|
g.SmoothingMode = SmoothingMode.None;
|
|
g.FillRectangle(brush, chunkRect);
|
|
brush.Dispose();
|
|
g.SmoothingMode = sm;
|
|
}
|
|
GradientColorTable overlay = ct.ChunkOverlay;
|
|
if (item.Orientation == eOrientation.Horizontal)
|
|
overlay.LinearGradientAngle = 90;
|
|
else
|
|
overlay.LinearGradientAngle = 0;
|
|
brush = DisplayHelp.CreateBrush(chunkRect, overlay);
|
|
if (brush != null)
|
|
{
|
|
g.FillRectangle(brush, chunkRect);
|
|
|
|
if (item.ProgressType == eProgressItemType.Marquee)
|
|
{
|
|
// Horizontal
|
|
if (item.Orientation == eOrientation.Horizontal && chunkRect.Right > r.Right + 4)
|
|
chunkRect = new Rectangle(r.X, r.Y, chunkRect.Right - r.Right - 4, r.Height);
|
|
// Vertical
|
|
else if (item.Orientation == eOrientation.Vertical && chunkRect.Bottom > r.Bottom + 4)
|
|
chunkRect = new Rectangle(r.X, r.Y, r.Height, chunkRect.Bottom - r.Bottom - 4);
|
|
g.FillRectangle(brush, chunkRect);
|
|
}
|
|
|
|
brush.Dispose();
|
|
}
|
|
// Horizontal
|
|
if (item.Orientation == eOrientation.Horizontal && chunkRect.Right + 4 <= r.Right)
|
|
{
|
|
chunkRect.X = chunkRect.Right;
|
|
chunkRect.Width = 4;
|
|
brush = DisplayHelp.CreateBrush(chunkRect, ct.ChunkShadow);
|
|
if (brush != null)
|
|
{
|
|
g.FillRectangle(brush, chunkRect);
|
|
brush.Dispose();
|
|
}
|
|
}
|
|
// Vertical
|
|
else if (item.Orientation == eOrientation.Vertical && chunkRect.Y - 3 >= r.Y)
|
|
{
|
|
chunkRect.Y = chunkRect.Y - 3;
|
|
chunkRect.Height = 3;
|
|
brush = DisplayHelp.CreateBrush(chunkRect, ct.ChunkShadow.Colors, ct.ChunkShadow.LinearGradientAngle-90, ct.ChunkShadow.GradientType);
|
|
if (brush != null)
|
|
{
|
|
g.FillRectangle(brush, chunkRect);
|
|
brush.Dispose();
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
g.Clip = oldClip;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|