457 lines
12 KiB
C#
457 lines
12 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Drawing.Design;
|
|
using System.Globalization;
|
|
|
|
namespace DevComponents.Instrumentation
|
|
{
|
|
[TypeConverter(typeof(TickMarkLayoutConvertor))]
|
|
public class TickMarkLayout : IDisposable, ICloneable
|
|
{
|
|
#region Events
|
|
|
|
public event EventHandler<EventArgs> TickMarkLayoutChanged;
|
|
|
|
#endregion
|
|
|
|
#region Private variables
|
|
|
|
private GaugeMarkerStyle _Style;
|
|
|
|
private DisplayPlacement _Placement;
|
|
private float _ScaleOffset;
|
|
|
|
private float _Width;
|
|
private float _Length;
|
|
|
|
private GradientFillColor _FillColor;
|
|
private GaugeTickMarkOverlap _Overlap;
|
|
|
|
private Image _Image;
|
|
private Bitmap _Bitmap;
|
|
|
|
private float _DefaultWidth;
|
|
private float _DefaultLength;
|
|
private GaugeMarkerStyle _DefaultStyle;
|
|
|
|
#endregion
|
|
|
|
public TickMarkLayout()
|
|
: this(GaugeMarkerStyle.Rectangle, .045f, .09f)
|
|
{
|
|
}
|
|
|
|
public TickMarkLayout(GaugeMarkerStyle style, float width, float length)
|
|
{
|
|
_Style = style;
|
|
_Width = width;
|
|
_Length = length;
|
|
|
|
_DefaultStyle = style;
|
|
_DefaultWidth = width;
|
|
_DefaultLength = length;
|
|
|
|
_Placement = DisplayPlacement.Center;
|
|
|
|
FillColor = new GradientFillColor(Color.DarkGray, Color.White);
|
|
FillColor.BorderColor = Color.DimGray;
|
|
FillColor.BorderWidth = 1;
|
|
|
|
_Overlap = GaugeTickMarkOverlap.ReplaceAll;
|
|
}
|
|
|
|
#region Public properties
|
|
|
|
#region FillColor
|
|
|
|
/// <summary>
|
|
/// Gets or sets the TickMark Fill Color
|
|
/// </summary>
|
|
[Browsable(true), Category("Appearance")]
|
|
[Description("Indicates the TickMark Fill Color.")]
|
|
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;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal bool ShouldSerializeFillColor()
|
|
{
|
|
return (_FillColor.IsEqualTo(Color.DarkGray,
|
|
Color.White, 90, GradientFillType.Auto, Color.DimGray, 1) == false);
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal void ResetFillColor()
|
|
{
|
|
FillColor = new GradientFillColor(Color.DarkGray, Color.White);
|
|
FillColor.BorderColor = Color.DimGray;
|
|
FillColor.BorderWidth = 1;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Image
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Image to use for the TickMark
|
|
/// </summary>
|
|
[Browsable(true), Category("Appearance"), DefaultValue(null)]
|
|
[Description("Indicates the Image to use for the TickMark.")]
|
|
public Image Image
|
|
{
|
|
get { return (_Image); }
|
|
|
|
set
|
|
{
|
|
if (_Image != value)
|
|
{
|
|
_Image = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Length
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Length of the TickMark, specified as a percentage
|
|
/// </summary>
|
|
[Browsable(true), Category("Layout")]
|
|
[Editor("DevComponents.Instrumentation.Design.RangeValueEditor, DevComponents.Instrumentation.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=76cb4c6eb576bca5", typeof(UITypeEditor))]
|
|
[Description("Indicates the Length of the TickMark, specified as a percentage.")]
|
|
public float Length
|
|
{
|
|
get { return (_Length); }
|
|
|
|
set
|
|
{
|
|
if (value < 0)
|
|
throw new ArgumentException("Value can not be less than zero.");
|
|
|
|
if (_Length != value)
|
|
{
|
|
_Length = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeLength()
|
|
{
|
|
return (_Length != _DefaultLength);
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void ResetLength()
|
|
{
|
|
Length = _DefaultLength;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Placement
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Placement of the TickMarks with respect to the Scale
|
|
/// </summary>
|
|
[Browsable(true)]
|
|
[Category("Layout"), DefaultValue(DisplayPlacement.Center)]
|
|
[Description("Indicates the Placement of the TickMarks with respect to the Scale.")]
|
|
public DisplayPlacement Placement
|
|
{
|
|
get { return (_Placement); }
|
|
|
|
set
|
|
{
|
|
if (_Placement != value)
|
|
{
|
|
_Placement = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ScaleOffset
|
|
|
|
/// <summary>
|
|
/// Gets or sets the distance from the TickMark to 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 TickMark to the Scale, measured as a percentage.")]
|
|
public float ScaleOffset
|
|
{
|
|
get { return (_ScaleOffset); }
|
|
|
|
set
|
|
{
|
|
if (_ScaleOffset != value)
|
|
{
|
|
_ScaleOffset = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Style
|
|
|
|
/// <summary>
|
|
/// Gets or sets the TickMark Style
|
|
/// </summary>
|
|
[Browsable(true), Category("Appearance")]
|
|
[Description("Indicates the TickMark Style.")]
|
|
public GaugeMarkerStyle Style
|
|
{
|
|
get { return (_Style); }
|
|
|
|
set
|
|
{
|
|
if (_Style != value)
|
|
{
|
|
_Style = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeStyle()
|
|
{
|
|
return (_Style != _DefaultStyle);
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void ResetStyle()
|
|
{
|
|
Style = _DefaultStyle;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Overlap
|
|
|
|
/// <summary>
|
|
/// Gets or sets how the TickMark overlaps previous TickMarks
|
|
/// </summary>
|
|
[Browsable(true)]
|
|
[Category("Behavior"), DefaultValue(GaugeTickMarkOverlap.ReplaceAll)]
|
|
[Description("Indicates how the TickMark overlaps previous TickMarks.")]
|
|
public GaugeTickMarkOverlap Overlap
|
|
{
|
|
get { return (_Overlap); }
|
|
|
|
set
|
|
{
|
|
if (_Overlap != value)
|
|
{
|
|
_Overlap = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Width
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Width of the TickMark, specified as a percentage
|
|
/// </summary>
|
|
[Browsable(true)]
|
|
[Category("Layout")]
|
|
[Editor("DevComponents.Instrumentation.Design.WidthRangeValueEditor, DevComponents.Instrumentation.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=76cb4c6eb576bca5", typeof(UITypeEditor))]
|
|
[Description("Indicates the Width of the TickMark, specified as a percentage.")]
|
|
public float Width
|
|
{
|
|
get { return (_Width); }
|
|
|
|
set
|
|
{
|
|
if (value < 0)
|
|
throw new ArgumentException("Value can not be less than zero.");
|
|
|
|
if (_Width != value)
|
|
{
|
|
_Width = value;
|
|
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeWidth()
|
|
{
|
|
return (_Width != _DefaultWidth);
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void ResetWidth()
|
|
{
|
|
Width = _DefaultWidth;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region Internal properties
|
|
|
|
#region Bitmap
|
|
|
|
internal Bitmap Bitmap
|
|
{
|
|
get { return (_Bitmap); }
|
|
|
|
set
|
|
{
|
|
if (_Bitmap != null)
|
|
_Bitmap.Dispose();
|
|
|
|
_Bitmap = value;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region HookEvents
|
|
|
|
private void HookEvents(bool hook)
|
|
{
|
|
if (hook == true)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if (_FillColor != null)
|
|
_FillColor.ColorTableChanged -= FillColor_ColorTableChanged;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Event processing
|
|
|
|
void FillColor_ColorTableChanged(object sender, EventArgs e)
|
|
{
|
|
OnTickMarkLayoutChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region OnTickMarkLayoutChanged
|
|
|
|
protected virtual void OnTickMarkLayoutChanged()
|
|
{
|
|
if (TickMarkLayoutChanged != null)
|
|
TickMarkLayoutChanged(this, EventArgs.Empty);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IDisposable Members
|
|
|
|
public void Dispose()
|
|
{
|
|
HookEvents(false);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ICloneable Members
|
|
|
|
public virtual object Clone()
|
|
{
|
|
TickMarkLayout copy = new
|
|
TickMarkLayout(_Style, _Width, _Length);
|
|
|
|
CopyToItem(copy);
|
|
|
|
return (copy);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CopyToItem
|
|
|
|
internal virtual void CopyToItem(TickMarkLayout copy)
|
|
{
|
|
if (_FillColor != null)
|
|
copy.FillColor = (GradientFillColor) _FillColor.Clone();
|
|
|
|
copy.Image = _Image;
|
|
copy.Length = _Length;
|
|
copy.Placement = _Placement;
|
|
copy.ScaleOffset = _ScaleOffset;
|
|
copy.Style = _Style;
|
|
copy.Overlap = _Overlap;
|
|
copy.Width = _Width;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
#region TickMarkLayoutConvertor
|
|
|
|
public class TickMarkLayoutConvertor : ExpandableObjectConverter
|
|
{
|
|
public override object ConvertTo(
|
|
ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
|
{
|
|
if (destinationType == typeof(string))
|
|
{
|
|
TickMarkLayout layout = value as TickMarkLayout;
|
|
|
|
if (layout != null)
|
|
{
|
|
return (String.Empty);
|
|
}
|
|
}
|
|
|
|
return (base.ConvertTo(context, culture, value, destinationType));
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|