SourceCode/PROMS/DotNetBar Source Code/Rendering/Office2007SliderPainter.cs

481 lines
21 KiB
C#

using System;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using DevComponents.DotNetBar.Ribbon;
namespace DevComponents.DotNetBar.Rendering
{
internal class Office2007SliderPainter : SliderPainter, 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
protected virtual Office2007SliderColorTable GetColorTable(SliderItem item, System.Windows.Forms.Control container)
{
if (item.ColorTable != null)
return item.ColorTable;
if (container == null)
return m_ColorTable.Slider;
Office2007ColorTable table = m_ColorTable;
string key = Office2007ColorTable.GetContextualKey(typeof(Office2007SliderColorTable), container.GetType());
object st = null;
if (container is Bar)
{
if (table.ContextualTables.TryGetValue(key + "+" + ((Bar)container).BarType.ToString(), out st))
return (Office2007SliderColorTable)st;
}
if (table.ContextualTables.TryGetValue(key, out st))
return (Office2007SliderColorTable)st;
return m_ColorTable.Slider;
}
public override void Paint(SliderItemRendererEventArgs e)
{
SliderItem item = e.SliderItem;
Office2007SliderColorTable ct = GetColorTable(item, e.ItemPaintArgs.ContainerControl);
Office2007SliderStateColorTable decreaseCt = null;
Office2007SliderStateColorTable increaseCt = null;
Office2007SliderStateColorTable trackCt = null;
eDotNetBarStyle effectiveStyle = item.EffectiveStyle;
if (item.GetEnabled())
{
decreaseCt = ct.Default;
increaseCt = ct.Default;
trackCt = ct.Default;
if (ct.DecreaseButtonPart != null)
decreaseCt = ct.DecreaseButtonPart.Default;
if (ct.IncreaseButtonPart != null)
increaseCt = ct.IncreaseButtonPart.Default;
if (ct.TrackPart != null)
trackCt = ct.TrackPart.Default;
if (item.MouseDownPart == eSliderPart.DecreaseButton)
{
if (ct.DecreaseButtonPart != null)
decreaseCt = ct.DecreaseButtonPart.Pressed;
else
decreaseCt = ct.Pressed;
}
else if (item.MouseDownPart == eSliderPart.IncreaseButton)
{
if (ct.IncreaseButtonPart != null)
increaseCt = ct.IncreaseButtonPart.Pressed;
else
increaseCt = ct.Pressed;
}
else if (item.MouseDownPart == eSliderPart.TrackArea)
{
if (ct.TrackPart != null)
trackCt = ct.TrackPart.Pressed;
else
trackCt = ct.Pressed;
}
else if (item.MouseOverPart == eSliderPart.DecreaseButton)
{
if (ct.DecreaseButtonPart != null)
decreaseCt = ct.DecreaseButtonPart.MouseOver;
else
decreaseCt = ct.MouseOver;
}
else if (item.MouseOverPart == eSliderPart.IncreaseButton)
{
if (ct.IncreaseButtonPart != null)
increaseCt = ct.IncreaseButtonPart.MouseOver;
else
increaseCt = ct.MouseOver;
}
else if (item.MouseOverPart == eSliderPart.TrackArea)
{
if (ct.TrackPart != null)
trackCt = ct.TrackPart.MouseOver;
else
trackCt = ct.MouseOver;
}
}
else
{
decreaseCt = ct.Disabled;
increaseCt = ct.Disabled;
trackCt = ct.Disabled;
}
Rectangle itemRect = item.DisplayRectangle;
Rectangle r = item.LabelBounds;
Graphics g = e.Graphics;
string text = GetText(item);
if (!r.IsEmpty && text.Length > 0)
{
r.Offset(itemRect.Location);
eTextFormat tf = eTextFormat.Default | eTextFormat.WordEllipsis;
if (item.LabelPosition == eSliderLabelPosition.Left)
tf |= eTextFormat.Left | eTextFormat.VerticalCenter;
else if (item.LabelPosition == eSliderLabelPosition.Right)
tf |= eTextFormat.Right | eTextFormat.VerticalCenter;
else if (item.LabelPosition == eSliderLabelPosition.Top)
tf |= eTextFormat.HorizontalCenter | eTextFormat.Top | eTextFormat.WordBreak;
else if (item.LabelPosition == eSliderLabelPosition.Bottom)
tf |= eTextFormat.HorizontalCenter | eTextFormat.Bottom | eTextFormat.WordBreak;
Color cl = trackCt.LabelColor;
if (e.ItemPaintArgs.ContainerControl is DevComponents.DotNetBar.Controls.Slider)
cl = trackCt.SliderLabelColor;
if (!item.TextColor.IsEmpty)
cl = item.TextColor;
if (item.TextMarkupBody == null)
{
#if FRAMEWORK20
if (e.ItemPaintArgs != null && e.ItemPaintArgs.GlassEnabled && item.Parent is CaptionItemContainer && !(e.ItemPaintArgs.ContainerControl is QatToolbar))
{
if (!e.ItemPaintArgs.CachedPaint)
Office2007RibbonControlPainter.PaintTextOnGlass(g, GetText(item), e.ItemPaintArgs.Font, r, TextDrawing.GetTextFormat(tf));
}
else
#endif
{
if (item.SliderOrientation == eOrientation.Vertical)
{
g.RotateTransform(90);
TextDrawing.DrawString(g, GetText(item), e.ItemPaintArgs.Font, cl, new Rectangle(r.Top, -r.Right, r.Height, r.Width), tf);
g.ResetTransform();
}
else
TextDrawing.DrawString(g, GetText(item), e.ItemPaintArgs.Font, cl, r, tf);
}
}
else
{
if (item.SliderOrientation == eOrientation.Vertical)
{
g.RotateTransform(90);
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, e.ItemPaintArgs.Font, cl, e.ItemPaintArgs.RightToLeft);
d.HotKeyPrefixVisible = !((tf & eTextFormat.HidePrefix) == eTextFormat.HidePrefix);
item.TextMarkupBody.Bounds = new Rectangle(r.Top, -r.Right, item.TextMarkupBody.Bounds.Width, item.TextMarkupBody.Bounds.Height);
item.TextMarkupBody.Render(d);
g.ResetTransform();
}
else
{
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, e.ItemPaintArgs.Font, cl, e.ItemPaintArgs.RightToLeft);
d.HotKeyPrefixVisible = !((tf & eTextFormat.HidePrefix) == eTextFormat.HidePrefix);
item.TextMarkupBody.Bounds = r;
item.TextMarkupBody.Render(d);
}
}
}
r = item.SlideBounds;
int penWidth = Dpi.Width1;
if (!r.IsEmpty)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
r.Offset(itemRect.Location);
if (item.SliderOrientation == eOrientation.Horizontal)
{
// Draw the track line
int ty = r.Y + r.Height / 2 - 1;
int tmx = r.X + r.Width / 2;
if (!trackCt.TrackLineColor.IsEmpty)
{
using (Pen pen = new Pen(trackCt.TrackLineColor, penWidth))
{
g.DrawLine(pen, r.X - 1, ty, r.Right, ty);
}
}
if (!trackCt.TrackLineLightColor.IsEmpty)
{
ty++;
tmx++;
using (Pen pen = new Pen(trackCt.TrackLineLightColor, penWidth))
{
if (item.TrackMarker)
g.DrawLine(pen, tmx, ty - 3, tmx, ty + 3);
g.DrawLine(pen, r.X - 1, ty, r.Right, ty);
}
}
if (!trackCt.TrackLineColor.IsEmpty && item.TrackMarker)
{
ty--;
tmx--;
using (Pen pen = new Pen(trackCt.TrackLineColor, penWidth))
{
g.DrawLine(pen, tmx, ty - 3, tmx, ty + 3);
}
}
g.SmoothingMode = sm;
int tx = 0;
if (e.ItemPaintArgs.RightToLeft)
tx = (int)((r.Width - Dpi.Width11) * (1 - ((item.Maximum - item.Minimum == 0) ? 0 : (float)(item.Value - item.Minimum) / (item.Maximum - item.Minimum))));
else
tx = (int)((r.Width - Dpi.Width11) * ((item.Maximum - item.Minimum == 0) ? 0 : (float)(item.Value - item.Minimum) / (item.Maximum - item.Minimum)));
// Draw the tracker
Rectangle trackRect = r;
trackRect.X += tx;
trackRect.Width = Dpi.Width11;
trackRect.Height = Dpi.Height15;
trackRect.Y += (r.Height - trackRect.Height) / 2;
PaintSliderPart(trackCt, trackRect, g, eSliderPart.TrackArea, item.SliderOrientation, effectiveStyle);
item.TrackBounds = trackRect;
}
else
{
// Draw the track line
int tx = r.X + r.Width / 2 - 1;
int tmy = r.Y + r.Height / 2;
if (!trackCt.TrackLineColor.IsEmpty)
{
using (Pen pen = new Pen(trackCt.TrackLineColor, penWidth))
{
g.DrawLine(pen, tx, r.Y - 1, tx, r.Bottom);
}
}
if (!trackCt.TrackLineLightColor.IsEmpty)
{
tx++;
tmy++;
using (Pen pen = new Pen(trackCt.TrackLineLightColor, penWidth))
{
if (item.TrackMarker)
g.DrawLine(pen, tx - 3, tmy, tx + 3, tmy);
g.DrawLine(pen, tx, r.Y - 1, tx, r.Bottom);
}
}
if (!trackCt.TrackLineColor.IsEmpty && item.TrackMarker)
{
tx--;
tmy--;
using (Pen pen = new Pen(trackCt.TrackLineColor, penWidth))
{
g.DrawLine(pen, tx - 3, tmy, tx + 3, tmy);
}
}
g.SmoothingMode = sm;
int ty = 0;
ty = (r.Height - 16) - (int)((r.Height - 11) * ((item.Maximum - item.Minimum == 0) ? 0 : (float)(item.Value - item.Minimum) / (item.Maximum - item.Minimum)));
// Draw the tracker
Rectangle trackRect = r;
trackRect.Y += ty;
trackRect.Width = Dpi.Width15;
trackRect.Height = Dpi.Height11;
trackRect.X += (r.Width - trackRect.Width) / 2;
PaintSliderPart(trackCt, trackRect, g, eSliderPart.TrackArea, item.SliderOrientation, effectiveStyle);
item.TrackBounds = trackRect;
}
}
r = item.DecreaseBounds;
if (!r.IsEmpty)
{
r.Offset(itemRect.Location);
r.Width--;
r.Height--;
PaintSliderPart(decreaseCt, r, g, eSliderPart.DecreaseButton, item.SliderOrientation, effectiveStyle);
}
r = item.IncreaseBounds;
if (!r.IsEmpty)
{
r.Offset(itemRect.Location);
r.Width--;
r.Height--;
PaintSliderPart(increaseCt, r, g, eSliderPart.IncreaseButton, item.SliderOrientation, effectiveStyle);
}
base.Paint(e);
}
private string GetText(SliderItem item)
{
return item.Text;
}
//private void PaintSliderPart(Office2007SliderStateColorTable ct, Rectangle r, Graphics g, eSliderPart part)
//{
// PaintSliderPart(ct, r, g, part, eOrientation.Horizontal, eDotNetBarStyle.Office2010);
//}
private void PaintSliderPart(Office2007SliderStateColorTable ct, Rectangle r, Graphics g, eSliderPart part, eOrientation orientation, eDotNetBarStyle effectiveStyle)
{
if (r.Width <= 0 || r.Height <= 0) return;
if (part == eSliderPart.DecreaseButton || part == eSliderPart.IncreaseButton)
{
r.Inflate(-1, -1);
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
if (ct.PartBackground.Colors.Count > 0)
{
using (Brush brush = DisplayHelp.CreateBrush(r, ct.PartBackground))
{
g.FillEllipse(brush, r);
}
}
if (!ct.PartBorderColor.IsEmpty)
{
using (Pen pen = new Pen(ct.PartBorderColor, 1))
g.DrawEllipse(pen, r);
}
r.Inflate(1, 1);
if (!ct.PartBorderLightColor.IsEmpty)
{
using (Pen pen = new Pen(ct.PartBorderLightColor, 1))
g.DrawEllipse(pen, r);
}
g.SmoothingMode = SmoothingMode.None;
if (part == eSliderPart.DecreaseButton)
{
Size ps = new Size(Dpi.Width9, Dpi.Height3);
Rectangle rp = new Rectangle(r.X + (r.Width - ps.Width) / 2, r.Y + (r.Height - ps.Height) / 2, ps.Width, ps.Height);
if (!ct.PartForeLightColor.IsEmpty)
{
using (Pen pen = new Pen(ct.PartForeLightColor, 1))
g.DrawRectangle(pen, rp);
}
if (!ct.PartForeColor.IsEmpty)
{
rp.Offset(1, 1);
rp.Width--;
rp.Height--;
using (SolidBrush brush = new SolidBrush(ct.PartForeColor))
g.FillRectangle(brush, rp);
}
}
else if (part == eSliderPart.IncreaseButton)
{
Size ps = new Size(Dpi.Width8, Dpi.Height8);
Rectangle rp = new Rectangle(r.X + (r.Width - ps.Width) / 2, r.Y + (r.Height - ps.Height) / 2, ps.Width, ps.Height);
if (!ct.TrackLineLightColor.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(ct.PartForeLightColor))
{
g.FillRectangle(brush, new Rectangle(rp.X, rp.Y + Dpi.Height3, rp.Width + Dpi.Width2, Dpi.Height4));
g.FillRectangle(brush, new Rectangle(rp.X + Dpi.Width3, rp.Y, Dpi.Width4, Dpi.Height3));
g.FillRectangle(brush, new Rectangle(rp.X + Dpi.Width3, rp.Bottom - Dpi.Height1, Dpi.Width4, Dpi.Height3));
}
}
if (!ct.TrackLineColor.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(ct.PartForeColor))
{
g.FillRectangle(brush, new Rectangle(rp.X + Dpi.Width1, rp.Y + Dpi.Width4, rp.Width, Dpi.Width2));
g.FillRectangle(brush, new Rectangle(rp.X + Dpi.Width4, rp.Y + Dpi.Height1, Dpi.Width2, Dpi.Height4));
g.FillRectangle(brush, new Rectangle(rp.X + Dpi.Width4, rp.Bottom - Dpi.Width2, Dpi.Width2, Dpi.Height3));
}
}
}
g.SmoothingMode = sm;
}
else if (part == eSliderPart.TrackArea)
{
if (orientation == eOrientation.Vertical)
{
// Left
Matrix m = new Matrix();
m.RotateAt(-90, new PointF(r.X, r.Bottom));
m.Translate(r.Height, r.Width - r.Height, MatrixOrder.Append);
g.Transform = m;
}
if (StyleManager.IsMetro(effectiveStyle))
{
if (!ct.PartBackground.IsEmpty)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.Default;
Rectangle slideBounds = new Rectangle(r.X + (r.Width - Dpi.Width3) / 2, r.Y + Dpi.Width2, Dpi.Width3, r.Height - Dpi.Width4);
using (Brush brush = DisplayHelp.CreateBrush(slideBounds, ct.PartBackground))
{
g.FillRectangle(brush, slideBounds);
}
g.SmoothingMode = sm;
}
}
else
{
using (GraphicsPath path = new GraphicsPath())
{
int x1 = Dpi.Width11;
path.AddLine(r.X, r.Y, r.X + x1, r.Y);
path.AddLine(r.X + x1, r.Y, r.X + x1, r.Y + Dpi.Height9);
path.AddLine(r.X + x1, r.Y + Dpi.Height9, r.X + Dpi.Width6, r.Y + Dpi.Height15);
path.AddLine(r.X + Dpi.Width5, r.Y + Dpi.Height15, r.X, r.Y + Dpi.Width10);
path.CloseAllFigures();
using (SolidBrush brush = new SolidBrush(ct.PartBorderLightColor))
g.FillPath(brush, path);
}
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
r.Offset(1, 1);
using (GraphicsPath path = new GraphicsPath())
{
int n2 = Dpi.Width8;
path.AddLine(r.X, r.Y, r.X + n2, r.Y);
path.AddLine(r.X + n2, r.Y + n2, r.X + n2/2, r.Y + Dpi.Height12);
path.AddLine(r.X, r.Y + n2, r.X, r.Y);
path.CloseAllFigures();
if (ct.PartBackground.Colors.Count > 0)
{
using (Brush brush = DisplayHelp.CreateBrush(Rectangle.Ceiling(path.GetBounds()), ct.PartBackground))
{
g.FillPath(brush, path);
}
}
using (Pen pen = new Pen(ct.PartBorderColor, 1))
g.DrawPath(pen, path);
}
using (Pen pen = new Pen(Color.FromArgb(200, ct.PartForeColor), 1))
g.DrawLine(pen, r.X + Dpi.Width4, r.Y + Dpi.Height3, r.X + Dpi.Width4, r.Y + Dpi.Height8);
using (Pen pen = new Pen(ct.PartForeLightColor, 1))
g.DrawLine(pen, r.X + Dpi.Width5, r.Y + Dpi.Height4, r.X + Dpi.Width5, r.Y + Dpi.Height7);
g.SmoothingMode = sm;
}
if (orientation == eOrientation.Vertical)
g.ResetTransform();
}
}
#endregion
}
}