using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing.Design; using DevComponents.DotNetBar.Charts; using DevComponents.DotNetBar.Charts.Style; /// /// Represents the collection of DataLabels. /// [Editor("DevComponents.Charts.Design.DataLabelCollectionEditor, DevComponents.Charts.Design, " + "Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))] public class DataLabelCollection : CustomNamedCollection { #region GetUniqueName public string GetUniqueName() { return (GetUniqueName("DataLabel")); } #endregion } namespace DevComponents.DotNetBar.Charts { public class DataLabel : ChartVisualElement, IEffectiveStyle { #region Private variables private string _Text; private DataLabelVisualStyle _DataLabelVisualStyle; private EffectiveStyle _EffectiveDataLabelStyle; private object _ValueX; private object _ValueY; private BarLabelPosition _BarLabelPosition = BarLabelPosition.NotSet; #endregion #region Constructors /// /// DataLabel /// /// Associated SeriesPoint /// Label text public DataLabel(SeriesPoint sp, string text) : this(sp) { _Text = text; } /// /// DataLabel /// /// Associated SeriesPoint public DataLabel(SeriesPoint sp) : this() { if (sp.ValueX == null) throw new Exception("DataLabel Value X must be defined."); if (sp.ValueY == null || sp.ValueY.Length == 0) throw new Exception("DataLabel Value Y must be defined."); ValueX = sp.ValueX; ValueY = sp.ValueY[0]; } /// /// DataLabel /// public DataLabel() { _EffectiveDataLabelStyle = new EffectiveStyle(this); } #endregion #region Public properties #region BarLabelPosition /// /// Gets or sets the position of bar series labels. /// [DefaultValue(BarLabelPosition.NotSet), Category("Bar Display")] [Description("Indicates the position of bar series labels.")] public BarLabelPosition BarLabelPosition { get { return (_BarLabelPosition); } set { _BarLabelPosition = value; } } #endregion #region DataLabelVisualStyle /// /// Gets or sets the visual style for the data label. /// [Category("Style")] [Description("Indicates the visual style for the data label.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataLabelVisualStyle DataLabelVisualStyle { get { if (_DataLabelVisualStyle == null) { _DataLabelVisualStyle = new DataLabelVisualStyle(); StyleVisualChangeHandler(null, _DataLabelVisualStyle); } return (_DataLabelVisualStyle); } set { if (_DataLabelVisualStyle != value) { DataLabelVisualStyle oldValue = _DataLabelVisualStyle; _DataLabelVisualStyle = value; OnVisualStyleChanged("DataLabelVisualStyle", oldValue, value); if (oldValue != null) oldValue.Dispose(); } } } #endregion #region EffectiveDataLabelStyle /// /// Gets a reference to the DataLabel effective (cached, composite) style. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Description("Indicates a reference to the DataLabel effective (cached, composite) style.")] public DataLabelVisualStyle EffectiveDataLabelStyle { get { return (_EffectiveDataLabelStyle.Style); } } #endregion #region ValueX /// /// Gets or sets the X-Axis Value. /// [Category("Data")] [Description("Indicates the X-Axis Value.")] [TypeConverter("DevComponents.Charts.Design.PointValueConverter, DevComponents.Charts.Design," + "Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public object ValueX { get { return (_ValueX); } set { _ValueX = value; } } #endregion #region ValueY /// /// Gets or sets the Y-Axis Value. /// [Category("Data")] [Description("Indicates the Y-Axis Value.")] [TypeConverter("DevComponents.Charts.Design.PointValueConverter, DevComponents.Charts.Design," + "Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public object ValueY { get { return (_ValueY); } set { _ValueY = value; } } #endregion #region Text /// /// Gets or sets the DataLabel text. /// [DefaultValue(null), Category("Appearance")] [Description("Indicates the DataLabel text.")] public string Text { get { return (_Text); } set { _Text = value; OnPropertyChangedEx("Text", VisualChangeType.Layout); } } #endregion #endregion #region MeasureOverride protected override void MeasureOverride(ChartLayoutInfo layoutInfo) { } #endregion #region ArrangeOverride protected override void ArrangeOverride(ChartLayoutInfo layoutInfo) { } #endregion #region RenderOverride protected override void RenderOverride(ChartRenderInfo renderInfo) { } #endregion #region Style handling #region ApplyStyles public override void ApplyStyles(BaseVisualStyle style) { DataLabelVisualStyle dstyle = style as DataLabelVisualStyle; if (dstyle != null) { ChartSeries series = Parent as ChartSeries; dstyle.ApplyStyle(series.EffectiveDataLabelStyle); dstyle.ApplyStyle(DataLabelVisualStyle); } } #endregion #region InvalidateStyle /// ///Invalidate the cached Style definition /// public void InvalidateStyle() { ClearEffectiveStyles(); } #endregion #region ClearEffectiveStyles protected override void ClearEffectiveStyles() { if (_EffectiveDataLabelStyle.InvalidateStyle() == true) InvalidateLayout(); ChartXy chartXy = ParentChartContainer as ChartXy; if (chartXy != null) chartXy.InvalidatePointLabels(); } #endregion #endregion #region Copy/CopyTo public override ChartVisualElement Copy() { DataLabel copy = new DataLabel(); CopyTo(copy); return (copy); } public override void CopyTo(ChartVisualElement copy) { DataLabel c = copy as DataLabel; if (c != null) { base.CopyTo(c); c.DataLabelVisualStyle = (_DataLabelVisualStyle != null) ? DataLabelVisualStyle.Copy() : null; c.ValueX = ValueX; c.ValueY = ValueY; c.Text = (Text != null) ? (string)Text.Clone() : null; } } #endregion #region GetSerialData internal override SerialElementCollection GetSerialData(string serialName) { SerialElementCollection sec = new SerialElementCollection(); if (serialName != null) { if (serialName.Equals("") == true) serialName = "DataLabel"; sec.AddStartElement(serialName); } if (_DataLabelVisualStyle != null && _DataLabelVisualStyle.IsEmpty == false) sec.AddElement(_DataLabelVisualStyle.GetSerialData("DataLabelVisualStyle")); sec.AddDataValue("ValueX", ValueX, null); sec.AddDataValue("ValueY", ValueY, null); sec.AddValue("Text", Text, null); sec.AddElement(base.GetSerialData(null)); if (serialName != null) sec.AddEndElement(serialName); return (sec); } #endregion #region PutSerialData #region ProcessValue internal override void ProcessValue(SerialElement se) { switch (se.Name) { case "ValueX": ValueX = se.DataValue; break; case "ValueY": ValueY = se.DataValue; break; case "Text": Text = se.StringValue; break; default: base.ProcessValue(se); break; } } #endregion #region ProcessCollection internal override void ProcessCollection(SerialElement se) { SerialElementCollection sec = se.Sec; switch (se.Name) { case "DataLabelVisualStyle": sec.PutSerialData(DataLabelVisualStyle); break; default: base.ProcessCollection(se); break; } } #endregion #endregion #region IDisposable public override void Dispose() { DataLabelVisualStyle = null; base.Dispose(); } #endregion } }