Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/30/17 13:39:16 (7 years ago)
Author:
mkommend
Message:

#2758: Improved performance of RunCollectionView and added runs counter.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs

    r14185 r14793  
    5252    }
    5353
    54     public ListView ItemsListView {
    55       get { return itemsListView; }
    56     }
     54    private int EmptyImageIndex { get { return 0; } }
     55    private int RunImageIndex { get { return 1; } }
    5756
    5857    public RunCollectionView() {
    5958      InitializeComponent();
    60       itemsGroupBox.Text = "Runs";
     59      UpdateGroupBoxText();
     60
     61      itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
     62      itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Class);
     63
    6164      itemListViewItemMapping = new Dictionary<IRun, List<ListViewItem>>();
    6265      runCollectionModifiersListView.Evaluator = EvaluateModifications;
     
    8386    }
    8487    private void DeregisterItemEvents(IRun item) {
    85       item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
    8688      item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
    8789      item.PropertyChanged -= Item_PropertyChanged;
    8890    }
    8991    private void RegisterItemEvents(IRun item) {
    90       item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
    9192      item.ToStringChanged += new EventHandler(Item_ToStringChanged);
    9293      item.PropertyChanged += Item_PropertyChanged;
     
    116117      itemsListView.Items.Clear();
    117118      itemListViewItemMapping.Clear();
    118       RebuildImageList();
    119119      viewHost.Content = null;
     120
     121      UpdateGroupBoxText();
    120122
    121123      if (Content != null) {
     
    129131          runCollectionModifiersListView.Content = RunCollection.Modifiers;
    130132        }
     133
     134        ListViewItem[] items = new ListViewItem[Content.Count];
     135        int count = 0;
    131136        foreach (IRun item in Content) {
    132137          ListViewItem listViewItem = CreateListViewItem(item);
    133           AddListViewItem(listViewItem);
     138
    134139          if ((selectedName != null) && item.Name.Equals(selectedName))
    135140            listViewItem.Selected = true;
    136         }
     141          items[count] = listViewItem;
     142          count++;
     143        }
     144        itemsListView.Items.AddRange(items);
    137145        AdjustListViewColumnSizes();
    138146      } else {
     
    166174    }
    167175
    168     private ListViewItem CreateListViewItem(IRun item) {
     176    private static readonly string tooltipText = ItemAttribute.GetName(typeof(Run)) + ": " +
     177                                    ItemAttribute.GetDescription(typeof(Run));
     178    private ListViewItem CreateListViewItem(IRun run) {
    169179      ListViewItem listViewItem = new ListViewItem();
    170       if (item == null) {
     180      if (run == null) {
    171181        listViewItem.Text = "null";
    172         itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
    173         listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
     182        listViewItem.ImageIndex = EmptyImageIndex;
     183        return listViewItem;
     184      }
     185
     186      listViewItem.Text = run.Name;
     187      listViewItem.ToolTipText = tooltipText;
     188      listViewItem.ImageIndex = RunImageIndex;
     189      listViewItem.Tag = run;
     190
     191      if (run.Visible) {
     192        listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular);
     193        listViewItem.ForeColor = run.Color;
    174194      } else {
    175         listViewItem.Text = item.ToString();
    176         listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
    177         itemsListView.SmallImageList.Images.Add(item.ItemImage);
    178         listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
    179         listViewItem.Tag = item;
    180 
    181         if (item.Visible) {
    182           listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular);
    183           listViewItem.ForeColor = item.Color;
    184         } else {
    185           listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
    186           listViewItem.ForeColor = Color.LightGray;
    187         }
    188       }
     195        listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
     196        listViewItem.ForeColor = Color.LightGray;
     197      }
     198
     199      if (!itemListViewItemMapping.ContainsKey(run)) {
     200        itemListViewItemMapping.Add(run, new List<ListViewItem>());
     201        RegisterItemEvents(run);
     202      }
     203      itemListViewItemMapping[run].Add(listViewItem);
     204
    189205      return listViewItem;
    190206    }
    191     private void AddListViewItem(ListViewItem listViewItem) {
    192       if (listViewItem == null) throw new ArgumentNullException();
    193       itemsListView.Items.Add(listViewItem);
    194       IRun run = listViewItem.Tag as IRun;
    195       if (run != null) {
    196         if (!itemListViewItemMapping.ContainsKey(run)) {
    197           itemListViewItemMapping.Add(run, new List<ListViewItem>());
    198           RegisterItemEvents(run);
    199         }
    200         itemListViewItemMapping[run].Add(listViewItem);
    201       }
    202     }
     207
    203208    private void RemoveListViewItem(ListViewItem listViewItem) {
    204209      if (listViewItem == null) throw new ArgumentNullException();
     
    213218      listViewItem.Remove();
    214219    }
    215     private void UpdateListViewItemImage(ListViewItem listViewItem) {
    216       if (listViewItem == null) throw new ArgumentNullException();
    217       IRun item = listViewItem.Tag as IRun;
    218       int i = listViewItem.ImageIndex;
    219       itemsListView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
    220       listViewItem.ImageIndex = -1;
    221       listViewItem.ImageIndex = i;
    222     }
     220
    223221    private void UpdateListViewItemText(ListViewItem listViewItem) {
    224222      if (listViewItem == null) throw new ArgumentNullException();
     
    239237        return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
    240238      }
     239    }
     240
     241    private void UpdateGroupBoxText() {
     242      if (Content == null || Content.Count == 0) itemsGroupBox.Text = "Runs";
     243      else itemsGroupBox.Text = @"Runs (" + Content.Count + @")";
    241244    }
    242245
     
    393396        RunCollection.UpdateOfRunsInProgress = true;
    394397        RunCollection.Modify();
    395       } finally {
     398      }
     399      finally {
    396400        ReadOnly = false;
    397401        RunCollection.UpdateOfRunsInProgress = false;
     
    406410        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
    407411      else {
    408         foreach (IRun item in e.Items)
    409           AddListViewItem(CreateListViewItem(item));
    410 
     412        var items = e.Items.Select(CreateListViewItem).ToArray();
     413        itemsListView.Items.AddRange(items);
    411414        AdjustListViewColumnSizes();
    412415        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
    413416        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
    414417        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
     418        UpdateGroupBoxText();
    415419      }
    416420    }
     
    425429          if (listViewItem != null) RemoveListViewItem(listViewItem);
    426430        }
    427         RebuildImageList();
    428431        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
    429432        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
    430433        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
     434        UpdateGroupBoxText();
    431435      }
    432436    }
     
    441445          if (listViewItem != null) RemoveListViewItem(listViewItem);
    442446        }
    443         RebuildImageList();
    444         foreach (IRun item in e.Items)
    445           AddListViewItem(CreateListViewItem(item));
     447        var items = e.Items.Select(CreateListViewItem).ToArray();
     448        itemsListView.Items.AddRange(items);
    446449
    447450        AdjustListViewColumnSizes();
     
    449452        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
    450453        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
     454        UpdateGroupBoxText();
    451455      }
    452456    }
     
    456460        suppressUpdates = RunCollection.UpdateOfRunsInProgress;
    457461        if (!suppressUpdates) {
    458           foreach (IRun item in Content) {
    459             //remove only the first matching ListViewItem, because the IRun could be contained multiple times in the ItemCollection
    460             ListViewItem listViewItem = GetListViewItemsForItem(item).FirstOrDefault();
    461             if (listViewItem != null) RemoveListViewItem(listViewItem);
     462          foreach (IRun run in Content) {
     463            DeregisterItemEvents(run);
    462464          }
    463           RebuildImageList();
    464           foreach (IRun item in Content)
    465             AddListViewItem(CreateListViewItem(item));
     465          itemsListView.Items.Clear();
     466          itemListViewItemMapping.Clear();
     467          var items = Content.Select(CreateListViewItem).ToArray();
     468          itemsListView.Items.AddRange(items);
    466469
    467470          AdjustListViewColumnSizes();
     
    469472          clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
    470473          runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
     474          UpdateGroupBoxText();
    471475        }
    472476      }
     
    475479
    476480    #region Item Events
    477     private void Item_ItemImageChanged(object sender, EventArgs e) {
    478       if (suppressUpdates) return;
    479       if (InvokeRequired)
    480         Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
    481       else {
    482         IRun item = (IRun)sender;
    483         foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
    484           UpdateListViewItemImage(listViewItem);
    485       }
    486     }
    487481    private void Item_ToStringChanged(object sender, EventArgs e) {
    488482      if (suppressUpdates) return;
     
    528522      }
    529523    }
    530     private void RebuildImageList() {
    531       itemsListView.SmallImageList.Images.Clear();
    532       foreach (ListViewItem listViewItem in itemsListView.Items) {
    533         IRun item = listViewItem.Tag as IRun;
    534         itemsListView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
    535         listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
    536       }
    537     }
    538524    #endregion
    539525  }
Note: See TracChangeset for help on using the changeset viewer.