5682 lines
		
	
	
		
			164 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			5682 lines
		
	
	
		
			164 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						||
using System.Collections;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.ComponentModel;
 | 
						||
using System.ComponentModel.Design;
 | 
						||
using System.Drawing;
 | 
						||
using System.Drawing.Design;
 | 
						||
using System.Drawing.Drawing2D;
 | 
						||
using System.Globalization;
 | 
						||
using System.Text;
 | 
						||
using System.Text.RegularExpressions;
 | 
						||
using System.Windows.Forms;
 | 
						||
using DevComponents.DotNetBar.Charts.Style;
 | 
						||
 | 
						||
namespace DevComponents.DotNetBar.Charts
 | 
						||
{
 | 
						||
    [Editor("DevComponents.Charts.Design.PieSeriesPointCollectionEditor, DevComponents.Charts.Design, " +
 | 
						||
        "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
    public class PieSeriesPointCollection : CustomNamedCollection<PieSeriesPoint>
 | 
						||
    {
 | 
						||
        #region Private variables
 | 
						||
 | 
						||
        private ISeriesPointContainer _Parent;
 | 
						||
 | 
						||
        private PieSeriesPointCollection _PieSlices;
 | 
						||
        private PieSeriesPointCollection _OtherSlices;
 | 
						||
 | 
						||
        private PieSeriesPoint _OtherSlicePsp;
 | 
						||
 | 
						||
        private double _PieTotal;
 | 
						||
 | 
						||
        private double _PieMinExtent;
 | 
						||
        private double _PieMaxExtent;
 | 
						||
        private double _PieOuterExtent;
 | 
						||
        private double _PieTotalExtent;
 | 
						||
 | 
						||
        private double _PieAverage;
 | 
						||
        private double _PieAverageExtent;
 | 
						||
 | 
						||
        private PieRing _PieRing;
 | 
						||
 | 
						||
        private States _States;
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Public properties
 | 
						||
 | 
						||
        #region IsOther
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the PieSeriesPoint is the 'Other' slice collection.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsOther
 | 
						||
        {
 | 
						||
            get { return (TestState(States.Other)); }
 | 
						||
            internal set { SetState(States.Other, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OtherSlicePsp
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the 'Other' slice PieSeriesPoint.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public PieSeriesPoint OtherSlicePsp
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_OtherSlicePsp == null)
 | 
						||
                    _OtherSlicePsp = new PieSeriesPoint("Other", null, null);
 | 
						||
 | 
						||
                return (_OtherSlicePsp);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OtherSlices
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the 'Other' slice collection of SeriesPoints.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public PieSeriesPointCollection OtherSlices
 | 
						||
        {
 | 
						||
            get { return (_OtherSlices); }
 | 
						||
            internal set { _OtherSlices = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Parent
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the parent of this item.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public ISeriesPointContainer Parent
 | 
						||
        {
 | 
						||
            get { return (_Parent); }
 | 
						||
            internal set { _Parent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieAverage
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the average pie point 'value' (Y[0]) for the collection.
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double PieAverage
 | 
						||
        {
 | 
						||
            get { return (_PieAverage); }
 | 
						||
            internal set { _PieAverage = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieAverageExtent
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the average extent for the collection.
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double PieAverageExtent
 | 
						||
        {
 | 
						||
            get { return (_PieAverageExtent); }
 | 
						||
            internal set { _PieAverageExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieSlices
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the collection of displayed Pie slices.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public PieSeriesPointCollection PieSlices
 | 
						||
        {
 | 
						||
            get { return (_PieSlices); }
 | 
						||
 | 
						||
            internal set
 | 
						||
            {
 | 
						||
                if (_PieSlices != null)
 | 
						||
                    SetOtherHandler(false);
 | 
						||
 | 
						||
                _PieSlices = value;
 | 
						||
 | 
						||
                if (_PieSlices != null)
 | 
						||
                    SetOtherHandler(true);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region SetOtherHandler
 | 
						||
 | 
						||
        private void SetOtherHandler(bool notify)
 | 
						||
        {
 | 
						||
            PieSeriesPointCollection spc = _PieSlices;
 | 
						||
 | 
						||
            foreach (PieSeriesPoint psp in spc)
 | 
						||
            {
 | 
						||
                if (psp.IsOther == true)
 | 
						||
                {
 | 
						||
                    SetPointNotify(psp, notify);
 | 
						||
 | 
						||
                    break;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region SetPointNotify
 | 
						||
 | 
						||
        private void SetPointNotify(PieSeriesPoint psp, bool notify)
 | 
						||
        {
 | 
						||
            if (notify == true)
 | 
						||
            {
 | 
						||
                psp.Parent = this;
 | 
						||
                psp.PropertyChanged += Sp_PropertyChanged;
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                psp.Parent = null;
 | 
						||
                psp.PropertyChanged -= Sp_PropertyChanged;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Sp_PropertyChanged
 | 
						||
 | 
						||
        void Sp_PropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            VisualPropertyChangedEventArgs vce = e as VisualPropertyChangedEventArgs;
 | 
						||
 | 
						||
            if (vce != null)
 | 
						||
            {
 | 
						||
                PieSeriesPoint psp = sender as PieSeriesPoint;
 | 
						||
 | 
						||
                if (psp != null)
 | 
						||
                    psp.NotifyVisualParent(psp, vce.ChangeType);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieTotal
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the sum total of the pie collection 'values' (Y[0]).
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double PieTotal
 | 
						||
        {
 | 
						||
            get { return (_PieTotal); }
 | 
						||
            internal set { _PieTotal = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieTotalExtent
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the sum total of the collection 'extents' (Y[1]).
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double PieTotalExtent
 | 
						||
        {
 | 
						||
            get { return (_PieTotalExtent); }
 | 
						||
            internal set { _PieTotalExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region VisibleCount
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets count of visible points in the collection.
 | 
						||
        ///</summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public int VisibleCount
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                int vcount = 0;
 | 
						||
 | 
						||
                foreach (PieSeriesPoint psp in Items)
 | 
						||
                {
 | 
						||
                    if (psp.Visible == true)
 | 
						||
                        vcount++;
 | 
						||
                }
 | 
						||
 | 
						||
                return (vcount);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Internal properties
 | 
						||
 | 
						||
        #region PieMaxExtent
 | 
						||
 | 
						||
        internal double PieMaxExtent
 | 
						||
        {
 | 
						||
            get { return (_PieMaxExtent); }
 | 
						||
            set { _PieMaxExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieMinExtent
 | 
						||
 | 
						||
        internal double PieMinExtent
 | 
						||
        {
 | 
						||
            get { return (_PieMinExtent); }
 | 
						||
            set { _PieMinExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieOuterExtent
 | 
						||
 | 
						||
        internal double PieOuterExtent
 | 
						||
        {
 | 
						||
            get { return (_PieOuterExtent); }
 | 
						||
            set { _PieOuterExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieRing
 | 
						||
 | 
						||
        internal PieRing PieRing
 | 
						||
        {
 | 
						||
            get { return (_PieRing); }
 | 
						||
            set { _PieRing = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ClearItems
 | 
						||
 | 
						||
        protected override void ClearItems()
 | 
						||
        {
 | 
						||
            if (Parent is PieSeriesPoint)
 | 
						||
            {
 | 
						||
                for (int i = Items.Count - 1; i >= 0; i--)
 | 
						||
                    RemoveItem(i);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                CheckReentrancy();
 | 
						||
 | 
						||
                Items.Clear();
 | 
						||
 | 
						||
                OnPropertyChanged(CountString);
 | 
						||
                OnPropertyChanged(ItemString);
 | 
						||
 | 
						||
                OnCollectionReset();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SetSelected
 | 
						||
 | 
						||
        internal void SetSelected(bool select)
 | 
						||
        {
 | 
						||
            foreach (PieSeriesPoint psp in Items)
 | 
						||
            {
 | 
						||
                if (psp != null)
 | 
						||
                {
 | 
						||
                    psp.IsSelected = select;
 | 
						||
 | 
						||
                    if (psp.SeriesPoints.PieSlices != null)
 | 
						||
                        psp.SeriesPoints.PieSlices.SetSelected(select);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region States
 | 
						||
 | 
						||
        [Flags]
 | 
						||
        private enum States : uint
 | 
						||
        {
 | 
						||
            Other = (1 << 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 SliceVisualLayout
 | 
						||
 | 
						||
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						||
    public class SliceVisualLayout : INotifyPropertyChanged, IProcessSerialElement, IDisposable
 | 
						||
    {
 | 
						||
        #region Private variables
 | 
						||
 | 
						||
        private ChartVisualElement _Parent;
 | 
						||
 | 
						||
        private double _AngleMargin = double.NaN;
 | 
						||
 | 
						||
        private int _RingWeight = -1;
 | 
						||
 | 
						||
        private int _MaxSlices = -1;
 | 
						||
        private int _MinExtent = -1;
 | 
						||
        private double _MinPercent = double.NaN;
 | 
						||
 | 
						||
        private SliceLabelOrientation _InnerLabelOrientation = SliceLabelOrientation.NotSet;
 | 
						||
        private SliceLabelCropMode _SliceLabelCropMode = SliceLabelCropMode.NotSet;
 | 
						||
        private SliceLabelVisibility _SliceLabelVisibility = SliceLabelVisibility.NotSet;
 | 
						||
        private SliceLabelDisplayMode _SliceLabelDisplayMode = SliceLabelDisplayMode.NotSet;
 | 
						||
 | 
						||
        private ChartSliceVisualStyles _SliceVisualStyles;
 | 
						||
        private ChartSliceVisualStyles _OtherSliceVisualStyles;
 | 
						||
 | 
						||
        private Tbool _ShowSliceWhiteSpace = Tbool.NotSet;
 | 
						||
 | 
						||
        private string _InnerSliceLabel;
 | 
						||
        private string _OuterSliceLabel;
 | 
						||
 | 
						||
        private double _StartAngle = double.NaN;
 | 
						||
        private double _SweepAngle = double.NaN;
 | 
						||
        private SweepDirection _SweepDirection = SweepDirection.NotSet;
 | 
						||
 | 
						||
        private string _ToolTipText;
 | 
						||
 | 
						||
        private PieRefLineDisplayMode _RefLineDisplayMode = PieRefLineDisplayMode.NotSet;
 | 
						||
        private Tbool _ReferenceLineDisplayOnTop = Tbool.NotSet;
 | 
						||
 | 
						||
        internal PieReferenceLineCollection _ReferenceLines;
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        public SliceVisualLayout(ChartVisualElement parent)
 | 
						||
        {
 | 
						||
            _Parent = parent;
 | 
						||
        }
 | 
						||
 | 
						||
        #region Public properties
 | 
						||
 | 
						||
        #region AngleMargin
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the margin used to offset the angle at
 | 
						||
        /// which the slice sides are rendered. This can be used to
 | 
						||
        /// create a more 'wedge' shaped slice.
 | 
						||
        /// </summary>
 | 
						||
        [Description("Indicates the margin used to offset the angle at which the slice sides are rendered. This can be used to create a more 'wedge' shaped slice.")]
 | 
						||
        [DefaultValue(double.NaN)]
 | 
						||
        [Editor("DevComponents.Charts.Design.AngleMarginRangeValueEditor, DevComponents.Charts.Design, " +
 | 
						||
            "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double AngleMargin
 | 
						||
        {
 | 
						||
            get { return (_AngleMargin); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _AngleMargin)
 | 
						||
                {
 | 
						||
                    _AngleMargin = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("AngleMargin", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerLabelOrientation
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the inner label orientation with respect to the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Behavior"), DefaultValue(SliceLabelOrientation.NotSet)]
 | 
						||
        [Description("Indicates the inner label orientation with respect to the slice.")]
 | 
						||
        public SliceLabelOrientation InnerLabelOrientation
 | 
						||
        {
 | 
						||
            get { return (_InnerLabelOrientation); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _InnerLabelOrientation)
 | 
						||
                {
 | 
						||
                    _InnerLabelOrientation = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("InnerLabelOrientation", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerSliceLabel
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the inner slice label for the pie slice. The label can be
 | 
						||
        /// straight text, or be comprised of text and formatting specifiers. The label
 | 
						||
        /// should be specified as (note that brackets denote optional elements):
 | 
						||
        /// "[text]{keyword[:format]}[text][{...}]".
 | 
						||
        /// 
 | 
						||
        /// Here are the formatting specifiers that can be used with both inner and
 | 
						||
        /// outer labels:
 | 
						||
        /// 
 | 
						||
        /// "AVG" "A" - Average (angular values).
 | 
						||
        /// "PCT" "P" - Percent of pie (angular values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOT" "T" - Total of all values (angluar values).
 | 
						||
        /// "VAL" "V" - Value percent of pie (angular value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "AVGX" "AX" - Average (extent/radial values).
 | 
						||
        /// "PCTX" "PX" - Percent of pie (extent values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOTX" "TX" - Total of all values (extent values).
 | 
						||
        /// "VALX" "VX" - Value percent of pie (extent value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "S" "SNAME" - Series name.
 | 
						||
        /// "X" - ValueX.
 | 
						||
        /// "Y", "Y0", "Yn" - ValueY values (where 'n' is index value).
 | 
						||
        ///
 | 
						||
        /// Example use:
 | 
						||
        /// 
 | 
						||
        /// "{S}\\n{X:yyyy} ({Y:##,##0} - {P:Y1})"
 | 
						||
        /// "Individual cost {Y:C} and average cost {AVG:C} of goods."
 | 
						||
        ///
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        [Description("Indicates the inner slice label for the pie slices (format specifiers {Keyword[:Format]} - " +
 | 
						||
            "S, X, Y, Y0-Yn, N, [A|AVG][X], [A|PCT][X], [A|TOT][X], [A|VAL][X]. e.g. \"{x:f2},{avg:##.##},{totx:c}\"")]
 | 
						||
        public string InnerSliceLabel
 | 
						||
        {
 | 
						||
            get { return (_InnerSliceLabel); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (String.Equals(value, _InnerSliceLabel) == false)
 | 
						||
                {
 | 
						||
                    _InnerSliceLabel = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("InnerSliceLabel", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MaxSlices
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the maximum number of slices to represent in the pie. Any remaining values
 | 
						||
        /// are consolidated into the 'Other' slice, if shown, or are not displayed at all.
 | 
						||
        ///
 | 
						||
        /// The slices are counted in the order in which they are displayed. This order is
 | 
						||
        /// affected by the ReverseSlices property.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(-1), Category("Display")]
 | 
						||
        [Description("Indicates the maximum number of slices to represent in the pie. Any remaining values are consolidated into the 'Other' slice, if shown, or are not displayed at all.")]
 | 
						||
        public int MaxSlices
 | 
						||
        {
 | 
						||
            get { return (_MaxSlices); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _MaxSlices)
 | 
						||
                {
 | 
						||
                    _MaxSlices = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("MaxSlices", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MinExtent
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets the minimum extent for the collection.
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(-1), Category("Display")]
 | 
						||
        [Description("Indicates the minimum extent for the collection.")]
 | 
						||
        public int MinExtent
 | 
						||
        {
 | 
						||
            get { return (_MinExtent); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _MinExtent)
 | 
						||
                {
 | 
						||
                    _MinExtent = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("MinExtent", Style.VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MinPercent
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the minimum percent-of-total represented in individual slices.
 | 
						||
        /// Values less than the MinPercent are either accumulated into the 'Other' slice, if shown,
 | 
						||
        /// or  left in the main pie display.
 | 
						||
        /// Range is 0–1.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Display")]
 | 
						||
        [Description("Indicates the minimum percent-of-total represented in individual slices. Values less than the MinPercent are accumulated into the 'Other' slice. Range is 0–1.")]
 | 
						||
        public double MinPercent
 | 
						||
        {
 | 
						||
            get { return (_MinPercent); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _MinPercent)
 | 
						||
                {
 | 
						||
                    _MinPercent = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("MinPercent", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OtherSliceVisualStyles
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the default visual style for the series 'Other' slice.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Style")]
 | 
						||
        [Description("Indicates the default visual style for the series 'Other' slice.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public ChartSliceVisualStyles OtherSliceVisualStyles
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_OtherSliceVisualStyles == null)
 | 
						||
                {
 | 
						||
                    _OtherSliceVisualStyles = new ChartSliceVisualStyles();
 | 
						||
 | 
						||
                    StyleChangeHandler(null, _OtherSliceVisualStyles);
 | 
						||
                }
 | 
						||
 | 
						||
                return (_OtherSliceVisualStyles);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (_OtherSliceVisualStyles != value)
 | 
						||
                {
 | 
						||
                    ChartSliceVisualStyles oldValue = _OtherSliceVisualStyles;
 | 
						||
 | 
						||
                    _OtherSliceVisualStyles = value;
 | 
						||
 | 
						||
                    OnStyleChanged("OtherSliceVisualStyles", oldValue, value);
 | 
						||
 | 
						||
                    if (oldValue != null)
 | 
						||
                        oldValue.Dispose();
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OuterSliceLabel
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the outer slice label for the pie slice.  See InnerSliceLabel for
 | 
						||
        /// further notes on Format Specifiers.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        [Description("Indicates the inner slice label for the pie slices. See InnerSliceLabel for further notes on Format Specifiers.")]
 | 
						||
        public string OuterSliceLabel
 | 
						||
        {
 | 
						||
            get { return (_OuterSliceLabel); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (String.Equals(value, _OuterSliceLabel) == false)
 | 
						||
                {
 | 
						||
                    _OuterSliceLabel = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("OuterSliceLabel", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Parent
 | 
						||
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public ChartVisualElement Parent
 | 
						||
        {
 | 
						||
            get { return (_Parent); }
 | 
						||
 | 
						||
            internal set
 | 
						||
            {
 | 
						||
                _Parent = value;
 | 
						||
 | 
						||
                UpdateRelations();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region UpdateRelations
 | 
						||
 | 
						||
        private void UpdateRelations()
 | 
						||
        {
 | 
						||
            foreach (PieReferenceLine line in ReferenceLines)
 | 
						||
                line.Parent = _Parent;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLineDisplayMode
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the type of pie reference lines to display.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Appearance"), DefaultValue(PieRefLineDisplayMode.NotSet)]
 | 
						||
        [Description("Indicates the type of pie reference lines to display.")]
 | 
						||
        [Editor("DevComponents.Charts.Design.FlagsEnumUIEditor, DevComponents.Charts.Design, " +
 | 
						||
                "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public PieRefLineDisplayMode ReferenceLineDisplayMode
 | 
						||
        {
 | 
						||
            get { return (_RefLineDisplayMode); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _RefLineDisplayMode)
 | 
						||
                {
 | 
						||
                    _RefLineDisplayMode = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ReferenceLineDisplayMode", VisualChangeType.Render);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLineDisplayOnTop
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether references lines are displayed on top of chart data.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(Tbool.NotSet), Category("Appearance")]
 | 
						||
        [Description("Indicates whether the reference lines are displayed on top of chart data.")]
 | 
						||
        public Tbool ReferenceLineDisplayOnTop
 | 
						||
        {
 | 
						||
            get { return (_ReferenceLineDisplayOnTop); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _ReferenceLineDisplayOnTop)
 | 
						||
                {
 | 
						||
                    _ReferenceLineDisplayOnTop = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ReferenceLineDisplayOnTop", VisualChangeType.Render);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLines
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets a reference to the collection of user defined Reference Lines.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Appearance")]
 | 
						||
        [Description("Indicates the collection of user defined Reference Lines.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public PieReferenceLineCollection ReferenceLines
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_ReferenceLines == null)
 | 
						||
                {
 | 
						||
                    _ReferenceLines = new PieReferenceLineCollection();
 | 
						||
 | 
						||
                    _ReferenceLines.CollectionChanged += ReferenceLineCollectionChanged;
 | 
						||
                }
 | 
						||
 | 
						||
                return (_ReferenceLines);
 | 
						||
            }
 | 
						||
 | 
						||
            internal set
 | 
						||
            {
 | 
						||
                if (_ReferenceLines != null)
 | 
						||
                    _ReferenceLines.CollectionChanged -= ReferenceLineCollectionChanged;
 | 
						||
 | 
						||
                _ReferenceLines = value;
 | 
						||
 | 
						||
                if (_ReferenceLines != null)
 | 
						||
                    _ReferenceLines.CollectionChanged += ReferenceLineCollectionChanged;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region ReferenceLineCollectionChanged
 | 
						||
 | 
						||
        void ReferenceLineCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 | 
						||
        {
 | 
						||
            switch (e.Action)
 | 
						||
            {
 | 
						||
                case NotifyCollectionChangedAction.Add:
 | 
						||
                    foreach (ChartElement item in e.NewItems)
 | 
						||
                    {
 | 
						||
                        item.Parent = Parent;
 | 
						||
                        item.PropertyChanged += Item_PropertyChanged;
 | 
						||
                    }
 | 
						||
                    break;
 | 
						||
 | 
						||
                case NotifyCollectionChangedAction.Replace:
 | 
						||
                    foreach (ChartElement item in e.OldItems)
 | 
						||
                    {
 | 
						||
                        item.Parent = null;
 | 
						||
                        item.PropertyChanged -= Item_PropertyChanged;
 | 
						||
                    }
 | 
						||
 | 
						||
                    foreach (ChartElement item in e.NewItems)
 | 
						||
                    {
 | 
						||
                        item.Parent = Parent;
 | 
						||
                        item.PropertyChanged += Item_PropertyChanged;
 | 
						||
                    }
 | 
						||
                    break;
 | 
						||
 | 
						||
                case NotifyCollectionChangedAction.Remove:
 | 
						||
                    foreach (ChartElement item in e.OldItems)
 | 
						||
                    {
 | 
						||
                        item.Parent = null;
 | 
						||
                        item.PropertyChanged -= Item_PropertyChanged;
 | 
						||
                    }
 | 
						||
                    break;
 | 
						||
            }
 | 
						||
 | 
						||
            OnPropertyChangedEx("ReferenceLines", VisualChangeType.Render);
 | 
						||
        }
 | 
						||
 | 
						||
        void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            OnPropertyChanged(e);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region RingWeight
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets the 'relative' thickness of the associated pie ring, as
 | 
						||
        /// compared to the relative thickness of other series rings
 | 
						||
        /// rings.
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(-1), Category("Layout")]
 | 
						||
        [Description("Indicates the 'relative' thickness of the associated pie ring, as compared to the relative thickness of other series rings. Default is 100.")]
 | 
						||
        public int RingWeight
 | 
						||
        {
 | 
						||
            get { return (_RingWeight); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _RingWeight)
 | 
						||
                {
 | 
						||
                    _RingWeight = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("RingWeight", Style.VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowSliceWhiteSpace
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether to display, by default, the full
 | 
						||
        /// slice (includes potential area beyond slice extent). Default is false.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(Tbool.NotSet), Category("Display")]
 | 
						||
        [Description("Indicates whether to display, by default the full slice (includes potential area beyond slice extent). Default is false.")]
 | 
						||
        public Tbool ShowSliceWhiteSpace
 | 
						||
        {
 | 
						||
            get { return (_ShowSliceWhiteSpace); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _ShowSliceWhiteSpace)
 | 
						||
                {
 | 
						||
                    _ShowSliceWhiteSpace = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ShowSliceWhiteSpace", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelCropMode
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the label display mode (ie. the action taken
 | 
						||
        /// when a label needs be clipped for full display). Default is Clip.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(SliceLabelCropMode.NotSet), Category("Label")]
 | 
						||
        [Description("Indicates the label display mode (ie. the action taken when a label needs clipped for full display). Default is Clip.")]
 | 
						||
        public SliceLabelCropMode SliceLabelCropMode
 | 
						||
        {
 | 
						||
            get { return (_SliceLabelCropMode); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SliceLabelCropMode)
 | 
						||
                {
 | 
						||
                    _SliceLabelCropMode = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SliceLabelCropMode", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelVisibility
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets when the slice labels are visibly displayed.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(SliceLabelVisibility.NotSet), Category("Label")]
 | 
						||
        [Description("Indicates when the slice labels are visibly displayed.")]
 | 
						||
        public SliceLabelVisibility SliceLabelVisibility
 | 
						||
        {
 | 
						||
            get { return (_SliceLabelVisibility); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SliceLabelVisibility)
 | 
						||
                {
 | 
						||
                    _SliceLabelVisibility = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SliceLabelVisibility", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelDisplayMode
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the label display mode, which determines
 | 
						||
        /// which slice labels (inner/outer) are displayed. Default is InnerAndOuter.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(SliceLabelDisplayMode.NotSet), Category("Label")]
 | 
						||
        [Description("Indicates the label display mode, which determines which slice labels (inner/outer) are displayed. Default is InnerAndOuter.")]
 | 
						||
        public SliceLabelDisplayMode SliceLabelDisplayMode
 | 
						||
        {
 | 
						||
            get { return (_SliceLabelDisplayMode); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SliceLabelDisplayMode)
 | 
						||
                {
 | 
						||
                    _SliceLabelDisplayMode = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SliceLabelDisplayMode", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceVisualStyles
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the visual styles for the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Style")]
 | 
						||
        [Description("Indicates the visual styles for the slice.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public ChartSliceVisualStyles SliceVisualStyles
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_SliceVisualStyles == null)
 | 
						||
                {
 | 
						||
                    _SliceVisualStyles = new ChartSliceVisualStyles();
 | 
						||
 | 
						||
                    StyleChangeHandler(null, _SliceVisualStyles);
 | 
						||
                }
 | 
						||
 | 
						||
                return (_SliceVisualStyles);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (_SliceVisualStyles != value)
 | 
						||
                {
 | 
						||
                    ChartSliceVisualStyles oldValue = _SliceVisualStyles;
 | 
						||
 | 
						||
                    _SliceVisualStyles = value;
 | 
						||
 | 
						||
                    OnStyleChanged("SliceVisualStyles", oldValue, value);
 | 
						||
 | 
						||
                    if (oldValue != null)
 | 
						||
                        oldValue.Dispose();
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region StartAngle
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the start angle of the pie in degrees where 0 is right and 270 is top. 
 | 
						||
        /// Defaults to 270.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Layout")]
 | 
						||
        [Description("Indicates the start angle of the pie in degrees where 0 is right and 270 is top. Defaults to 270.")]
 | 
						||
        [Editor("DevComponents.Charts.Design.AngleRangeValueEditor, DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double StartAngle
 | 
						||
        {
 | 
						||
            get { return (_StartAngle); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _StartAngle)
 | 
						||
                {
 | 
						||
                    _StartAngle = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("StartAngle", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SweepAngle
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the sweep angle (distance from StartAngle to the
 | 
						||
        /// ending angle) of the pie in positive degrees (use SweepDirection
 | 
						||
        /// to change rotational direction).
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Layout")]
 | 
						||
        [Description("Indicates the sweep angle (distance from StartAngle to the ending angle) of the pie in positive degrees (use SweepDirection to change rotational direction).")]
 | 
						||
        [Editor("DevComponents.Charts.Design.AngleRangeValueEditor, DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double SweepAngle
 | 
						||
        {
 | 
						||
            get { return (_SweepAngle); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SweepAngle)
 | 
						||
                {
 | 
						||
                    if (value < 0)
 | 
						||
                        throw new Exception("SweepAngle cannot be negative (See SweepDirection).");
 | 
						||
 | 
						||
                    _SweepAngle = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SweepAngle", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SweepDirection
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the direction to display the pie slices - in either a clockwise
 | 
						||
        /// or counterclockwise direction.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(SweepDirection.NotSet), Category("Layout")]
 | 
						||
        [Description("Indicates the direction to display the pie slices - in either a clockwise or counterclockwise direction).")]
 | 
						||
        public SweepDirection SweepDirection
 | 
						||
        {
 | 
						||
            get { return (_SweepDirection); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SweepDirection)
 | 
						||
                {
 | 
						||
                    _SweepDirection = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SweepDirection", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ToolTipText
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the text to use for the point ToolTip.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Description("Indicates the text to use for the point ToolTip.")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        public string ToolTipText
 | 
						||
        {
 | 
						||
            get { return (_ToolTipText); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _ToolTipText)
 | 
						||
                {
 | 
						||
                    _ToolTipText = value;
 | 
						||
 | 
						||
                    OnPropertyChanged("ToolTipText");
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetReferenceLineByName
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the ReferenceLine from the given name.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="name"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public PieReferenceLine GetReferenceLineByName(string name)
 | 
						||
        {
 | 
						||
            if (String.IsNullOrEmpty(name) == true)
 | 
						||
                return (null);
 | 
						||
 | 
						||
            if (_ReferenceLines != null)
 | 
						||
            {
 | 
						||
                foreach (PieReferenceLine line in _ReferenceLines)
 | 
						||
                {
 | 
						||
                    if (name.Equals(line.Name) == true)
 | 
						||
                        return (line);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            return (null);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Style support
 | 
						||
 | 
						||
        #region OnStyleChanged
 | 
						||
 | 
						||
        protected virtual void OnStyleChanged(string property,
 | 
						||
            INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
 | 
						||
        {
 | 
						||
            StyleChangeHandler(oldValue, newValue);
 | 
						||
 | 
						||
            OnPropertyChanged(property);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region StyleChangeHandler
 | 
						||
 | 
						||
        protected void StyleChangeHandler(
 | 
						||
            INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
 | 
						||
        {
 | 
						||
            if (oldValue != null)
 | 
						||
                oldValue.PropertyChanged -= StyleChanged;
 | 
						||
 | 
						||
            if (newValue != null)
 | 
						||
                newValue.PropertyChanged += StyleChanged;
 | 
						||
        }
 | 
						||
 | 
						||
        #region StyleChanged
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Occurs when one of element visual styles has property changes.
 | 
						||
        /// Default implementation invalidates visual appearance of element.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender">VisualStyle that changed.</param>
 | 
						||
        /// <param name="e">Event arguments.</param>
 | 
						||
        protected void StyleChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            OnPropertyChanged(e);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
    
 | 
						||
        #region INotifyPropertyChanged Members
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Occurs when property value has changed.
 | 
						||
        /// </summary>
 | 
						||
        public event PropertyChangedEventHandler PropertyChanged;
 | 
						||
 | 
						||
        #region OnPropertyChanged
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Raises the PropertyChanged event.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="e">Event arguments</param>
 | 
						||
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                PropertyChanged(this, e);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Default PropertyChanged processing
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="s"></param>
 | 
						||
        protected void OnPropertyChanged(string s)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                OnPropertyChanged(new PropertyChangedEventArgs(s));
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Default PropertyChanged processing
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="s"></param>
 | 
						||
        /// <param name="changeType">invalidate</param>
 | 
						||
        protected void OnPropertyChangedEx(string s, VisualChangeType changeType)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                OnPropertyChanged(new VisualPropertyChangedEventArgs(s, changeType));
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Copy/CopyTo
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Creates a copy of the SeriesPointsLayout
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public SliceVisualLayout Copy()
 | 
						||
        {
 | 
						||
            SliceVisualLayout copy = new SliceVisualLayout(null);
 | 
						||
 | 
						||
            CopyTo(copy);
 | 
						||
 | 
						||
            return (copy);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Copies the item data to the given SeriesPointsLayout.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sp"></param>
 | 
						||
        public void CopyTo(SliceVisualLayout c)
 | 
						||
        {
 | 
						||
            c.AngleMargin = AngleMargin;
 | 
						||
 | 
						||
            c.MaxSlices = MaxSlices;
 | 
						||
            c.MinExtent = MinExtent;
 | 
						||
            c.MinPercent = MinPercent;
 | 
						||
 | 
						||
            c.InnerLabelOrientation = _InnerLabelOrientation;
 | 
						||
            c.InnerSliceLabel = _InnerSliceLabel;
 | 
						||
 | 
						||
            c.OtherSliceVisualStyles = (_OtherSliceVisualStyles != null) ? _OtherSliceVisualStyles.Copy() : null;
 | 
						||
 | 
						||
            c.OuterSliceLabel = OuterSliceLabel;
 | 
						||
 | 
						||
            foreach (PieReferenceLine line in ReferenceLines)
 | 
						||
                c.ReferenceLines.Add((PieReferenceLine)line.Copy());
 | 
						||
 | 
						||
            c.ReferenceLineDisplayMode = _RefLineDisplayMode;
 | 
						||
            c.ReferenceLineDisplayOnTop = _ReferenceLineDisplayOnTop;
 | 
						||
 | 
						||
            c.RingWeight = RingWeight;
 | 
						||
 | 
						||
            c.ShowSliceWhiteSpace = _ShowSliceWhiteSpace;
 | 
						||
            c.SliceLabelCropMode = _SliceLabelCropMode;
 | 
						||
            c.SliceLabelDisplayMode = _SliceLabelDisplayMode;
 | 
						||
            c.SliceLabelVisibility = _SliceLabelVisibility;
 | 
						||
 | 
						||
            c.SliceVisualStyles = (_SliceVisualStyles != null) ? _SliceVisualStyles.Copy() : null;
 | 
						||
 | 
						||
            c.StartAngle = _StartAngle;
 | 
						||
            c.SweepAngle = _SweepAngle;
 | 
						||
            c.SweepDirection = _SweepDirection;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSerialData
 | 
						||
 | 
						||
        internal virtual SerialElementCollection GetSerialData()
 | 
						||
        {
 | 
						||
            return (GetSerialData(true));
 | 
						||
        }
 | 
						||
 | 
						||
        internal virtual SerialElementCollection GetSerialData(bool root)
 | 
						||
        {
 | 
						||
            SerialElementCollection sec = new SerialElementCollection();
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddStartElement("SliceVisualLayout");
 | 
						||
 | 
						||
            sec.AddValue("AngleMargin", AngleMargin, double.NaN);
 | 
						||
 | 
						||
            sec.AddValue("MaxSlices", MaxSlices, -1);
 | 
						||
            sec.AddValue("MinExtent", MinExtent, -1);
 | 
						||
            sec.AddValue("MinPercent", MinPercent, double.NaN);
 | 
						||
 | 
						||
            sec.AddValue("InnerLabelOrientation", InnerLabelOrientation, SliceLabelOrientation.NotSet);
 | 
						||
 | 
						||
            sec.AddValue("InnerSliceLabel", InnerSliceLabel, null);
 | 
						||
 | 
						||
            if (_OtherSliceVisualStyles != null && _OtherSliceVisualStyles.IsEmpty == false)
 | 
						||
                sec.AddElement(_OtherSliceVisualStyles.GetSerialData("OtherSliceVisualStyles"));
 | 
						||
 | 
						||
            sec.AddValue("OuterSliceLabel", OuterSliceLabel, null);
 | 
						||
 | 
						||
            if (_ReferenceLines != null && _ReferenceLines.Count > 0)
 | 
						||
            {
 | 
						||
                sec.AddStartElement("ReferenceLines count=\"" + _ReferenceLines.Count + "\"");
 | 
						||
 | 
						||
                foreach (PieReferenceLine rline in _ReferenceLines)
 | 
						||
                    sec.AddElement(rline.GetSerialData(""));
 | 
						||
 | 
						||
                sec.AddEndElement("ReferenceLines");
 | 
						||
            }
 | 
						||
 | 
						||
            sec.AddValue("ReferenceLineDisplayMode", ReferenceLineDisplayMode, PieRefLineDisplayMode.NotSet);
 | 
						||
            sec.AddValue("ReferenceLineDisplayOnTop", ReferenceLineDisplayOnTop, Tbool.NotSet);
 | 
						||
 | 
						||
            sec.AddValue("RingWeight", RingWeight, -1);
 | 
						||
 | 
						||
            sec.AddValue("ShowSliceWhiteSpace", ShowSliceWhiteSpace, Tbool.NotSet);
 | 
						||
            sec.AddValue("SliceLabelCropMode", SliceLabelCropMode, SliceLabelCropMode.NotSet);
 | 
						||
            sec.AddValue("SliceLabelDisplayMode", SliceLabelDisplayMode, SliceLabelDisplayMode.NotSet);
 | 
						||
            sec.AddValue("SliceLabelVisibility", SliceLabelVisibility, SliceLabelVisibility.NotSet);
 | 
						||
 | 
						||
            if (_SliceVisualStyles != null && _SliceVisualStyles.IsEmpty == false)
 | 
						||
                sec.AddElement(_SliceVisualStyles.GetSerialData("SliceVisualStyles"));
 | 
						||
 | 
						||
            sec.AddValue("StartAngle", StartAngle, double.NaN);
 | 
						||
            sec.AddValue("SweepAngle", SweepAngle, double.NaN);
 | 
						||
            sec.AddValue("SweepDirection", SweepDirection, SweepDirection.NotSet);
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddEndElement("SliceVisualLayout");
 | 
						||
 | 
						||
            return (sec);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PutSerialData
 | 
						||
 | 
						||
        #region ProcessValue
 | 
						||
 | 
						||
        void IProcessSerialElement.ProcessValue(SerialElement se)
 | 
						||
        {
 | 
						||
            switch (se.Name)
 | 
						||
            {
 | 
						||
                case "AngleMargin":
 | 
						||
                    AngleMargin = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "InnerLabelOrientation":
 | 
						||
                    InnerLabelOrientation = (SliceLabelOrientation)se.GetValueEnum(typeof(SliceLabelOrientation));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "InnerSliceLabel":
 | 
						||
                    InnerSliceLabel = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "MaxSlices":
 | 
						||
                    MaxSlices = int.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "MinExtent":
 | 
						||
                    MinExtent = int.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "MinPercent":
 | 
						||
                    MinPercent = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "OuterSliceLabel":
 | 
						||
                    OuterSliceLabel = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ReferenceLineDisplayMode":
 | 
						||
                    ReferenceLineDisplayMode = (PieRefLineDisplayMode)se.GetValueEnum(typeof(PieRefLineDisplayMode));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ReferenceLineDisplayOnTop":
 | 
						||
                    ReferenceLineDisplayOnTop = (Tbool)se.GetValueEnum(typeof(Tbool));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "RingWeight":
 | 
						||
                    RingWeight = int.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ShowSliceWhiteSpace":
 | 
						||
                    ShowSliceWhiteSpace = (Tbool)se.GetValueEnum(typeof(Tbool));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceLabelCropMode":
 | 
						||
                    SliceLabelCropMode = (SliceLabelCropMode)se.GetValueEnum(typeof(SliceLabelCropMode));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceLabelDisplayMode":
 | 
						||
                    SliceLabelDisplayMode = (SliceLabelDisplayMode)se.GetValueEnum(typeof(SliceLabelDisplayMode));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceLabelVisibility":
 | 
						||
                    SliceLabelVisibility = (SliceLabelVisibility)se.GetValueEnum(typeof(SliceLabelVisibility));
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "StartAngle":
 | 
						||
                    StartAngle = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SweepAngle":
 | 
						||
                    SweepAngle = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SweepDirection":
 | 
						||
                    SweepDirection = (SweepDirection)se.GetValueEnum(typeof(SweepDirection));
 | 
						||
                    break;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ProcessCollection
 | 
						||
 | 
						||
        void IProcessSerialElement.ProcessCollection(SerialElement se)
 | 
						||
        {
 | 
						||
            SerialElementCollection sec = se.Sec;
 | 
						||
 | 
						||
            switch (se.Name)
 | 
						||
            {
 | 
						||
                case "OtherSliceVisualStyles":
 | 
						||
                    sec.PutSerialData(OtherSliceVisualStyles);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ReferenceLine":
 | 
						||
                    PieReferenceLine line = GetReferenceLineByName(se.Name);
 | 
						||
 | 
						||
                    if (line != null)
 | 
						||
                        sec.PutSerialData(line);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ReferenceLines":
 | 
						||
                    sec.PutSerialData(this);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceVisualStyles":
 | 
						||
                    sec.PutSerialData(SliceVisualStyles);
 | 
						||
                    break;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IDispose
 | 
						||
 | 
						||
        public virtual void Dispose()
 | 
						||
        {
 | 
						||
            ReferenceLines = null;
 | 
						||
            OtherSliceVisualStyles = null;
 | 
						||
            SliceVisualStyles = null;
 | 
						||
 | 
						||
            Parent = null;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
    }
 | 
						||
 | 
						||
    #region ISeriesPointContainer
 | 
						||
 | 
						||
    public interface ISeriesPointContainer
 | 
						||
    {
 | 
						||
        SliceVisualLayout SubSliceVisualLayout { get; set; }
 | 
						||
    }
 | 
						||
 | 
						||
    #endregion
 | 
						||
 | 
						||
    #endregion
 | 
						||
 | 
						||
    #region PieSeriesPoint
 | 
						||
 | 
						||
    [DesignTimeVisible(false), ToolboxItem(false)]
 | 
						||
    public class PieSeriesPoint : SeriesPoint,
 | 
						||
        IEffectiveStyle, INotifyPropertyChanged, ILegendItem, ILegendItemEx, ISeriesPointContainer, INamed
 | 
						||
    {
 | 
						||
        #region Private variables
 | 
						||
 | 
						||
        private object _Parent;
 | 
						||
 | 
						||
        private int _OrdinalValue;
 | 
						||
 | 
						||
        private ChartControl _ChartControl;
 | 
						||
        private int _LocalUpdateCount;
 | 
						||
 | 
						||
        private string _InnerSliceLabel;
 | 
						||
        private string _OuterSliceLabel;
 | 
						||
 | 
						||
        private double _DetachedOffset = double.NaN;
 | 
						||
 | 
						||
        private double _StartAngle = double.NaN;
 | 
						||
        private double _SweepAngle = double.NaN;
 | 
						||
 | 
						||
        private double _AngleMarginExx;
 | 
						||
 | 
						||
        private double _StartAngleEx;
 | 
						||
        private double _SweepAngleEx;
 | 
						||
 | 
						||
        private Point _SliceCenter;
 | 
						||
        private double _SliceExtent;
 | 
						||
        private double _SliceValue;
 | 
						||
 | 
						||
        private int _InnerRadius;
 | 
						||
        private int _OuterRadius;
 | 
						||
 | 
						||
        private Rectangle _PathBounds;
 | 
						||
        private Rectangle _LastPathBounds;
 | 
						||
 | 
						||
        private PieRing _PieRing;
 | 
						||
 | 
						||
        private PieSeriesPoint _RootPsp;
 | 
						||
 | 
						||
        private ChartSliceVisualStyles _SliceVisualStyles;
 | 
						||
        private EffectiveStyles<ChartSliceVisualStyle> _EffectiveSliceStyles;
 | 
						||
        private ChartSliceVisualStyle _LastEffectiveStyle;
 | 
						||
 | 
						||
        private Color _DefaultPaletteColor = Color.Empty;
 | 
						||
 | 
						||
        private ushort _LayoutUpdateCount;
 | 
						||
        private Rectangle _InscribedRect;
 | 
						||
        private List<WordPosLine> _WordPosLines;
 | 
						||
        private RectangleF[] _CharBounds;
 | 
						||
 | 
						||
        private PieLabel _PieLabel;
 | 
						||
 | 
						||
        private ChartLegendItem _LegendItem;
 | 
						||
        private string _LegendText;
 | 
						||
        private ChartLegendItemVisualStyles _ChartLegendItemVisualStyles;
 | 
						||
 | 
						||
        private string _Name;
 | 
						||
        private string _ToolTipText;
 | 
						||
 | 
						||
        private PieSeriesPointCollection _SeriesPoints;
 | 
						||
        private SliceVisualLayout _SliceVisualLayout;
 | 
						||
 | 
						||
        private States _States;
 | 
						||
 | 
						||
        // ----  Cached items
 | 
						||
 | 
						||
        private double _AngleMarginEx;
 | 
						||
 | 
						||
        private SliceLabelCropMode _SliceLabelCropModeEx;
 | 
						||
        private SliceLabelDisplayMode _SliceLabelDisplayModeEx;
 | 
						||
        private SliceLabelOrientation _InnerLabelOrientationEx;
 | 
						||
        private SliceLabelVisibility _SliceLabelVisibilityEx;
 | 
						||
 | 
						||
        private string _InnerSliceLabelEx;
 | 
						||
        private string _OuterSliceLabelEx;
 | 
						||
 | 
						||
        private int _MaxSlicesEx;
 | 
						||
        private int _MinExtentEx;
 | 
						||
        private double _MinPercentEx;
 | 
						||
 | 
						||
        private int _RingWeightEx;
 | 
						||
 | 
						||
        private PieRefLineDisplayMode _ReferenceLineDisplayModeEx;
 | 
						||
        private List<PieReferenceLine> _ReferenceLinesEx;
 | 
						||
 | 
						||
        private string _ToolTipTextEx;
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Constructors
 | 
						||
 | 
						||
        public PieSeriesPoint()
 | 
						||
            : this(0, 0)
 | 
						||
        {
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// PieSeriesPoint
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="xValue"></param>
 | 
						||
        /// <param name="yValue"></param>
 | 
						||
        public PieSeriesPoint(object xValue, object yValue)
 | 
						||
            : base(xValue, yValue)
 | 
						||
        {
 | 
						||
            InitDefaultStates();
 | 
						||
 | 
						||
            _EffectiveSliceStyles = new EffectiveStyles<ChartSliceVisualStyle>(this);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// PieSeriesPoint
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="xValue"></param>
 | 
						||
        /// <param name="yValue"></param>
 | 
						||
        public PieSeriesPoint(object xValue, object[] yValue)
 | 
						||
            : base(xValue, yValue)
 | 
						||
        {
 | 
						||
            InitDefaultStates();
 | 
						||
 | 
						||
            _EffectiveSliceStyles = new EffectiveStyles<ChartSliceVisualStyle>(this);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// PieSeriesPoint
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="xValue"></param>
 | 
						||
        /// <param name="yValue1">angular value</param>
 | 
						||
        /// <param name="yValue2">yValue2=radial</param>
 | 
						||
        public PieSeriesPoint(object xValue, object yValue1, object yValue2)
 | 
						||
            : base(xValue, yValue1, yValue2)
 | 
						||
        {
 | 
						||
            InitDefaultStates();
 | 
						||
 | 
						||
            _EffectiveSliceStyles = new EffectiveStyles<ChartSliceVisualStyle>(this);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InitDefaultStates
 | 
						||
 | 
						||
        private void InitDefaultStates()
 | 
						||
        {
 | 
						||
            SetState(States.AllowDetach, true);
 | 
						||
            SetState(States.AllowSelect, true);
 | 
						||
 | 
						||
            SetState(States.CheckedInLegend, true);
 | 
						||
            SetState(States.ShowInLegend, true);
 | 
						||
            SetState(States.ShowInParentLegend, true);
 | 
						||
            SetState(States.ShowMarkerInLegend, true);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Public properties
 | 
						||
 | 
						||
        #region ActualStartAngle
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the actual, calculated starting angle for the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double ActualStartAngle
 | 
						||
        {
 | 
						||
            get { return (StartAngleEx); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ActualSweepAngle
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the actual, calculated sweep angle for the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double ActualSweepAngle
 | 
						||
        {
 | 
						||
            get { return (SweepAngleEx); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region AllowDetach
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the element can be 'detached' from
 | 
						||
        /// the center of the pie by the user. Defaults to true.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Behavior")]
 | 
						||
        [Description("Indicates whether the element can be 'detached' from the center of the pie by the user. Defaults to true.")]
 | 
						||
        public bool AllowDetach
 | 
						||
        {
 | 
						||
            get { return (TestState(States.AllowDetach)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != AllowDetach)
 | 
						||
                {
 | 
						||
                    SetState(States.AllowDetach, value);
 | 
						||
 | 
						||
                    OnPropertyChanged("AllowDetach");
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region AllowSelect
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the element can be selected by clicking on it. Defaults to true.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Behavior")]
 | 
						||
        [Description("Indicates whether the element can be selected by clicking on it. Defaults to true.")]
 | 
						||
        public bool AllowSelect
 | 
						||
        {
 | 
						||
            get { return (TestState(States.AllowSelect)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != AllowSelect)
 | 
						||
                {
 | 
						||
                    SetState(States.AllowSelect, value);
 | 
						||
 | 
						||
                    OnPropertyChanged("AllowSliceSelect");
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region CenterAngle
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the Center Angle for the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double CenterAngle
 | 
						||
        {
 | 
						||
            get { return ((StartAngleEx + SweepAngleEx / 2) + 360000) % 360; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ChartSeries
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the associated ChartSeries.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public PieSeries ChartSeries
 | 
						||
        {
 | 
						||
            get { return (_PieRing != null ? _PieRing.ChartSeries : null); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region DefaultPaletteColor
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the default palette color assigned to the point when it
 | 
						||
        /// is arranged in the pie.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        [Description("Indicates the default palette color assigned to the point when it is arranged in the pie.")]
 | 
						||
        public Color DefaultPaletteColor
 | 
						||
        {
 | 
						||
            get { return (_DefaultPaletteColor); }
 | 
						||
 | 
						||
            internal set
 | 
						||
            {
 | 
						||
                if (value != _DefaultPaletteColor)
 | 
						||
                {
 | 
						||
                    _DefaultPaletteColor = value;
 | 
						||
 | 
						||
                    ClearEffectiveStyles();
 | 
						||
 | 
						||
                    OnPropertyChangedEx("DetachedOffset", VisualChangeType.Render);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region DetachedOffset
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the offset distance of the slice from the pie center, as measured
 | 
						||
        /// by a percentage of the pie radius (if between 0 and 1), or absolute pixel amount (if >= 1).
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Appearance")]
 | 
						||
        [Description("Indicates the offset distance of the slice from the pie center, as measured by a percentage of the pie radius (if between 0 and 1), or absolute pixel amount (if >= 1).")]
 | 
						||
        [Editor("DevComponents.Charts.Design.RadiusRangeValueEditor, DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double DetachedOffset
 | 
						||
        {
 | 
						||
            get { return (_DetachedOffset); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _DetachedOffset)
 | 
						||
                {
 | 
						||
                    _DetachedOffset = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("DetachedOffset", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region EffectiveSliceStyles
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets a reference to the Effective (cached, composite) Slice styles.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public EffectiveStyles<ChartSliceVisualStyle> EffectiveSliceStyles
 | 
						||
        {
 | 
						||
            get { return (_EffectiveSliceStyles); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ExtentRadius
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the actual, calculated extent radius of the slice (the
 | 
						||
        /// radius between the inner and outer radius - ValuesY[1]).
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double ExtentRadius
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                int width = OuterRadius - InnerRadius;
 | 
						||
                int extendWidth = (int)(SliceExtent * width);
 | 
						||
 | 
						||
                return (InnerRadius + extendWidth);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerRadius
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the actual, inner radius of the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public int InnerRadius
 | 
						||
        {
 | 
						||
            get { return (_InnerRadius); }
 | 
						||
            internal set { _InnerRadius = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerSliceLabel
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the inner slice label for the pie slice. The label can be
 | 
						||
        /// straight text, or be comprised of text and formatting specifiers. The label
 | 
						||
        /// should be specified as "Some text {Keyword:Format} more text [{...:...}]".
 | 
						||
        /// 
 | 
						||
        /// Here are the formatting specifiers that can be used with both inner and
 | 
						||
        /// outer labels:
 | 
						||
        /// 
 | 
						||
        /// "AVG" "A" - Average (angular values).
 | 
						||
        /// "PCT" "P" - Percent of pie (angular values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOT" "T" - Total of all values (angluar values).
 | 
						||
        /// "VAL" "V" - Value percent of pie (angular value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "AVGX" "AX" - Average (extent/radial values).
 | 
						||
        /// "PCTX" "PX" - Percent of pie (extent values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOTX" "TX" - Total of all values (extent values).
 | 
						||
        /// "VALX" "VX" - Value percent of pie (extent value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "S" "SNAME" - Series name.
 | 
						||
        /// "X" - ValueX.
 | 
						||
        /// "Y", "Y0", "Yn" - ValueY values (where 'n' is index value).
 | 
						||
        ///
 | 
						||
        /// Examples:
 | 
						||
        /// 
 | 
						||
        /// "{S}\\n{X:yyyy} ({Y:##,##0} - {P:Y1})"
 | 
						||
        /// "Individual cost {Y:C} and average cost {AVG:C} of goods."
 | 
						||
        /// 
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        [Description("Indicates the inner slice label for the pie slices (format specifiers {Keyword[:Format]} - " +
 | 
						||
            "S, X, Y, Y0-Yn, N, [A|AVG][X], [A|PCT][X], [A|TOT][X], [A|VAL][X].  e.g. \"{x:f2},{avg:##.##},{totx:c}\"")]
 | 
						||
        public string InnerSliceLabel
 | 
						||
        {
 | 
						||
            get { return (_InnerSliceLabel); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (String.Equals(value, _InnerSliceLabel) == false)
 | 
						||
                {
 | 
						||
                    _InnerSliceLabel = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("InnerSliceLabel", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsDetached
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the slice is 'detached' from the center of the pie. This can be
 | 
						||
        /// used to create emphasis or to highlight a slice of the pie.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(false), Category("Appearance")]
 | 
						||
        [Description("Indicates whether the slice is 'detached' from the center of the pie.")]
 | 
						||
        public bool IsDetached
 | 
						||
        {
 | 
						||
            get { return (TestState(States.Detached)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != IsDetached)
 | 
						||
                {
 | 
						||
                    SetState(States.Detached, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("IsDetached", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsDisplayed
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets whether the series point is displayed
 | 
						||
        /// based upon its Visibility and Legend state.
 | 
						||
        ///</summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsDisplayed
 | 
						||
        {
 | 
						||
            get { return (Visible == true && IsDisplayedEx == true); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsEmptyPoint
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the point is an 'Empty' (or missing) Point.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(false), Category("Data")]
 | 
						||
        [Description("Indicates whether the point is an 'Empty' (or missing) Point.")]
 | 
						||
        public override bool IsEmptyPoint
 | 
						||
        {
 | 
						||
            get { return (base.IsEmptyPoint); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != base.IsEmptyPoint)
 | 
						||
                {
 | 
						||
                    base.IsEmptyPoint = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("IsEmptyPoint", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsInOther
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the slice is in the 'Other' slice.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(false), Category("Appearance")]
 | 
						||
        [Description("Indicates whether the slice is in the 'Other' slice.")]
 | 
						||
        public bool IsInOther
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsInOther)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != IsInOther)
 | 
						||
                {
 | 
						||
                    SetState(States.IsInOther, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("IsInOther", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsOther
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the slice is the 'Other' slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        [Description("Indicates whether the slice is the 'Other' slice.")]
 | 
						||
        public bool IsOther
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsOther)); }
 | 
						||
            internal set { SetState(States.IsOther, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsSelected
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the slice is selected.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        [Description("Indicates whether the slice is selected.")]
 | 
						||
        public bool IsSelected
 | 
						||
        {
 | 
						||
            get { return (TestState(States.Selected)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != IsSelected)
 | 
						||
                {
 | 
						||
                    SetState(States.Selected, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("IsSelected", VisualChangeType.Render);
 | 
						||
 | 
						||
                    PieSeries series = ChartSeries;
 | 
						||
                    
 | 
						||
                    if (series != null)
 | 
						||
                    {
 | 
						||
                        PieChart pieChart = series.Parent as PieChart;
 | 
						||
 | 
						||
                        if (pieChart != null)
 | 
						||
                            pieChart.GlobalSelectionCount++;
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Name
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the Name of the item.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null)]
 | 
						||
        [Description("Indicates the Name of the item.")]
 | 
						||
        public virtual string Name
 | 
						||
        {
 | 
						||
            get { return (_Name); }
 | 
						||
            set { _Name = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OrdinalValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the ordial value for the point (the ordinal value when added
 | 
						||
        /// to the PieSeriesPoint Collection
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public int OrdinalValue
 | 
						||
        {
 | 
						||
            get { return (_OrdinalValue); }
 | 
						||
            internal set { _OrdinalValue = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OuterRadius
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the actual, outer radius of the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public int OuterRadius
 | 
						||
        {
 | 
						||
            get { return (_OuterRadius); }
 | 
						||
            internal set { _OuterRadius = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OuterSliceLabel
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the outer slice label for the pie slice.  See InnerSliceLabel for
 | 
						||
        /// further notes on Format Specifiers.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        [Description("Indicates the inner slice label for the pie slices. See InnerSliceLabel for further notes on Format Specifiers.")]
 | 
						||
        public string OuterSliceLabel
 | 
						||
        {
 | 
						||
            get { return (_OuterSliceLabel); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (String.Equals(value, _OuterSliceLabel) == false)
 | 
						||
                {
 | 
						||
                    _OuterSliceLabel = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("OuterSliceLabel", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Parent
 | 
						||
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        [Description("Indicates the item Parent.")]
 | 
						||
        public object Parent
 | 
						||
        {
 | 
						||
            get { return (_Parent); }
 | 
						||
 | 
						||
            internal set
 | 
						||
            {
 | 
						||
                _Parent = value;
 | 
						||
 | 
						||
                _RootPsp = null;
 | 
						||
 | 
						||
                if (value != null)
 | 
						||
                {
 | 
						||
                    PieSeriesPointCollection psp = value as PieSeriesPointCollection;
 | 
						||
 | 
						||
                    if (psp != null)
 | 
						||
                        SubSliceVisualLayout.Parent = psp.Parent as ChartVisualElement;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieRing
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the items associated PieRing (if applicable).
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public PieRing PieRing
 | 
						||
        {
 | 
						||
            get { return (_PieRing); }
 | 
						||
            internal set { _PieRing = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SeriesPoints
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets the nested series point data collection.
 | 
						||
        ///</summary>
 | 
						||
        [Category("Data")]
 | 
						||
        [Description("Indicates the nested series point data collection.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public PieSeriesPointCollection SeriesPoints
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_SeriesPoints == null)
 | 
						||
                    SeriesPoints = new PieSeriesPointCollection();
 | 
						||
 | 
						||
                return (_SeriesPoints);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SeriesPoints)
 | 
						||
                {
 | 
						||
                    if (_SeriesPoints != null)
 | 
						||
                    {
 | 
						||
                        _SeriesPoints.Parent = null;
 | 
						||
 | 
						||
                        _SeriesPoints.CollectionChanged -= SeriesPoints_CollectionChanged;
 | 
						||
                    }
 | 
						||
 | 
						||
                    _SeriesPoints = value;
 | 
						||
 | 
						||
                    if (_SeriesPoints != null)
 | 
						||
                    {
 | 
						||
                        _SeriesPoints.Parent = this;
 | 
						||
 | 
						||
                        _SeriesPoints.CollectionChanged += SeriesPoints_CollectionChanged;
 | 
						||
                    }
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SeriesPoints", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region SeriesPoints_CollectionChanged
 | 
						||
 | 
						||
        void SeriesPoints_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 | 
						||
        {
 | 
						||
            SetSpcNotify(e.OldItems, false);
 | 
						||
            SetSpcNotify(e.NewItems, true);
 | 
						||
 | 
						||
            OnPropertyChangedEx("SeriesPoints", Style.VisualChangeType.Layout);
 | 
						||
        }
 | 
						||
 | 
						||
        #region SetPointNotify
 | 
						||
 | 
						||
        private void SetSpcNotify(IList list, bool notify)
 | 
						||
        {
 | 
						||
            if (list != null)
 | 
						||
            {
 | 
						||
                foreach (PieSeriesPoint psp in list)
 | 
						||
                {
 | 
						||
                    if (psp != null)
 | 
						||
                    {
 | 
						||
                        if (notify == true)
 | 
						||
                        {
 | 
						||
                            psp.Parent = SeriesPoints;
 | 
						||
                            psp.PropertyChanged += Spc_PropertyChanged;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            psp.Parent = null;
 | 
						||
                            psp.PropertyChanged -= Spc_PropertyChanged;
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Spc_PropertyChanged
 | 
						||
 | 
						||
        void Spc_PropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            if (e is VisualPropertyChangedEventArgs)
 | 
						||
                OnPropertyChanged(e);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceCenter
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the slice center origin point.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public Point SliceCenter
 | 
						||
        {
 | 
						||
            get { return (_SliceCenter); }
 | 
						||
            internal set { _SliceCenter = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceExtent
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the calculated slice extent value (the relative
 | 
						||
        /// percent-of-total ValuesY[1] value for the slice).
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double SliceExtent
 | 
						||
        {
 | 
						||
            get { return (_SliceExtent); }
 | 
						||
            internal set { _SliceExtent = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the calculated slice value (the relative
 | 
						||
        /// percent-of-total ValuesY[0] value for the slice).
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public double SliceValue
 | 
						||
        {
 | 
						||
            get { return (_SliceValue); }
 | 
						||
            internal set { _SliceValue = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceVisualStyles
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the visual styles for the slice.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Style")]
 | 
						||
        [Description("Indicates the visual styles for the slice.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public ChartSliceVisualStyles SliceVisualStyles
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_SliceVisualStyles == null)
 | 
						||
                {
 | 
						||
                    _SliceVisualStyles = new ChartSliceVisualStyles();
 | 
						||
 | 
						||
                    StyleChangeHandler(null, _SliceVisualStyles);
 | 
						||
                }
 | 
						||
 | 
						||
                return (_SliceVisualStyles);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (_SliceVisualStyles != value)
 | 
						||
                {
 | 
						||
                    ChartSliceVisualStyles oldValue = _SliceVisualStyles;
 | 
						||
 | 
						||
                    _SliceVisualStyles = value;
 | 
						||
 | 
						||
                    OnStyleChanged("SliceVisualStyles", oldValue, value);
 | 
						||
 | 
						||
                    if (oldValue != null)
 | 
						||
                        oldValue.Dispose();
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region StartAngle
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets the starting angle of the slice. For subsequent slices,
 | 
						||
        /// the default is the ending angle of the previous slice. Specify a value 
 | 
						||
        /// for the StartAngle if you want the next slice to start at an angle that
 | 
						||
        /// is different from the previous ending angle.
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Layout")]
 | 
						||
        [Description("Indicates the starting angle of the slice. For subsequent slices, the default is the ending angle of the previous slice. Specify a value for the StartAngle if you want the next slice to start at an angle that is different from the previous ending angle.")]
 | 
						||
        [Editor("DevComponents.Charts.Design.AngleRangeValueEditor, DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double StartAngle
 | 
						||
        {
 | 
						||
            get { return (_StartAngle); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _StartAngle)
 | 
						||
                {
 | 
						||
                    _StartAngle = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("StartAngle", Style.VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SubSliceVisualLayout
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the layout of the subordinate (or nested) slices.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Layout")]
 | 
						||
        [Description("Indicates the layout of the subordinate (or nested) slices.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public SliceVisualLayout SubSliceVisualLayout
 | 
						||
        {
 | 
						||
            get 
 | 
						||
            {
 | 
						||
                if (_SliceVisualLayout == null)
 | 
						||
                    SubSliceVisualLayout = new SliceVisualLayout(null);
 | 
						||
 | 
						||
                return (_SliceVisualLayout);
 | 
						||
            }
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SliceVisualLayout)
 | 
						||
                {
 | 
						||
                    if (_SliceVisualLayout != null)
 | 
						||
                        _SliceVisualLayout.PropertyChanged -= SliceVisualLayout_PropertyChanged;
 | 
						||
 | 
						||
                    _SliceVisualLayout = value;
 | 
						||
 | 
						||
                    if (_SliceVisualLayout != null)
 | 
						||
                    {
 | 
						||
                        _SliceVisualLayout.SliceVisualStyles.Default.Tag = "PSP_Def";
 | 
						||
                        _SliceVisualLayout.SliceVisualStyles.MouseOver.Tag = "PSP_Mov";
 | 
						||
                        _SliceVisualLayout.SliceVisualStyles.Selected.Tag = "PSP_Sel";
 | 
						||
                        _SliceVisualLayout.SliceVisualStyles.SelectedMouseOver.Tag = "PSP_Smo";
 | 
						||
 | 
						||
                        _SliceVisualLayout.PropertyChanged += SliceVisualLayout_PropertyChanged;
 | 
						||
                    }
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SubSliceVisualLayout", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region SliceVisualLayout_PropertyChanged
 | 
						||
 | 
						||
        void SliceVisualLayout_PropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            if (e is VisualPropertyChangedEventArgs)
 | 
						||
                OnPropertyChanged(e);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SweepAngle
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets the sweep angle of the slice (angle size, in degrees).
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(double.NaN), Category("Layout")]
 | 
						||
        [Description("Indicates the sweep angle of the slice (angle size, in degrees).")]
 | 
						||
        [Editor("DevComponents.Charts.Design.AngleRangeValueEditor, DevComponents.Charts.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public double SweepAngle
 | 
						||
        {
 | 
						||
            get { return (_SweepAngle); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _SweepAngle)
 | 
						||
                {
 | 
						||
                    if (value < 0)
 | 
						||
                        throw new Exception("SweepAngle cannot be negative.");
 | 
						||
 | 
						||
                    _SweepAngle = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("SweepAngle", Style.VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ToolTipText
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the text to use for the point ToolTip.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(null), Category("Label")]
 | 
						||
        [Description("Indicates the text to use for the point ToolTip.")]
 | 
						||
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
 | 
						||
        public string ToolTipText
 | 
						||
        {
 | 
						||
            get { return (_ToolTipText); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _ToolTipText)
 | 
						||
                {
 | 
						||
                    _ToolTipText = value;
 | 
						||
 | 
						||
                    OnPropertyChanged("ToolTipText");
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Visible
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the point is Visible.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Appearance")]
 | 
						||
        [Description("Indicates whether the point is Visible.")]
 | 
						||
        public override bool Visible
 | 
						||
        {
 | 
						||
            get { return (base.Visible); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != base.Visible)
 | 
						||
                {
 | 
						||
                    base.Visible = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("Visible", VisualChangeType.Recalc);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Internal properties
 | 
						||
 | 
						||
        #region AngleMarginExx
 | 
						||
 | 
						||
        internal double AngleMarginExx
 | 
						||
        {
 | 
						||
            get { return (_AngleMarginExx); }
 | 
						||
            set { _AngleMarginExx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region AngleMarginEx
 | 
						||
 | 
						||
        internal double AngleMarginEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_AngleMarginEx); }
 | 
						||
            set { _AngleMarginEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Bounds
 | 
						||
 | 
						||
        internal Rectangle Bounds
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                Rectangle r = new Rectangle();
 | 
						||
                r.Location = _SliceCenter;
 | 
						||
                r.Inflate(OuterRadius, OuterRadius);
 | 
						||
 | 
						||
                return (r);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region CharBounds
 | 
						||
 | 
						||
        internal RectangleF[] CharBounds
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                VerifyLayoutUpdateCount();
 | 
						||
 | 
						||
                return (_CharBounds);
 | 
						||
            }
 | 
						||
 | 
						||
            set { _CharBounds = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region HasExtent
 | 
						||
 | 
						||
        internal bool HasExtent
 | 
						||
        {
 | 
						||
            get { return (TestState(States.HasExtent)); }
 | 
						||
            set { SetState(States.HasExtent, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerLabelClipped
 | 
						||
 | 
						||
        internal bool InnerLabelClipped
 | 
						||
        {
 | 
						||
            get { return (TestState(States.InnerLabelClipped)); }
 | 
						||
            set { SetState(States.InnerLabelClipped, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerLabelDisplayed
 | 
						||
 | 
						||
        internal bool InnerLabelDisplayed
 | 
						||
        {
 | 
						||
            get { return (TestState(States.InnerLabelDisplayed)); }
 | 
						||
            set { SetState(States.InnerLabelDisplayed, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerLabelOrientationEx
 | 
						||
 | 
						||
        internal SliceLabelOrientation InnerLabelOrientationEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_InnerLabelOrientationEx); }
 | 
						||
            set { _InnerLabelOrientationEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InnerSliceLabelEx
 | 
						||
 | 
						||
        internal string InnerSliceLabelEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_InnerSliceLabelEx); }
 | 
						||
            set { _InnerSliceLabelEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InscribedRect
 | 
						||
 | 
						||
        internal Rectangle InscribedRect
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                VerifyLayoutUpdateCount();
 | 
						||
 | 
						||
                return (_InscribedRect);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                _InscribedRect = value;
 | 
						||
 | 
						||
                InscribedRectValid = true;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InscribedRectValid
 | 
						||
 | 
						||
        internal bool InscribedRectValid
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                VerifyLayoutUpdateCount();
 | 
						||
 | 
						||
                return (TestState(States.InscribedRectValid));
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                SetState(States.InscribedRectValid, value);
 | 
						||
 | 
						||
                if (value == false)
 | 
						||
                    _InscribedRect = Rectangle.Empty;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsDisplayable
 | 
						||
 | 
						||
        internal bool IsDisplayable
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (Visible == false || IsEmpty == true)
 | 
						||
                    return (false);
 | 
						||
 | 
						||
                if (IsInOtherEx == false)
 | 
						||
                {
 | 
						||
                    object item = Parent;
 | 
						||
 | 
						||
                    while (item != null)
 | 
						||
                    {
 | 
						||
                        if (item is PieSeriesPointCollection)
 | 
						||
                        {
 | 
						||
                            if (((PieSeriesPointCollection)item).IsOther == true)
 | 
						||
                            {
 | 
						||
                                IsInOtherEx = true;
 | 
						||
                                break;
 | 
						||
                            }
 | 
						||
 | 
						||
                            item = ((PieSeriesPointCollection)item).Parent;
 | 
						||
                        }
 | 
						||
                        else if (item is PieSeriesPoint)
 | 
						||
                        {
 | 
						||
                            if (((PieSeriesPoint)item).IsInOtherEx == true)
 | 
						||
                            {
 | 
						||
                                IsInOtherEx = true;
 | 
						||
                                break;
 | 
						||
                            }
 | 
						||
 | 
						||
                            item = ((PieSeriesPoint)item).Parent;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            break;
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
 | 
						||
                return (IsInOtherEx == false);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsDisplayedEx
 | 
						||
 | 
						||
        internal bool IsDisplayedEx
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (Visible == true)
 | 
						||
                {
 | 
						||
                    if (ChartSeries != null)
 | 
						||
                    {
 | 
						||
                        PieChart pieChart = ChartSeries.Parent as PieChart;
 | 
						||
 | 
						||
                        if (pieChart != null)
 | 
						||
                        {
 | 
						||
                            ItemCheckAction ica = (pieChart != null)
 | 
						||
                                ? pieChart.Legend.ItemCheckAction : ItemCheckAction.ShowItem;
 | 
						||
 | 
						||
                            return ((ica == ItemCheckAction.None ||
 | 
						||
                                    (ShowCheckBoxInLegend == false || CheckedInLegend == true)));
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
 | 
						||
                return (false);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsInOtherEx
 | 
						||
 | 
						||
        internal bool IsInOtherEx
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsInOtherEx)); }
 | 
						||
            set { SetState(States.IsInOtherEx, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsOffset
 | 
						||
 | 
						||
        internal bool IsOffset
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsOffset)); }
 | 
						||
            set { SetState(States.IsOffset, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsEnabled
 | 
						||
 | 
						||
        internal bool IsEnabled
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                PieRing pieRing = PieRing;
 | 
						||
 | 
						||
                if (pieRing != null)
 | 
						||
                {
 | 
						||
                    if (pieRing.IsEnabled == true)
 | 
						||
                        return (pieRing.IsDisplayed);
 | 
						||
                }
 | 
						||
 | 
						||
                return (false);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region LastPathBounds
 | 
						||
 | 
						||
        internal Rectangle LastPathBounds
 | 
						||
        {
 | 
						||
            get { return (_LastPathBounds); }
 | 
						||
            set { _LastPathBounds = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MaxSlicesEx
 | 
						||
 | 
						||
        internal int MaxSlicesEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_MaxSlicesEx); }
 | 
						||
            set { _MaxSlicesEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MinExtentEx
 | 
						||
 | 
						||
        internal int MinExtentEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_MinExtentEx); }
 | 
						||
            set { _MinExtentEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MinPercentEx
 | 
						||
 | 
						||
        internal double MinPercentEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_MinPercentEx); }
 | 
						||
            set { _MinPercentEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OuterSliceLabelEx
 | 
						||
 | 
						||
        internal string OuterSliceLabelEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_OuterSliceLabelEx); }
 | 
						||
            set { _OuterSliceLabelEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PathBounds
 | 
						||
 | 
						||
        internal Rectangle PathBounds
 | 
						||
        {
 | 
						||
            get { return (_PathBounds); }
 | 
						||
            set { _PathBounds = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PieLabel
 | 
						||
 | 
						||
        internal PieLabel PieLabel
 | 
						||
        {
 | 
						||
            get { return (_PieLabel); }
 | 
						||
            set { _PieLabel = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLineDisplayModeEx
 | 
						||
 | 
						||
        internal PieRefLineDisplayMode ReferenceLineDisplayModeEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_ReferenceLineDisplayModeEx); }
 | 
						||
            set { _ReferenceLineDisplayModeEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLineDisplayOnTopEx
 | 
						||
 | 
						||
        internal bool ReferenceLineDisplayOnTopEx
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                UpdatePropertyCache();
 | 
						||
 | 
						||
                return (TestState(States.ReferenceLineDisplayOnTop));
 | 
						||
            }
 | 
						||
 | 
						||
            set { SetState(States.ReferenceLineDisplayOnTop, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ReferenceLinesEx
 | 
						||
 | 
						||
        internal List<PieReferenceLine> ReferenceLinesEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_ReferenceLinesEx); }
 | 
						||
            set { _ReferenceLinesEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region RenderCount
 | 
						||
 | 
						||
        private int _RenderCount;
 | 
						||
 | 
						||
        internal int RenderCount
 | 
						||
        {
 | 
						||
            get { return (_RenderCount); }
 | 
						||
            set { _RenderCount = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region RingWeightEx
 | 
						||
 | 
						||
        internal int RingWeightEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_RingWeightEx); }
 | 
						||
            set { _RingWeightEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region RootPsp
 | 
						||
 | 
						||
        internal PieSeriesPoint RootPsp
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_RootPsp == null)
 | 
						||
                    _RootPsp = GetRootPsp();
 | 
						||
 | 
						||
                return (_RootPsp);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region GetRootPsp
 | 
						||
 | 
						||
        private PieSeriesPoint GetRootPsp()
 | 
						||
        {
 | 
						||
            if (PieRing.RingLevel > 0)
 | 
						||
            {
 | 
						||
                PieSeriesPointCollection spc = Parent as PieSeriesPointCollection;
 | 
						||
 | 
						||
                if (spc != null)
 | 
						||
                {
 | 
						||
                    PieSeriesPoint psp = spc.Parent as PieSeriesPoint;
 | 
						||
 | 
						||
                    if (psp != null)
 | 
						||
                        return (psp.RootPsp);
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            return (this);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowSliceWhiteSpaceEx
 | 
						||
 | 
						||
        internal bool ShowSliceWhiteSpaceEx
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                UpdatePropertyCache();
 | 
						||
 | 
						||
                return (TestState(States.ShowSliceWhiteSpaceEx));
 | 
						||
            }
 | 
						||
 | 
						||
            set { SetState(States.ShowSliceWhiteSpaceEx, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelCropModeEx
 | 
						||
 | 
						||
        internal SliceLabelCropMode SliceLabelCropModeEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_SliceLabelCropModeEx); }
 | 
						||
            set { _SliceLabelCropModeEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelDisplayModeEx
 | 
						||
 | 
						||
        internal SliceLabelDisplayMode SliceLabelDisplayModeEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_SliceLabelDisplayModeEx); }
 | 
						||
            set { _SliceLabelDisplayModeEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SliceLabelVisibilityEx
 | 
						||
 | 
						||
        internal SliceLabelVisibility SliceLabelVisibilityEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_SliceLabelVisibilityEx); }
 | 
						||
            set { _SliceLabelVisibilityEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region StartAngleEx
 | 
						||
 | 
						||
        internal double StartAngleEx
 | 
						||
        {
 | 
						||
            get { return (_StartAngleEx); }
 | 
						||
            set { _StartAngleEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SweepAngleEx
 | 
						||
 | 
						||
        internal double SweepAngleEx
 | 
						||
        {
 | 
						||
            get { return (_SweepAngleEx); }
 | 
						||
            set { _SweepAngleEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ToolTipTextEx
 | 
						||
 | 
						||
        internal string ToolTipTextEx
 | 
						||
        {
 | 
						||
            get { UpdatePropertyCache(); return (_ToolTipTextEx); }
 | 
						||
            set { _ToolTipTextEx = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region WordPosLines
 | 
						||
 | 
						||
        internal List<WordPosLine> WordPosLines
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                VerifyLayoutUpdateCount();
 | 
						||
 | 
						||
                return (_WordPosLines);
 | 
						||
            }
 | 
						||
 | 
						||
            set { _WordPosLines = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region VerifyLayoutUpdateCount
 | 
						||
 | 
						||
        private void VerifyLayoutUpdateCount()
 | 
						||
        {
 | 
						||
            PieSeries series = ChartSeries;
 | 
						||
 | 
						||
            if (series != null)
 | 
						||
            {
 | 
						||
                ChartControl chartControl = series.ChartControl;
 | 
						||
 | 
						||
                if (chartControl != null)
 | 
						||
                {
 | 
						||
                    if (_LayoutUpdateCount != chartControl.LayoutUpdateCount)
 | 
						||
                    {
 | 
						||
                        _WordPosLines = null;
 | 
						||
 | 
						||
                        InscribedRectValid = false;
 | 
						||
 | 
						||
                        _LayoutUpdateCount = chartControl.LayoutUpdateCount;
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region UpdatePropertyCache
 | 
						||
 | 
						||
        private void UpdatePropertyCache()
 | 
						||
        {
 | 
						||
            if (ChartControl != null)
 | 
						||
            {
 | 
						||
                if (_LocalUpdateCount != ChartControl.GlobalUpdateCount)
 | 
						||
                {
 | 
						||
                    PieSeriesPointCollection spc = Parent as PieSeriesPointCollection;
 | 
						||
 | 
						||
                    if (spc != null)
 | 
						||
                    {
 | 
						||
                        PieSeries pieSeries = this.ChartSeries;
 | 
						||
                        PieChart pieChart = pieSeries.Parent as PieChart;
 | 
						||
 | 
						||
                        _AngleMarginEx = GetAngleMarginEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _InnerLabelOrientationEx = GetSliceLabelOrientationEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _InnerSliceLabelEx = GetInnerSliceLabelEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _MaxSlicesEx = GetMaxSlicesEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _MinExtentEx = GetMinExtentEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _MinPercentEx = GetMinPercentEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _OuterSliceLabelEx = GetOuterSliceLabelEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _ReferenceLineDisplayModeEx = GetReferenceLineDisplayModeEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _ReferenceLinesEx = GetReferenceLinesEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _RingWeightEx = GetRingWeightEx(pieChart, pieSeries, spc.Parent);
 | 
						||
 | 
						||
                        SetState(States.ReferenceLineDisplayOnTop, GetReferenceLineDisplayOnTopEx(pieChart, pieSeries, spc.Parent));
 | 
						||
                        SetState(States.ShowSliceWhiteSpaceEx, GetShowSliceWhiteSpaceEx(pieChart, pieSeries, spc.Parent));
 | 
						||
 | 
						||
                        _SliceLabelCropModeEx = GetSliceLabelCropModeEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _SliceLabelDisplayModeEx = GetSliceLabelDisplayModeEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                        _SliceLabelVisibilityEx = GetSliceLabelVisibilityEx(pieChart, pieSeries, spc.Parent);
 | 
						||
 | 
						||
                        _ToolTipTextEx = GetToolTipTextEx(pieChart, pieSeries, spc.Parent);
 | 
						||
                    }
 | 
						||
 | 
						||
                    _LocalUpdateCount = ChartControl.GlobalUpdateCount;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region GetAngleMarginEx
 | 
						||
 | 
						||
        private double GetAngleMarginEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (double.IsNaN(psp.SubSliceVisualLayout.AngleMargin) == false)
 | 
						||
                    return (psp.SubSliceVisualLayout.AngleMargin);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (double.IsNaN(pieSeries.SubSliceVisualLayout.AngleMargin) == false)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.AngleMargin);
 | 
						||
 | 
						||
            if (double.IsNaN(pieChart.SubSliceVisualLayout.AngleMargin) == false)
 | 
						||
                return (pieChart.SubSliceVisualLayout.AngleMargin);
 | 
						||
 | 
						||
            return (0);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetInnerSliceLabelEx
 | 
						||
 | 
						||
        private string GetInnerSliceLabelEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            CharBounds = null;
 | 
						||
 | 
						||
            if (InnerSliceLabel != null)
 | 
						||
                return (InnerSliceLabel);
 | 
						||
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.InnerSliceLabel != null)
 | 
						||
                    return (psp.SubSliceVisualLayout.InnerSliceLabel);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.InnerSliceLabel != null)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.InnerSliceLabel);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.InnerSliceLabel != null)
 | 
						||
                return (pieChart.SubSliceVisualLayout.InnerSliceLabel);
 | 
						||
 | 
						||
            return ("{X}");
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetMaxSlicesEx
 | 
						||
 | 
						||
        private int GetMaxSlicesEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.MaxSlices >= 0)
 | 
						||
                    return (psp.SubSliceVisualLayout.MaxSlices);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.MaxSlices >= 0)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.MaxSlices);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.MaxSlices >= 0)
 | 
						||
                return (pieChart.SubSliceVisualLayout.MaxSlices);
 | 
						||
 | 
						||
            return (100);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetMinExtentEx
 | 
						||
 | 
						||
        private int GetMinExtentEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.MinExtent >= 0)
 | 
						||
                    return (psp.SubSliceVisualLayout.MinExtent);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.MinExtent >= 0)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.MinExtent);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.MinExtent >= 0)
 | 
						||
                return (pieChart.SubSliceVisualLayout.MinExtent);
 | 
						||
 | 
						||
            return (0);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetMinPercentEx
 | 
						||
 | 
						||
        private double GetMinPercentEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (double.IsNaN(psp.SubSliceVisualLayout.MinPercent) == false)
 | 
						||
                    return (psp.SubSliceVisualLayout.MinPercent);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (double.IsNaN(pieSeries.SubSliceVisualLayout.MinPercent) == false)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.MinPercent);
 | 
						||
 | 
						||
            if (double.IsNaN(pieChart.SubSliceVisualLayout.MinPercent) == false)
 | 
						||
                return (pieChart.SubSliceVisualLayout.MinPercent);
 | 
						||
 | 
						||
            return (.04d);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetOuterSliceLabelEx
 | 
						||
 | 
						||
        private string GetOuterSliceLabelEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            if (OuterSliceLabel != null)
 | 
						||
                return (OuterSliceLabel);
 | 
						||
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.OuterSliceLabel != null)
 | 
						||
                    return (psp.SubSliceVisualLayout.OuterSliceLabel);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.OuterSliceLabel != null)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.OuterSliceLabel);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.OuterSliceLabel != null)
 | 
						||
                return (pieChart.SubSliceVisualLayout.OuterSliceLabel);
 | 
						||
 | 
						||
            return ("{X}");
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetReferenceLineDisplayModeEx
 | 
						||
 | 
						||
        private PieRefLineDisplayMode GetReferenceLineDisplayModeEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.ReferenceLineDisplayMode != PieRefLineDisplayMode.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.ReferenceLineDisplayMode);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.ReferenceLineDisplayMode != PieRefLineDisplayMode.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.ReferenceLineDisplayMode);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.ReferenceLineDisplayMode != PieRefLineDisplayMode.NotSet)
 | 
						||
                return (pieChart.SubSliceVisualLayout.ReferenceLineDisplayMode);
 | 
						||
 | 
						||
            return (PieRefLineDisplayMode.None);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetReferenceLineDisplayOnTopEx
 | 
						||
 | 
						||
        private bool GetReferenceLineDisplayOnTopEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.ReferenceLineDisplayOnTop != Tbool.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.ReferenceLineDisplayOnTop == Tbool.True);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.ReferenceLineDisplayOnTop != Tbool.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.ReferenceLineDisplayOnTop == Tbool.True);
 | 
						||
 | 
						||
            return (pieChart.SubSliceVisualLayout.ReferenceLineDisplayOnTop != Tbool.False);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetReferenceLinesEx
 | 
						||
 | 
						||
        private List<PieReferenceLine> GetReferenceLinesEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            List<PieReferenceLine> lines = new List<PieReferenceLine>();
 | 
						||
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout._ReferenceLines != null)
 | 
						||
                    AddReferenceLines(lines, psp.SubSliceVisualLayout.ReferenceLines);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout._ReferenceLines != null)
 | 
						||
                AddReferenceLines(lines, pieSeries.SubSliceVisualLayout.ReferenceLines);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout._ReferenceLines != null)
 | 
						||
                AddReferenceLines(lines, pieChart.SubSliceVisualLayout.ReferenceLines);
 | 
						||
 | 
						||
            return (lines);
 | 
						||
        }
 | 
						||
 | 
						||
        #region AddReferenceLines
 | 
						||
 | 
						||
        private void AddReferenceLines(
 | 
						||
            List<PieReferenceLine> lines, PieReferenceLineCollection rlc)
 | 
						||
        {
 | 
						||
            foreach (PieReferenceLine line in rlc)
 | 
						||
                lines.Add(line);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetRingWeightEx
 | 
						||
 | 
						||
        private int GetRingWeightEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.RingWeight >= 0)
 | 
						||
                    return (psp.SubSliceVisualLayout.RingWeight);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.RingWeight >= 0)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.RingWeight);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.RingWeight >= 0)
 | 
						||
                return (pieChart.SubSliceVisualLayout.RingWeight);
 | 
						||
 | 
						||
            return (100);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetShowSliceWhiteSpaceEx
 | 
						||
 | 
						||
        private bool GetShowSliceWhiteSpaceEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.ShowSliceWhiteSpace != Tbool.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.ShowSliceWhiteSpace == Tbool.True);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.ShowSliceWhiteSpace != Tbool.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.ShowSliceWhiteSpace == Tbool.True);
 | 
						||
 | 
						||
            return (pieChart.SubSliceVisualLayout.ShowSliceWhiteSpace == Tbool.True);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSliceLabelCropModeEx
 | 
						||
 | 
						||
        private SliceLabelCropMode GetSliceLabelCropModeEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.SliceLabelCropMode != SliceLabelCropMode.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.SliceLabelCropMode);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.SliceLabelCropMode != SliceLabelCropMode.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.SliceLabelCropMode);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.SliceLabelCropMode != SliceLabelCropMode.NotSet)
 | 
						||
                return (pieChart.SubSliceVisualLayout.SliceLabelCropMode);
 | 
						||
 | 
						||
            return (SliceLabelCropMode.Clip);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSliceLabelDisplayModeEx
 | 
						||
 | 
						||
        private SliceLabelDisplayMode GetSliceLabelDisplayModeEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.SliceLabelDisplayMode != SliceLabelDisplayMode.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.SliceLabelDisplayMode);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.SliceLabelDisplayMode != SliceLabelDisplayMode.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.SliceLabelDisplayMode);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.SliceLabelDisplayMode != SliceLabelDisplayMode.NotSet)
 | 
						||
                return (pieChart.SubSliceVisualLayout.SliceLabelDisplayMode);
 | 
						||
 | 
						||
            return (SliceLabelDisplayMode.InnerAndOuter);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSliceLabelOrientationEx
 | 
						||
 | 
						||
        private SliceLabelOrientation GetSliceLabelOrientationEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.InnerLabelOrientation != SliceLabelOrientation.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.InnerLabelOrientation);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.InnerLabelOrientation != SliceLabelOrientation.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.InnerLabelOrientation);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.InnerLabelOrientation != SliceLabelOrientation.NotSet)
 | 
						||
                return (pieChart.SubSliceVisualLayout.InnerLabelOrientation);
 | 
						||
 | 
						||
            return (SliceLabelOrientation.Adaptive);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSliceLabelVisibilityEx
 | 
						||
 | 
						||
        private SliceLabelVisibility GetSliceLabelVisibilityEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.SliceLabelVisibility != SliceLabelVisibility.NotSet)
 | 
						||
                    return (psp.SubSliceVisualLayout.SliceLabelVisibility);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.SliceLabelVisibility != SliceLabelVisibility.NotSet)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.SliceLabelVisibility);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.SliceLabelVisibility != SliceLabelVisibility.NotSet)
 | 
						||
                return (pieChart.SubSliceVisualLayout.SliceLabelVisibility);
 | 
						||
 | 
						||
            return (SliceLabelVisibility.NotSet);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetToolTipTextEx
 | 
						||
 | 
						||
        private string GetToolTipTextEx(
 | 
						||
            PieChart pieChart, PieSeries pieSeries, object item)
 | 
						||
        {
 | 
						||
            PieSeriesPoint psp = item as PieSeriesPoint;
 | 
						||
 | 
						||
            while (psp != null)
 | 
						||
            {
 | 
						||
                if (psp.SubSliceVisualLayout.ToolTipText != null)
 | 
						||
                    return (psp.SubSliceVisualLayout.ToolTipText);
 | 
						||
 | 
						||
                psp = GetParentPsp(psp);
 | 
						||
            }
 | 
						||
 | 
						||
            if (pieSeries.SubSliceVisualLayout.ToolTipText != null)
 | 
						||
                return (pieSeries.SubSliceVisualLayout.ToolTipText);
 | 
						||
 | 
						||
            if (pieChart.SubSliceVisualLayout.ToolTipText != null)
 | 
						||
                return (pieChart.SubSliceVisualLayout.ToolTipText);
 | 
						||
 | 
						||
            return ("{x}");
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetParentPsp
 | 
						||
 | 
						||
        private PieSeriesPoint GetParentPsp(PieSeriesPoint psp)
 | 
						||
        {
 | 
						||
            PieSeriesPointCollection spc = psp.Parent as PieSeriesPointCollection;
 | 
						||
 | 
						||
            return (spc != null) ? spc.Parent as PieSeriesPoint : null;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetRayEndPoint
 | 
						||
 | 
						||
        internal Point GetRayEndPoint(double angle, double radius)
 | 
						||
        {
 | 
						||
            Point pt = SliceCenter;
 | 
						||
 | 
						||
            double radians = MathHelper.ToRadians(angle);
 | 
						||
 | 
						||
            pt.X += (int)(Math.Cos(radians) * radius);
 | 
						||
            pt.Y += (int)(Math.Sin(radians) * radius);
 | 
						||
 | 
						||
            return (pt);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetLabelText
 | 
						||
 | 
						||
        internal string GetLabelText(string pattern)
 | 
						||
        {
 | 
						||
            pattern = pattern.Replace("\\n", "\n");
 | 
						||
            pattern = pattern.Replace("\\r", "\r");
 | 
						||
 | 
						||
            Regex regex = new Regex("{([^}]*)}");
 | 
						||
            MatchCollection mc = regex.Matches(pattern);
 | 
						||
 | 
						||
            StringBuilder sb = new StringBuilder();
 | 
						||
 | 
						||
            int index = 0;
 | 
						||
 | 
						||
            foreach (Match ma in mc)
 | 
						||
            {
 | 
						||
                if (ma.Index > index)
 | 
						||
                    sb.Append(pattern.Substring(index, ma.Index - index));
 | 
						||
 | 
						||
                sb.Append(ProcessSliceLabelFmt(ma.Value));
 | 
						||
 | 
						||
                index = ma.Index + ma.Length;
 | 
						||
            }
 | 
						||
 | 
						||
            if (index < pattern.Length)
 | 
						||
                sb.Append(pattern.Substring(index));
 | 
						||
 | 
						||
            return (sb.ToString());
 | 
						||
        }
 | 
						||
 | 
						||
        #region ProcessSliceLabelFmt
 | 
						||
 | 
						||
        /// "AVG" "A" - Average (angular values).
 | 
						||
        /// "PCT" "P" - Percent of pie (angular values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOT" "T" - Total of all values (angluar values).
 | 
						||
        /// "VAL" "V" - Value percent of pie (angular value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "AVGX" "AX" - Average (extent/radial values).
 | 
						||
        /// "PCTX" "PX" - Percent of pie (extent values) - (.025 yields "2.5 %").
 | 
						||
        /// "TOTX" "TX" - Total of all values (extent values).
 | 
						||
        /// "VALX" "VX" - Value percent of pie (extent value) -  (.025 yields ".025").
 | 
						||
        ///
 | 
						||
        /// "S" "SNAME" - Series name.
 | 
						||
        /// "X" - ValueX.
 | 
						||
        /// "Y", "Y0", "Yn" - ValueY values (where 'n' is index value).
 | 
						||
        ///
 | 
						||
        /// Use: {format[:specifier]}
 | 
						||
 | 
						||
        private string ProcessSliceLabelFmt(string pattern)
 | 
						||
        {
 | 
						||
            string s = pattern.Substring(1, pattern.Length - 2);
 | 
						||
 | 
						||
            int n = s.IndexOf(':');
 | 
						||
 | 
						||
            if ((uint)n > s.Length - 1)
 | 
						||
                n = s.Length;
 | 
						||
 | 
						||
            string placeHolder = s.Substring(0, n).Trim().ToUpper();
 | 
						||
            string formatSpecifier = (n + 1 < s.Length) ? s.Substring(n + 1) : "";
 | 
						||
 | 
						||
            try
 | 
						||
            {
 | 
						||
                PieSeriesPointCollection spc = Parent as PieSeriesPointCollection;
 | 
						||
 | 
						||
                switch (placeHolder)
 | 
						||
                {
 | 
						||
                    case "A":
 | 
						||
                    case "AVG":
 | 
						||
                        if (spc != null)
 | 
						||
                            return (GetSliceLabelText(spc.PieAverage, formatSpecifier));
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case "AX":
 | 
						||
                    case "AVGX":
 | 
						||
                        if (spc != null)
 | 
						||
                            return (GetSliceLabelText(spc.PieAverageExtent, formatSpecifier));
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case "N":
 | 
						||
                    case "NAME":
 | 
						||
                        if (string.IsNullOrEmpty(formatSpecifier) == false)
 | 
						||
                            return (String.Format(formatSpecifier, Name));
 | 
						||
 | 
						||
                        return (Name);
 | 
						||
 | 
						||
                    case "P":
 | 
						||
                    case "PCT":
 | 
						||
                        if (string.IsNullOrEmpty(formatSpecifier) == false)
 | 
						||
                            return (SliceValue.ToString(formatSpecifier));
 | 
						||
 | 
						||
                        return (GetSliceLabelText(SliceValue, "P"));
 | 
						||
 | 
						||
                    case "PX":
 | 
						||
                    case "PCTX":
 | 
						||
                        if (string.IsNullOrEmpty(formatSpecifier) == false)
 | 
						||
                            return (SliceExtent.ToString(formatSpecifier));
 | 
						||
 | 
						||
                        return (GetSliceLabelText(SliceExtent, "P"));
 | 
						||
 | 
						||
                    case "S":
 | 
						||
                    case "SNAME":
 | 
						||
                        string sname = ChartSeries != null ? ChartSeries.Name : "";
 | 
						||
 | 
						||
                        if (string.IsNullOrEmpty(formatSpecifier) == false)
 | 
						||
                            return (String.Format(formatSpecifier, sname));
 | 
						||
 | 
						||
                        return (sname);
 | 
						||
 | 
						||
                    case "T":
 | 
						||
                    case "TOTA":
 | 
						||
                        if (spc != null)
 | 
						||
                            return (GetSliceLabelText(spc.PieTotal, formatSpecifier));
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case "TX":
 | 
						||
                    case "TOTX":
 | 
						||
                        if (spc != null)
 | 
						||
                            return (GetSliceLabelText(spc.PieTotalExtent, formatSpecifier));
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case "V":
 | 
						||
                    case "VAL":
 | 
						||
                        return (GetSliceLabelText(SliceValue, formatSpecifier));
 | 
						||
 | 
						||
                    case "VX":
 | 
						||
                    case "VALX":
 | 
						||
                        return (GetSliceLabelText(SliceExtent, formatSpecifier));
 | 
						||
 | 
						||
                    case "X":
 | 
						||
                        return (GetSliceLabelText(ValueX, formatSpecifier));
 | 
						||
 | 
						||
                    case "Y":
 | 
						||
                    case "Y0":
 | 
						||
                        if (ValueY != null && ValueY.Length > 0)
 | 
						||
                            return (GetSliceLabelText(ValueY[0], formatSpecifier));
 | 
						||
 | 
						||
                        return ("");
 | 
						||
 | 
						||
                    default:
 | 
						||
                        if (placeHolder.StartsWith("Y") == true)
 | 
						||
                        {
 | 
						||
                            int index = int.Parse(placeHolder.Substring(1));
 | 
						||
 | 
						||
                            if (ValueY != null && ValueY.Length > index)
 | 
						||
                                return (GetSliceLabelText(ValueY[index], formatSpecifier));
 | 
						||
                        }
 | 
						||
 | 
						||
                        return (s);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            catch
 | 
						||
            {
 | 
						||
            }
 | 
						||
 | 
						||
            return (s);
 | 
						||
        }
 | 
						||
 | 
						||
        #region GetSliceLabelText
 | 
						||
 | 
						||
        private string GetSliceLabelText(object value, string format)
 | 
						||
        {
 | 
						||
            if (value is string)
 | 
						||
            {
 | 
						||
                if (string.IsNullOrEmpty(format) == true)
 | 
						||
                    return ((string)value);
 | 
						||
 | 
						||
                return (String.Format(format, value));
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                double d = Convert.ToDouble(value);
 | 
						||
 | 
						||
                if (string.IsNullOrEmpty(format) == false)
 | 
						||
                    return (d.ToString(format));
 | 
						||
 | 
						||
                return (d.ToString("F3"));
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Style handling
 | 
						||
 | 
						||
        #region GetEffectiveSliceStyle
 | 
						||
 | 
						||
        public ChartSliceVisualStyle
 | 
						||
            GetEffectiveSliceStyle(PieChart pieChart, PieSeries series)
 | 
						||
        {
 | 
						||
            StyleState state = StyleState.Default;
 | 
						||
 | 
						||
            if (series.IsHighLightedPsp(pieChart, this) == true)
 | 
						||
                state |= StyleState.MouseOver;
 | 
						||
 | 
						||
            if (IsSelected == true)
 | 
						||
                state |= StyleState.Selected;
 | 
						||
 | 
						||
            ChartSliceVisualStyle estyle = EffectiveSliceStyles[state];
 | 
						||
 | 
						||
            if (_WordPosLines != null)
 | 
						||
            {
 | 
						||
                if (_LastEffectiveStyle != null)
 | 
						||
                {
 | 
						||
                    if (EqualFonts(estyle.SliceInnerLabelStyle.Font,
 | 
						||
                        _LastEffectiveStyle.SliceInnerLabelStyle.Font) == false)
 | 
						||
                    {
 | 
						||
                        _CharBounds = null;
 | 
						||
                        _WordPosLines = null;
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                   
 | 
						||
                _LastEffectiveStyle = estyle;
 | 
						||
            }
 | 
						||
 | 
						||
            return (estyle);
 | 
						||
        }
 | 
						||
 | 
						||
        #region EqualFonts
 | 
						||
 | 
						||
        private bool EqualFonts(Font font1, Font font2)
 | 
						||
        {
 | 
						||
            if (font1 == null || font2 == null)
 | 
						||
                return (false);
 | 
						||
 | 
						||
            return (font1.Name == font2.Name &&
 | 
						||
                font1.SizeInPoints == font2.SizeInPoints &&
 | 
						||
                font1.Style == font2.Style);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ApplyStyles
 | 
						||
 | 
						||
        public void ApplyStyles(BaseVisualStyle style)
 | 
						||
        {
 | 
						||
        }
 | 
						||
 | 
						||
        public void ApplyStyles(BaseVisualStyle style, StyleType cs)
 | 
						||
        {
 | 
						||
            ChartSliceVisualStyle sstyle = style as ChartSliceVisualStyle;
 | 
						||
 | 
						||
            if (sstyle != null)
 | 
						||
            {
 | 
						||
                PieSeriesPointCollection spc = Parent as PieSeriesPointCollection;
 | 
						||
                PieSeries series = ChartSeries;
 | 
						||
 | 
						||
                if (IsOther == true)
 | 
						||
                {
 | 
						||
                    ApplyOtherParentStyles(sstyle, cs, series.Parent as ChartContainer);
 | 
						||
 | 
						||
                    sstyle.ApplyStyle(series.SubSliceVisualLayout.OtherSliceVisualStyles[cs]);
 | 
						||
 | 
						||
                    ApplyOtherParentPspStyle(sstyle, cs, this);
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    ApplyParentStyles(sstyle, cs, series.Parent as ChartContainer);
 | 
						||
 | 
						||
                    sstyle.ApplyStyle(series.SubSliceVisualLayout.SliceVisualStyles[cs]);
 | 
						||
 | 
						||
                    ApplyParentPspStyle(sstyle, cs, this);
 | 
						||
                }
 | 
						||
 | 
						||
                sstyle.ApplyStyle(SliceVisualStyles[cs]);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region ApplyOtherParentStyles
 | 
						||
 | 
						||
        private void ApplyOtherParentStyles(
 | 
						||
            ChartSliceVisualStyle sstyle, StyleType cs, ChartContainer item)
 | 
						||
        {
 | 
						||
            if (item != null)
 | 
						||
            {
 | 
						||
                ApplyOtherParentStyles(sstyle, cs, item.Parent as ChartContainer);
 | 
						||
 | 
						||
                ChartPanel panel = item as ChartPanel;
 | 
						||
 | 
						||
                if (panel != null)
 | 
						||
                {
 | 
						||
                    sstyle.ApplyStyle(panel.DefaultVisualStyles.OtherSliceVisualStyles[cs]);
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    PieChart pieChart = item as PieChart;
 | 
						||
 | 
						||
                    if (pieChart != null)
 | 
						||
                        sstyle.ApplyStyle(pieChart.SubSliceVisualLayout.OtherSliceVisualStyles[cs]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                ChartControl chartControl = ChartControl;
 | 
						||
 | 
						||
                if (chartControl != null)
 | 
						||
                {
 | 
						||
                    sstyle.ApplyStyle(chartControl.BaseVisualStyles.OtherSliceVisualStyles[cs]);
 | 
						||
                    sstyle.ApplyStyle(chartControl.DefaultVisualStyles.OtherSliceVisualStyles[cs]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ApplyOtherParentPspStyle
 | 
						||
 | 
						||
        private void ApplyOtherParentPspStyle(
 | 
						||
            ChartSliceVisualStyle sstyle, StyleType cs, PieSeriesPoint psp)
 | 
						||
        {
 | 
						||
            psp = GetParentPsp(psp);
 | 
						||
 | 
						||
            if (psp != null)
 | 
						||
            {
 | 
						||
                ApplyOtherParentPspStyle(sstyle, cs, psp);
 | 
						||
 | 
						||
                sstyle.ApplyStyle(psp.SubSliceVisualLayout.OtherSliceVisualStyles[cs]);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ApplyParentStyles
 | 
						||
 | 
						||
        private void ApplyParentStyles(
 | 
						||
            ChartSliceVisualStyle sstyle, StyleType cs, ChartContainer item)
 | 
						||
        {
 | 
						||
            if (item != null)
 | 
						||
            {
 | 
						||
                ApplyParentStyles(sstyle, cs, item.Parent as ChartContainer);
 | 
						||
 | 
						||
                if (item is PieChart)
 | 
						||
                    sstyle.ApplyStyle(((PieChart)item).SubSliceVisualLayout.SliceVisualStyles[cs]);
 | 
						||
 | 
						||
                if (item is ChartPanel)
 | 
						||
                    sstyle.ApplyStyle(((ChartPanel)item).DefaultVisualStyles.SliceVisualStyles[cs]);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                ChartControl chartControl = ChartControl;
 | 
						||
 | 
						||
                if (chartControl != null)
 | 
						||
                {
 | 
						||
                    sstyle.ApplyStyle(ChartControl.BaseVisualStyles.SliceVisualStyles[cs]);
 | 
						||
                    sstyle.ApplyStyle(ChartControl.DefaultVisualStyles.SliceVisualStyles[cs]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ApplyParentPspStyle
 | 
						||
 | 
						||
        private void ApplyParentPspStyle(
 | 
						||
            ChartSliceVisualStyle sstyle, StyleType cs, PieSeriesPoint psp)
 | 
						||
        {
 | 
						||
            psp = GetParentPsp(psp);
 | 
						||
 | 
						||
            if (psp != null)
 | 
						||
            {
 | 
						||
                ApplyParentPspStyle(sstyle, cs, psp);
 | 
						||
 | 
						||
                sstyle.ApplyStyle(psp.SubSliceVisualLayout.SliceVisualStyles[cs]);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ApplyDefaults
 | 
						||
 | 
						||
        public void ApplyDefaults(BaseVisualStyle style, StyleType styleType)
 | 
						||
        {
 | 
						||
            ChartSliceVisualStyle sstyle = style as ChartSliceVisualStyle;
 | 
						||
 | 
						||
            if (sstyle != null)
 | 
						||
            {
 | 
						||
                HatchFillType hatch = HatchFillType.LightUpwardDiagonal;
 | 
						||
 | 
						||
                switch (styleType)
 | 
						||
                {
 | 
						||
                    case StyleType.Default:
 | 
						||
                        if (sstyle.Background.IsEmpty == true)
 | 
						||
                            sstyle.Background = new Background(DefaultPaletteColor);
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBackground.IsEmpty == true)
 | 
						||
                            sstyle.WhiteSpaceBackground = new Background(Color.FromArgb(100, DefaultPaletteColor));
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBorder.LinePattern == LinePattern.NotSet)
 | 
						||
                            sstyle.WhiteSpaceBorder.LinePattern = LinePattern.Solid;
 | 
						||
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case StyleType.MouseOver:
 | 
						||
                        if (sstyle.Background.IsEmpty == true)
 | 
						||
                            sstyle.Background = new Background(ControlPaint.Light(DefaultPaletteColor));
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBackground.IsEmpty == true)
 | 
						||
                            sstyle.WhiteSpaceBackground = new Background(Color.FromArgb(50, DefaultPaletteColor));
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBorder.LinePattern == LinePattern.NotSet)
 | 
						||
                            sstyle.WhiteSpaceBorder.LinePattern = LinePattern.Solid;
 | 
						||
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case StyleType.Selected:
 | 
						||
                        if (sstyle.Background.IsEmpty == true)
 | 
						||
                        {
 | 
						||
                            sstyle.Background = new Background(Color.White, DefaultPaletteColor);
 | 
						||
                            sstyle.Background.HatchFillType = hatch;
 | 
						||
                        }
 | 
						||
 | 
						||
                        if (sstyle.Border.LineWidth < 0)
 | 
						||
                            sstyle.Border.LineWidth = 2;
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBackground.IsEmpty == true)
 | 
						||
                        {
 | 
						||
                            sstyle.WhiteSpaceBackground = new Background(Color.White, Color.FromArgb(100, DefaultPaletteColor));
 | 
						||
                            sstyle.WhiteSpaceBackground.HatchFillType = hatch;
 | 
						||
                        }
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBorder.LineWidth < 0)
 | 
						||
                            sstyle.WhiteSpaceBorder.LineWidth = 2;
 | 
						||
 | 
						||
                        break;
 | 
						||
 | 
						||
                    case StyleType.SelectedMouseOver:
 | 
						||
                        if (sstyle.Background.IsEmpty == true)
 | 
						||
                        {
 | 
						||
                            sstyle.Background = new Background(Color.White, ControlPaint.Light(DefaultPaletteColor));
 | 
						||
                            sstyle.Background.HatchFillType = hatch;
 | 
						||
                        }
 | 
						||
 | 
						||
                        if (sstyle.Border.LineWidth < 0)
 | 
						||
                            sstyle.Border.LineWidth = 2;
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBackground.IsEmpty == true)
 | 
						||
                        {
 | 
						||
                            sstyle.WhiteSpaceBackground = new Background(Color.White, Color.FromArgb(50, DefaultPaletteColor));
 | 
						||
                            sstyle.WhiteSpaceBackground.HatchFillType = hatch;
 | 
						||
                        }
 | 
						||
 | 
						||
                        if (sstyle.WhiteSpaceBorder.LineWidth < 0)
 | 
						||
                            sstyle.WhiteSpaceBorder.LineWidth = 2;
 | 
						||
 | 
						||
                        break;
 | 
						||
                }
 | 
						||
 | 
						||
                if (sstyle.Border.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.Border.LineColor = DefaultPaletteColor;
 | 
						||
 | 
						||
                if (sstyle.WhiteSpaceBorder.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.WhiteSpaceBorder.LineColor = DefaultPaletteColor;
 | 
						||
 | 
						||
                if (sstyle.ExtentAverageRefLineStyle.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.ExtentAverageRefLineStyle.LineColor = Color.DimGray;
 | 
						||
 | 
						||
                if (sstyle.ExtentMinRefLineStyle.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.ExtentMinRefLineStyle.LineColor = Color.DimGray;
 | 
						||
 | 
						||
                if (sstyle.ExtentMaxRefLineStyle.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.ExtentMaxRefLineStyle.LineColor = Color.DimGray;
 | 
						||
 | 
						||
                if (sstyle.ExtentOuterRefLineStyle.LineColor.IsEmpty == true)
 | 
						||
                    sstyle.ExtentOuterRefLineStyle.LineColor = Color.DimGray;
 | 
						||
 | 
						||
                if (sstyle.SliceOuterLabelStyle.TextColor.IsEmpty == true)
 | 
						||
                    sstyle.SliceOuterLabelStyle.TextColor = DefaultPaletteColor;
 | 
						||
 | 
						||
                sstyle.ApplyDefaults();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetElementStyle
 | 
						||
 | 
						||
        public virtual void GetElementStyle(
 | 
						||
            IEffectiveStyle chartElement, StyleType styleType, ref BaseVisualStyle style)
 | 
						||
        {
 | 
						||
            ChartControl chartControl = ChartControl;
 | 
						||
 | 
						||
            if (chartControl != null)
 | 
						||
                chartControl.DoGetPieSeriesPointStyleEvent(this, styleType, ref style);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ChartControl
 | 
						||
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public ChartControl ChartControl
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_ChartControl == null)
 | 
						||
                {
 | 
						||
                    if (ChartSeries != null)
 | 
						||
                        _ChartControl = ChartSeries.ChartControl;
 | 
						||
                }
 | 
						||
 | 
						||
                return (_ChartControl);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ClearEffectiveStyles
 | 
						||
 | 
						||
        protected void ClearEffectiveStyles()
 | 
						||
        {
 | 
						||
            _EffectiveSliceStyles.InvalidateStyles();
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region OnStyleChanged
 | 
						||
 | 
						||
        protected virtual void OnStyleChanged(string property,
 | 
						||
            INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
 | 
						||
        {
 | 
						||
            StyleChangeHandler(oldValue, newValue);
 | 
						||
 | 
						||
            OnPropertyChanged(property);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region StyleChangeHandler
 | 
						||
 | 
						||
        protected void StyleChangeHandler(
 | 
						||
            INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue)
 | 
						||
        {
 | 
						||
            if (oldValue != null)
 | 
						||
                oldValue.PropertyChanged -= StyleChanged;
 | 
						||
 | 
						||
            if (newValue != null)
 | 
						||
                newValue.PropertyChanged += StyleChanged;
 | 
						||
        }
 | 
						||
 | 
						||
        #region StyleChanged
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Occurs when one of element visual styles has property changes.
 | 
						||
        /// Default implementation invalidates visual appearance of element.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender">VisualStyle that changed.</param>
 | 
						||
        /// <param name="e">Event arguments.</param>
 | 
						||
        protected void StyleChanged(object sender, PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            VisualChangeType changeType = ((VisualPropertyChangedEventArgs)e).ChangeType;
 | 
						||
 | 
						||
            PieSeries series = ChartSeries;
 | 
						||
 | 
						||
            if (series != null)
 | 
						||
            {
 | 
						||
                if (series.ChartControl != null)
 | 
						||
                    series.ChartControl.GlobalUpdateCount++;
 | 
						||
 | 
						||
                if (changeType == VisualChangeType.Layout)
 | 
						||
                    series.InvalidateLayout();
 | 
						||
                else
 | 
						||
                    series.InvalidateRender();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ILegendItem
 | 
						||
 | 
						||
        #region ChartLegendItemVisualStyles
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the visual styles for the Legend item.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Style")]
 | 
						||
        [Description("Indicates the visual styles for the Legend item.")]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						||
        public ChartLegendItemVisualStyles ChartLegendItemVisualStyles
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_ChartLegendItemVisualStyles == null)
 | 
						||
                {
 | 
						||
                    _ChartLegendItemVisualStyles = new ChartLegendItemVisualStyles();
 | 
						||
 | 
						||
                    StyleChangeHandler(null, _ChartLegendItemVisualStyles);
 | 
						||
                }
 | 
						||
 | 
						||
                return (_ChartLegendItemVisualStyles);
 | 
						||
            }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (_ChartLegendItemVisualStyles != value)
 | 
						||
                {
 | 
						||
                    ChartLegendItemVisualStyles oldValue = _ChartLegendItemVisualStyles;
 | 
						||
 | 
						||
                    _ChartLegendItemVisualStyles = value;
 | 
						||
 | 
						||
                    OnStyleChanged("ChartLegendItemVisualStyles", oldValue, value);
 | 
						||
 | 
						||
                    if (oldValue != null)
 | 
						||
                        oldValue.Dispose();
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region CheckedInLegend
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the item is checked in the Legend.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Legend")]
 | 
						||
        [Description("Indicates whether the item is checked in the Legend.")]
 | 
						||
        public bool CheckedInLegend
 | 
						||
        {
 | 
						||
            get { return (TestState(States.CheckedInLegend)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != CheckedInLegend)
 | 
						||
                {
 | 
						||
                    SetState(States.CheckedInLegend, value);
 | 
						||
 | 
						||
                    if (LegendItem != null)
 | 
						||
                        LegendItem.UpdateCheckState();
 | 
						||
 | 
						||
                    OnPropertyChangedEx("CheckedInLegend", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowCheckBoxInLegend
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether a checkbox for the item is shown in the Legend.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(false), Category("Legend")]
 | 
						||
        [Description("Indicates whether a checkbox for the item is shown in the Legend.")]
 | 
						||
        public bool ShowCheckBoxInLegend
 | 
						||
        {
 | 
						||
            get { return (TestState(States.ShowCheckBoxInLegend)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != ShowCheckBoxInLegend)
 | 
						||
                {
 | 
						||
                    SetState(States.ShowCheckBoxInLegend, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ShowCheckBoxInLegend", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowInLegend
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the item is shown in the Legend.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Legend")]
 | 
						||
        [Description("Indicates whether the item is shown in the Legend.")]
 | 
						||
        public bool ShowInLegend
 | 
						||
        {
 | 
						||
            get { return (TestState(States.ShowInLegend)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != ShowInLegend)
 | 
						||
                {
 | 
						||
                    SetState(States.ShowInLegend, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ShowInLegend", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowInParentLegend
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the item Line is shown in parent Legend(s).
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Legend")]
 | 
						||
        [Description("Indicates whether the item Line is shown in parent Legend(s).")]
 | 
						||
        public bool ShowInParentLegend
 | 
						||
        {
 | 
						||
            get { return (TestState(States.ShowInParentLegend)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != ShowInParentLegend)
 | 
						||
                {
 | 
						||
                    SetState(States.ShowInParentLegend, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ShowInParentLegend", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ShowMarkerInLegend
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the item Marker is shown in the Legend.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true), Category("Legend")]
 | 
						||
        [Description("Indicates whether the item Marker is shown in the Legend.")]
 | 
						||
        public bool ShowMarkerInLegend
 | 
						||
        {
 | 
						||
            get { return (TestState(States.ShowMarkerInLegend)); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != ShowMarkerInLegend)
 | 
						||
                {
 | 
						||
                    SetState(States.ShowMarkerInLegend, value);
 | 
						||
 | 
						||
                    OnPropertyChangedEx("ShowMarkerInLegend", VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region LegendItem
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets the item's parent LegendItem.
 | 
						||
        ///</summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        [Description("Indicates the item's parent LegendItem.")]
 | 
						||
        public ChartLegendItem LegendItem
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_LegendItem == null)
 | 
						||
                {
 | 
						||
                    _LegendItem = new ChartLegendItem();
 | 
						||
 | 
						||
                    _LegendItem.Name = (ValueX != null ? ValueX.ToString() : "");
 | 
						||
 | 
						||
                    if (string.IsNullOrEmpty(_LegendItem.Name) == true)
 | 
						||
                        _LegendItem.Name = "(Psp)";
 | 
						||
 | 
						||
                    _LegendItem.ChartItems.Add(this);
 | 
						||
                }
 | 
						||
 | 
						||
                return (_LegendItem);
 | 
						||
            }
 | 
						||
 | 
						||
            internal set { _LegendItem = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region LegendText
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets the text to display in the legend.
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(null), Category("Legend")]
 | 
						||
        [Description("Indicates the text to display in the legend.")]
 | 
						||
        [NotifyParentProperty(true)]
 | 
						||
        public string LegendText
 | 
						||
        {
 | 
						||
            get { return (_LegendText); }
 | 
						||
 | 
						||
            set
 | 
						||
            {
 | 
						||
                if (value != _LegendText)
 | 
						||
                {
 | 
						||
                    _LegendText = value;
 | 
						||
 | 
						||
                    OnPropertyChangedEx("LegendText", Style.VisualChangeType.Layout);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetLegendItem
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Creates the LegendItem for the item.
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public ChartLegendItem GetLegendItem()
 | 
						||
        {
 | 
						||
            ChartLegendItem item = LegendItem;
 | 
						||
 | 
						||
            if (ShowInLegend == true)
 | 
						||
            {
 | 
						||
                item.CheckState = (CheckedInLegend == true)
 | 
						||
                    ? CheckState.Checked : CheckState.Unchecked;
 | 
						||
 | 
						||
                item.ItemText = LegendText;
 | 
						||
                item.IsEnabled = IsEnabled;
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
            return (item);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetLegendItems
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Creates a list of legend items associated with
 | 
						||
        /// the item.
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public List<ChartLegendItem> GetLegendItems()
 | 
						||
        {
 | 
						||
            List<ChartLegendItem> list = null;
 | 
						||
 | 
						||
            ChartLegendItem litem = GetLegendItem();
 | 
						||
 | 
						||
            if (litem != null)
 | 
						||
            {
 | 
						||
                list = new List<ChartLegendItem>(1);
 | 
						||
 | 
						||
                list.Add(litem);
 | 
						||
            }
 | 
						||
 | 
						||
            return (list);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetLegendItemColor
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets the default color associated with the legend item.
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public Color GetLegendItemColor()
 | 
						||
        {
 | 
						||
            ChartSliceVisualStyle sstyle = EffectiveSliceStyles[StyleState.Default];
 | 
						||
 | 
						||
            Color color = sstyle.Background.Color1;
 | 
						||
 | 
						||
            if (color.IsEmpty == false)
 | 
						||
                return (color);
 | 
						||
 | 
						||
            return (Color.DimGray);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region RenderLegendItemMarker
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Renders the Legend item Marker.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="g"></param>
 | 
						||
        /// <param name="litem"></param>
 | 
						||
        /// <param name="style"></param>
 | 
						||
        public void RenderLegendItemMarker(Graphics g,
 | 
						||
            ChartLegendItem litem, ChartLegendItemVisualStyle style)
 | 
						||
        {
 | 
						||
            ChartSliceVisualStyle sstyle = EffectiveSliceStyles[StyleState.Default];
 | 
						||
 | 
						||
            Rectangle r = litem.MarkerBounds;
 | 
						||
            r.Inflate(-1, -1);
 | 
						||
 | 
						||
            g.SmoothingMode = SmoothingMode.AntiAlias;
 | 
						||
 | 
						||
            using (GraphicsPath path = new GraphicsPath())
 | 
						||
            {
 | 
						||
                Point pt = new Point(r.Right - 2, r.Bottom - 2);
 | 
						||
 | 
						||
                r.Height += (r.Height - 4);
 | 
						||
                r.Width += (r.Width - 4);
 | 
						||
 | 
						||
                path.AddArc(r, 180, 90);
 | 
						||
                path.AddLine(pt, pt);
 | 
						||
 | 
						||
                path.CloseFigure();
 | 
						||
 | 
						||
                if (IsEnabled == true)
 | 
						||
                {
 | 
						||
                    if (sstyle.Background.IsEmpty == true)
 | 
						||
                    {
 | 
						||
                        g.FillPath(Brushes.LightPink, path);
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        using (Brush br = sstyle.Background.GetBrush(r))
 | 
						||
                            g.FillPath(br, path);
 | 
						||
 | 
						||
                        if (sstyle.Background.Color1.IsEmpty == false)
 | 
						||
                        {
 | 
						||
                            using (Pen pen = new Pen(sstyle.Background.Color1))
 | 
						||
                                g.DrawPath(pen, path);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    Background back = style.DisabledMarkerBackground;
 | 
						||
 | 
						||
                    if (back.IsEmpty == true)
 | 
						||
                    {
 | 
						||
                        using (Brush br = new SolidBrush(Color.LightGray))
 | 
						||
                            g.FillPath(br, path);
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        using (Brush br = back.GetBrush(r))
 | 
						||
                            g.FillPath(br, path);
 | 
						||
 | 
						||
                        if (back.Color1.IsEmpty == false)
 | 
						||
                        {
 | 
						||
                            using (Pen pen = new Pen(sstyle.Background.Color1))
 | 
						||
                                g.DrawPath(pen, path);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region TrackLegendItem
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether legend item tracking is enabled.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool TrackLegendItem
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (ChartSeries != null)
 | 
						||
                    return (ChartSeries.TrackLegendItem);
 | 
						||
 | 
						||
                return (false);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region FormatItemText
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Formats the provided item text.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public string FormatItemText(string text)
 | 
						||
        {
 | 
						||
            return (GetLabelText(text));
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region States
 | 
						||
 | 
						||
        [Flags]
 | 
						||
        private enum States : uint
 | 
						||
        {
 | 
						||
            AllowDetach = (1U << 0),
 | 
						||
            AllowSelect = (1U << 1),
 | 
						||
 | 
						||
            Detached = (1U << 2),
 | 
						||
            Selected = (1U << 3),
 | 
						||
 | 
						||
            IsOther = (1U << 4),
 | 
						||
            IsInOther = (1U << 5),
 | 
						||
            IsInOtherEx = (1U << 6),
 | 
						||
 | 
						||
            InnerLabelClipped = (1U << 7),
 | 
						||
            InnerLabelDisplayed = (1U << 8),
 | 
						||
 | 
						||
            IsOffset = (1U << 9),
 | 
						||
            InscribedRectValid = (1 << 10),
 | 
						||
 | 
						||
            CheckedInLegend = (1U << 11),
 | 
						||
            ShowInLegend = (1U << 12),
 | 
						||
            ShowInParentLegend = (1U << 13),
 | 
						||
            ShowCheckBoxInLegend = (1U << 14),
 | 
						||
            ShowMarkerInLegend = (1U << 15),
 | 
						||
 | 
						||
            ReferenceLineDisplayOnTop = (1U << 16),
 | 
						||
            ShowSliceWhiteSpaceEx = (1U << 17),
 | 
						||
 | 
						||
            HasExtent = (1U << 18),
 | 
						||
        }
 | 
						||
 | 
						||
        #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 Copy/CopyTo
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Creates a copy of the PieSeriesPoint
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public new PieSeriesPoint Copy()
 | 
						||
        {
 | 
						||
            PieSeriesPoint copy = new PieSeriesPoint(ValueX, 0);
 | 
						||
 | 
						||
            CopyTo(copy);
 | 
						||
 | 
						||
            return (copy);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Copies the item data to the given PieSeriesPoint.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sp"></param>
 | 
						||
        public void CopyTo(PieSeriesPoint c)
 | 
						||
        {
 | 
						||
            base.CopyTo(c);
 | 
						||
 | 
						||
            c.AllowDetach = AllowDetach;
 | 
						||
            c.AllowSelect = AllowSelect;
 | 
						||
 | 
						||
            c.DetachedOffset = DetachedOffset;
 | 
						||
            c.InnerSliceLabel = InnerSliceLabel;
 | 
						||
            c.IsDetached = IsDetached;
 | 
						||
            c.IsInOther = IsInOther;
 | 
						||
            c.IsSelected = IsSelected;
 | 
						||
            c.Name = Name;
 | 
						||
            c.OuterSliceLabel = OuterSliceLabel;
 | 
						||
 | 
						||
            if (_SeriesPoints != null)
 | 
						||
            {
 | 
						||
                PieSeriesPointCollection spc = SeriesPoints;
 | 
						||
 | 
						||
                if (spc.Count > 0)
 | 
						||
                {
 | 
						||
                    foreach (PieSeriesPoint psp in spc)
 | 
						||
                    {
 | 
						||
                        PieSeriesPoint pspCopy = psp.Copy();
 | 
						||
 | 
						||
                        c.SeriesPoints.Add(pspCopy);
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            c.SubSliceVisualLayout = (_SliceVisualLayout != null) ? _SliceVisualLayout.Copy() : null;
 | 
						||
            c.SliceVisualStyles = (_SliceVisualStyles != null) ? _SliceVisualStyles.Copy() : null;
 | 
						||
 | 
						||
            c.StartAngle = StartAngle;
 | 
						||
            c.SweepAngle = SweepAngle;
 | 
						||
 | 
						||
            c.CheckedInLegend = CheckedInLegend;
 | 
						||
            c.LegendText = LegendText;
 | 
						||
            c.ShowCheckBoxInLegend = ShowCheckBoxInLegend;
 | 
						||
            c.ShowInLegend = ShowInLegend;
 | 
						||
            c.ShowInParentLegend = ShowInParentLegend;
 | 
						||
            c.ShowMarkerInLegend = ShowMarkerInLegend;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSerialData
 | 
						||
 | 
						||
        internal override SerialElementCollection GetSerialData(bool root)
 | 
						||
        {
 | 
						||
            SerialElementCollection sec = new SerialElementCollection();
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddStartElement("SeriesPoint");
 | 
						||
 | 
						||
            sec.AddValue("AllowDetach", AllowDetach, true);
 | 
						||
            sec.AddValue("AllowSelect", AllowSelect, true);
 | 
						||
            sec.AddValue("DetachedOffset", DetachedOffset, double.NaN);
 | 
						||
            sec.AddValue("InnerSliceLabel", InnerSliceLabel, null);
 | 
						||
            sec.AddValue("IsDetached", IsDetached, false);
 | 
						||
            sec.AddValue("IsInOther", IsInOther, false);
 | 
						||
            sec.AddValue("IsSelected", IsSelected, false);
 | 
						||
            sec.AddValue("Name", Name, null);
 | 
						||
            sec.AddValue("OuterSliceLabel", OuterSliceLabel, null);
 | 
						||
 | 
						||
            sec.AddValue("StartAngle", StartAngle, double.NaN);
 | 
						||
            sec.AddValue("SweepAngle", SweepAngle, double.NaN);
 | 
						||
 | 
						||
            if (_SeriesPoints != null)
 | 
						||
            {
 | 
						||
                PieSeriesPointCollection spc = SeriesPoints;
 | 
						||
 | 
						||
                if (spc.Count > 0)
 | 
						||
                {
 | 
						||
                    sec.AddStartElement("SeriesPoints count=\"" + spc.Count + "\"");
 | 
						||
 | 
						||
                    foreach (PieSeriesPoint psp in spc)
 | 
						||
                        sec.AddElement(psp.GetSerialData());
 | 
						||
 | 
						||
                    sec.AddEndElement("SeriesPoints");
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            if (_SliceVisualLayout != null)
 | 
						||
                sec.AddElement(_SliceVisualLayout.GetSerialData());
 | 
						||
 | 
						||
            if (_SliceVisualStyles != null && _SliceVisualStyles.IsEmpty == false)
 | 
						||
                sec.AddElement(_SliceVisualStyles.GetSerialData("SliceVisualStyles"));
 | 
						||
 | 
						||
            sec.AddValue("CheckedInLegend", CheckedInLegend, true);
 | 
						||
            sec.AddValue("LegendText", LegendText, null);
 | 
						||
            sec.AddValue("ShowCheckBoxInLegend", ShowCheckBoxInLegend, true);
 | 
						||
            sec.AddValue("ShowInLegend", ShowInLegend, true);
 | 
						||
            sec.AddValue("ShowInParentLegend", ShowInParentLegend, true);
 | 
						||
            sec.AddValue("ShowMarkerInLegend", ShowMarkerInLegend, true);
 | 
						||
 | 
						||
            sec.AddElement(base.GetSerialData(false));
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddEndElement("SeriesPoint");
 | 
						||
 | 
						||
            return (sec);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PutSerialData
 | 
						||
 | 
						||
        #region ProcessValue
 | 
						||
 | 
						||
        internal override void ProcessValue(SerialElement se)
 | 
						||
        {
 | 
						||
            switch (se.Name)
 | 
						||
            {
 | 
						||
                case "AllowDetach":
 | 
						||
                    AllowDetach = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "AllowSelect":
 | 
						||
                    AllowSelect = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "DetachedOffset":
 | 
						||
                    DetachedOffset = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "InnerSliceLabel":
 | 
						||
                    InnerSliceLabel = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "IsDetached":
 | 
						||
                    IsDetached = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "IsInOther":
 | 
						||
                    IsInOther = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "IsSelected":
 | 
						||
                    IsSelected = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "Name":
 | 
						||
                    Name = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "OuterSliceLabel":
 | 
						||
                    OuterSliceLabel = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "StartAngle":
 | 
						||
                    StartAngle = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SweepAngle":
 | 
						||
                    SweepAngle = double.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "CheckedInLegend":
 | 
						||
                    CheckedInLegend = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "LegendText":
 | 
						||
                    LegendText = se.StringValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ShowCheckBoxInLegend":
 | 
						||
                    ShowCheckBoxInLegend = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ShowInLegend":
 | 
						||
                    ShowInLegend = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ShowInParentLegend":
 | 
						||
                    ShowInParentLegend = bool.Parse(se.StringValue);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ShowMarkerInLegend":
 | 
						||
                    ShowMarkerInLegend = bool.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 "SeriesPoints":
 | 
						||
                    if (se.ArrayCount > 0)
 | 
						||
                    {
 | 
						||
                        SeriesPoints = new PieSeriesPointCollection();
 | 
						||
 | 
						||
                        sec.PutSerialData(this);
 | 
						||
                    }
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SeriesPoint":
 | 
						||
                    PieSeriesPoint sp = new PieSeriesPoint();
 | 
						||
 | 
						||
                    sec.PutSerialData(sp);
 | 
						||
 | 
						||
                    SeriesPoints.Add(sp);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceVisualLayout":
 | 
						||
                    sec.PutSerialData(SubSliceVisualLayout);
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "SliceVisualStyles":
 | 
						||
                    se.Sec.PutSerialData(SliceVisualStyles);
 | 
						||
                    break;
 | 
						||
 | 
						||
                default:
 | 
						||
                    base.ProcessCollection(se);
 | 
						||
                    break;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region INotifyPropertyChanged Members
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Occurs when property value has changed.
 | 
						||
        /// </summary>
 | 
						||
        public event PropertyChangedEventHandler PropertyChanged;
 | 
						||
 | 
						||
        #region OnPropertyChanged
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Raises the PropertyChanged event.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="e">Event arguments</param>
 | 
						||
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                PropertyChanged(this, e);
 | 
						||
 | 
						||
            VisualPropertyChangedEventArgs vce = e as VisualPropertyChangedEventArgs;
 | 
						||
 | 
						||
            if (vce != null)
 | 
						||
                NotifyVisualParent(this, vce.ChangeType);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Default PropertyChanged processing
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="s"></param>
 | 
						||
        protected void OnPropertyChanged(string s)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                OnPropertyChanged(new PropertyChangedEventArgs(s));
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Default PropertyChanged processing
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="s"></param>
 | 
						||
        /// <param name="changeType">invalidate</param>
 | 
						||
        protected void OnPropertyChangedEx(string s, VisualChangeType changeType)
 | 
						||
        {
 | 
						||
            if (PropertyChanged != null)
 | 
						||
                OnPropertyChanged(new VisualPropertyChangedEventArgs(s, changeType));
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region NotifyVisualParent
 | 
						||
 | 
						||
        internal void NotifyVisualParent(object sender, VisualChangeType vct)
 | 
						||
        {
 | 
						||
            ChartVisualElement cve = GetParentCve(sender);
 | 
						||
 | 
						||
            if (cve != null)
 | 
						||
            {
 | 
						||
                if (vct == VisualChangeType.Recalc)
 | 
						||
                {
 | 
						||
                    cve.InvalidateRecalc();
 | 
						||
                    cve.InvalidateLayout();
 | 
						||
                }
 | 
						||
                else if (vct == VisualChangeType.Layout)
 | 
						||
                {
 | 
						||
                    cve.InvalidateLayout();
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    PieSeriesPoint psp = (PieSeriesPoint)sender;
 | 
						||
 | 
						||
                    cve.InvalidateRender(psp.PathBounds);
 | 
						||
 | 
						||
                    if (psp.PieLabel != null)
 | 
						||
                    {
 | 
						||
                        if (psp.PieLabel.Bounds.IsEmpty == false)
 | 
						||
                        {
 | 
						||
                            cve.InvalidateRender(psp.PieLabel.Bounds);
 | 
						||
 | 
						||
                            if (psp.PieLabel.ConnectorBounds.IsEmpty == false)
 | 
						||
                                cve.InvalidateRender(psp.PieLabel.ConnectorBounds);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region GetParentCve
 | 
						||
 | 
						||
        private ChartVisualElement GetParentCve(object sender)
 | 
						||
        {
 | 
						||
            object parent = sender;
 | 
						||
 | 
						||
            while (parent != null)
 | 
						||
            {
 | 
						||
                if (parent is ChartVisualElement)
 | 
						||
                    break;
 | 
						||
 | 
						||
                if (parent is PieSeriesPoint)
 | 
						||
                    parent = ((PieSeriesPoint)parent).Parent;
 | 
						||
 | 
						||
                else if (parent is PieSeriesPointCollection)
 | 
						||
                    parent = ((PieSeriesPointCollection)parent).Parent;
 | 
						||
 | 
						||
                else
 | 
						||
                    parent = null;
 | 
						||
            }
 | 
						||
 | 
						||
            return ((ChartVisualElement)parent);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InvalidateRender
 | 
						||
 | 
						||
        public void InvalidateRender()
 | 
						||
        {
 | 
						||
            ChartVisualElement cve = GetParentCve(Parent);
 | 
						||
 | 
						||
            if (cve != null)
 | 
						||
            {
 | 
						||
                cve.InvalidateRender(PathBounds);
 | 
						||
 | 
						||
                if (PieLabel != null)
 | 
						||
                {
 | 
						||
                    if (PieLabel.Bounds.IsEmpty == false)
 | 
						||
                    {
 | 
						||
                        cve.InvalidateRender(PieLabel.Bounds);
 | 
						||
 | 
						||
                        if (PieLabel.ConnectorBounds.IsEmpty == false)
 | 
						||
                            cve.InvalidateRender(PieLabel.ConnectorBounds);
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IDispose
 | 
						||
 | 
						||
        public override void Dispose()
 | 
						||
        {
 | 
						||
            SubSliceVisualLayout = null;
 | 
						||
            SliceVisualStyles = null;
 | 
						||
 | 
						||
 	        base.Dispose();
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
    }
 | 
						||
 | 
						||
    #endregion
 | 
						||
 | 
						||
    [Editor("DevComponents.Charts.Design.SeriesPointCollectionEditor, DevComponents.Charts.Design, " +
 | 
						||
        "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
    public class SeriesPointCollection : CustomCollection<SeriesPoint>
 | 
						||
    {
 | 
						||
    }
 | 
						||
 | 
						||
    #region SeriesPoint
 | 
						||
 | 
						||
    [DesignTimeVisible(false), ToolboxItem(false)]
 | 
						||
    public class SeriesPoint : IProcessSerialElement, IDisposable
 | 
						||
    {
 | 
						||
        #region Private variables
 | 
						||
 | 
						||
        private object _ValueX;
 | 
						||
        private object[] _ValueY;
 | 
						||
 | 
						||
        private Point[] _Point;
 | 
						||
        private int _SeriesValidationCount;
 | 
						||
 | 
						||
        private Size _PointSize;
 | 
						||
 | 
						||
        private States _States;
 | 
						||
 | 
						||
        private object _DataItem;
 | 
						||
        private object _Tag;
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Constructors
 | 
						||
 | 
						||
        public SeriesPoint()
 | 
						||
            : this(0, 0)
 | 
						||
        {
 | 
						||
        }
 | 
						||
 | 
						||
        public SeriesPoint(object xValue)
 | 
						||
        {
 | 
						||
            _Point = new Point[1];
 | 
						||
 | 
						||
            ValueX = xValue;
 | 
						||
 | 
						||
            InitDefaultStates();
 | 
						||
        }
 | 
						||
 | 
						||
        public SeriesPoint(object xValue, object yValue)
 | 
						||
        {
 | 
						||
            _ValueY = new object[1];
 | 
						||
            _Point = new Point[1];
 | 
						||
 | 
						||
            ValueX = xValue;
 | 
						||
 | 
						||
            _ValueY[0] = yValue;
 | 
						||
 | 
						||
            InitDefaultStates();
 | 
						||
        }
 | 
						||
 | 
						||
        public SeriesPoint(object xValue, object yValue, object size)
 | 
						||
        {
 | 
						||
            _ValueY = new object[2];
 | 
						||
            _Point = new Point[1];
 | 
						||
 | 
						||
            ValueX = xValue;
 | 
						||
 | 
						||
            _ValueY[0] = yValue;
 | 
						||
            _ValueY[1] = size;
 | 
						||
 | 
						||
            InitDefaultStates();
 | 
						||
        }
 | 
						||
 | 
						||
        public SeriesPoint(object xValue, object yValue, object size, object intensity)
 | 
						||
        {
 | 
						||
            _ValueY = new object[3];
 | 
						||
            _Point = new Point[1];
 | 
						||
 | 
						||
            ValueX = xValue;
 | 
						||
 | 
						||
            _ValueY[0] = yValue;
 | 
						||
            _ValueY[1] = size;
 | 
						||
            _ValueY[2] = intensity;
 | 
						||
 | 
						||
            InitDefaultStates();
 | 
						||
        }
 | 
						||
 | 
						||
        public SeriesPoint(object xValue, object[] yValue)
 | 
						||
        {
 | 
						||
            _ValueY = new object[yValue.Length];
 | 
						||
            _Point = new Point[yValue.Length];
 | 
						||
 | 
						||
            ValueX = xValue;
 | 
						||
 | 
						||
            for (int i = 0; i < yValue.Length; i++)
 | 
						||
            {
 | 
						||
                _ValueY[i] = yValue[i];
 | 
						||
 | 
						||
                if (i > 0)
 | 
						||
                {
 | 
						||
                    if (IsQuantitativeYValue != IsQuantitativeValue(yValue[i]))
 | 
						||
                        throw new ArgumentException("Cannot have mixed qualitative/quantitative yValues");
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            InitDefaultStates();
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InitDefaultStates
 | 
						||
 | 
						||
        private void InitDefaultStates()
 | 
						||
        {
 | 
						||
            SetState(States.Visible, true);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Public properties
 | 
						||
 | 
						||
        #region DataItem
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets the object to which the Point is bound.
 | 
						||
        ///</summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public object DataItem
 | 
						||
        {
 | 
						||
            get { return (_DataItem); }
 | 
						||
            internal set { _DataItem = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsEmpty
 | 
						||
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsEmpty
 | 
						||
        {
 | 
						||
            get { return (IsEmptyPoint || IsEmptyValue); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsEmptyPoint
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the point is an 'Empty' (or missing) Point.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(false)]
 | 
						||
        public virtual bool IsEmptyPoint
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsEmptyPoint)); }
 | 
						||
            set { SetState(States.IsEmptyPoint, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsEmptyValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the point is an 'Empty' value.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsEmptyValue
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsEmptyValue)); }
 | 
						||
            internal set { SetState(States.IsEmptyValue, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQualitativeXValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the X Value is a Qualitative value.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsQualitativeXValue
 | 
						||
        {
 | 
						||
            get { return (TestState(States.IsQualitativeXValue)); }
 | 
						||
            internal set { SetState(States.IsQualitativeXValue, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQualitativeYValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the Y Values are a Qualitative values.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsQualitativeYValue
 | 
						||
        {
 | 
						||
            get { return (IsQuantitativeYValue == false); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQuantitativeXValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the X Value is a Quantitative value.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsQuantitativeXValue
 | 
						||
        {
 | 
						||
            get { return (!IsQualitativeXValue); }
 | 
						||
            internal set { IsQualitativeXValue = !value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQuantitativeYValue
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets whether the Y Values are Quantitative values.
 | 
						||
        /// </summary>
 | 
						||
        [Browsable(false)]
 | 
						||
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						||
        public bool IsQuantitativeYValue
 | 
						||
        {
 | 
						||
            get
 | 
						||
            {
 | 
						||
                if (_ValueY != null && _ValueY.Length > 0)
 | 
						||
                    return (IsQuantitativeValue(_ValueY[0]));
 | 
						||
 | 
						||
                return (true);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Tag
 | 
						||
 | 
						||
        ///<summary>
 | 
						||
        /// Gets or sets user-defined data associated with the point
 | 
						||
        ///</summary>
 | 
						||
        [DefaultValue(null)]
 | 
						||
        [Description("Indicates the user-defined data associated with the point.")]
 | 
						||
        [TypeConverter("DevComponents.Charts.Design.PointValueConverter, DevComponents.Charts.Design," +
 | 
						||
            "Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
 | 
						||
        public object Tag
 | 
						||
        {
 | 
						||
            get { return (_Tag); }
 | 
						||
            set { _Tag = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #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;
 | 
						||
 | 
						||
                IsQuantitativeXValue = IsQuantitativeValue(value);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ValueY
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets the Y-Axis Values.
 | 
						||
        /// </summary>
 | 
						||
        [Category("Data")]
 | 
						||
        [Description("Indicates the Y-Axis Values.")]
 | 
						||
        [Editor("DevComponents.Charts.Design.SeriesPointValueEditor, DevComponents.Charts.Design, " +
 | 
						||
                "Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
 | 
						||
        public object[] ValueY
 | 
						||
        {
 | 
						||
            get { return (_ValueY); }
 | 
						||
            set { _ValueY = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Visible
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Gets or sets whether the point is Visible.
 | 
						||
        /// </summary>
 | 
						||
        [DefaultValue(true)]
 | 
						||
        public virtual bool Visible
 | 
						||
        {
 | 
						||
            get { return (TestState(States.Visible)); }
 | 
						||
            set { SetState(States.Visible, value); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Internal properties
 | 
						||
 | 
						||
        #region Point
 | 
						||
 | 
						||
        internal Point[] Point
 | 
						||
        {
 | 
						||
            get { return (_Point); }
 | 
						||
            set { _Point = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PointSize
 | 
						||
 | 
						||
        internal Size PointSize
 | 
						||
        {
 | 
						||
            get { return (_PointSize); }
 | 
						||
            set { _PointSize = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region SeriesValidationCount
 | 
						||
 | 
						||
        internal int SeriesValidationCount
 | 
						||
        {
 | 
						||
            get { return (_SeriesValidationCount); }
 | 
						||
            set { _SeriesValidationCount = value; }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region InvalidatePoints
 | 
						||
 | 
						||
        internal void InvalidatePoints()
 | 
						||
        {
 | 
						||
            if (_Point != null)
 | 
						||
                _Point = new Point[_Point.Length];
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQuantitativeValue
 | 
						||
 | 
						||
        private bool IsQuantitativeValue(object value)
 | 
						||
        {
 | 
						||
            if (value is string || value is bool || value is char)
 | 
						||
                return (false);
 | 
						||
 | 
						||
            return (true);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IsQualitativeValue
 | 
						||
 | 
						||
        private bool IsQualitativeValue(object value)
 | 
						||
        {
 | 
						||
            return (IsQuantitativeValue(value) == false);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetScaleType
 | 
						||
 | 
						||
        public static ScaleType GetScaleType(Type dataType)
 | 
						||
        {
 | 
						||
            if (dataType == typeof(DateTime))
 | 
						||
                return (ScaleType.DateTime);
 | 
						||
 | 
						||
            if (dataType == typeof(string) || dataType == typeof(bool) || dataType == typeof(char))
 | 
						||
                return (ScaleType.Qualitative);
 | 
						||
 | 
						||
            return (ScaleType.Quantitative);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region Copy/CopyTo
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Creates a copy of the SeriesPoint
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public SeriesPoint Copy()
 | 
						||
        {
 | 
						||
            SeriesPoint copy = new SeriesPoint(ValueX);
 | 
						||
 | 
						||
            CopyTo(copy);
 | 
						||
 | 
						||
            return (copy);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// Copies the item data to the given SeriesPoint.
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sp"></param>
 | 
						||
        public void CopyTo(SeriesPoint sp)
 | 
						||
        {
 | 
						||
            sp.IsEmptyPoint = IsEmptyPoint;
 | 
						||
            sp.Tag = Tag;
 | 
						||
 | 
						||
            sp.ValueX = ValueX;
 | 
						||
 | 
						||
            if (ValueY != null)
 | 
						||
            {
 | 
						||
                sp.ValueY = new object[ValueY.Length];
 | 
						||
                sp.Point = new Point[ValueY.Length];
 | 
						||
 | 
						||
                for (int i = 0; i < ValueY.Length; i++)
 | 
						||
                    sp.ValueY[i] = ValueY[i];
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GetSerialData
 | 
						||
 | 
						||
        internal virtual SerialElementCollection GetSerialData()
 | 
						||
        {
 | 
						||
            return (GetSerialData(true));
 | 
						||
        }
 | 
						||
 | 
						||
        internal virtual SerialElementCollection GetSerialData(bool root)
 | 
						||
        {
 | 
						||
            SerialElementCollection sec = new SerialElementCollection();
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddStartElement("SeriesPoint");
 | 
						||
 | 
						||
            sec.AddDataValue("Tag", Tag, null);
 | 
						||
            sec.AddDataValue("ValueX", ValueX);
 | 
						||
 | 
						||
            if (ValueY != null)
 | 
						||
            {
 | 
						||
                if (ValueY.Length == 1)
 | 
						||
                {
 | 
						||
                    sec.AddDataValue("ValueY0", ValueY[0]);
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    sec.AddStartElement("ValueYs count=\"" + ValueY.Length + "\"");
 | 
						||
 | 
						||
                    for (int i = 0; i < ValueY.Length; i++)
 | 
						||
                        sec.AddDataValue("ValueY", ValueY[i]);
 | 
						||
 | 
						||
                    sec.AddEndElement("ValueYs");
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            if (root == true)
 | 
						||
                sec.AddEndElement("SeriesPoint");
 | 
						||
 | 
						||
            return (sec);
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region PutSerialData
 | 
						||
 | 
						||
        #region ProcessValue
 | 
						||
 | 
						||
        void IProcessSerialElement.ProcessValue(SerialElement se)
 | 
						||
        {
 | 
						||
            ProcessValue(se);
 | 
						||
        }
 | 
						||
 | 
						||
        internal virtual void ProcessValue(SerialElement se)
 | 
						||
        {
 | 
						||
            switch (se.Name)
 | 
						||
            {
 | 
						||
                case "Tag":
 | 
						||
                    Tag = se.DataValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ValueX":
 | 
						||
                    ValueX = se.DataValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ValueY":
 | 
						||
                    ValueY[se.ValueIndex] = se.DataValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                case "ValueY0":
 | 
						||
                    ValueY = new object[1];
 | 
						||
                    ValueY[0] = se.DataValue;
 | 
						||
                    break;
 | 
						||
 | 
						||
                default:
 | 
						||
                    throw new Exception("Unknown Serial Value (" + se.Name + ")");
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region ProcessCollection
 | 
						||
 | 
						||
        void IProcessSerialElement.ProcessCollection(SerialElement se)
 | 
						||
        {
 | 
						||
            ProcessCollection(se);
 | 
						||
        }
 | 
						||
 | 
						||
        internal virtual void ProcessCollection(SerialElement se)
 | 
						||
        {
 | 
						||
            switch (se.Name)
 | 
						||
            {
 | 
						||
                case "ValueYs":
 | 
						||
                    if (se.ArrayCount > 0)
 | 
						||
                    {
 | 
						||
                        ValueY = new object[se.ArrayCount];
 | 
						||
 | 
						||
                        se.Sec.PutSerialData(this);
 | 
						||
                    }
 | 
						||
                    break;
 | 
						||
 | 
						||
                default:
 | 
						||
                    throw new Exception("Unknown Serial Collection (" + se.Name + ")");
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region States
 | 
						||
 | 
						||
        [Flags]
 | 
						||
        private enum States : uint
 | 
						||
        {
 | 
						||
            IsQualitativeXValue = (1U << 0),
 | 
						||
            IsQualitativeYValue = (1U << 1),
 | 
						||
 | 
						||
            IsEmptyPoint = (1U << 2),
 | 
						||
            IsEmptyValue = (1U << 3),
 | 
						||
 | 
						||
            Visible = (1U << 4),
 | 
						||
        }
 | 
						||
 | 
						||
        #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 ToString
 | 
						||
 | 
						||
        public override string ToString()
 | 
						||
        {
 | 
						||
            StringBuilder sb = new StringBuilder();
 | 
						||
 | 
						||
            sb.Append("SeriesPoint (");
 | 
						||
            sb.Append(FormatToStringValue(ValueX));
 | 
						||
            sb.Append(",");
 | 
						||
 | 
						||
            if (ValueY != null && ValueY.Length > 0)
 | 
						||
            {
 | 
						||
                if (ValueY.Length > 1)
 | 
						||
                    sb.Append("[");
 | 
						||
 | 
						||
                foreach (object value in ValueY)
 | 
						||
                {
 | 
						||
                    sb.Append(FormatToStringValue(value));
 | 
						||
                    sb.Append(",");
 | 
						||
                }
 | 
						||
 | 
						||
                sb.Length--;
 | 
						||
 | 
						||
                if (ValueY.Length > 1)
 | 
						||
                    sb.Append("]");
 | 
						||
            }
 | 
						||
 | 
						||
            sb.Append(")");
 | 
						||
 | 
						||
            return (sb.ToString());
 | 
						||
        }
 | 
						||
 | 
						||
        #region FormatToStringValue
 | 
						||
 | 
						||
        private string FormatToStringValue(object value)
 | 
						||
        {
 | 
						||
            if (value == null)
 | 
						||
                return ("<null>");
 | 
						||
 | 
						||
            if (value is string)
 | 
						||
                return ("\"" + value + "\"");
 | 
						||
 | 
						||
            if (value is int)
 | 
						||
                return (value.ToString());
 | 
						||
 | 
						||
            if (value is DateTime)
 | 
						||
                return (value.ToString());
 | 
						||
 | 
						||
            return (String.Format("{0:0.0###############}", value));
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #endregion
 | 
						||
    
 | 
						||
        #region IDispose
 | 
						||
 | 
						||
        public virtual void Dispose()
 | 
						||
        {
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
}
 | 
						||
 | 
						||
    #region PointValueConvertor
 | 
						||
 | 
						||
    ///<summary>
 | 
						||
    /// PointValueConvertor
 | 
						||
    ///</summary>
 | 
						||
    public class PointValueConvertor : BlankExpandableObjectConverter
 | 
						||
    {
 | 
						||
        public override object ConvertTo(
 | 
						||
            ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
 | 
						||
        {
 | 
						||
            if (destinationType == typeof(string))
 | 
						||
            {
 | 
						||
                if (value == null)
 | 
						||
                    return ("<null>");
 | 
						||
 | 
						||
                if (value is string)
 | 
						||
                    return ("\"" + value + "\"");
 | 
						||
 | 
						||
                if (value is int)
 | 
						||
                    return (value.ToString());
 | 
						||
 | 
						||
                if (value is DateTime)
 | 
						||
                    return (value.ToString());
 | 
						||
 | 
						||
                return (String.Format("{0:0.0}", value));
 | 
						||
            }
 | 
						||
 | 
						||
            return (base.ConvertTo(context, culture, value, destinationType));
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    #endregion
 | 
						||
 | 
						||
    #endregion
 | 
						||
}
 |