Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2713 was 2713, checked in by swagner, 14 years ago

Adapted HL 3.3 plugins according to changes in MainForm (#857)

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