Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 3982 was 3904, checked in by mkommend, 14 years ago

Added SetEnabledStateOfControls as protected virtual method in !View. Therefore the overloading of OnReadOnlyChanged and OnLockedChanged got obsolete in most views, because the method got called in the !View respectively ContentView. (ticket #1021)

File size: 17.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Generic;
24using System.Drawing;
25using System.Windows.Forms;
26using HeuristicLab.Collections;
27using HeuristicLab.MainForm;
28using HeuristicLab.MainForm.WindowsForms;
29using HeuristicLab.PluginInfrastructure;
30
31namespace HeuristicLab.Core.Views {
32  /// <summary>
33  /// The visual representation of all variables in a specified scope.
34  /// </summary>
35  [View("ItemList View")]
36  [Content(typeof(ItemList<>), true)]
37  [Content(typeof(IItemList<>), false)]
38  public partial class ItemListView<T> : ItemView where T : class, IItem {
39    protected TypeSelectorDialog typeSelectorDialog;
40
41    /// <summary>
42    /// Gets or sets the scope whose variables to represent visually.
43    /// </summary>
44    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
45    /// No won data storage present.</remarks>
46    public new IItemList<T> Content {
47      get { return (IItemList<T>)base.Content; }
48      set { base.Content = value; }
49    }
50
51    public ListView ItemsListView {
52      get { return itemsListView; }
53    }
54
55    /// <summary>
56    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
57    /// </summary>
58    public ItemListView() {
59      InitializeComponent();
60    }
61
62    /// <summary>
63    /// Removes the eventhandlers from the underlying <see cref="IScope"/>.
64    /// </summary>
65    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
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      base.DeregisterContentEvents();
73    }
74
75    /// <summary>
76    /// Adds eventhandlers to the underlying <see cref="IScope"/>.
77    /// </summary>
78    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
79    protected override void RegisterContentEvents() {
80      base.RegisterContentEvents();
81      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
82      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
83      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
84      Content.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
85      Content.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
86    }
87
88    protected override void OnContentChanged() {
89      base.OnContentChanged();
90
91      int selectedIndex = -1;
92      if (itemsListView.SelectedItems.Count == 1) selectedIndex = itemsListView.SelectedIndices[0];
93
94      while (itemsListView.Items.Count > 0) RemoveListViewItem(itemsListView.Items[0]);
95      viewHost.Content = null;
96      if (Content != null) {
97        foreach (T item in Content)
98          AddListViewItem(CreateListViewItem(item));
99        if ((selectedIndex != -1) && (selectedIndex < itemsListView.Items.Count))
100          itemsListView.Items[selectedIndex].Selected = true;
101      }
102      SetEnabledStateOfControls();
103    }
104
105    protected override void SetEnabledStateOfControls() {
106      base.SetEnabledStateOfControls();
107      if (Content == null) {
108        addButton.Enabled = false;
109        moveUpButton.Enabled = false;
110        moveDownButton.Enabled = false;
111        removeButton.Enabled = false;
112        itemsListView.Enabled = false;
113        detailsGroupBox.Enabled = false;
114      } else {
115        addButton.Enabled = !Content.IsReadOnly && !ReadOnly;
116        moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
117                               itemsListView.SelectedIndices[0] != 0 &&
118                               !Content.IsReadOnly && !ReadOnly;
119        moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
120                                 itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
121                                 !Content.IsReadOnly && !ReadOnly;
122        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
123                               !Content.IsReadOnly && !ReadOnly;
124        itemsListView.Enabled = true;
125        detailsGroupBox.Enabled = true;
126      }
127    }
128
129    protected virtual T CreateItem() {
130      if (typeSelectorDialog == null) {
131        typeSelectorDialog = new TypeSelectorDialog();
132        typeSelectorDialog.Caption = "Select Item";
133        typeSelectorDialog.TypeSelector.Caption = "Available Items";
134        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
135      }
136
137      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
138        try {
139          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
140        }
141        catch (Exception ex) {
142          ErrorHandling.ShowErrorDialog(this, ex);
143        }
144      }
145      return null;
146    }
147    protected virtual ListViewItem CreateListViewItem(T item) {
148      ListViewItem listViewItem = new ListViewItem();
149      listViewItem.Text = item.ToString();
150      listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
151      listViewItem.Tag = item;
152      itemsListView.SmallImageList.Images.Add(item.ItemImage);
153      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
154      return listViewItem;
155    }
156    protected virtual void AddListViewItem(ListViewItem listViewItem) {
157      itemsListView.Items.Add(listViewItem);
158      ((T)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
159      ((T)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
160      AdjustListViewColumnSizes();
161    }
162    protected virtual void InsertListViewItem(int index, ListViewItem listViewItem) {
163      itemsListView.Items.Insert(index, listViewItem);
164      ((T)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
165      ((T)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
166      AdjustListViewColumnSizes();
167    }
168    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
169      ((T)listViewItem.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
170      ((T)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
171      listViewItem.Remove();
172      foreach (ListViewItem other in itemsListView.Items)
173        if (other.ImageIndex > listViewItem.ImageIndex) other.ImageIndex--;
174      itemsListView.SmallImageList.Images.RemoveAt(listViewItem.ImageIndex);
175    }
176    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
177      int i = listViewItem.ImageIndex;
178      listViewItem.ImageList.Images[i] = ((T)listViewItem.Tag).ItemImage;
179      listViewItem.ImageIndex = -1;
180      listViewItem.ImageIndex = i;
181    }
182    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
183      if (!listViewItem.Text.Equals(listViewItem.Tag.ToString()))
184        listViewItem.Text = listViewItem.Tag.ToString();
185    }
186
187    #region ListView Events
188    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
189      moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
190                             itemsListView.SelectedIndices[0] != 0 &&
191                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
192      moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
193                               itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
194                               (Content != null) && !Content.IsReadOnly && !ReadOnly;
195      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
196                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
197      AdjustListViewColumnSizes();
198
199      if (itemsListView.SelectedItems.Count == 1) {
200        T item = (T)itemsListView.SelectedItems[0].Tag;
201        detailsGroupBox.Enabled = true;
202        viewHost.Content = item;
203      } else {
204        viewHost.Content = null;
205        detailsGroupBox.Enabled = false;
206      }
207    }
208
209    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
210      if (e.KeyCode == Keys.Delete) {
211        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
212          foreach (ListViewItem item in itemsListView.SelectedItems)
213            Content.RemoveAt(item.Index);
214        }
215      }
216    }
217
218    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
219      if (itemsListView.SelectedItems.Count == 1) {
220        T item = (T)itemsListView.SelectedItems[0].Tag;
221        IContentView view = MainFormManager.MainForm.ShowContent(item);
222        if (view != null) {
223          view.ReadOnly = ReadOnly;
224          view.Locked = Locked;
225        }
226      }
227    }
228
229    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
230      if (!Locked) {
231        ListViewItem listViewItem = (ListViewItem)e.Item;
232        T item = (T)listViewItem.Tag;
233        DataObject data = new DataObject();
234        data.SetData("Type", item.GetType());
235        data.SetData("Value", item);
236        if (Content.IsReadOnly || ReadOnly) {
237          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
238        } else {
239          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
240          if ((result & DragDropEffects.Move) == DragDropEffects.Move)
241            Content.RemoveAt(listViewItem.Index);
242        }
243      }
244    }
245    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
246      e.Effect = DragDropEffects.None;
247      Type type = e.Data.GetData("Type") as Type;
248      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
249        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
250        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
251        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
252        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
253        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
254      }
255    }
256    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
257      if (e.Effect != DragDropEffects.None) {
258        T item = e.Data.GetData("Value") as T;
259        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
260
261        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
262        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
263        if (listViewItem != null) Content.Insert(listViewItem.Index, item);
264        else Content.Add(item);
265      }
266    }
267    #endregion
268
269    #region Button Events
270    protected virtual void addButton_Click(object sender, EventArgs e) {
271      T item = CreateItem();
272      if (item != null)
273        Content.Add(item);
274    }
275    protected virtual void moveUpButton_Click(object sender, EventArgs e) {
276      if (itemsListView.SelectedItems.Count == 1) {
277        int index = itemsListView.SelectedIndices[0];
278        T item = Content[index - 1];
279        Content[index - 1] = Content[index];
280        itemsListView.Items[index].Selected = false;
281        itemsListView.Items[index - 1].Selected = true;
282        Content[index] = item;
283      }
284    }
285    protected virtual void moveDownButton_Click(object sender, EventArgs e) {
286      if (itemsListView.SelectedItems.Count == 1) {
287        int index = itemsListView.SelectedIndices[0];
288        T item = Content[index + 1];
289        Content[index + 1] = Content[index];
290        itemsListView.Items[index].Selected = false;
291        itemsListView.Items[index + 1].Selected = true;
292        Content[index] = item;
293      }
294    }
295    protected virtual void removeButton_Click(object sender, EventArgs e) {
296      if (itemsListView.SelectedItems.Count > 0) {
297        foreach (ListViewItem item in itemsListView.SelectedItems)
298          Content.RemoveAt(item.Index);
299      }
300    }
301    #endregion
302
303    #region Content Events
304    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
305      if (InvokeRequired)
306        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded), sender, e);
307      else
308        foreach (IndexedItem<T> item in e.Items)
309          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
310    }
311    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
312      if (InvokeRequired)
313        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved), sender, e);
314      else {
315        List<ListViewItem> listViewItems = new List<ListViewItem>();
316        foreach (IndexedItem<T> item in e.Items)
317          listViewItems.Add(itemsListView.Items[item.Index]);
318        foreach (ListViewItem listViewItem in listViewItems)
319          RemoveListViewItem(listViewItem);
320      }
321    }
322    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
323      if (InvokeRequired)
324        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced), sender, e);
325      else {
326        int[] selected = new int[itemsListView.SelectedIndices.Count];
327        itemsListView.SelectedIndices.CopyTo(selected, 0);
328
329        List<ListViewItem> listViewItems = new List<ListViewItem>();
330        foreach (IndexedItem<T> item in e.OldItems)
331          listViewItems.Add(itemsListView.Items[item.Index]);
332        foreach (ListViewItem listViewItem in listViewItems)
333          RemoveListViewItem(listViewItem);
334
335        foreach (IndexedItem<T> item in e.Items)
336          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
337
338        for (int i = 0; i < selected.Length; i++)
339          itemsListView.Items[selected[i]].Selected = true;
340      }
341    }
342    protected virtual void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
343      if (InvokeRequired)
344        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved), sender, e);
345      else {
346        foreach (IndexedItem<T> item in e.Items) {
347          ListViewItem listViewItem = itemsListView.Items[item.Index];
348          listViewItem.Tag = item.Value;
349          UpdateListViewItemImage(listViewItem);
350          UpdateListViewItemText(listViewItem);
351        }
352      }
353    }
354    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
355      if (InvokeRequired)
356        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset), sender, e);
357      else {
358        List<ListViewItem> listViewItems = new List<ListViewItem>();
359        foreach (IndexedItem<T> item in e.OldItems)
360          listViewItems.Add(itemsListView.Items[item.Index]);
361        foreach (ListViewItem listViewItem in listViewItems)
362          RemoveListViewItem(listViewItem);
363
364        foreach (IndexedItem<T> item in e.Items)
365          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
366      }
367    }
368    #endregion
369
370    #region Item Events
371    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
372      if (InvokeRequired)
373        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
374      else {
375        T item = (T)sender;
376        foreach (ListViewItem listViewItem in itemsListView.Items) {
377          if (((T)listViewItem.Tag) == item)
378            UpdateListViewItemImage(listViewItem);
379        }
380      }
381    }
382    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
383      if (InvokeRequired)
384        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
385      else {
386        T item = (T)sender;
387        foreach (ListViewItem listViewItem in itemsListView.Items) {
388          if (((T)listViewItem.Tag) == item)
389            UpdateListViewItemText(listViewItem);
390        }
391      }
392    }
393    #endregion
394
395    #region Helpers
396    protected virtual void AdjustListViewColumnSizes() {
397      if (itemsListView.Items.Count > 0) {
398        for (int i = 0; i < itemsListView.Columns.Count; i++)
399          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
400      }
401    }
402    #endregion
403  }
404}
Note: See TracBrowser for help on using the repository browser.