358 lines
8.9 KiB
C#

using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using DevComponents.Instrumentation.Primitives;
namespace DevComponents.Instrumentation
{
/// <summary>
/// Collection of GaugeLinearScales
/// </summary>
public class GaugeLinearScaleCollection : GenericCollection<GaugeLinearScale>
{
}
[TypeConverter(typeof(GaugeScaleConvertor))]
public class GaugeLinearScale : GaugeScale
{
#region Private variables
private SizeF _Size;
private PointF _Location;
private Orientation _Orientation;
private Rectangle _ScaleBounds;
#endregion
public GaugeLinearScale(GaugeControl gaugeControl)
: base(gaugeControl)
{
InitGaugeScale();
}
public GaugeLinearScale()
{
InitGaugeScale();
}
#region InitGaugeScale
private void InitGaugeScale()
{
Style = GaugeScaleStyle.Linear;
_Location = new PointF(.5f, .5f);
_Size = new SizeF(.8f, .8f);
_Orientation = Orientation.Horizontal;
}
#endregion
#region Public properties
#region Location
/// <summary>
/// Gets or sets the Scale location, specified as a percentage
/// </summary>
[Browsable(true), Category("Layout")]
[Editor("DevComponents.Instrumentation.Design.LocationEditor, DevComponents.Instrumentation.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=76cb4c6eb576bca5", typeof(UITypeEditor))]
[Description("Indicates the Scale location, specified as a percentage.")]
[TypeConverter(typeof(PointFConverter))]
public PointF Location
{
get { return (_Location); }
set
{
if (_Location.Equals(value) == false)
{
_Location = value;
OnGaugeItemChanged(true);
}
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializePivotPoint()
{
return (_Location.X != .5f || _Location.Y != .5f);
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public void ResetPivotPoint()
{
_Location = new PointF(.5f, .5f);
}
#endregion
#region Orientation
/// <summary>
/// Gets or sets the Scale display orientation
/// </summary>
[Browsable(true)]
[Category("Layout"), DefaultValue(Orientation.Horizontal)]
[Description("Indicates the Scale display orientation.")]
public Orientation Orientation
{
get { return (_Orientation); }
set
{
if (_Orientation != value)
{
_Orientation = value;
OnGaugeItemChanged(true);
}
}
}
#endregion
#region ReverseScalingAxis
private bool _ReverseScalingAxis;
/// <summary>
/// Gets or sets whether linear scales are scaled
/// using the default axis or not.
/// </summary>
[Browsable(true)]
[Category("Layout"), DefaultValue(false)]
[Description("Indicates whether linear scales are scaled using the default axis or not.")]
public bool ReverseScalingAxis
{
get { return (_ReverseScalingAxis); }
set
{
if (_ReverseScalingAxis != value)
{
_ReverseScalingAxis = value;
OnGaugeItemChanged(true);
}
}
}
#endregion
#region Size
/// <summary>
/// Gets or sets the bounding size of the Scale, specified as a percentage
/// </summary>
[Browsable(true), Category("Layout")]
[Editor("DevComponents.Instrumentation.Design.SizeEditor, DevComponents.Instrumentation.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=76cb4c6eb576bca5", typeof(UITypeEditor))]
[Description("Determines the bounding size of the Scale, specified as a percentage.")]
public SizeF Size
{
get { return (_Size); }
set
{
if (_Size != value)
{
_Size = value;
OnGaugeItemChanged(true);
}
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
internal bool ShouldSerializeSize()
{
return (_Size.Width != .8f || _Size.Height != .8f);
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
internal void ResetSize()
{
_Size = new SizeF(.8f, .8f);
}
#endregion
#endregion
#region Internal properties
#region AbsLength
internal int AbsLength
{
get
{
if (_Orientation == Orientation.Horizontal)
return (Bounds.Width);
return (Bounds.Height);
}
}
#endregion
#region AbsWidth
internal int AbsWidth
{
get
{
if (_Orientation == Orientation.Horizontal)
return (_ReverseScalingAxis ? Bounds.Width : Bounds.Height);
return (_ReverseScalingAxis ? Bounds.Height : Bounds.Width);
}
}
#endregion
#region AbsScaleLength
internal int AbsScaleLength
{
get
{
if (_Orientation == Orientation.Horizontal)
return (_ScaleBounds.Width);
return (_ScaleBounds.Height);
}
}
#endregion
#region AbsScaleWidth
internal int AbsScaleWidth
{
get
{
if (_Orientation == Orientation.Horizontal)
return (_ScaleBounds.Height);
return (_ScaleBounds.Width);
}
}
#endregion
#region ScaleBounds
internal Rectangle ScaleBounds
{
get { return (_ScaleBounds); }
set { _ScaleBounds = value; }
}
#endregion
#endregion
#region RecalcLayout
public override void RecalcLayout()
{
if (NeedRecalcLayout == true)
{
base.RecalcLayout();
RecalcMetrics();
}
}
#region RecalcMetrics
private void RecalcMetrics()
{
Center = GaugeControl.GetAbsPoint(_Location, false);
Rectangle r = new Rectangle();
r.Size = GaugeControl.GetAbsSize(_Size, false);
r.Location = new Point(Center.X - r.Size.Width / 2, Center.Y - r.Size.Height / 2);
Bounds = r;
_ScaleBounds = new Rectangle();
if (Orientation == Orientation.Horizontal)
{
if (ReverseScalingAxis == true)
_ScaleBounds.Size = new Size(r.Width, (int)(r.Width * Width));
else
_ScaleBounds.Size = new Size(r.Width, (int)(r.Height * Width));
_ScaleBounds.Location = new Point(r.X, Center.Y - _ScaleBounds.Size.Height / 2);
}
else
{
if (ReverseScalingAxis == true)
_ScaleBounds.Size = new Size((int)(r.Height * Width), r.Height);
else
_ScaleBounds.Size = new Size((int)(r.Width * Width), r.Height);
_ScaleBounds.Location = new Point(Center.X - _ScaleBounds.Size.Width / 2, r.Y);
}
}
#endregion
#endregion
#region PaintBorder
protected override void PaintBorder(PaintEventArgs e)
{
if (BorderWidth > 0)
{
if (Bounds.Width > 0 && Bounds.Height > 0)
{
using (Pen pen = new Pen(BorderColor, BorderWidth))
e.Graphics.DrawRectangle(pen, _ScaleBounds);
}
}
}
#endregion
#region ICloneable Members
public override object Clone()
{
GaugeLinearScale copy = new GaugeLinearScale();
CopyToItem(copy);
return (copy);
}
#endregion
#region CopyToItem
public override void CopyToItem(GaugeItem copy)
{
GaugeLinearScale c = copy as GaugeLinearScale;
if (c != null)
{
base.CopyToItem(c);
c.Location = _Location;
c.Orientation = _Orientation;
c.Size = _Size;
}
}
#endregion
}
}