333 lines
9.6 KiB
C#

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using DevComponents.DotNetBarKnobControl.Design;
namespace DevComponents.Instrumentation.Design
{
public class GaugeControlActionList : DesignerActionList
{
#region Private variables
private GaugeControl _GaugeControl;
#endregion
/// <summary>
/// GaugeControlActionList
/// </summary>
/// <param name="gaugeControl">Associated GaugeControl</param>
public GaugeControlActionList(GaugeControl gaugeControl)
: base(gaugeControl)
{
_GaugeControl = gaugeControl;
}
#region Public properties
/// <summary>
/// Gets or sets the FrameStyle
/// </summary>
public GaugeFrameStyle FrameStyle
{
get { return (_GaugeControl.Frame.Style); }
set { GetFramePropertyByName("Style").SetValue(_GaugeControl.Frame, value); }
}
/// <summary>
/// Gets or sets the Glass Effect
/// </summary>
public bool AddGlassEffect
{
get { return (_GaugeControl.Frame.AddGlassEffect); }
set { GetFramePropertyByName("AddGlassEffect").SetValue(_GaugeControl.Frame, value); }
}
/// <summary>
/// Gets or sets the frame inner bevel size
/// </summary>
[Editor(typeof(HalfRadiusRangeValueEditor), typeof(UITypeEditor))]
public float InnerBevel
{
get { return (_GaugeControl.Frame.InnerBevel); }
set { GetFramePropertyByName("InnerBevel").SetValue(_GaugeControl.Frame, value); }
}
/// <summary>
/// Gets or sets the frame outer bevel size
/// </summary>
[Editor(typeof(HalfRadiusRangeValueEditor), typeof(UITypeEditor))]
public float OuterBevel
{
get { return (_GaugeControl.Frame.OuterBevel); }
set { GetFramePropertyByName("OuterBevel").SetValue(_GaugeControl.Frame, value); }
}
/// <summary>
/// Gets or sets the RoundRectangleArc size
/// </summary>
[Editor(typeof(HalfRadiusRangeValueEditor), typeof(UITypeEditor))]
public float RoundRectangleArc
{
get { return (_GaugeControl.Frame.RoundRectangleArc); }
set { GetFramePropertyByName("RoundRectangleArc").SetValue(_GaugeControl.Frame, value); }
}
#endregion
#region GetPropertyByName
/// <summary>
/// Gets the property via the given name
/// </summary>
/// <param name="propName">Property name</param>
/// <returns>PropertyDescriptor</returns>
private PropertyDescriptor GetPropertyByName(string propName)
{
PropertyDescriptor prop =
TypeDescriptor.GetProperties(_GaugeControl)[propName];
if (prop == null)
throw new ArgumentException("Matching property not found.", propName);
return (prop);
}
#endregion
#region GetFramePropertyByName
/// <summary>
/// Gets the Frame property via the given name
/// </summary>
/// <param name="propName">Property name</param>
/// <returns>PropertyDescriptor</returns>
private PropertyDescriptor GetFramePropertyByName(string propName)
{
PropertyDescriptor prop =
TypeDescriptor.GetProperties(_GaugeControl.Frame)[propName];
if (prop == null)
throw new ArgumentException("Matching property not found.", propName);
return (prop);
}
#endregion
#region GetSortedActionItems
/// <summary>
/// Gets the SortedActionItems
/// </summary>
/// <returns>DesignerActionItemCollection</returns>
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionMethodItem(this, "AddCircularScale", "Add Circular Scale", "Scale"));
items.Add(new DesignerActionMethodItem(this, "AddHLinearScale", "Add Horizontal Linear Scale", "Scale"));
items.Add(new DesignerActionMethodItem(this, "AddVLinearScale", "Add Vertical Linear Scale", "Scale"));
items.Add(new DesignerActionHeaderItem("Gauge Frame"));
items.Add(new DesignerActionPropertyItem("FrameStyle", "Style",
"Gauge Frame", "Sets the frame Style."));
items.Add(new DesignerActionPropertyItem("InnerBevel", "Inner Bevel",
"Gauge Frame", "Sets the frame inner bevel size."));
items.Add(new DesignerActionPropertyItem("OuterBevel", "Outer Bevel",
"Gauge Frame", "Sets the frame outer bevel size."));
items.Add(new DesignerActionPropertyItem("RoundRectangleArc", "Round Rectangle Arc",
"Gauge Frame", "Sets the rectangle corner arc."));
items.Add(new DesignerActionTextItem(
"Frame sizes are measured as a\n" +
"percentage of the width/height of the Gauge", "Gauge Frame"));
return (items);
}
#endregion
#region AddCircularScale
/// <summary>
/// Adds a CircularScale
/// </summary>
public void AddCircularScale()
{
GaugeCircularScale scale = NewCircularScale();
_GaugeControl.CircularScales.Add(scale);
GaugePropertyGrid prop = new GaugePropertyGrid();
prop.SelectedObject = scale;
DialogResult result = prop.ShowDialog();
if (result != DialogResult.OK)
_GaugeControl.CircularScales.Remove(scale);
}
#region NewCircularScale
private GaugeCircularScale NewCircularScale()
{
GaugeCircularScale scale = new GaugeCircularScale(_GaugeControl);
scale.Name = GetScaleName(scale);
GaugeSection section = new GaugeSection(scale);
section.Name = GetSectionName(scale);
section.FillColor = new GradientFillColor(Color.CornflowerBlue);
scale.Sections.Add(section);
return (scale);
}
#endregion
#endregion
#region AddHLinearScale
/// <summary>
/// Adds a Horizontal LinearScale
/// </summary>
public void AddHLinearScale()
{
GaugeLinearScale scale = NewLinearScale(Orientation.Horizontal);
_GaugeControl.LinearScales.Add(scale);
GaugePropertyGrid prop = new GaugePropertyGrid();
prop.SelectedObject = scale;
DialogResult result = prop.ShowDialog();
if (result != DialogResult.OK)
_GaugeControl.LinearScales.Remove(scale);
}
#endregion
#region AddVLinearScale
/// <summary>
/// Adds a Vertical LinearScale
/// </summary>
public void AddVLinearScale()
{
GaugeLinearScale scale = NewLinearScale(Orientation.Vertical);
_GaugeControl.LinearScales.Add(scale);
GaugePropertyGrid prop = new GaugePropertyGrid();
prop.SelectedObject = scale;
DialogResult result = prop.ShowDialog();
if (result != DialogResult.OK)
_GaugeControl.LinearScales.Remove(scale);
}
#endregion
#region NewLinearScale
private GaugeLinearScale NewLinearScale(Orientation orientation)
{
GaugeLinearScale scale = new GaugeLinearScale(_GaugeControl);
scale.Orientation = orientation;
scale.Name = GetScaleName(scale);
scale.MinPin.EndOffset = .028f;
scale.MaxPin.EndOffset = .028f;
GaugeSection section = new GaugeSection(scale);
section.Name = GetSectionName(scale);
section.FillColor = new GradientFillColor(Color.CornflowerBlue);
scale.Sections.Add(section);
return (scale);
}
#endregion
#region GetScaleName
private string GetScaleName(GaugeCircularScale scale)
{
for (int i = 1; i < 100; i++)
{
string s = "Scale" + i.ToString();
if (scale.GaugeControl.CircularScales[s] == null)
return (s);
}
return (null);
}
private string GetScaleName(GaugeLinearScale scale)
{
for (int i = 1; i < 100; i++)
{
string s = "Scale" + i.ToString();
if (scale.GaugeControl.LinearScales[s] == null)
return (s);
}
return (null);
}
#endregion
#region GetSectionName
private string GetSectionName(GaugeScale scale)
{
for (int i = 1; i < 100; i++)
{
string s = "Section" + i.ToString();
if (scale.Sections[s] == null)
return (s);
}
return (null);
}
#endregion
#region GetDefaultOrientation
private Orientation GetDefaultOrientation(GaugeLinearScale scale)
{
foreach (GaugeLinearScale gls in scale.GaugeControl.LinearScales)
{
if (gls != scale)
return (gls.Orientation);
}
return (scale.GaugeControl.Width > scale.GaugeControl.Height
? Orientation.Horizontal : Orientation.Vertical);
}
#endregion
}
}