353 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
using DevComponents.Instrumentation.Primitives;
 | 
						|
 | 
						|
namespace DevComponents.Instrumentation
 | 
						|
{
 | 
						|
    public class GaugeCustomLabelCollection : GenericCollection<GaugeCustomLabel>
 | 
						|
    {
 | 
						|
        #region ICloneable Members
 | 
						|
 | 
						|
        public override object Clone()
 | 
						|
        {
 | 
						|
            GaugeCustomLabelCollection copy = new GaugeCustomLabelCollection();
 | 
						|
 | 
						|
            CopyToItem(copy);
 | 
						|
 | 
						|
            return (copy);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CopyToItem
 | 
						|
 | 
						|
        internal void CopyToItem(GaugeCustomLabelCollection copy)
 | 
						|
        {
 | 
						|
            foreach (GaugeCustomLabel item in this)
 | 
						|
            {
 | 
						|
                GaugeCustomLabel ic = new GaugeCustomLabel();
 | 
						|
 | 
						|
                item.CopyToItem(ic);
 | 
						|
 | 
						|
                copy.Add(ic);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    public class GaugeCustomLabel : GaugeBaseLabel
 | 
						|
    {
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private string _Text;
 | 
						|
        private double _Value;
 | 
						|
 | 
						|
        private GaugeTickMarkLabel _TickMark;
 | 
						|
        private LabelPoint _LabelPoint;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        public GaugeCustomLabel()
 | 
						|
        {
 | 
						|
            _Text = "Text";
 | 
						|
            _Value = double.NaN;
 | 
						|
 | 
						|
            _TickMark = new GaugeTickMarkLabel(
 | 
						|
                Scale, GaugeTickMarkRank.Custom, GaugeMarkerStyle.Trapezoid, .09f, .14f, double.NaN);
 | 
						|
 | 
						|
            HookEvents(true);
 | 
						|
        }
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        #region Scale
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the label's associated Scale
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public override GaugeScale Scale
 | 
						|
        {
 | 
						|
            get { return (base.Scale); }
 | 
						|
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                base.Scale = value;
 | 
						|
 | 
						|
                _TickMark.Scale = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Text
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Label text
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true)]
 | 
						|
        [Category("Behavior"), DefaultValue("Text")]
 | 
						|
        [Description("Indicates the Label text.")]
 | 
						|
        public string Text
 | 
						|
        {
 | 
						|
            get { return (_Text); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != null && value.Equals(_Text) == false)
 | 
						|
                {
 | 
						|
                    _Text = value;
 | 
						|
 | 
						|
                    OnGaugeItemChanged(true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region TickMark
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the Label Tickmark definition
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true), Category("Appearance")]
 | 
						|
        [Description("Contains the Label TickMark layout properties.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public GaugeTickMarkLabel TickMark
 | 
						|
        {
 | 
						|
            get { return (_TickMark); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Value
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the Label scale value
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(true)]
 | 
						|
        [Category("Behavior"), DefaultValue(double.NaN)]
 | 
						|
        [Description("Indicates the Label scale value.")]
 | 
						|
        public double Value
 | 
						|
        {
 | 
						|
            get { return (_Value); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_Value != value)
 | 
						|
                {
 | 
						|
                    _Value = value;
 | 
						|
 | 
						|
                    OnGaugeItemChanged(true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal properties
 | 
						|
 | 
						|
        #region NeedRecalcLayout
 | 
						|
 | 
						|
        internal override bool NeedRecalcLayout
 | 
						|
        {
 | 
						|
            get { return (base.NeedRecalcLayout); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                base.NeedRecalcLayout = value;
 | 
						|
 | 
						|
                if (value == true)
 | 
						|
                    _TickMark.NeedRecalcLayout = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region HookEvents
 | 
						|
 | 
						|
        private void HookEvents(bool hook)
 | 
						|
        {
 | 
						|
            if (hook == true)
 | 
						|
            {
 | 
						|
                _TickMark.GaugeItemChanged += LabelTickMark_GaugeItemChanged;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                _TickMark.GaugeItemChanged -= LabelTickMark_GaugeItemChanged;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Event processing
 | 
						|
 | 
						|
        void LabelTickMark_GaugeItemChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            OnGaugeItemChanged(true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RecalcLayout
 | 
						|
 | 
						|
        public override void RecalcLayout()
 | 
						|
        {
 | 
						|
            if (NeedRecalcLayout == true)
 | 
						|
            {
 | 
						|
                base.RecalcLayout();
 | 
						|
 | 
						|
                if (_Value >= Scale.MinValue && _Value <= Scale.MaxValue)
 | 
						|
                {
 | 
						|
                    if (Scale is GaugeCircularScale)
 | 
						|
                        CalcCircularLabelPoint(Scale as GaugeCircularScale);
 | 
						|
 | 
						|
                    else if (Scale is GaugeLinearScale)
 | 
						|
                        CalcLinearLabelPoint(Scale as GaugeLinearScale);
 | 
						|
 | 
						|
                    _TickMark.Interval = _Value - Scale.MinValue;
 | 
						|
                    _TickMark.NeedRecalcLayout = true;
 | 
						|
 | 
						|
                    _TickMark.RecalcLayout();
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    _LabelPoint = null;
 | 
						|
                    _TickMark.TickPoint = null;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region CalcCircularLabelPoint
 | 
						|
 | 
						|
        private void CalcCircularLabelPoint(GaugeCircularScale scale)
 | 
						|
        {
 | 
						|
            double spread = scale.MaxValue - scale.MinValue;
 | 
						|
            double dpt = scale.SweepAngle / spread;
 | 
						|
            double interval = _Value - scale.MinValue;
 | 
						|
 | 
						|
            double n = interval * dpt;
 | 
						|
            
 | 
						|
            _LabelPoint = new LabelPoint();
 | 
						|
 | 
						|
            _LabelPoint.Angle = (float)(scale.StartAngle + (scale.Reversed ? scale.SweepAngle - n : n));
 | 
						|
            _LabelPoint.Point = scale.GetPoint(Radius, _LabelPoint.Angle);
 | 
						|
            _LabelPoint.Interval = interval;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CalcLinearLabelPoint
 | 
						|
 | 
						|
        private void CalcLinearLabelPoint(GaugeLinearScale scale)
 | 
						|
        {
 | 
						|
            double ticks = scale.MaxValue - scale.MinValue;
 | 
						|
 | 
						|
            _LabelPoint = new LabelPoint();
 | 
						|
 | 
						|
            if (scale.Orientation == Orientation.Horizontal)
 | 
						|
            {
 | 
						|
                double dpt = scale.ScaleBounds.Width / ticks;
 | 
						|
                int dx = (int)((_Value - Scale.MinValue) * dpt);
 | 
						|
 | 
						|
                int x = (scale.Reversed == true)
 | 
						|
                    ? Scale.Bounds.Right - dx : Scale.Bounds.X + dx;
 | 
						|
 | 
						|
                _LabelPoint.Point = new Point(x, scale.ScaleBounds.Y + Offset);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                double dpt = scale.ScaleBounds.Height / ticks;
 | 
						|
                int dy = (int)((_Value - Scale.MinValue) * dpt);
 | 
						|
 | 
						|
                int y = (scale.Reversed == true)
 | 
						|
                    ? Scale.Bounds.Top + dy : Scale.Bounds.Bottom - dy;
 | 
						|
 | 
						|
                _LabelPoint.Point = new Point(scale.ScaleBounds.X + Offset, y);
 | 
						|
            }
 | 
						|
 | 
						|
            _LabelPoint.Interval = _Value;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnPaint
 | 
						|
 | 
						|
        public override void OnPaint(PaintEventArgs e)
 | 
						|
        {
 | 
						|
            Graphics g = e.Graphics;
 | 
						|
 | 
						|
            RecalcLayout();
 | 
						|
 | 
						|
            if (_LabelPoint != null)
 | 
						|
            {
 | 
						|
                if (_LabelPoint.Visible == true)
 | 
						|
                {
 | 
						|
                    if (Scale.GaugeControl.OnPreRenderScaleCustomLabel(e, this) == false)
 | 
						|
                    {
 | 
						|
                        using (Brush br = new SolidBrush(Layout.ForeColor))
 | 
						|
                            PaintLabel(g, _Text, br, _LabelPoint, AbsFont);
 | 
						|
 | 
						|
                        Scale.GaugeControl.OnPostRenderScaleCustomLabel(e, this);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnDispose
 | 
						|
 | 
						|
        protected override void OnDispose()
 | 
						|
        {
 | 
						|
            HookEvents(false);
 | 
						|
 | 
						|
            base.OnDispose();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ICloneable Members
 | 
						|
 | 
						|
        public override object Clone()
 | 
						|
        {
 | 
						|
            GaugeCustomLabel copy = new GaugeCustomLabel();
 | 
						|
 | 
						|
            CopyToItem(copy);
 | 
						|
 | 
						|
            return (copy);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CopyToItem
 | 
						|
 | 
						|
        public override void CopyToItem(GaugeItem copy)
 | 
						|
        {
 | 
						|
            GaugeCustomLabel c = copy as GaugeCustomLabel;
 | 
						|
 | 
						|
            if (c != null)
 | 
						|
            {
 | 
						|
                base.CopyToItem(c);
 | 
						|
 | 
						|
                c.Text = _Text;
 | 
						|
                c.Value = _Value;
 | 
						|
 | 
						|
                _TickMark.CopyToItem(c.TickMark);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |