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 }