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
 | |
|     }
 | |
| }
 |