using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
    /// 
    /// Represents a PieLabel (label associated with a pie data slice in the chart).
    /// 
    public class PieLabel : IDisposable
    {
        #region Private data
        private PieSeriesPoint _PieSeriesPoint;
        private float _Angle;
        private Rectangle _Bounds;
        private Rectangle _ConnectorBounds;
        private Point _PtBoxEdge;
        private Point _PtBoxBend;
        private Point _PtSliceEdge;
        private double _Radius;
        private double _OuterRadius;
        private string _Label;
        private Size _LabelSize;
        private SliceOuterLabelVisualStyle _SliceLabelVisualStyle;
        private States _States;
        #endregion
        public PieLabel(PieSeriesPoint sp, string label)
        {
            _PieSeriesPoint = sp;
            _Label = label;
            InitDefaultStates();
        }
        #region InitDefaultStates
        private void InitDefaultStates()
        {
        }
        #endregion
        #region Public properties
        #region Angle
        /// 
        /// Gets the angle used to display the point label 
        /// associated with the data point.
        /// 
        public float Angle
        {
            get { return (_Angle); }
            internal set { _Angle = value; }
        }
        #endregion
        #region Bounds
        /// 
        /// Gets the label text bounds.
        /// 
        public Rectangle Bounds
        {
            get { return (_Bounds); }
            internal set { _Bounds = value; }
        }
        #endregion
        #region IsLeftlabel
        /// 
        /// Gets whether the label is a left positioned
        /// label (with respect to the chart slice).
        /// 
        public bool IsLeftlabel
        {
            get { return (!TestState(States.RightLabel)); }
            internal set { SetState(States.RightLabel, !value); }
        }
        #endregion
        #region IsRightlabel
        /// 
        /// Gets whether the label is a right positioned
        /// label (with respect to the chart slice).
        /// 
        public bool IsRightlabel
        {
            get { return (TestState(States.RightLabel)); }
            internal set { SetState(States.RightLabel, value); }
        }
        #endregion
        #region Label
        /// 
        /// Gets or sets the label text
        /// 
        public string Label
        {
            get { return (_Label); }
            internal set { _Label = value; }
        }
        #endregion
        #region LabelSize
        /// 
        /// Gets the label size.
        /// 
        public Size LabelSize
        {
            get { return (_LabelSize); }
            internal set { _LabelSize = value; }
        }
        #endregion
        #region PieSeriesPoint
        /// 
        /// Gets the associated PieSeriesPoint.
        /// 
        public PieSeriesPoint PieSeriesPoint
        {
            get { return (_PieSeriesPoint); }
            internal set { _PieSeriesPoint = value; }
        }
        #endregion
        #region PtBoxBend
        /// 
        /// Gets the middle connector point located
        /// at the 'bend' of the connector.
        /// 
        public Point PtBoxBend
        {
            get { return (_PtBoxBend); }
            internal set { _PtBoxBend = value; }
        }
        #endregion
        #region PtBoxEdge
        /// 
        /// Gets the connector point located and the
        /// 'edge' of the label text bounding box.
        /// 
        public Point PtBoxEdge
        {
            get { return (_PtBoxEdge); }
            internal set { _PtBoxEdge = value; }
        }
        #endregion
        #region PtSliceEdge
        /// 
        /// Gets the initial connector point, located at
        /// the edge of the pie slice.
        /// 
        public Point PtSliceEdge
        {
            get { return (_PtSliceEdge); }
            internal set { _PtSliceEdge = value; }
        }
        #endregion
        #region SliceLabelVisualStyle
        /// 
        /// Gets the current slice label VisualStyle for the label.
        /// 
        public SliceOuterLabelVisualStyle LabelStyle
        {
            get { return (_SliceLabelVisualStyle); }
            internal set { _SliceLabelVisualStyle = value; }
        }
        #endregion
        #endregion
        #region Internal properties
        #region ConnectorBounds
        internal Rectangle ConnectorBounds
        {
            get { return (_ConnectorBounds); }
            set { _ConnectorBounds = value; }
        }
        #endregion
        #region OuterRadius
        internal double OuterRadius
        {
            get { return (_OuterRadius); }
            set { _OuterRadius = value; }
        }
        #endregion
        #region Radius
        internal double Radius
        {
            get { return (_Radius); }
            set { _Radius = value; }
        }
        #endregion
        #endregion
        #region States
        [Flags]
        private enum States : uint
        {
            RightLabel = (1U << 0),
        }
        #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 IDisposable
        public void Dispose()
        {
        }
        #endregion
    }
}