409 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using DevComponents.DotNetBar.Charts;
using DevComponents.DotNetBar.Charts.Style;
/// <summary>
/// Represents the collection of DataLabels.
/// </summary>
[Editor("DevComponents.Charts.Design.DataLabelCollectionEditor, DevComponents.Charts.Design, " +
"Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
public class DataLabelCollection : CustomNamedCollection<DataLabel>
{
#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<DataLabelVisualStyle> _EffectiveDataLabelStyle;
private object _ValueX;
private object _ValueY;
private BarLabelPosition _BarLabelPosition = BarLabelPosition.NotSet;
#endregion
#region Constructors
/// <summary>
/// DataLabel
/// </summary>
/// <param name="sp">Associated SeriesPoint</param>
/// <param name="text">Label text</param>
public DataLabel(SeriesPoint sp, string text)
: this(sp)
{
_Text = text;
}
/// <summary>
/// DataLabel
/// </summary>
/// <param name="sp">Associated SeriesPoint</param>
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];
}
/// <summary>
/// DataLabel
/// </summary>
public DataLabel()
{
_EffectiveDataLabelStyle = new EffectiveStyle<DataLabelVisualStyle>(this);
}
#endregion
#region Public properties
#region BarLabelPosition
/// <summary>
/// Gets or sets the position of bar series labels.
/// </summary>
[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
/// <summary>
/// Gets or sets the visual style for the data label.
/// </summary>
[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
/// <summary>
/// Gets a reference to the DataLabel effective (cached, composite) style.
/// </summary>
[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
/// <summary>
/// Gets or sets the X-Axis Value.
/// </summary>
[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
/// <summary>
/// Gets or sets the Y-Axis Value.
/// </summary>
[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
///<summary>
/// Gets or sets the DataLabel text.
///</summary>
[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
///<summary>
///Invalidate the cached Style definition
///</summary>
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
}
}