Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/22/19 14:12:15 (5 years ago)
Author:
abeham
Message:

#3010: merged to stable (17009, 17126)

Location:
stable
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Core.Views

  • stable/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs

    r17097 r17147  
    3737  [Content(typeof(ReadOnlyCheckedItemList<>), true)]
    3838  public partial class CheckedItemListView<T> : ItemListView<T> where T : class, IItem {
     39    private bool suppressCheckedEvents;
     40
    3941    public new ICheckedItemList<T> Content {
    4042      get { return (ICheckedItemList<T>)base.Content; }
     
    8486      if (doubleClick) {
    8587        e.NewValue = e.CurrentValue;
    86         doubleClick = false;
    8788      } else {
    88         var checkedItem = (T)itemsListView.Items[e.Index].Tag;
    8989        bool check = e.NewValue == CheckState.Checked;
    90         if (Content.ItemChecked(checkedItem) != check) {
    91           if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
    92           else e.NewValue = e.CurrentValue;
    93         }
     90        if (Content.ItemChecked(e.Index) == check) return;
     91
     92        suppressCheckedEvents = true;
     93        try {
     94          if (itemsListView.SelectedIndices.Count > 1
     95            && itemsListView.SelectedIndices.Contains(e.Index)) {
     96            if (!ReadOnly && !Locked) Content.SetItemCheckedState(itemsListView.SelectedIndices.Cast<int>(), check);
     97            else e.NewValue = e.CurrentValue;
     98          } else {
     99            var checkedItem = (T)itemsListView.Items[e.Index].Tag;
     100            if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
     101            else e.NewValue = e.CurrentValue;
     102          }
     103        } finally { suppressCheckedEvents = false; }
    94104      }
    95105    }
    96106
    97107    protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
    98       if (e.Clicks > 1)
    99         doubleClick = true;
     108      doubleClick = e.Clicks > 1;
    100109    }
    101110
     
    139148        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged), sender, e);
    140149      else {
    141         UpdateCheckedItemState(e.Items);
     150        if (!suppressCheckedEvents) UpdateCheckedItemState(e.Items);
    142151        SetNumberOfCheckItems();
    143152      }
     
    175184
    176185    private void UpdateCheckedItemState(IEnumerable<IndexedItem<T>> items) {
    177       foreach (var item in items) {
    178         var isChecked = Content.ItemChecked(item.Value);
    179         if (itemsListView.Items[item.Index].Checked != isChecked)
    180           itemsListView.Items[item.Index].Checked = isChecked;
    181       }
     186      itemsListView.BeginUpdate();
     187      try {
     188        foreach (var item in items) {
     189          var isChecked = Content.ItemChecked(item.Value);
     190          if (itemsListView.Items[item.Index].Checked != isChecked)
     191            itemsListView.Items[item.Index].Checked = isChecked;
     192        }
     193      } finally { itemsListView.EndUpdate(); itemsListView.Refresh(); }
    182194    }
    183195  }
Note: See TracChangeset for help on using the changeset viewer.