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

464 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Threading;
namespace DevComponents.DotNetBar.Rendering
{
internal class Office2010RangeSliderPainter : RangeSliderPainter, IOffice2007Painter
{
#region IOffice2007Painter
private Office2007ColorTable _ColorTable = null; //new Office2007ColorTable();
/// <summary>
/// Gets or sets color table used by renderer.
/// </summary>
public Office2007ColorTable ColorTable
{
get { return _ColorTable; }
set { _ColorTable = value; }
}
#endregion
#region Implementation
public override void Paint(RangeSliderItemRendererEventArgs e)
{
RangeSliderItem item = e.SliderItem;
ItemPaintArgs p = e.ItemPaintArgs;
Graphics g = e.Graphics;
Office2010RangeSliderColorTable table = GetColorTable(item, p.ContainerControl);
eOrientation sliderOrientation = item.SliderOrientation;
RangeValue minmaxValue = item.GetNormalizedMinMaxValues();
int min = minmaxValue.Min;
int max = minmaxValue.Max;
RangeValue value = item.GetNormalizedRangeValue();
if (table == null)
{
g.FillRectangle(Brushes.Gray, item.Bounds);
return;
}
if (item.RangeLineHeight > 0)
{
Rectangle rangeBounds;
if (item.SliderOrientation == eOrientation.Horizontal)
{
rangeBounds = new Rectangle(item.TicksBounds.X,
item.RangeButtonMinBounds.Y + (item.RangeButtonMinBounds.Height - item.RangeLineHeight) / 2 + 1,
item.TicksBounds.Width, item.RangeLineHeight);
}
else
{
rangeBounds = new Rectangle(
item.RangeButtonMinBounds.X + (item.RangeButtonMinBounds.Width - item.RangeLineHeight) / 2,
item.TicksBounds.Y,
item.RangeLineHeight, item.TicksBounds.Height);
}
if (table.RangeBackground != null)
{
table.RangeBackground.LinearGradientAngle = (item.SliderOrientation == eOrientation.Horizontal) ? 90 : 180;
Rectangle rb = rangeBounds;
rb.Offset(item.Bounds.Location);
rb.Height--;
using (Brush brush = DisplayHelp.CreateBrush(rb, table.RangeBackground))
DisplayHelp.FillRoundedRectangle(g, brush, rb, table.RangeCornerRadius);
rb.Height++;
if (!table.RangeLineColor.IsEmpty)
DisplayHelp.DrawRoundedRectangle(g, table.RangeLineColor, rb, table.RangeCornerRadius);
}
if (table.RangeValueBackground != null)
{
if (item.SliderOrientation == eOrientation.Horizontal)
{
rangeBounds.X = item.RangeButtonMinBounds.Right;
rangeBounds.Width = item.RangeButtonMaxBounds.X - item.RangeButtonMinBounds.Right;
}
else
{
rangeBounds.Y = item.RangeButtonMinBounds.Bottom;
rangeBounds.Height = item.RangeButtonMaxBounds.Y - item.RangeButtonMinBounds.Bottom;
}
Rectangle rb = rangeBounds;
rb.Offset(item.Bounds.Location);
table.RangeValueBackground.LinearGradientAngle = (item.SliderOrientation == eOrientation.Horizontal) ? 90 : 180;
rb.Height--;
if (item.RangeValueColor.IsEmpty)
{
using (Brush brush = DisplayHelp.CreateBrush(rb, table.RangeValueBackground))
g.FillRectangle(brush, rb);
}
else
{
using(SolidBrush brush=new SolidBrush(item.RangeValueColor))
g.FillRectangle(brush, rb);
}
rb.Height++;
if (!table.RangeValueLineColor.IsEmpty)
{
using (Pen pen = new Pen(table.RangeValueLineColor))
{
if (item.SliderOrientation == eOrientation.Horizontal)
{
g.DrawLine(pen, rb.X, rb.Y, rb.Right, rb.Y);
g.DrawLine(pen, rb.X, rb.Bottom - 1, rb.Right, rb.Bottom - 1);
}
else
{
g.DrawLine(pen, rb.X, rb.Y, rb.X, rb.Bottom);
g.DrawLine(pen, rb.Right - 1, rb.Y, rb.Right - 1, rb.Bottom);
}
}
}
}
}
if (item.TicksVisible && !table.TickLineColor.IsEmpty)
{
Rectangle ticksBounds = item.TicksBounds;
ticksBounds.Offset(item.Bounds.Location);
int steps = item.TicksStep;
//g.FillRectangle(Brushes.Yellow, ticksBounds);
if (sliderOrientation == eOrientation.Horizontal)
{
DrawHTicks(g, table, min, max, ticksBounds, steps);
if (!item.TicksBounds2.IsEmpty)
{
ticksBounds = item.TicksBounds2;
ticksBounds.Offset(item.Bounds.Location);
DrawHTicks(g, table, min, max, ticksBounds, steps);
}
}
else
{
DrawVTicks(g, table, min, max, ticksBounds, steps);
if (!item.TicksBounds2.IsEmpty)
{
ticksBounds = item.TicksBounds2;
ticksBounds.Offset(item.Bounds.Location);
DrawVTicks(g, table, min, max, ticksBounds, steps);
}
}
}
g.ResetClip();
if (item.MinRangeSliderImage != null)
{
Rectangle br = item.RangeButtonMinBounds;
br.Offset(item.Bounds.Location);
g.DrawImage(item.MinRangeSliderImage, br);
}
else
{
Office2010RangeChangePartColorTable ct = table.MinRangeSlider.Default;
if (!item.GetEnabled() && table.MinRangeSlider.Disabled != null)
ct = table.MinRangeSlider.Disabled;
else if (item.MouseDownPart == eRangeSliderPart.MinRangeSlider && table.MinRangeSlider.Pressed != null)
ct = table.MinRangeSlider.Pressed;
else if (item.MouseOverPart == eRangeSliderPart.MinRangeSlider && table.MinRangeSlider.MouseOver != null)
ct = table.MinRangeSlider.MouseOver;
if (ct.Background != null)
ct.Background.LinearGradientAngle = (item.SliderOrientation == eOrientation.Horizontal) ? 90 : 0;
Rectangle br = item.RangeButtonMinBounds;
br.Offset(item.Bounds.Location);
using (GraphicsPath sliderButtonPath = CreateMinSlider(br, item.TicksPosition, item.SliderOrientation))
{
using (Brush brush = DisplayHelp.CreateBrush(br, ct.Background))
g.FillPath(brush, sliderButtonPath);
if (!ct.BorderLightColor.IsEmpty)
{
br.Inflate(-1, -1);
using (GraphicsPath borderPath = CreateMinSlider(br, item.TicksPosition, item.SliderOrientation))
{
using (Pen pen = new Pen(ct.BorderLightColor, 1))
g.DrawPath(pen, sliderButtonPath);
}
}
if (!ct.BorderColor.IsEmpty)
{
using (Pen pen = new Pen(ct.BorderColor, 1))
g.DrawPath(pen, sliderButtonPath);
}
}
}
if (item.MaxRangeSliderImage != null)
{
Rectangle br = item.RangeButtonMaxBounds;
br.Offset(item.Bounds.Location);
g.DrawImage(item.MaxRangeSliderImage, br);
}
else
{
Office2010RangeChangePartColorTable ct = table.MaxRangeSlider.Default;
if (!item.GetEnabled() && table.MaxRangeSlider.Disabled != null)
ct = table.MaxRangeSlider.Disabled;
else if (item.MouseDownPart == eRangeSliderPart.MaxRangeSlider && table.MaxRangeSlider.Pressed != null)
ct = table.MaxRangeSlider.Pressed;
else if (item.MouseOverPart == eRangeSliderPart.MaxRangeSlider && table.MaxRangeSlider.MouseOver != null)
ct = table.MaxRangeSlider.MouseOver;
if (ct.Background != null)
ct.Background.LinearGradientAngle = (item.SliderOrientation == eOrientation.Horizontal) ? 90 : 0;
Rectangle br = item.RangeButtonMaxBounds;
br.Offset(item.Bounds.Location);
using (GraphicsPath sliderButtonPath = CreateMaxSlider(br, item.TicksPosition, item.SliderOrientation))
{
using (Brush brush = DisplayHelp.CreateBrush(br, ct.Background))
g.FillPath(brush, sliderButtonPath);
if (!ct.BorderLightColor.IsEmpty)
{
br.Inflate(-1, -1);
using (GraphicsPath borderPath = CreateMaxSlider(br, item.TicksPosition, item.SliderOrientation))
{
using (Pen pen = new Pen(ct.BorderLightColor, 1))
g.DrawPath(pen, sliderButtonPath);
}
}
if (!ct.BorderColor.IsEmpty)
{
using (Pen pen = new Pen(ct.BorderColor, 1))
g.DrawPath(pen, sliderButtonPath);
}
}
//using (GraphicsPath sliderButtonPath = CreateMaxSlider(item.RangeButtonMaxBounds, item.TicksPosition, item.SliderOrientation))
//{
// g.FillPath(Brushes.Red, sliderButtonPath);
// g.DrawPath(Pens.BlanchedAlmond, sliderButtonPath);
//}
}
}
private static void DrawHTicks(Graphics g, Office2010RangeSliderColorTable table, int min, int max, Rectangle ticksBounds, int steps)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
if (ticksBounds.Width / 2 < Math.Abs(max - min) / steps)
steps = (int)Math.Max(2, Math.Ceiling(Math.Abs(max - min) / ((float)ticksBounds.Width / 2)));
int xstep = (int)RangeSliderItem.GetXStep(ticksBounds.Width, min, max, steps);
int x = ticksBounds.X;
using (Pen linePen = new Pen(table.TickLineColor))
{
for (int i = min; i <= max; i += steps)
{
g.DrawLine(linePen, x, ticksBounds.Y, x, ticksBounds.Bottom - 1);
x += xstep;
}
}
g.SmoothingMode = sm;
}
private static void DrawVTicks(Graphics g, Office2010RangeSliderColorTable table, int min, int max, Rectangle ticksBounds, int steps)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
if (ticksBounds.Height / 2 < Math.Abs(max - min) / steps)
steps = Math.Max(2, Math.Abs(max - min) / (ticksBounds.Height / 2));
int y = ticksBounds.Y;
int ystep = (int)RangeSliderItem.GetXStep(ticksBounds.Height, min, max, steps);
using (Pen linePen = new Pen(table.TickLineColor))
{
for (int i = min; i <= max; i += steps)
{
g.DrawLine(linePen, ticksBounds.X, y, ticksBounds.Right - 1, y);
y += ystep;
}
}
g.SmoothingMode = sm;
}
//private void PaintTrackPart(Office2010RangeChangePartColorTable ct, Rectangle r, Graphics g, eOrientation orientation, eDotNetBarStyle effectiveStyle)
//{
// if (r.Width <= 0 || r.Height <= 0) return;
// 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 - 3) / 2, r.Y + 2, 3, r.Height - 4);
// using (Brush brush = DisplayHelp.CreateBrush(slideBounds, ct.Background))
// {
// g.FillRectangle(brush, slideBounds);
// }
// g.SmoothingMode = sm;
// }
// }
// else
// {
// using (GraphicsPath path = new GraphicsPath())
// {
// path.AddLine(r.X, r.Y, r.X + 11, r.Y);
// path.AddLine(r.X + 11, r.Y, r.X + 11, r.Y + 9);
// path.AddLine(r.X + 11, r.Y + 9, r.X + 6, r.Y + 15);
// path.AddLine(r.X + 5, r.Y + 15, r.X, r.Y + 10);
// path.CloseAllFigures();
// using (SolidBrush brush = new SolidBrush(ct.BorderLightColor))
// g.FillPath(brush, path);
// }
// SmoothingMode sm = g.SmoothingMode;
// g.SmoothingMode = SmoothingMode.AntiAlias;
// r.Offset(1, 1);
// using (GraphicsPath path = new GraphicsPath())
// {
// path.AddLine(r.X, r.Y, r.X + 8, r.Y);
// path.AddLine(r.X + 8, r.Y + 8, r.X + 4, r.Y + 12);
// path.AddLine(r.X, r.Y + 8, r.X, r.Y);
// path.CloseAllFigures();
// if (ct.PartBackground.Colors.Count > 0)
// {
// using (Brush brush = DisplayHelp.CreateBrush(Rectangle.Ceiling(path.GetBounds()), ct.Background))
// {
// 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 + 4, r.Y + 3, r.X + 4, r.Y + 8);
// using (Pen pen = new Pen(ct.PartForeLightColor, 1))
// g.DrawLine(pen, r.X + 5, r.Y + 4, r.X + 5, r.Y + 7);
// g.SmoothingMode = sm;
// }
// if (orientation == eOrientation.Vertical)
// g.ResetTransform();
//}
private GraphicsPath CreateMinSlider(Rectangle r, eTicksPosition position, eOrientation sliderOrientation)
{
GraphicsPath path = new GraphicsPath();
if (sliderOrientation == eOrientation.Horizontal)
{
if (position == eTicksPosition.Top)
{
path.AddLine(r.Right, r.Y, r.Right, r.Bottom);
path.AddLine(r.Right, r.Bottom, r.X, r.Bottom);
path.AddLine(r.X, r.Bottom, r.X, r.Y + r.Width);
path.CloseAllFigures();
}
else if (position == eTicksPosition.Bottom)
{
path.AddLine(r.Right, r.Bottom, r.Right, r.Y);
path.AddLine(r.Right, r.Y, r.X, r.Y);
path.AddLine(r.X, r.Y, r.X, r.Bottom - r.Width);
path.CloseAllFigures();
}
else
{
path.AddRectangle(r);
}
}
else
{
if (position == eTicksPosition.Top)
{
path.AddLine(r.X, r.Bottom, r.Right, r.Bottom);
path.AddLine(r.Right, r.Bottom, r.Right, r.Y);
path.AddLine(r.Right, r.Y, r.X + r.Height, r.Y);
path.CloseAllFigures();
}
else if (position == eTicksPosition.Bottom)
{
path.AddLine(r.Right, r.Bottom, r.X, r.Bottom);
path.AddLine(r.X, r.Bottom, r.X, r.Y);
path.AddLine(r.X, r.Y, r.Right - r.Height, r.Y);
path.CloseAllFigures();
}
else
{
path.AddRectangle(r);
}
}
return path;
}
private GraphicsPath CreateMaxSlider(Rectangle r, eTicksPosition position, eOrientation sliderOrientation)
{
GraphicsPath path = new GraphicsPath();
if (sliderOrientation == eOrientation.Horizontal)
{
if (position == eTicksPosition.Top)
{
path.AddLine(r.X, r.Y, r.X, r.Bottom);
path.AddLine(r.X, r.Bottom, r.Right, r.Bottom);
path.AddLine(r.Right, r.Bottom, r.Right, r.Y + r.Width);
path.CloseAllFigures();
}
else if (position == eTicksPosition.Bottom)
{
path.AddLine(r.X, r.Bottom, r.X, r.Y);
path.AddLine(r.X, r.Y, r.Right, r.Y);
path.AddLine(r.Right, r.Y, r.Right, r.Bottom - r.Width);
path.CloseAllFigures();
}
else
{
path.AddRectangle(r);
}
}
else
{
if (position == eTicksPosition.Top)
{
path.AddLine(r.X, r.Y, r.Right, r.Y);
path.AddLine(r.Right, r.Y, r.Right, r.Bottom);
path.AddLine(r.Right, r.Bottom, r.X + r.Height, r.Bottom);
path.CloseAllFigures();
}
else if (position == eTicksPosition.Bottom)
{
path.AddLine(r.Right, r.Y, r.X, r.Y);
path.AddLine(r.X, r.Y, r.X, r.Bottom);
path.AddLine(r.X, r.Bottom, r.Right - r.Height, r.Bottom);
path.CloseAllFigures();
}
else
{
path.AddRectangle(r);
}
}
return path;
}
protected virtual Office2010RangeSliderColorTable GetColorTable(RangeSliderItem item, System.Windows.Forms.Control container)
{
if (container == null)
return _ColorTable.RangeSlider;
Office2007ColorTable table = _ColorTable;
string key = Office2007ColorTable.GetContextualKey(typeof(Office2010RangeSliderColorTable), container.GetType());
object st = null;
if (container is Bar)
{
if (table.ContextualTables.TryGetValue(key + "+" + ((Bar)container).BarType.ToString(), out st))
return (Office2010RangeSliderColorTable)st;
}
if (table.ContextualTables.TryGetValue(key, out st))
return (Office2010RangeSliderColorTable)st;
return _ColorTable.RangeSlider;
}
#endregion
}
}