Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/HeuristicLab.Core.Views/3.3/ItemListView.cs @ 17008

Last change on this file since 17008 was 17008, checked in by abeham, 5 years ago

#2949: Disable autosizing when there is only one column and use width of list view as size of column. In addition no update occurs on ToStringChanged when there is only one column (most common case)

File size: 23.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections;
24using System.Collections.Generic;
25using System.Drawing;
26using System.Linq;
27using System.Text;
28using System.Windows.Forms;
29using HeuristicLab.Collections;
30using HeuristicLab.Common;
31using HeuristicLab.MainForm;
32using HeuristicLab.PluginInfrastructure;
33
34namespace HeuristicLab.Core.Views {
35  [View("ItemList View")]
36  [Content(typeof(ItemList<>), true)]
37  [Content(typeof(IItemList<>), false)]
38  [Content(typeof(ReadOnlyItemList<>), true)]
39  public partial class ItemListView<T> : ItemView where T : class, IItem {
40    protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
41    protected TypeSelectorDialog typeSelectorDialog;
42    protected bool validDragOperation;
43
44    public new IItemList<T> Content {
45      get { return (IItemList<T>)base.Content; }
46      set { base.Content = value; }
47    }
48
49    public ListView ItemsListView {
50      get { return itemsListView; }
51    }
52
53    public ItemListView() {
54      InitializeComponent();
55      itemListViewItemMapping = new Dictionary<T, List<ListViewItem>>();
56    }
57
58    protected override void Dispose(bool disposing) {
59      if (disposing) {
60        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
61        if (components != null) components.Dispose();
62      }
63      base.Dispose(disposing);
64    }
65
66    protected override void DeregisterContentEvents() {
67      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
68      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
69      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
70      Content.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
71      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
72      foreach (T item in itemListViewItemMapping.Keys) {
73        DeregisterItemEvents(item);
74      }
75      base.DeregisterContentEvents();
76    }
77    protected override void RegisterContentEvents() {
78      base.RegisterContentEvents();
79      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
80      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
81      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
82      Content.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
83      Content.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
84    }
85    protected virtual void DeregisterItemEvents(T item) {
86      item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
87      item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
88    }
89    protected virtual void RegisterItemEvents(T item) {
90      item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
91      item.ToStringChanged += new EventHandler(Item_ToStringChanged);
92    }
93
94    protected override void OnContentChanged() {
95      base.OnContentChanged();
96
97      int selectedIndex = -1;
98      if (itemsListView.SelectedItems.Count == 1) selectedIndex = itemsListView.SelectedIndices[0];
99
100      itemsListView.Items.Clear();
101      itemListViewItemMapping.Clear();
102      RebuildImageList();
103      viewHost.Content = null;
104      if (Content != null) {
105        foreach (T item in Content)
106          AddListViewItem(CreateListViewItem(item));
107        AdjustListViewColumnSizes();
108        if ((selectedIndex != -1) && (selectedIndex < itemsListView.Items.Count))
109          itemsListView.Items[selectedIndex].Selected = true;
110      }
111      SetEnabledStateOfControls();
112    }
113
114    protected override void SetEnabledStateOfControls() {
115      base.SetEnabledStateOfControls();
116      if (Content == null) {
117        addButton.Enabled = false;
118        moveUpButton.Enabled = false;
119        moveDownButton.Enabled = false;
120        removeButton.Enabled = false;
121        itemsListView.Enabled = false;
122        detailsGroupBox.Enabled = false;
123      } else {
124        addButton.Enabled = !Content.IsReadOnly && !ReadOnly;
125        moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
126                               itemsListView.SelectedIndices[0] != 0 &&
127                               !Content.IsReadOnly && !ReadOnly;
128        moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
129                                 itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
130                                 !Content.IsReadOnly && !ReadOnly;
131        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
132                               !Content.IsReadOnly && !ReadOnly;
133        itemsListView.Enabled = true;
134        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
135      }
136    }
137
138    protected virtual T CreateItem() {
139      if (typeSelectorDialog == null) {
140        typeSelectorDialog = new TypeSelectorDialog();
141        typeSelectorDialog.Caption = "Select Item";
142        typeSelectorDialog.TypeSelector.Caption = "Available Items";
143        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
144      }
145
146      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
147        try {
148          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
149        } catch (Exception ex) {
150          ErrorHandling.ShowErrorDialog(this, ex);
151        }
152      }
153      return null;
154    }
155    protected virtual ListViewItem CreateListViewItem(T item) {
156      ListViewItem listViewItem = new ListViewItem();
157      if (item == null) {
158        listViewItem.Text = "null";
159        itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
160        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
161      } else {
162        listViewItem.Text = item.ToString();
163        listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
164        itemsListView.SmallImageList.Images.Add(item.ItemImage);
165        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
166        listViewItem.Tag = item;
167      }
168      return listViewItem;
169    }
170    protected virtual void AddListViewItem(ListViewItem listViewItem) {
171      if (listViewItem == null) throw new ArgumentNullException();
172      T item = (listViewItem.Tag as T);
173      itemsListView.Items.Add(listViewItem);
174      if (item != null) {
175        if (!itemListViewItemMapping.ContainsKey(item)) {
176          RegisterItemEvents(item);
177          itemListViewItemMapping.Add(item, new List<ListViewItem>());
178        }
179        itemListViewItemMapping[item].Add(listViewItem);
180      }
181    }
182    protected virtual void InsertListViewItem(int index, ListViewItem listViewItem) {
183      if (listViewItem == null) throw new ArgumentNullException();
184      T item = (listViewItem.Tag as T);
185      itemsListView.Items.Insert(index, listViewItem);
186      if (item != null) {
187        if (!itemListViewItemMapping.ContainsKey(item)) {
188          RegisterItemEvents(item);
189          itemListViewItemMapping.Add(item, new List<ListViewItem>());
190        }
191        itemListViewItemMapping[item].Add(listViewItem);
192      }
193    }
194    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
195      if (listViewItem == null) throw new ArgumentNullException();
196      T item = (listViewItem.Tag as T);
197      if (item != null) {
198        itemListViewItemMapping[item].Remove(listViewItem);
199        if (itemListViewItemMapping[item].Count == 0) {
200          itemListViewItemMapping.Remove(item);
201          DeregisterItemEvents(item);
202        }
203      }
204      listViewItem.Remove();
205    }
206    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
207      if (listViewItem == null) throw new ArgumentNullException();
208      T item = listViewItem.Tag as T;
209      int i = listViewItem.ImageIndex;
210      itemsListView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
211      listViewItem.ImageIndex = -1;
212      listViewItem.ImageIndex = i;
213    }
214    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
215      if (listViewItem == null) throw new ArgumentNullException();
216      T item = listViewItem.Tag as T;
217      listViewItem.Text = item == null ? "null" : item.ToString();
218      listViewItem.ToolTipText = item == null ? string.Empty : item.ItemName + ": " + item.ItemDescription;
219    }
220    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(T item) {
221      if (item == null) {
222        List<ListViewItem> listViewItems = new List<ListViewItem>();
223        foreach (ListViewItem listViewItem in itemsListView.Items) {
224          if (listViewItem.Tag == null) listViewItems.Add(listViewItem);
225        }
226        return listViewItems;
227      } else {
228        List<ListViewItem> listViewItems = null;
229        itemListViewItemMapping.TryGetValue(item, out listViewItems);
230        return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
231      }
232    }
233
234    #region ListView Events
235    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
236      moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
237                             itemsListView.SelectedIndices[0] != 0 &&
238                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
239      moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
240                               itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
241                               (Content != null) && !Content.IsReadOnly && !ReadOnly;
242      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
243                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
244     
245      if (showDetailsCheckBox.Checked) {
246        if (itemsListView.SelectedItems.Count == 1) {
247          T item = (T)itemsListView.SelectedItems[0].Tag;
248          detailsGroupBox.Enabled = true;
249          viewHost.Content = item;
250        } else {
251          viewHost.Content = null;
252          detailsGroupBox.Enabled = false;
253        }
254      }
255    }
256
257    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
258      if (e.KeyCode == Keys.Delete) {
259        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
260          foreach (ListViewItem item in itemsListView.SelectedItems)
261            Content.RemoveAt(item.Index);
262        }
263      } else if (e.KeyData == (Keys.Control | Keys.C)) {
264        if (itemsListView.SelectedItems.Count > 0) {
265          var builder = new StringBuilder();
266          foreach (ListViewItem selected in itemsListView.SelectedItems) {
267            builder.AppendLine(selected.Text);
268          }
269          Clipboard.SetText(builder.ToString());
270        }
271      }
272    }
273
274    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
275      if (itemsListView.SelectedItems.Count == 1) {
276        T item = itemsListView.SelectedItems[0].Tag as T;
277        if (item != null) {
278          IContentView view = MainFormManager.MainForm.ShowContent(item);
279          if (view != null) {
280            view.ReadOnly = ReadOnly;
281            view.Locked = Locked;
282          }
283        }
284      }
285    }
286
287    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
288      if (!Locked) {
289        List<T> items = new List<T>();
290        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
291          T item = listViewItem.Tag as T;
292          if (item != null) items.Add(item);
293        }
294
295        if (items.Count > 0) {
296          DataObject data = new DataObject();
297          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
298          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
299          if (Content.IsReadOnly || ReadOnly) {
300            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
301          } else {
302            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
303            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
304              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray()) {
305                if (listViewItem.Tag != null) Content.RemoveAt(listViewItem.Index);
306              }
307            }
308          }
309        }
310      }
311    }
312    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
313      validDragOperation = false;
314      if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T)) {
315        validDragOperation = true;
316      } else if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable)) {
317        validDragOperation = true;
318        IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
319        foreach (object item in items)
320          validDragOperation = validDragOperation && (item is T);
321      }
322    }
323    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
324      e.Effect = DragDropEffects.None;
325      if (validDragOperation) {
326        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
327        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
328        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
329        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
330        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
331      }
332    }
333    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
334      if (e.Effect != DragDropEffects.None) {
335        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
336        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
337
338        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
339          T item = (T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
340          if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
341          else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
342        } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
343          IEnumerable<T> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<T>();
344          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
345            Cloner cloner = new Cloner();
346            items = items.Select(x => cloner.Clone(x));
347          }
348          foreach (T item in items) {
349            if (listViewItem != null) Content.Insert(listViewItem.Index, item);
350            else Content.Add(item);
351          }
352        }
353      }
354    }
355    protected virtual void itemsListView_Layout(object sender, LayoutEventArgs e) {
356      if (itemsListView.Columns.Count == 1)
357        AdjustListViewColumnSizes();
358    }
359    #endregion
360
361    #region Button Events
362    protected virtual void addButton_Click(object sender, EventArgs e) {
363      T item = CreateItem();
364      if (item != null)
365        Content.Add(item);
366    }
367    protected virtual void moveUpButton_Click(object sender, EventArgs e) {
368      if (itemsListView.SelectedItems.Count == 1) {
369        int index = itemsListView.SelectedIndices[0];
370        Content.Reverse(index - 1, 2);
371        itemsListView.Items[index].Selected = false;
372        itemsListView.Items[index - 1].Selected = true;
373      }
374    }
375    protected virtual void moveDownButton_Click(object sender, EventArgs e) {
376      if (itemsListView.SelectedItems.Count == 1) {
377        int index = itemsListView.SelectedIndices[0];
378        Content.Reverse(index, 2);
379        itemsListView.Items[index].Selected = false;
380        itemsListView.Items[index + 1].Selected = true;
381      }
382    }
383    protected virtual void removeButton_Click(object sender, EventArgs e) {
384      if (itemsListView.SelectedItems.Count > 0) {
385        foreach (ListViewItem item in itemsListView.SelectedItems)
386          Content.RemoveAt(item.Index);
387      }
388    }
389    #endregion
390
391    #region CheckBox Events
392    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
393      if (showDetailsCheckBox.Checked) {
394        splitContainer.Panel2Collapsed = false;
395        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
396        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? (T)itemsListView.SelectedItems[0].Tag : null;
397      } else {
398        splitContainer.Panel2Collapsed = true;
399        viewHost.Content = null;
400      }
401    }
402    #endregion
403
404    #region Content Events
405    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
406      if (InvokeRequired)
407        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded), sender, e);
408      else {
409        foreach (IndexedItem<T> item in e.Items)
410          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
411        AdjustListViewColumnSizes();
412      }
413    }
414    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
415      if (InvokeRequired)
416        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved), sender, e);
417      else {
418        List<ListViewItem> listViewItems = new List<ListViewItem>();
419        foreach (IndexedItem<T> item in e.Items)
420          listViewItems.Add(itemsListView.Items[item.Index]);
421        foreach (ListViewItem listViewItem in listViewItems)
422          RemoveListViewItem(listViewItem);
423        RebuildImageList();
424      }
425    }
426    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
427      if (InvokeRequired)
428        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced), sender, e);
429      else {
430        int[] selected = new int[itemsListView.SelectedIndices.Count];
431        itemsListView.SelectedIndices.CopyTo(selected, 0);
432
433        List<ListViewItem> listViewItems = new List<ListViewItem>();
434        foreach (IndexedItem<T> item in e.OldItems)
435          listViewItems.Add(itemsListView.Items[item.Index]);
436        foreach (ListViewItem listViewItem in listViewItems)
437          RemoveListViewItem(listViewItem);
438        RebuildImageList();
439
440        foreach (IndexedItem<T> item in e.Items)
441          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
442        AdjustListViewColumnSizes();
443
444        for (int i = 0; i < selected.Length; i++)
445          itemsListView.Items[selected[i]].Selected = true;
446      }
447    }
448    protected virtual void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
449      if (InvokeRequired)
450        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved), sender, e);
451      else {
452        foreach (IndexedItem<T> item in e.Items) {
453          ListViewItem listViewItem = itemsListView.Items[item.Index];
454          if (listViewItem.Tag != null)
455            itemListViewItemMapping[(T)listViewItem.Tag].Remove(listViewItem);
456          listViewItem.Tag = item.Value;
457          if (listViewItem.Tag != null)
458            itemListViewItemMapping[item.Value].Add(listViewItem);
459          UpdateListViewItemImage(listViewItem);
460          UpdateListViewItemText(listViewItem);
461        }
462      }
463    }
464    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
465      if (InvokeRequired)
466        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset), sender, e);
467      else {
468        List<ListViewItem> listViewItems = new List<ListViewItem>();
469        foreach (IndexedItem<T> item in e.OldItems)
470          listViewItems.Add(itemsListView.Items[item.Index]);
471        foreach (ListViewItem listViewItem in listViewItems)
472          RemoveListViewItem(listViewItem);
473        RebuildImageList();
474
475        foreach (IndexedItem<T> item in e.Items)
476          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
477        AdjustListViewColumnSizes();
478      }
479    }
480    #endregion
481
482    #region Item Events
483    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
484      if (InvokeRequired)
485        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
486      else {
487        T item = (T)sender;
488        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
489          UpdateListViewItemImage(listViewItem);
490      }
491    }
492    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
493      if (InvokeRequired)
494        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
495      else {
496        T item = (T)sender;
497        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
498          UpdateListViewItemText(listViewItem);
499        if (itemsListView.Columns.Count > 1)
500          AdjustListViewColumnSizes();
501      }
502    }
503    #endregion
504
505    #region Helpers
506    protected virtual void AdjustListViewColumnSizes() {
507      if (itemsListView.Columns.Count == 1) {
508        if (itemsListView.Columns[0].Width != itemsListView.ClientSize.Width)
509          itemsListView.Columns[0].Width = itemsListView.ClientSize.Width;
510      } else {
511        if (itemsListView.Items.Count > 0) {
512          for (int i = 0; i < itemsListView.Columns.Count; i++)
513            itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
514        }
515      }
516    }
517    protected virtual void RebuildImageList() {
518      itemsListView.SmallImageList.Images.Clear();
519      foreach (ListViewItem listViewItem in itemsListView.Items) {
520        T item = listViewItem.Tag as T;
521        itemsListView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
522        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
523      }
524    }
525    #endregion
526  }
527}
Note: See TracBrowser for help on using the repository browser.