using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.ComponentModel; namespace DevComponents.DotNetBar.MicroCharts { internal class HundredPctBar : MicroChartBase { public override void CreateChart(MicroChartRenderInfo info) { int chartHeight = info.ChartHeight; int chartWidth = info.ChartWidth; int x = 0; int y = 0; HundredPctMicroChartStyle style = this.Style; int drawStep = Math.Max(style.MinBarSize, (chartWidth / (Math.Max(1, info.DataPoints.Count)))); int dataStep = Math.Max(1, ((info.DataPoints.Count * drawStep) / chartWidth)); 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]); } int colorsCount = style.BarColors.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.BarOutlineColor, 1)) { for (int i = 0; i < info.DataPoints.Count; i += dataStep) { double value = Math.Abs(info.DataPoints[i]); Rectangle barBounds = new Rectangle(x, y, (int)Math.Round(chartWidth * value / sum), chartHeight); using (SolidBrush brush = new SolidBrush(style.BarColors[sliceColor])) graphics.FillRectangle(brush, barBounds); graphics.DrawRectangle(pen, barBounds); microHotPoints[hotPointIndex] = new MicroChartHotPoint(GetHotPointBounds(barBounds), barBounds, style.BarColors[sliceColor], value, i); hotPointIndex++; x += barBounds.Width; sliceColor++; if (sliceColor >= colorsCount) sliceColor = 0; } } info.MicroChartHotPoints = microHotPoints; } private HundredPctMicroChartStyle _Style; public virtual HundredPctMicroChartStyle Style { get { return _Style; } set { _Style = value; } } private static int HotPointOffset { get { return Dpi.Width4; } } private Rectangle GetHotPointBounds(Rectangle barBounds) { return new Rectangle(barBounds.X + (barBounds.Width - HotPointOffset * 2) / 2, barBounds.Y + (barBounds.Height - HotPointOffset * 2) / 2, HotPointOffset * 2, HotPointOffset * 2); } } /// /// Defines the style for 100% bar chart. /// [System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false), TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))] public class HundredPctMicroChartStyle { private List _BarColors = new List(); /// /// Initializes a new instance of the PieMicroChartStyle class. /// public HundredPctMicroChartStyle() { _BarColors.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); } private int _MinBarWidth = 2; /// /// Gets or sets the minimum single bar width. /// [DefaultValue(2), Category("Appearance"), Description("Indicates minimum single bar width.")] public int MinBarSize { get { return _MinBarWidth; } set { _MinBarWidth = value; OnStyleChanged(); } } /// /// Gets the pre-defined slice colors for the pie chart. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public List BarColors { get { return _BarColors; } } private Color _BarOutlineColor = ColorScheme.GetColor(0xE2E4E7); /// /// Gets or sets the color of the slice outline. /// [Category("Appearance"), Description("Indicates color of slice outline.")] public Color BarOutlineColor { get { return _BarOutlineColor; } set { _BarOutlineColor = value; OnStyleChanged(); } } /// /// Gets whether property should be serialized. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeBarOutlineColor() { return _BarOutlineColor != ColorScheme.GetColor(0xE2E4E7); } /// /// Resets property to its default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetBarOutlineColor() { this.BarOutlineColor = ColorScheme.GetColor(0xE2E4E7); } } }