352 lines
7.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
/// <summary>
/// Represents a PointLabel group.
/// </summary>
public class PointLabelGroup
{
#region Private data
private ChartSeries _ChartSeries;
private List<PointLabel> _PointLabels;
#endregion
public PointLabelGroup(ChartSeries chartSeries, List<PointLabel> pointLabels)
{
_ChartSeries = chartSeries;
_PointLabels = pointLabels;
}
#region Public properties
#region ChartSeries
/// <summary>
/// Gets or sets the associated chart series.
/// </summary>
public ChartSeries ChartSeries
{
get { return (_ChartSeries); }
set { _ChartSeries = value; }
}
#endregion
#region PointLabels
/// <summary>
/// Gets or sets the associated list of PointLabels.
/// </summary>
public List<PointLabel> PointLabels
{
get { return (_PointLabels); }
set { _PointLabels = value; }
}
#endregion
#endregion
}
/// <summary>
/// Represents a PointLabel (label associated with a data point in the chart).
/// </summary>
public class PointLabel : IDisposable
{
#region Private data
private SeriesPoint _SeriesPoint;
private float _Angle;
private Rectangle _Bounds;
private Point _EdgePoint;
private Point _Point;
private string _Label;
private Size _LabelSize;
private BarLabelPosition _BarLabelPosition = BarLabelPosition.NotSet;
private DataLabelVisualStyle _DataLabelVisualStyle;
private States _States;
#endregion
public PointLabel(SeriesPoint sp, Point pt, string label)
{
_SeriesPoint = sp;
_Point = pt;
_Label = label;
InitDefaultStates();
}
#region InitDefaultStates
private void InitDefaultStates()
{
SetState(States.Visible, true);
SetState(States.NeedsMeasured, true);
}
#endregion
#region Public properties
#region Angle
/// <summary>
/// Gets the angle used to display the point label
/// associated with the data point.
/// </summary>
public float Angle
{
get { return (_Angle); }
internal set { _Angle = value; }
}
#endregion
#region BarLabelPosition
/// <summary>
/// Gets or sets the position of bar series labels.
/// </summary>
[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>
public DataLabelVisualStyle DataLabelVisualStyle
{
get { return (_DataLabelVisualStyle); }
set
{
if (value != _DataLabelVisualStyle)
{
DataLabelVisualStyle oldValue = _DataLabelVisualStyle;
_DataLabelVisualStyle = value;
StyleVisualChangeHandler(oldValue, value);
}
}
}
#endregion
#region FixedSize
/// <summary>
/// Gets or set whether the LabelSize is a fixed size.
/// </summary>
public bool IsFixedSize
{
get { return (TestState(States.IsFixedSize)); }
set { SetState(States.IsFixedSize, value); }
}
#endregion
#region Label
/// <summary>
/// Gets or sets the label text
/// </summary>
public string Label
{
get { return (_Label); }
set
{
NeedsMeasured = true;
_Label = value;
}
}
#endregion
#region LabelSize
/// <summary>
/// Gets or sets the label size.
/// </summary>
public Size LabelSize
{
get { return (_LabelSize); }
set
{
_LabelSize = value;
NeedsMeasured = false;
}
}
#endregion
#region SeriesPoint
/// <summary>
/// Gets the associated SeriesPoint.
/// </summary>
public SeriesPoint SeriesPoint
{
get { return (_SeriesPoint); }
internal set { _SeriesPoint = value; }
}
#endregion
#region Visible
/// <summary>
/// Gets or sets whether the label is visible.
/// </summary>
public bool Visible
{
get { return (TestState(States.Visible)); }
set { SetState(States.Visible, value); }
}
#endregion
#endregion
#region Internal properties
#region Bounds
internal Rectangle Bounds
{
get { return (_Bounds); }
set { _Bounds = value; }
}
#endregion
#region EdgePoint
internal Point EdgePoint
{
get { return (_EdgePoint); }
set { _EdgePoint = value; }
}
#endregion
#region IsDataLabel
internal bool IsDataLabel
{
get { return (TestState(States.IsDataLabel)); }
set { SetState(States.IsDataLabel, value); }
}
#endregion
#region NeedsMeasured
internal bool NeedsMeasured
{
get { return (TestState(States.NeedsMeasured)); }
set { SetState(States.NeedsMeasured, value); }
}
#endregion
#region Point
internal Point Point
{
get { return (_Point); }
set { _Point = value; }
}
#endregion
#endregion
#region States
[Flags]
private enum States : uint
{
IsFixedSize = (1U << 0),
NeedsMeasured = (1U << 1),
Visible = (1U << 2),
IsDataLabel = (1U << 3),
}
#region TestState
private bool TestState(States state)
{
return ((_States & state) == state);
}
#endregion
#region SetState
private void SetState(States state, bool value)
{
if (value == true)
_States |= state;
else
_States &= ~state;
}
#endregion
#endregion
#region StyleVisualChangeHandler
private void StyleVisualChangeHandler(
INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
{
if (oldValue != null)
oldValue.PropertyChanged -= StyleChanged;
if (newValue != null)
newValue.PropertyChanged += StyleChanged;
}
private void StyleChanged(object sender, PropertyChangedEventArgs e)
{
NeedsMeasured = true;
}
#endregion
#region IDisposable
public void Dispose()
{
DataLabelVisualStyle = null;
}
#endregion
}
}