using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.ComponentModel; using System.Drawing.Drawing2D; namespace DevComponents.DotNetBar.MicroCharts { internal class PieMicroChart : MicroChartBase { public override void CreateChart(MicroChartRenderInfo info) { int chartWidth = Math.Min(info.ChartHeight, info.ChartWidth) - 1; int x = (info.ChartWidth - chartWidth) / 2; int y = (info.ChartHeight - chartWidth) / 2; int dataStep = Math.Max(1, ((info.DataPoints.Count * 15) / 360)); PieMicroChartStyle style = this.Style; Graphics graphics = info.Graphics; double sum = info.Sum; if (dataStep > 1) { sum = 0; for (int i = 0; i < info.DataPoints.Count; i += dataStep) sum += Math.Abs(info.DataPoints[i]); } float angle = 0; int colorsCount = _Style.SliceColors.Count; int sliceColor = 0; int totalPoints = (int)Math.Ceiling((double)info.DataPoints.Count / dataStep); MicroChartHotPoint[] microHotPoints = new MicroChartHotPoint[totalPoints]; int hotPointIndex = 0; using (Pen pen = new Pen(_Style.SliceOutlineColor, 1)) { for (int i = 0; i < info.DataPoints.Count; i += dataStep) { double value = Math.Abs(info.DataPoints[i]); float sweepAngle = (float)Math.Max(1, Math.Round((float)(360 * (value / sum)))); using (SolidBrush brush = new SolidBrush(_Style.SliceColors[sliceColor])) graphics.FillPie(brush, x, y, chartWidth, chartWidth, angle, sweepAngle); graphics.DrawPie(pen, x, y, chartWidth, chartWidth, angle, sweepAngle); Rectangle hotPointBounds = new Rectangle( x + (int)(chartWidth / 2 + chartWidth / 3 * Math.Cos((angle + sweepAngle / 2) * Math.PI / 180)), y + (int)(chartWidth / 2 + chartWidth / 3 * Math.Sin((angle + sweepAngle / 2) * Math.PI / 180)), 1, 1); hotPointBounds.Inflate(4, 4); microHotPoints[hotPointIndex] = new MicroChartHotPoint(hotPointBounds, _Style.SliceColors[sliceColor], value, angle, sweepAngle, i); hotPointIndex++; angle += sweepAngle; sliceColor++; if (sliceColor >= colorsCount) sliceColor = 0; } } info.MicroChartHotPoints = microHotPoints; } private PieMicroChartStyle _Style; public virtual PieMicroChartStyle Style { get { return _Style; } set { _Style = value; } } } /// /// Defines the style for pie chart. /// [System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false), TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))] public class PieMicroChartStyle { private List _SliceColors = new List(); /// /// Initializes a new instance of the PieMicroChartStyle class. /// public PieMicroChartStyle() { _SliceColors.AddRange(new Color[]{ColorScheme.GetColor(0xC00000), ColorScheme.GetColor(0xFF0000), ColorScheme.GetColor(0xFFC000), ColorScheme.GetColor(0xFFFF00), ColorScheme.GetColor(0x92D050), ColorScheme.GetColor(0x00B050), ColorScheme.GetColor(0x00B0F0), ColorScheme.GetColor(0x0070C0), ColorScheme.GetColor(0x002060), ColorScheme.GetColor(0x7030A0), ColorScheme.GetColor(0xEEECE1), ColorScheme.GetColor(0x1F497D), ColorScheme.GetColor(0x4F81BD), ColorScheme.GetColor(0xC0504D), ColorScheme.GetColor(0x9BBB59), ColorScheme.GetColor(0x8064A2), ColorScheme.GetColor(0x4BACC6), ColorScheme.GetColor(0xF79646), ColorScheme.GetColor(0xF2F2F2), ColorScheme.GetColor(0xDDD9C3), ColorScheme.GetColor(0xC6D9F0), ColorScheme.GetColor(0xF2DCDB), ColorScheme.GetColor(0xEBF1DD), ColorScheme.GetColor(0xE5E0EC), ColorScheme.GetColor(0xDBEEF3), ColorScheme.GetColor(0xFDEADA), ColorScheme.GetColor(0xD8D8D8), ColorScheme.GetColor(0xC4BD97), ColorScheme.GetColor(0x8DB3E2), ColorScheme.GetColor(0xE5B9B7), ColorScheme.GetColor(0xD7E3BC), ColorScheme.GetColor(0xCCC1D9), ColorScheme.GetColor(0xB7DDE8), ColorScheme.GetColor(0xFBD5B5), ColorScheme.GetColor(0xBFBFBF), ColorScheme.GetColor(0x938953), ColorScheme.GetColor(0x548DD4), ColorScheme.GetColor(0x95B3D7), ColorScheme.GetColor(0xD99694), ColorScheme.GetColor(0xC3D69B), ColorScheme.GetColor(0xB2A1C7), ColorScheme.GetColor(0x92CDDC), ColorScheme.GetColor(0xFAC08F), ColorScheme.GetColor(0xA5A5A5), ColorScheme.GetColor(0x494429), ColorScheme.GetColor(0x17365D), ColorScheme.GetColor(0x366092), ColorScheme.GetColor(0x953734), ColorScheme.GetColor(0x76923C), ColorScheme.GetColor(0x5F497A), ColorScheme.GetColor(0x31859B), ColorScheme.GetColor(0xE36C09) }); } /// /// Occurs when style appearance changes. /// public event EventHandler StyleChanged; /// /// Raises StyleChanged event. /// /// Provides event arguments. protected virtual void OnStyleChanged(EventArgs e) { EventHandler handler = StyleChanged; if (handler != null) handler(this, e); } private void OnStyleChanged() { OnStyleChanged(EventArgs.Empty); } /// /// Gets the pre-defined slice colors for the pie chart. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public List SliceColors { get { return _SliceColors; } } private Color _SliceOutlineColor = ColorScheme.GetColor(0xE2E4E7); /// /// Gets or sets the color of the slice outline. /// [Category("Appearance"), Description("Indicates color of slice outline.")] public Color SliceOutlineColor { get { return _SliceOutlineColor; } set { _SliceOutlineColor = value; OnStyleChanged(); } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeSliceOutlineColor() { return _SliceOutlineColor != ColorScheme.GetColor(0xE2E4E7); } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetSliceOutlineColor() { this.SliceOutlineColor = ColorScheme.GetColor(0xE2E4E7); } } }