211 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace DevComponents.Charts.Design
{
#region FlagsEnumUIEditor
public class FlagsEnumUIEditor : UITypeEditor
{
private FlagsCheckedListBox _FlagCb;
public FlagsEnumUIEditor()
{
_FlagCb = new FlagsCheckedListBox();
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return (UITypeEditorEditStyle.DropDown);
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (context != null && context.Instance != null && provider != null)
{
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
Enum e = (Enum)Convert.ChangeType(value, context.PropertyDescriptor.PropertyType);
_FlagCb.Value = e;
edSvc.DropDownControl(_FlagCb);
return (_FlagCb.Value);
}
}
return (base.EditValue(provider, value));
}
}
#endregion
public class FlagsCheckedListBox : CheckedListBox
{
private Type _Type;
private Enum _Value;
private bool _UpdatingStates;
public FlagsCheckedListBox()
{
CheckOnClick = true;
BorderStyle = BorderStyle.None;
}
#region Public properties
#region Value
public Enum Value
{
get
{
return (_Value);
}
set
{
_Value = value;
_Type = value.GetType();
InitializeCheckedListBox();
}
}
#endregion
#endregion
#region InitializeCheckedListBox
private void InitializeCheckedListBox()
{
Items.Clear();
foreach (string name in Enum.GetNames(_Type))
{
object o = Enum.Parse(_Type, name);
uint value = (uint)Convert.ChangeType(o, typeof(uint));
FlagsCheckedListBoxItem item = new FlagsCheckedListBoxItem(value, name);
Items.Add(item);
}
SetCheckedItems();
}
#region OnItemCheck
protected override void OnItemCheck(ItemCheckEventArgs e)
{
base.OnItemCheck(e);
if (_UpdatingStates == false)
{
FlagsCheckedListBoxItem item = Items[e.Index] as FlagsCheckedListBoxItem;
uint sum;
if (e.NewValue == CheckState.Checked &&
(item.Value == 0 || item.Text.Equals("None")))
{
sum = item.Value;
}
else
{
sum = CalculateCheckedSum();
if (e.NewValue == CheckState.Checked)
sum += item.Value;
else
sum -= item.Value;
}
_Value = (Enum)(Enum.ToObject(_Type, sum));
SetCheckedItems();
}
}
#endregion
#region SetCheckedItems
private void SetCheckedItems()
{
_UpdatingStates = true;
int value = (int)Convert.ChangeType(_Value, typeof(int));
for (int i = 0; i < Items.Count; i++)
{
FlagsCheckedListBoxItem item = Items[i] as FlagsCheckedListBoxItem;
if (item.Value == 0)
SetItemChecked(i, value == 0);
else if (item.Text.Equals("None"))
SetItemChecked(i, value == item.Value);
else
SetItemChecked(i, ((item.Value & value) == item.Value));
}
_UpdatingStates = false;
}
#endregion
#endregion
#region CalculateCheckedSum
private uint CalculateCheckedSum()
{
uint sum = 0;
for (int i = 0; i < Items.Count; i++)
{
FlagsCheckedListBoxItem item = Items[i] as FlagsCheckedListBoxItem;
if (GetItemChecked(i))
sum |= item.Value;
}
return (sum);
}
#endregion
}
#region FlagsCheckedListBoxItem
public class FlagsCheckedListBoxItem
{
public uint Value;
public string Text;
public FlagsCheckedListBoxItem(uint value, string text)
{
Value = value;
Text = text;
}
public override string ToString()
{
return (Text);
}
}
#endregion
}