Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/21/10 18:19:39 (14 years ago)
Author:
mkommend
Message:

Improved performance of all RunCollectionViews (ticket #1284).

File:
1 edited

Legend:

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

    r4300 r4883  
    3535  [Content(typeof(RunCollection), true)]
    3636  [Content(typeof(IItemCollection<IRun>), false)]
    37   public partial class RunCollectionView : ItemView {
     37  public sealed partial class RunCollectionView : ItemView {
     38    private Dictionary<IRun, List<ListViewItem>> runListViewItemMapping;
     39
    3840    public new IItemCollection<IRun> Content {
    3941      get { return (IItemCollection<IRun>)base.Content; }
     
    5254      InitializeComponent();
    5355      itemsGroupBox.Text = "Runs";
     56      runListViewItemMapping = new Dictionary<IRun, List<ListViewItem>>();
    5457    }
    5558
     
    6871      RegisterRunEvents(Content);
    6972    }
    70     protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
     73    private void RegisterRunEvents(IEnumerable<IRun> runs) {
    7174      foreach (IRun run in runs)
    7275        run.Changed += new EventHandler(Run_Changed);
    7376    }
    74     protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
     77    private void DeregisterRunEvents(IEnumerable<IRun> runs) {
    7578      foreach (IRun run in runs)
    7679        run.Changed -= new EventHandler(Run_Changed);
     
    143146    }
    144147
    145     protected virtual ListViewItem CreateListViewItem(IRun item) {
     148    private ListViewItem CreateListViewItem(IRun item) {
    146149      ListViewItem listViewItem = new ListViewItem();
    147150      listViewItem.Text = item.ToString();
     
    160163      return listViewItem;
    161164    }
    162     protected virtual void AddListViewItem(ListViewItem listViewItem) {
     165    private void AddListViewItem(ListViewItem listViewItem) {
    163166      itemsListView.Items.Add(listViewItem);
    164       ((IRun)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
    165       ((IRun)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
    166     }
    167     protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
    168       ((IRun)listViewItem.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
    169       ((IRun)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
     167      IRun run = listViewItem.Tag as IRun;
     168      if (run != null) {
     169        if (!runListViewItemMapping.ContainsKey(run))
     170          runListViewItemMapping.Add(run, new List<ListViewItem>());
     171        runListViewItemMapping[run].Add(listViewItem);
     172        run.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
     173        run.ToStringChanged += new EventHandler(Item_ToStringChanged);
     174      }
     175    }
     176    private void RemoveListViewItem(ListViewItem listViewItem) {
     177      IRun run = listViewItem.Tag as IRun;
     178      if (run != null) {
     179        runListViewItemMapping[run].Remove(listViewItem);
     180        if (runListViewItemMapping[run].Count == 0) {
     181          runListViewItemMapping.Remove(run);
     182          run.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
     183          run.ToStringChanged -= new EventHandler(Item_ToStringChanged);
     184        }
     185      }
    170186      listViewItem.Remove();
    171187      foreach (ListViewItem other in itemsListView.Items)
     
    173189      itemsListView.SmallImageList.Images.RemoveAt(listViewItem.ImageIndex);
    174190    }
    175     protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
     191    private void UpdateListViewItemImage(ListViewItem listViewItem) {
    176192      int i = listViewItem.ImageIndex;
    177193      listViewItem.ImageList.Images[i] = ((IRun)listViewItem.Tag).ItemImage;
     
    179195      listViewItem.ImageIndex = i;
    180196    }
    181     protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
     197    private void UpdateListViewItemText(ListViewItem listViewItem) {
    182198      if (!listViewItem.Text.Equals(listViewItem.Tag.ToString()))
    183199        listViewItem.Text = listViewItem.Tag.ToString();
    184200    }
    185     protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(IRun item) {
    186       foreach (ListViewItem listViewItem in itemsListView.Items) {
    187         if (((IRun)listViewItem.Tag) == item)
    188           yield return listViewItem;
    189       }
     201    private IEnumerable<ListViewItem> GetListViewItemsForItem(IRun run) {
     202      return runListViewItemMapping[run];
    190203    }
    191204
    192205    #region ListView Events
    193     protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
     206    private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
    194207      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && (Content != null) && !Content.IsReadOnly && !ReadOnly;
    195208      AdjustListViewColumnSizes();
     
    205218      }
    206219    }
    207     protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
     220    private void itemsListView_KeyDown(object sender, KeyEventArgs e) {
    208221      if (e.KeyCode == Keys.Delete) {
    209222        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
     
    213226      }
    214227    }
    215     protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
     228    private void itemsListView_DoubleClick(object sender, EventArgs e) {
    216229      if (itemsListView.SelectedItems.Count == 1) {
    217230        IRun item = (IRun)itemsListView.SelectedItems[0].Tag;
     
    223236      }
    224237    }
    225     protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
     238    private void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
    226239      if (!Locked) {
    227240        ListViewItem listViewItem = (ListViewItem)e.Item;
     
    239252      }
    240253    }
    241     protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
     254    private void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
    242255      e.Effect = DragDropEffects.None;
    243256      Type type = e.Data.GetData("Type") as Type;
     
    250263      }
    251264    }
    252     protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
     265    private void itemsListView_DragDrop(object sender, DragEventArgs e) {
    253266      if (e.Effect != DragDropEffects.None) {
    254267        IRun item = e.Data.GetData("Value") as IRun;
     
    260273
    261274    #region Button Events
    262     protected virtual void menuItem_Click(object sender, EventArgs e) {
     275    private void menuItem_Click(object sender, EventArgs e) {
    263276      ToolStripMenuItem menuItem = (ToolStripMenuItem)sender;
    264277      Type viewType = (Type)menuItem.Tag;
     
    269282      }
    270283    }
    271     protected virtual void removeButton_Click(object sender, EventArgs e) {
     284    private void removeButton_Click(object sender, EventArgs e) {
    272285      if (itemsListView.SelectedItems.Count > 0) {
    273286        foreach (ListViewItem item in itemsListView.SelectedItems)
     
    276289      }
    277290    }
    278     protected virtual void clearButton_Click(object sender, EventArgs e) {
     291    private void clearButton_Click(object sender, EventArgs e) {
    279292      Content.Clear();
    280293    }
     
    282295
    283296    #region CheckBox Events
    284     protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
     297    private void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
    285298      if (showDetailsCheckBox.Checked) {
    286299        splitContainer.Panel2Collapsed = false;
     
    295308
    296309    #region Content Events
    297     protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
     310    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    298311      if (InvokeRequired)
    299312        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
     
    309322      }
    310323    }
    311     protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
     324    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    312325      if (InvokeRequired)
    313326        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved), sender, e);
     
    316329        foreach (IRun item in e.Items) {
    317330          //remove only the first matching ListViewItem, because the IRun could be contained multiple times in the ItemCollection
    318           ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
    319           if (listviewItem != null)
    320             RemoveListViewItem(listviewItem);
     331          ListViewItem listViewItem = GetListViewItemsForItem(item).FirstOrDefault();
     332          if (listViewItem != null) RemoveListViewItem(listViewItem);
    321333        }
    322334        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
     
    325337      }
    326338    }
    327     protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
     339    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    328340      if (InvokeRequired)
    329341        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset), sender, e);
     
    331343        DeregisterRunEvents(e.OldItems);
    332344        foreach (IRun item in e.OldItems) {
    333           //remove only the first matching ListViewItem, because the IRun could be contained multiple times in the ItemCollection
    334           ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
    335           if (listviewItem != null)
    336             RemoveListViewItem(listviewItem);
     345          ListViewItem listViewItem = GetListViewItemsForItem(item).FirstOrDefault();
     346          if (listViewItem != null) RemoveListViewItem(listViewItem);
    337347        }
    338348        RegisterRunEvents(e.Items);
     
    349359
    350360    #region Item Events
    351     protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
     361    private void Item_ItemImageChanged(object sender, EventArgs e) {
    352362      if (InvokeRequired)
    353363        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
     
    358368      }
    359369    }
    360     protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
     370    private void Item_ToStringChanged(object sender, EventArgs e) {
    361371      if (InvokeRequired)
    362372        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
     
    368378      }
    369379    }
    370     protected virtual void Run_Changed(object sender, EventArgs e) {
     380    private void Run_Changed(object sender, EventArgs e) {
    371381      if (InvokeRequired)
    372382        this.Invoke(new EventHandler(Run_Changed), sender, e);
     
    377387    }
    378388
    379     protected virtual void UpdateRun(IRun run) {
     389    private void UpdateRun(IRun run) {
    380390      foreach (ListViewItem listViewItem in GetListViewItemsForItem(run)) {
    381391        if (run.Visible) {
     
    391401
    392402    #region Helpers
    393     protected virtual void AdjustListViewColumnSizes() {
     403    private void AdjustListViewColumnSizes() {
    394404      if (itemsListView.Items.Count > 0) {
    395405        for (int i = 0; i < itemsListView.Columns.Count; i++) {
Note: See TracChangeset for help on using the changeset viewer.