352 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
						|
    }
 | 
						|
}
 |