777 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			777 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Design;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using System.Text;
 | 
						|
 | 
						|
namespace DevComponents.Instrumentation
 | 
						|
{
 | 
						|
    public class GaugeStrip : GaugeItem, IDisposable
 | 
						|
    {
 | 
						|
        #region Events
 | 
						|
 | 
						|
        [Description("Occurs when the coverage of a Strip changes.")]
 | 
						|
        public event EventHandler<EventArgs> StripCoverChanged;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private double _StartValue;
 | 
						|
        private double _EndValue;
 | 
						|
        private float _ScaleOffset;
 | 
						|
 | 
						|
        private GradientFillColor _FillColor;
 | 
						|
 | 
						|
        private Color _LabelColor;
 | 
						|
        private GradientFillColor _CapFillColor;
 | 
						|
        private GradientFillColor _PointerFillColor;
 | 
						|
        private GradientFillColor _MajorTickMarkFillColor;
 | 
						|
        private GradientFillColor _MinorTickMarkFillColor;
 | 
						|
        private GaugeScale _Scale;
 | 
						|
 | 
						|
        private float _StartAngle;
 | 
						|
        private float _SweepAngle;
 | 
						|
 | 
						|
        private double _MinValue;
 | 
						|
        private double _MaxValue;
 | 
						|
        private Rectangle _Bounds;
 | 
						|
 | 
						|
        private GraphicsPath _StripePath;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        public GaugeStrip(GaugeScale scale)
 | 
						|
            : this()
 | 
						|
        {
 | 
						|
            _Scale = scale;
 | 
						|
        }
 | 
						|
 | 
						|
        public GaugeStrip()
 | 
						|
        {
 | 
						|
            FillColor = new GradientFillColor();
 | 
						|
 | 
						|
            _StartValue = double.NaN;
 | 
						|
            _EndValue = double.NaN;
 | 
						|
        }
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        #region CapFillColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Cap Fill Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the Cap Fill Color.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GradientFillColor CapFillColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_CapFillColor == null)
 | 
						|
                {
 | 
						|
                    _CapFillColor = new GradientFillColor();
 | 
						|
                    _CapFillColor.ColorTableChanged += PointerFillColor_ColorTableChanged;
 | 
						|
                }
 | 
						|
 | 
						|
                return (_CapFillColor);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_CapFillColor != null)
 | 
						|
                    _CapFillColor.ColorTableChanged -= PointerFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                _CapFillColor = value;
 | 
						|
 | 
						|
                if (_CapFillColor != null)
 | 
						|
                    _CapFillColor.ColorTableChanged += PointerFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                OnGaugeItemChanged(true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region EndValue
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Ending value for the area
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Layout"), DefaultValue(double.NaN)]
 | 
						|
        [Description("Indicates the Ending value for the area.")]
 | 
						|
        public double EndValue
 | 
						|
        {
 | 
						|
            get { return (_EndValue); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_EndValue != value)
 | 
						|
                {
 | 
						|
                    _EndValue = value;
 | 
						|
 | 
						|
                    OnStripCoverChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region PointerFillColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Pointer Fill Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the Pointer Fill Color.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GradientFillColor PointerFillColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_PointerFillColor == null)
 | 
						|
                {
 | 
						|
                    _PointerFillColor = new GradientFillColor();
 | 
						|
                    _PointerFillColor.ColorTableChanged += PointerFillColor_ColorTableChanged;
 | 
						|
                }
 | 
						|
 | 
						|
                return (_PointerFillColor);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_PointerFillColor != null)
 | 
						|
                    _PointerFillColor.ColorTableChanged -= PointerFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                _PointerFillColor = value;
 | 
						|
 | 
						|
                if (_PointerFillColor != null)
 | 
						|
                    _PointerFillColor.ColorTableChanged += PointerFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                OnGaugeItemChanged(true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region FillColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the area Fill Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the area Fill Color.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GradientFillColor FillColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_FillColor == null)
 | 
						|
                {
 | 
						|
                    _FillColor = new GradientFillColor();
 | 
						|
                    _FillColor.ColorTableChanged += FillColor_ColorTableChanged;
 | 
						|
                }
 | 
						|
 | 
						|
                return (_FillColor);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_FillColor != null)
 | 
						|
                    _FillColor.ColorTableChanged -= FillColor_ColorTableChanged;
 | 
						|
 | 
						|
                _FillColor = value;
 | 
						|
 | 
						|
                if (_FillColor != null)
 | 
						|
                    _FillColor.ColorTableChanged += FillColor_ColorTableChanged;
 | 
						|
 | 
						|
                OnGaugeItemChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region LabelColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Section Label Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the Section Label Color.")]
 | 
						|
        public Color LabelColor
 | 
						|
        {
 | 
						|
            get { return (_LabelColor); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_LabelColor != value)
 | 
						|
                {
 | 
						|
                    _LabelColor = value;
 | 
						|
 | 
						|
                    OnGaugeItemChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        internal virtual bool ShouldSerializeLabelColor()
 | 
						|
        {
 | 
						|
            return (_LabelColor.IsEmpty == false);
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        internal virtual void ResetLabelColor()
 | 
						|
        {
 | 
						|
            LabelColor = Color.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MajorTickMarkFillColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the MajorTickMark Fill Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the MajorTickMark Fill Color.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GradientFillColor MajorTickMarkFillColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_MajorTickMarkFillColor == null)
 | 
						|
                {
 | 
						|
                    _MajorTickMarkFillColor = new GradientFillColor();
 | 
						|
                    _MajorTickMarkFillColor.ColorTableChanged += TickMarkFillColor_ColorTableChanged;
 | 
						|
                }
 | 
						|
 | 
						|
                return (_MajorTickMarkFillColor);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MajorTickMarkFillColor != null)
 | 
						|
                    _MajorTickMarkFillColor.ColorTableChanged -= TickMarkFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                _MajorTickMarkFillColor = value;
 | 
						|
 | 
						|
                if (_MajorTickMarkFillColor != null)
 | 
						|
                    _MajorTickMarkFillColor.ColorTableChanged += TickMarkFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                OnGaugeItemChanged(true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MinorTickMarkFillColor
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the MinorTickMark Fill Color
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Indicates the MinorTickMark Fill Color.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GradientFillColor MinorTickMarkFillColor
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_MinorTickMarkFillColor == null)
 | 
						|
                {
 | 
						|
                    _MinorTickMarkFillColor = new GradientFillColor();
 | 
						|
                    _MinorTickMarkFillColor.ColorTableChanged += TickMarkFillColor_ColorTableChanged;
 | 
						|
                }
 | 
						|
 | 
						|
                return (_MinorTickMarkFillColor);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MinorTickMarkFillColor != null)
 | 
						|
                    _MinorTickMarkFillColor.ColorTableChanged -= TickMarkFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                _MinorTickMarkFillColor = value;
 | 
						|
 | 
						|
                if (_MinorTickMarkFillColor != null)
 | 
						|
                    _MinorTickMarkFillColor.ColorTableChanged += TickMarkFillColor_ColorTableChanged;
 | 
						|
 | 
						|
                OnGaugeItemChanged(true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Scale
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the associated Scale
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public GaugeScale Scale
 | 
						|
        {
 | 
						|
            get { return (_Scale); }
 | 
						|
            internal set { _Scale = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ScaleOffset
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the distance from the Scale, measured as a percentage
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true)]
 | 
						|
        [Category("Layout"), DefaultValue(0f)]
 | 
						|
        [Editor("DevComponents.Instrumentation.Design.OffsetRangeValueEditor, DevComponents.Instrumentation.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=76cb4c6eb576bca5", typeof(UITypeEditor))]
 | 
						|
        [Description("Indicates the distance from the Scale, measured as a percentage.")]
 | 
						|
        public float ScaleOffset
 | 
						|
        {
 | 
						|
            get { return (_ScaleOffset); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_ScaleOffset != value)
 | 
						|
                {
 | 
						|
                    if (value < -1 || value > 1)
 | 
						|
                        throw new ArgumentException("Scale Offset must be bwtween -1 and +1");
 | 
						|
 | 
						|
                    _ScaleOffset = value;
 | 
						|
 | 
						|
                    OnGaugeItemChanged(true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region StartValue
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Starting value for the area
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Layout"), DefaultValue(double.NaN)]
 | 
						|
        [Description("Indicates the Starting value for the area.")]
 | 
						|
        public double StartValue
 | 
						|
        {
 | 
						|
            get { return (_StartValue); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_StartValue != value)
 | 
						|
                {
 | 
						|
                    _StartValue = value;
 | 
						|
 | 
						|
                    OnStripCoverChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnStripCoverChanged()
 | 
						|
        {
 | 
						|
            if (StripCoverChanged != null)
 | 
						|
                StripCoverChanged(this, EventArgs.Empty);
 | 
						|
 | 
						|
            OnGaugeItemChanged(true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Visible
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the item Visibility state.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance"), DefaultValue(true)]
 | 
						|
        [Description("Indicates the item Visibility state.")]
 | 
						|
        [ParenthesizePropertyName(true)]
 | 
						|
        public override bool Visible
 | 
						|
        {
 | 
						|
            get { return (base.Visible); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (base.Visible != value)
 | 
						|
                {
 | 
						|
                    base.Visible = value;
 | 
						|
 | 
						|
                    OnStripCoverChanged();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal properties
 | 
						|
 | 
						|
        #region Bounds
 | 
						|
 | 
						|
        internal Rectangle Bounds
 | 
						|
        {
 | 
						|
            get { return (_Bounds); }
 | 
						|
            set { _Bounds = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HasCapFillColor
 | 
						|
 | 
						|
        internal bool HasCapFillColor
 | 
						|
        {
 | 
						|
            get { return (_CapFillColor != null && _CapFillColor.IsEmpty == false); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HasMajorTickMarkFillColor
 | 
						|
 | 
						|
        internal bool HasMajorTickMarkFillColor
 | 
						|
        {
 | 
						|
            get { return (_MajorTickMarkFillColor != null &&
 | 
						|
                _MajorTickMarkFillColor.IsEmpty == false); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HasMinorTickMarkFillColor
 | 
						|
 | 
						|
        internal bool HasMinorTickMarkFillColor
 | 
						|
        {
 | 
						|
            get { return (_MinorTickMarkFillColor != null && _MinorTickMarkFillColor.IsEmpty == false); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HasPointerFillColor
 | 
						|
 | 
						|
        internal bool HasPointerFillColor
 | 
						|
        {
 | 
						|
            get { return (_PointerFillColor != null && _PointerFillColor.IsEmpty == false); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MaxValue
 | 
						|
 | 
						|
        internal double MaxValue
 | 
						|
        {
 | 
						|
            get { return (_MaxValue); }
 | 
						|
            set { _MaxValue = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MinValue
 | 
						|
 | 
						|
        internal double MinValue
 | 
						|
        {
 | 
						|
            get { return (_MinValue); }
 | 
						|
            set { _MinValue = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region StartAngle
 | 
						|
 | 
						|
        internal float StartAngle
 | 
						|
        {
 | 
						|
            get { return (_StartAngle); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region StripePath
 | 
						|
 | 
						|
        internal GraphicsPath StripePath
 | 
						|
        {
 | 
						|
            get { return (_StripePath); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_StripePath != value)
 | 
						|
                {
 | 
						|
                    if (_StripePath != null)
 | 
						|
                        _StripePath.Dispose();
 | 
						|
 | 
						|
                    _StripePath = value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region SweepAngle
 | 
						|
 | 
						|
        internal float SweepAngle
 | 
						|
        {
 | 
						|
            get { return (_SweepAngle); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Event processing
 | 
						|
 | 
						|
        void FillColor_ColorTableChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            OnGaugeItemChanged(true);
 | 
						|
        }
 | 
						|
 | 
						|
        void TickMarkFillColor_ColorTableChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            OnGaugeItemChanged(true);
 | 
						|
        }
 | 
						|
 | 
						|
        void PointerFillColor_ColorTableChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            OnGaugeItemChanged(true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RecalcLayout
 | 
						|
 | 
						|
        public override void RecalcLayout()
 | 
						|
        {
 | 
						|
            if (NeedRecalcLayout == true)
 | 
						|
            {
 | 
						|
                base.RecalcLayout();
 | 
						|
 | 
						|
                CalcStripMetrics();
 | 
						|
 | 
						|
                _Scale.NeedTickMarkRecalcLayout = true;
 | 
						|
                _Scale.NeedPointerRecalcLayout = true;
 | 
						|
 | 
						|
                StripePath = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region CalcStripMetrics
 | 
						|
 | 
						|
        private void CalcStripMetrics()
 | 
						|
        {
 | 
						|
            _MinValue = (_StartValue.Equals(double.NaN) ? _Scale.MinValue : _StartValue);
 | 
						|
            _MaxValue = (_EndValue.Equals(double.NaN) ? _Scale.MaxValue : _EndValue);
 | 
						|
 | 
						|
            if (_MinValue > _Scale.MaxValue)
 | 
						|
                _MinValue = _Scale.MaxValue;
 | 
						|
 | 
						|
            _MinValue -= _Scale.MinValue;
 | 
						|
 | 
						|
            if (_MinValue < 0)
 | 
						|
                _MinValue = 0;
 | 
						|
 | 
						|
            if (_MaxValue < _Scale.MinValue)
 | 
						|
                _MaxValue = _Scale.MinValue;
 | 
						|
 | 
						|
            _MaxValue -= _Scale.MinValue;
 | 
						|
 | 
						|
            if (_MaxValue > _Scale.MaxValue - _Scale.MinValue)
 | 
						|
                _MaxValue = _Scale.MaxValue - _Scale.MinValue;
 | 
						|
 | 
						|
            if (Scale is GaugeCircularScale)
 | 
						|
                CalcCircularMetrics(Scale as GaugeCircularScale);
 | 
						|
        }
 | 
						|
 | 
						|
        #region CalcCircularMetrics
 | 
						|
 | 
						|
        private void CalcCircularMetrics(GaugeCircularScale scale)
 | 
						|
        {
 | 
						|
            float spread = (float)Math.Abs(scale.MaxValue - scale.MinValue);
 | 
						|
 | 
						|
            if (spread == 0)
 | 
						|
                spread = 1;
 | 
						|
 | 
						|
            float dv = scale.SweepAngle / spread;
 | 
						|
 | 
						|
            _StartAngle = (float)(dv * _MinValue) + scale.StartAngle;
 | 
						|
            _SweepAngle = (float)(dv * (_MaxValue - _MinValue));
 | 
						|
 | 
						|
            if (scale.Reversed == true)
 | 
						|
            {
 | 
						|
                _StartAngle = (scale.StartAngle + scale.SweepAngle) - (_StartAngle - scale.StartAngle);
 | 
						|
                _SweepAngle = -_SweepAngle;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetPoint
 | 
						|
 | 
						|
        protected PointF GetPoint(float radius, float angle)
 | 
						|
        {
 | 
						|
            PointF pt = new PointF();
 | 
						|
 | 
						|
            // Normalize the angle and calculate some
 | 
						|
            // working vars
 | 
						|
 | 
						|
            if (angle < 0)
 | 
						|
                angle += 360;
 | 
						|
 | 
						|
            angle = angle % 360;
 | 
						|
 | 
						|
            // Determine the angle quadrant, and then calculate
 | 
						|
            // the intersecting coordinate accordingly
 | 
						|
 | 
						|
            double radians = GetRadians(angle % 90);
 | 
						|
 | 
						|
            if (angle < 90)
 | 
						|
            {
 | 
						|
                pt.X = (float)(Math.Cos(radians) * radius);
 | 
						|
                pt.Y = (float)(Math.Sin(radians) * radius);
 | 
						|
            }
 | 
						|
            else if (angle < 180)
 | 
						|
            {
 | 
						|
                pt.X = -(float)(Math.Sin(radians) * radius);
 | 
						|
                pt.Y = (float)(Math.Cos(radians) * radius);
 | 
						|
            }
 | 
						|
            else if (angle < 270)
 | 
						|
            {
 | 
						|
                pt.X = -(float)(Math.Cos(radians) * radius);
 | 
						|
                pt.Y = -(float)(Math.Sin(radians) * radius);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                pt.X = (float)(Math.Sin(radians) * radius);
 | 
						|
                pt.Y = -(float)(Math.Cos(radians) * radius);
 | 
						|
            }
 | 
						|
 | 
						|
            pt.X += _Scale.Center.X;
 | 
						|
            pt.Y += _Scale.Center.Y;
 | 
						|
 | 
						|
            return (pt);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetRadians
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Converts Degrees to Radians
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="theta">Degrees</param>
 | 
						|
        /// <returns>Radians</returns>
 | 
						|
        protected double GetRadians(float theta)
 | 
						|
        {
 | 
						|
            return (theta * Math.PI / 180);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ValueInRange
 | 
						|
 | 
						|
        internal bool ValueInRange(double value)
 | 
						|
        {
 | 
						|
            RecalcLayout();
 | 
						|
 | 
						|
            double startValue = (_StartValue.Equals(double.NaN) ? MinValue : _StartValue);
 | 
						|
            double endValue = (_EndValue.Equals(double.NaN) ? MaxValue : _EndValue);
 | 
						|
 | 
						|
            if (startValue > endValue)
 | 
						|
            {
 | 
						|
                double temp = startValue;
 | 
						|
                startValue = endValue;
 | 
						|
                endValue = temp;
 | 
						|
            }
 | 
						|
 | 
						|
            return (value >= startValue && value <= endValue);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ProcessTemplateText
 | 
						|
 | 
						|
        protected override void ProcessTemplateText(
 | 
						|
            GaugeControl gauge, StringBuilder sb, string key, string data)
 | 
						|
        {
 | 
						|
            switch (key)
 | 
						|
            {
 | 
						|
                case "StartValue":
 | 
						|
                    sb.Append(string.IsNullOrEmpty(data)
 | 
						|
                        ? _StartValue.ToString()
 | 
						|
                        : String.Format("{0:" + data + "}", _StartValue));
 | 
						|
                    break;
 | 
						|
 | 
						|
                case "EndValue":
 | 
						|
                    sb.Append(string.IsNullOrEmpty(data)
 | 
						|
                        ? _EndValue.ToString()
 | 
						|
                        : String.Format("{0:" + data + "}", _EndValue));
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    base.ProcessTemplateText(gauge, sb, key, data);
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDisposable Members
 | 
						|
 | 
						|
        void IDisposable.Dispose()
 | 
						|
        {
 | 
						|
            StripePath = null;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ICloneable Members
 | 
						|
 | 
						|
        public override object Clone()
 | 
						|
        {
 | 
						|
            GaugeStrip copy = new GaugeStrip();
 | 
						|
 | 
						|
            CopyToItem(copy);
 | 
						|
 | 
						|
            return (copy);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CopyToItem
 | 
						|
 | 
						|
        public override void CopyToItem(GaugeItem copy)
 | 
						|
        {
 | 
						|
            GaugeStrip c = copy as GaugeStrip;
 | 
						|
 | 
						|
            if (c != null)
 | 
						|
            {
 | 
						|
                base.CopyToItem(c);
 | 
						|
 | 
						|
                if (_CapFillColor != null)
 | 
						|
                    c.CapFillColor = (GradientFillColor)_CapFillColor.Clone();
 | 
						|
 | 
						|
                c.EndValue = _EndValue;
 | 
						|
 | 
						|
                if (_PointerFillColor != null)
 | 
						|
                    c.PointerFillColor = (GradientFillColor)_PointerFillColor.Clone();
 | 
						|
 | 
						|
                if (_FillColor != null)
 | 
						|
                    c.FillColor = (GradientFillColor)_FillColor.Clone();
 | 
						|
 | 
						|
                c.LabelColor = _LabelColor;
 | 
						|
 | 
						|
                if (_MajorTickMarkFillColor != null)
 | 
						|
                    c.MajorTickMarkFillColor = (GradientFillColor)_MajorTickMarkFillColor.Clone();
 | 
						|
 | 
						|
                if (_MinorTickMarkFillColor != null)
 | 
						|
                    c.MinorTickMarkFillColor = (GradientFillColor)_MinorTickMarkFillColor.Clone();
 | 
						|
 | 
						|
                c.ScaleOffset = _ScaleOffset;
 | 
						|
                c.StartValue = _StartValue;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |