409 lines
10 KiB
C#
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
|
|
}
|
|
}
|