338 lines
10 KiB
C#

using System;
using System.ComponentModel.Design;
using System.Drawing;
using System.Reflection;
using System.Resources;
using System.Windows.Forms;
using DevComponents.DotNetBarKnobControl.Design.Properties;
namespace DevComponents.Instrumentation.Design
{
public class GaugeItemCollectionEditor : CollectionEditor
{
#region Private variables
private ListBox _ListBox;
private GaugeItem _CopyItem;
private GaugeItem _GaugeItem;
private GaugeItem _LastGaugeItem;
private PropertyGrid _PropertyGrid;
private ToolStripItem _AddTextItem;
private ToolStripItem _AddImageItem;
private ToolStripItem _AddDigitalIndicatorItem;
private ToolStripItem _AddMechanicalIndicatorItem;
private ToolStripItem _AddStateIndicatorItem;
private Button _CopyButton;
private ToolTip _ToolTip;
#endregion
public GaugeItemCollectionEditor(Type type)
: base(type)
{
_CopyItem = null;
}
#region CreateCollectionForm
protected override CollectionForm CreateCollectionForm()
{
CollectionForm collectionForm = base.CreateCollectionForm();
if (collectionForm.Controls[0] is TableLayoutPanel)
{
TableLayoutPanel tlpf = collectionForm.Controls["overArchingTableLayoutPanel"] as TableLayoutPanel;
if (tlpf != null)
{
TableLayoutPanel tlp2 = tlpf.Controls["addRemoveTableLayoutPanel"] as TableLayoutPanel;
if (tlp2 != null)
{
Button btn = tlp2.Controls["removeButton"] as Button;
if (btn != null)
btn.Click += GaugeCollectionEditor_RemoveClick;
btn = tlp2.Controls["addButton"] as Button;
if (btn != null)
{
_AddTextItem = btn.ContextMenuStrip.Items[0];
_AddImageItem = btn.ContextMenuStrip.Items[1];
_AddDigitalIndicatorItem = btn.ContextMenuStrip.Items[2];
_AddMechanicalIndicatorItem = btn.ContextMenuStrip.Items[3];
_AddStateIndicatorItem = btn.ContextMenuStrip.Items[4];
AddCopyButton(collectionForm);
}
}
_ListBox = tlpf.Controls["listbox"] as ListBox;
if (_ListBox != null)
_ListBox.SelectedIndexChanged += ListBox_SelectedIndexChanged;
_PropertyGrid = tlpf.Controls["propertyBrowser"] as PropertyGrid;
if (_PropertyGrid != null)
_PropertyGrid.HelpVisible = true;
}
}
return (collectionForm);
}
#endregion
#region CreateInstance
protected override object CreateInstance(Type itemType)
{
if (itemType == typeof(DigitalIndicator))
{
NumericIndicator ind = (NumericIndicator)
base.CreateInstance(typeof(NumericIndicator));
ind.Style = NumericIndicatorStyle.Digital16Segment;
ind.BackColor.BorderWidth = 3;
ind.BackColor.BorderColor = Color.Gray;
ind.BackColor.Color1 = Color.Black;
ind.DigitColor = Color.Red;
ind.DigitDimColor = Color.FromArgb(94, 0, 0);
ind.DecimalColor = Color.Lime;
ind.DecimalDimColor = Color.FromArgb(0, 94, 0);
ind.Size = new SizeF(.4f, .08f);
return (ind);
}
if (itemType == typeof(MechanicalIndicator))
{
NumericIndicator ind = (NumericIndicator)
base.CreateInstance(typeof(NumericIndicator));
ind.BackColor.BorderWidth = 1;
ind.BackColor.BorderColor = Color.Black;
ind.BackColor.Color1 = Color.Gray;
ind.BackColor.Color2 = Color.White;
ind.BackColor.GradientFillType = GradientFillType.HorizontalCenter;
ind.SeparatorColor.BorderWidth = 1;
ind.SeparatorColor.BorderColor = Color.Gray;
ind.SeparatorColor.Color1 = Color.LightGray;
ind.SeparatorColor.Color2 = Color.DimGray;
ind.SeparatorColor.GradientFillType = GradientFillType.HorizontalCenter;
ind.Size = new SizeF(.4f, .08f);
return (ind);
}
if (itemType == typeof(StateIndicator))
{
StateIndicator ind = (StateIndicator)
base.CreateInstance(typeof(StateIndicator));
ind.EmptyString = "";
return (ind);
}
return (base.CreateInstance(itemType));
}
#endregion
#region CopyButton support
#region AddCopyButton
private void AddCopyButton(CollectionForm collectionForm)
{
_CopyButton = new Button();
_CopyButton.Size = new Size(23, 24);
_CopyButton.Enabled = false;
_CopyButton.Click += CopyButton_Click;
ResourceManager rm = Resources.ResourceManager;
_CopyButton.Image = (Image)rm.GetObject("Copy");
collectionForm.Controls.Add(_CopyButton);
_CopyButton.Location = new Point(208, 85);
_CopyButton.BringToFront();
_ToolTip = new ToolTip();
_ToolTip.SetToolTip(_CopyButton, "Clone the selected item");
}
#endregion
#region CopyButton_Click
void CopyButton_Click(object sender, EventArgs e)
{
if (_GaugeItem != null)
{
_CopyItem = _GaugeItem;
if (_GaugeItem is GaugeText)
_AddTextItem.PerformClick();
else if (_GaugeItem is GaugeImage)
_AddImageItem.PerformClick();
else if (_GaugeItem is NumericIndicator)
{
if (((NumericIndicator) _GaugeItem).Style == NumericIndicatorStyle.Mechanical)
_AddMechanicalIndicatorItem.PerformClick();
else
_AddDigitalIndicatorItem.PerformClick();
}
else if (_GaugeItem is StateIndicator)
_AddStateIndicatorItem.PerformClick();
}
}
#endregion
#endregion
#region ListBox_SelectedIndexChanged
void ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (_ListBox.SelectedItem != null)
{
PropertyInfo p = _ListBox.SelectedItem.GetType().GetProperty("Value");
_LastGaugeItem = _GaugeItem;
_GaugeItem = (GaugeItem)p.GetValue(_ListBox.SelectedItem, null);
if (_CopyItem != null)
{
if (_GaugeItem is GaugeText)
CopyGaugeText(_LastGaugeItem as GaugeText, _GaugeItem as GaugeText);
else if (_GaugeItem is GaugeImage)
CopyGaugeImage(_LastGaugeItem as GaugeImage, _GaugeItem as GaugeImage);
else if (_GaugeItem is NumericIndicator)
CopyGaugeNumericIndicator(_LastGaugeItem as NumericIndicator, _GaugeItem as NumericIndicator);
else if (_GaugeItem is StateIndicator)
CopyGaugeStateIndicator(_LastGaugeItem as StateIndicator, _GaugeItem as StateIndicator);
_CopyItem = null;
}
_CopyButton.Enabled = true;
}
else
{
_CopyButton.Enabled = false;
}
}
#endregion
#region CopyGaugeText
private void CopyGaugeText(GaugeText gt, GaugeText clone)
{
if (gt != null && clone != null)
gt.CopyToItem(clone);
}
#endregion
#region CopyGaugeImage
private void CopyGaugeImage(GaugeImage gi, GaugeImage clone)
{
if (gi != null && clone != null)
gi.CopyToItem(clone);
}
#endregion
#region CopyGaugeNumericIndicator
private void CopyGaugeNumericIndicator(NumericIndicator gi, NumericIndicator clone)
{
if (gi != null && clone != null)
gi.CopyToItem(clone);
}
#endregion
#region CopyGaugeStateIndicator
private void CopyGaugeStateIndicator(StateIndicator gi, StateIndicator clone)
{
if (gi != null && clone != null)
gi.CopyToItem(clone);
}
#endregion
#region CreateCollectionItemType
protected override Type CreateCollectionItemType()
{
return typeof(GaugeText);
}
#endregion
#region CreateNewItemTypes
protected override Type[] CreateNewItemTypes()
{
return new Type[]
{
typeof(GaugeText),
typeof(GaugeImage),
typeof(DigitalIndicator),
typeof(MechanicalIndicator),
typeof(StateIndicator),
};
}
private class DigitalIndicator : NumericIndicator
{
}
private class MechanicalIndicator : NumericIndicator
{
}
#endregion
#region GaugeCollectionEditor_RemoveClick
void GaugeCollectionEditor_RemoveClick(object sender, EventArgs e)
{
if (_LastGaugeItem != null)
{
_LastGaugeItem.Visible = false;
_LastGaugeItem = null;
}
else if (_GaugeItem != null)
{
_GaugeItem.Visible = false;
_GaugeItem = null;
}
}
#endregion
}
}