Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/03/17 23:04:37 (7 years ago)
Author:
mkommend
Message:

#2724: Merged r14597, r15009, r15010 into stable.

Location:
stable
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Data.Views

  • stable/HeuristicLab.Data.Views/3.3

  • stable/HeuristicLab.Data.Views/3.3/EnumValueView.cs

    r14186 r15117  
    2121
    2222using System;
     23using System.Windows.Forms;
    2324using HeuristicLab.Core.Views;
    2425using HeuristicLab.MainForm;
     
    4243    }
    4344
     45    static EnumValueView() {
     46      if (!typeof(T).IsEnum)
     47        throw new InvalidOperationException("Generic type " + typeof(T).Name + " is not an enum.");
     48    }
     49
    4450    public EnumValueView() {
    4551      InitializeComponent();
     52      this.Caption = typeof(T).Name + " View";
     53
    4654      valueComboBox.DataSource = Enum.GetValues(typeof(T));
    47       this.Name = typeof(T).Name + "EnumView";
     55      foreach (T flag in Enum.GetValues(typeof(T)))
     56        flagsListView.Items.Add(new ListViewItem(flag.ToString()) { Tag = flag });
     57      columnHeader.Width = -1;
     58
     59      bool isFlags = Attribute.IsDefined(typeof(T), typeof(FlagsAttribute));
     60      if (isFlags) valueLabel.Text = "Flags:";
     61      valueComboBox.Visible = !isFlags;
     62      flagsListView.Visible = isFlags;
    4863    }
    4964    public EnumValueView(EnumValue<T> content)
     
    6479    protected override void OnContentChanged() {
    6580      base.OnContentChanged();
    66       if (Content == null)
    67         valueComboBox.Enabled = false;
    68       else
     81      if (Content == null) {
     82        valueComboBox.SelectedIndex = -1;
     83        foreach (ListViewItem item in flagsListView.Items)
     84          item.Checked = false;
     85      } else {
    6986        valueComboBox.SelectedItem = Content.Value;
     87        foreach (ListViewItem item in flagsListView.Items) {
     88          var flag = (Enum)item.Tag;
     89          item.Checked = ((Enum)(object)Content.Value).HasFlag(flag);
     90        }
     91      }
    7092    }
    7193
    7294    protected override void SetEnabledStateOfControls() {
    7395      base.SetEnabledStateOfControls();
    74       if (Content == null) valueComboBox.Enabled = false;
    75       else valueComboBox.Enabled = !ReadOnly;
     96      if (Content == null) {
     97        valueComboBox.Enabled = false;
     98        flagsListView.Enabled = false;
     99      } else {
     100        valueComboBox.Enabled = !ReadOnly;
     101        flagsListView.Enabled = !ReadOnly;
     102      }
    76103    }
    77104
     
    79106      if (InvokeRequired)
    80107        Invoke(new EventHandler(Content_ValueChanged), sender, e);
    81       else
     108      else {
    82109        valueComboBox.SelectedItem = Content.Value;
     110        foreach (ListViewItem item in flagsListView.Items) {
     111          var flag = (Enum)item.Tag;
     112          item.Checked = ((Enum)(object)Content.Value).HasFlag(flag);
     113        }
     114      }
    83115    }
    84116
     
    87119        Content.Value = (T)valueComboBox.SelectedItem;
    88120    }
     121
     122    private void flagsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
     123      var flag = (T)e.Item.Tag;
     124      if ((Content != null) && !Content.ReadOnly)
     125        Content.Value = ((Enum)(object)Content.Value).SetFlag(flag, e.Item.Checked);
     126    }
     127  }
     128
     129  internal static class EnumHelper {
     130    //https://stackoverflow.com/a/21581418
     131    public static T SetFlag<T>(this Enum value, T flag, bool set) {
     132      var baseType = Enum.GetUnderlyingType(value.GetType());
     133      dynamic valueAsBase = Convert.ChangeType(value, baseType);
     134      dynamic flagAsBase = Convert.ChangeType(flag, baseType);
     135      if (set)
     136        valueAsBase |= flagAsBase;
     137      else
     138        valueAsBase &= ~flagAsBase;
     139      return (T)valueAsBase;
     140    }
    89141  }
    90142}
Note: See TracChangeset for help on using the changeset viewer.