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(); /// /// Gets or sets color table used by renderer. /// 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 } }