Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs @ 3350

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

implemented first version of View.ReadOnly and adapted some views to the new mechanism (ticket #973)

File size: 12.6 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.Linq;
25using System.Windows.Forms;
26using HeuristicLab.Collections;
27using HeuristicLab.MainForm;
28using HeuristicLab.MainForm.WindowsForms;
29
30namespace HeuristicLab.Core.Views {
31  [View("ItemCollection View")]
32  [Content(typeof(ItemCollection<>), true)]
33  [Content(typeof(IObservableCollection<>), false)]
34  public partial class ItemCollectionView<T> : AsynchronousContentView where T : class, IItem {
35    public new IObservableCollection<T> Content {
36      get { return (IObservableCollection<T>)base.Content; }
37      set { base.Content = value; }
38    }
39
40    public ListView ItemsListView {
41      get { return itemsListView; }
42    }
43
44    public ItemCollectionView() {
45      InitializeComponent();
46      Caption = "Item Collection";
47    }
48
49    public ItemCollectionView(IObservableCollection<T> content)
50      : this() {
51      Content = content;
52    }
53
54    protected override void DeregisterContentEvents() {
55      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
56      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
57      Content.CollectionReset -= new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
58      base.DeregisterContentEvents();
59    }
60    protected override void RegisterContentEvents() {
61      base.RegisterContentEvents();
62      Content.ItemsAdded += new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
63      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
64      Content.CollectionReset += new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
65    }
66
67    protected override void OnContentChanged() {
68      base.OnContentChanged();
69      Caption = "Item Collection";
70      while (itemsListView.Items.Count > 0) RemoveListViewItem(itemsListView.Items[0]);
71      viewHost.Content = null;
72      if (Content != null) {
73        Caption += " (" + Content.GetType().Name + ")";
74        foreach (T item in Content)
75          AddListViewItem(CreateListViewItem(item));
76        SortItemsListView(SortOrder.Ascending);
77      }
78      SetEnableStateOfControls();
79    }
80
81    protected override void OnReadOnlyChanged() {
82      base.OnReadOnlyChanged();
83      SetEnableStateOfControls();
84    }
85    private void SetEnableStateOfControls() {
86      if (Content == null) {
87        itemsListView.Enabled = false;
88        detailsGroupBox.Enabled = false;
89        sortAscendingButton.Enabled = itemsListView.Items.Count > 0;
90        sortDescendingButton.Enabled = itemsListView.Items.Count > 0;
91        viewHost.Enabled = false;
92        addButton.Enabled = false;
93        removeButton.Enabled = false;
94      } else {
95        itemsListView.Enabled = true;
96        detailsGroupBox.Enabled = true;
97        sortAscendingButton.Enabled = true;
98        sortDescendingButton.Enabled = true;
99        viewHost.Enabled = true;
100        viewHost.ReadOnly = ReadOnly;
101        addButton.Enabled = !ReadOnly;
102        removeButton.Enabled = !ReadOnly;
103      }
104    }
105
106    protected virtual T CreateItem() {
107      try {
108        return (T)Activator.CreateInstance(typeof(T));
109      } catch(Exception ex) {
110        Auxiliary.ShowErrorMessageBox(ex);
111        return null;
112      }
113    }
114    protected virtual ListViewItem CreateListViewItem(T item) {
115      ListViewItem listViewItem = new ListViewItem();
116      listViewItem.Text = item.ToString();
117      listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
118      listViewItem.Tag = item;
119      itemsListView.SmallImageList.Images.Add(item.ItemImage);
120      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
121      return listViewItem;
122    }
123    protected virtual void AddListViewItem(ListViewItem listViewItem) {
124      itemsListView.Items.Add(listViewItem);
125      ((T)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
126      ((T)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
127      sortAscendingButton.Enabled = itemsListView.Items.Count > 0;
128      sortDescendingButton.Enabled = itemsListView.Items.Count > 0;
129    }
130    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
131      ((T)listViewItem.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
132      ((T)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
133      listViewItem.Remove();
134      foreach (ListViewItem other in itemsListView.Items)
135        if (other.ImageIndex > listViewItem.ImageIndex) other.ImageIndex--;
136      itemsListView.SmallImageList.Images.RemoveAt(listViewItem.ImageIndex);
137      sortAscendingButton.Enabled = itemsListView.Items.Count > 0;
138      sortDescendingButton.Enabled = itemsListView.Items.Count > 0;
139    }
140    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
141      int i = listViewItem.ImageIndex;
142      listViewItem.ImageList.Images[i] = ((T)listViewItem.Tag).ItemImage;
143      listViewItem.ImageIndex = -1;
144      listViewItem.ImageIndex = i;
145    }
146    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
147      if (!listViewItem.Text.Equals(listViewItem.Tag.ToString()))
148        listViewItem.Text = listViewItem.Tag.ToString();
149    }
150    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(T item) {
151      foreach (ListViewItem listViewItem in itemsListView.Items) {
152        if (((T)listViewItem.Tag) == item)
153          yield return listViewItem;
154      }
155    }
156
157    #region ListView Events
158    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
159      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && !Content.IsReadOnly;
160      if (itemsListView.SelectedItems.Count == 1) {
161        T item = (T)itemsListView.SelectedItems[0].Tag;
162        detailsGroupBox.Enabled = true;
163        viewHost.ViewType = null;
164        viewHost.Content = item;
165      } else {
166        viewHost.Content = null;
167        detailsGroupBox.Enabled = false;
168      }
169    }
170    protected virtual void itemsListView_SizeChanged(object sender, EventArgs e) {
171      if (itemsListView.Columns.Count > 0)
172        itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
173    }
174    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
175      if (e.KeyCode == Keys.Delete) {
176        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly) {
177          foreach (ListViewItem item in itemsListView.SelectedItems)
178            Content.Remove((T)item.Tag);
179        }
180      }
181    }
182    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
183      if (itemsListView.SelectedItems.Count == 1) {
184        T item = (T)itemsListView.SelectedItems[0].Tag;
185        IView view = MainFormManager.CreateDefaultView(item);
186        if (view != null) view.Show();
187      }
188    }
189    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
190      ListViewItem listViewItem = (ListViewItem)e.Item;
191      T item = (T)listViewItem.Tag;
192      DataObject data = new DataObject();
193      data.SetData("Type", item.GetType());
194      data.SetData("Value", item);
195      if (Content.IsReadOnly) {
196        DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
197      } else {
198        DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
199        if ((result & DragDropEffects.Move) == DragDropEffects.Move)
200          Content.Remove(item);
201      }
202    }
203    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
204      e.Effect = DragDropEffects.None;
205      Type type = e.Data.GetData("Type") as Type;
206      if ((!Content.IsReadOnly) && (type != null) && (typeof(T).IsAssignableFrom(type))) {
207        if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Copy;  // CTRL key
208        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
209        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
210        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
211        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
212      }
213    }
214    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
215      if (e.Effect != DragDropEffects.None) {
216        T item = e.Data.GetData("Value") as T;
217        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
218        Content.Add(item);
219      }
220    }
221    #endregion
222
223    #region Button Events
224    protected virtual void addButton_Click(object sender, EventArgs e) {
225      T item = CreateItem();
226      if (item != null)
227        Content.Add(item);
228    }
229    protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
230      SortItemsListView(SortOrder.Ascending);
231    }
232    protected virtual void sortDescendingButton_Click(object sender, EventArgs e) {
233      SortItemsListView(SortOrder.Descending);
234    }
235    protected virtual void removeButton_Click(object sender, EventArgs e) {
236      if (itemsListView.SelectedItems.Count > 0) {
237        foreach (ListViewItem item in itemsListView.SelectedItems)
238          Content.Remove((T)item.Tag);
239        itemsListView.SelectedItems.Clear();
240      }
241    }
242    #endregion
243
244    #region Content Events
245    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
246      if (InvokeRequired)
247        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded), sender, e);
248      else
249        foreach (T item in e.Items)
250          AddListViewItem(CreateListViewItem(item));
251    }
252    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
253      if (InvokeRequired)
254        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved), sender, e);
255      else {
256        foreach (T item in e.Items) {
257          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
258            RemoveListViewItem(listViewItem);
259            break;
260          }
261        }
262      }
263    }
264    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
265      if (InvokeRequired)
266        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CollectionReset), sender, e);
267      else {
268        foreach (T item in e.OldItems) {
269          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
270            RemoveListViewItem(listViewItem);
271            break;
272          }
273        }
274        foreach (T item in e.Items)
275          AddListViewItem(CreateListViewItem(item));
276      }
277    }
278    #endregion
279
280    #region Item Events
281    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
282      if (InvokeRequired)
283        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
284      else {
285        T item = (T)sender;
286        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
287          UpdateListViewItemImage(listViewItem);
288      }
289    }
290    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
291      if (InvokeRequired)
292        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
293      else {
294        T item = (T)sender;
295        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
296          UpdateListViewItemText(listViewItem);
297      }
298    }
299    #endregion
300
301    #region Helpers
302    protected virtual void SortItemsListView(SortOrder sortOrder) {
303      itemsListView.Sorting = SortOrder.None;
304      itemsListView.Sorting = sortOrder;
305      itemsListView.Sorting = SortOrder.None;
306    }
307    #endregion
308  }
309}
Note: See TracBrowser for help on using the repository browser.