using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.Charts.TextMarkup;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
    /// 
    /// Represents the collection of PieReferenceLines.
    /// 
    [Editor("DevComponents.Charts.Design.PieReferenceCollectionEditor, DevComponents.Charts.Design, " +
            "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
    public class PieReferenceLineCollection : CustomNamedCollection
    {
        #region GetUniqueName
        /// 
        /// Gets a unique (unused) reference line Name.
        /// 
        /// 
        public string GetUniqueName()
        {
            return (GetUniqueName("PieRefLine"));
        }
        #endregion
    }
    /// 
    /// Represents a reference line (a radial line on the chart
    /// that can be used to signify, or reference, a specific chart value).
    /// 
    public class PieReferenceLine : ChartVisualElement
    {
        #region Private variables
        private double _Value;
        private PieReferenceLineVisualStyle _ReferenceLineVisualStyle;
        private EffectiveStyle _EffectiveStyle;
        #endregion
        #region Constructors
        /// 
        /// PieReferenceLine
        /// 
        public PieReferenceLine()
        {
            _EffectiveStyle = new EffectiveStyle(this);
        }
        /// 
        /// PieReferenceLine
        /// 
        /// 
        public PieReferenceLine(string name)
            : this()
        {
            Name = name;
        }
        /// 
        /// PieReferenceLine
        /// 
        /// 
        /// 
        public PieReferenceLine(string name, double value)
            : this(name)
        {
            Value = value;
        }
        #endregion
        #region Public properties
        #region EffectiveStyle
        /// 
        /// Gets a reference to the ReferenceLine's Effective (cached, composite) style.
        /// 
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public PieReferenceLineVisualStyle EffectiveStyle
        {
            get { return (_EffectiveStyle.Style); }
        }
        #endregion
        #region ReferenceLineVisualStyle
        /// 
        /// Gets or sets the visual style for the Reference Line.
        /// 
        [Category("Style")]
        [Description("Indicates the visual style for the ReferenceLine.")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public PieReferenceLineVisualStyle ReferenceLineVisualStyle
        {
            get
            {
                if (_ReferenceLineVisualStyle == null)
                {
                    _ReferenceLineVisualStyle = new PieReferenceLineVisualStyle();
                    StyleVisualChangeHandler(null, _ReferenceLineVisualStyle);
                }
                return (_ReferenceLineVisualStyle);
            }
            set
            {
                if (_ReferenceLineVisualStyle != value)
                {
                    PieReferenceLineVisualStyle oldValue = _ReferenceLineVisualStyle;
                    _ReferenceLineVisualStyle = value;
                    OnVisualStyleChanged("ReferenceLineVisualStyle", oldValue, value);
                    if (oldValue != null)
                        oldValue.Dispose();
                }
            }
        }
        #endregion
        #region  Value
        ///
        /// Gets or sets the associated radial grid value of the reference line.
        ///
        [DefaultValue(null), Category("Appearance")]
        [Description("Indicates the associated radial grid value of the reference line.")]
        //[TypeConverter("DevComponents.Charts.Design.PointValueConverter," +
        //    "DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
        public double Value
        {
            get { return (_Value); }
            set
            {
                if (value != _Value)
                {
                    _Value = value;
                    OnPropertyChangedEx("Value", VisualChangeType.Render);
                }
            }
        }
        #endregion
        #endregion
        #region Internal properties
        #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)
        {
        }
        #region RenderLine
        internal void RenderLine(ChartRenderInfo renderInfo)
        {
        }
        #endregion
        #endregion
        #region InvalidateRender
        public override void InvalidateRender()
        {
            ChartVisualElement cve = Parent as ChartVisualElement;
            if (cve != null)
                cve.InvalidateRender();
            else
                base.InvalidateRender();
        }
        #endregion
        #region Style handling
        #region ApplyStyles
        public override void ApplyStyles(BaseVisualStyle style)
        {
            ChartLineVisualStyle rstyle = style as ChartLineVisualStyle;
            if (rstyle != null)
            {
                ApplyParentStyles(rstyle, Parent as ChartContainer);
                rstyle.ApplyStyle(ReferenceLineVisualStyle);
                if (rstyle.LineColor.IsEmpty == true)
                    rstyle.LineColor = Color.Red;
                if (rstyle.LineWidth < 0)
                    rstyle.LineWidth = 1;
            }
        }
        #region ApplyParentStyles
        private void ApplyParentStyles(ChartLineVisualStyle pstyle, ChartContainer item)
        {
            if (item != null)
            {
                ApplyParentStyles(pstyle, item.Parent as ChartContainer);
                ChartPanel chartPanel = item as ChartPanel;
                if (chartPanel != null)
                {
                    pstyle.ApplyStyle(chartPanel.DefaultVisualStyles.PieChartVisualStyle.ReferenceLineVisualStyle);
                }
                else if (item is PieChart)
                {
                    PieChart pieChart = (PieChart)item;
                    pstyle.ApplyStyle(pieChart.ChartVisualStyle.ReferenceLineVisualStyle);
                }
            }
            else
            {
                pstyle.ApplyStyle(ChartControl.BaseVisualStyles.ReferenceLineVisualStyle);
                pstyle.ApplyStyle(ChartControl.DefaultVisualStyles.ReferenceLineVisualStyle);
            }
        }
        #endregion
        #endregion
        #region InvalidateStyle
        ///
        ///Invalidate the cached Style definition
        ///
        public void InvalidateStyle()
        {
            ClearEffectiveStyles();
        }
        #endregion
        #region ClearEffectiveStyles
        protected override void ClearEffectiveStyles()
        {
            if (_EffectiveStyle.InvalidateStyle() == true)
                InvalidateLayout();
        }
        #endregion
        #endregion
        #region Copy/CopyTo
        public override ChartVisualElement Copy()
        {
            PieReferenceLine copy = new PieReferenceLine();
            CopyTo(copy);
            return (copy);
        }
        public override void CopyTo(ChartVisualElement copy)
        {
            PieReferenceLine c = copy as PieReferenceLine;
            if (c != null)
            {
                base.CopyTo(c);
                c.Value = Value;
                c.ReferenceLineVisualStyle =
                    (_ReferenceLineVisualStyle != null) ? ReferenceLineVisualStyle.Copy() : null;
            }
        }
        #endregion
        #region GetSerialData
        internal override SerialElementCollection GetSerialData(string serialName)
        {
            SerialElementCollection sec = new SerialElementCollection();
            if (serialName != null)
            {
                if (serialName.Equals("") == true)
                    serialName = "PieReferenceLine";
                sec.AddStartElement(serialName);
            }
            if (_ReferenceLineVisualStyle != null && _ReferenceLineVisualStyle.IsEmpty == false)
                sec.AddElement(_ReferenceLineVisualStyle.GetSerialData("ReferenceLineVisualStyle"));
            sec.AddValue("Value", Value, 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 "Value":
                    Value = double.Parse(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 "ReferenceLineVisualStyle":
                    sec.PutSerialData(ReferenceLineVisualStyle);
                    break;
                default:
                    base.ProcessCollection(se);
                    break;
            }
        }
        #endregion
        #endregion
        #region IDisposable
        public override void Dispose()
        {
            ReferenceLineVisualStyle = null;
            base.Dispose();
        }
        #endregion
    }
}