Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs @ 3904

Last change on this file since 3904 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: 16.1 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 HeuristicLab.Collections;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Core.Views;
26using HeuristicLab.MainForm;
27using HeuristicLab.MainForm.WindowsForms;
28using System.Windows.Forms;
29using System;
30using System.Drawing;
31using System.Collections.Generic;
32using System.Linq;
33
34namespace HeuristicLab.Optimization.Views {
35  [View("RunCollection View")]
36  [Content(typeof(RunCollection), true)]
37  [Content(typeof(IItemCollection<IRun>), false)]
38  public partial class RunCollectionView : ItemView {
39    public new IItemCollection<IRun> Content {
40      get { return (IItemCollection<IRun>)base.Content; }
41      set { base.Content = value; }
42    }
43
44    public RunCollection RunCollection {
45      get { return Content as RunCollection; }
46    }
47
48    public ListView ItemsListView {
49      get { return itemsListView; }
50    }
51
52    public RunCollectionView() {
53      InitializeComponent();
54      itemsGroupBox.Text = "Runs";
55    }
56
57    protected override void DeregisterContentEvents() {
58      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
59      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
60      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
61      DeregisterRunEvents(Content);
62      base.DeregisterContentEvents();
63    }
64    protected override void RegisterContentEvents() {
65      base.RegisterContentEvents();
66      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
67      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
68      Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
69      RegisterRunEvents(Content);
70    }
71    protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
72      foreach (IRun run in runs)
73        run.Changed += new EventHandler(Run_Changed);
74    }
75    protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
76      foreach (IRun run in runs)
77        run.Changed -= new EventHandler(Run_Changed);
78    }
79
80    protected override void OnInitialized(EventArgs e) {
81      base.OnInitialized(e);
82      var viewTypes = MainFormManager.GetViewTypes(typeof(RunCollection), true);
83      foreach (Type viewType in viewTypes.OrderBy(x => ViewAttribute.GetViewName(x))) {
84        if ((viewType != typeof(ItemCollectionView<IRun>)) && (viewType != typeof(ViewHost))) {
85          ToolStripMenuItem menuItem = new ToolStripMenuItem();
86          menuItem.Text = ViewAttribute.GetViewName(viewType);
87          menuItem.Tag = viewType;
88          menuItem.Click += new EventHandler(menuItem_Click);
89          analyzeRunsToolStripDropDownButton.DropDownItems.Add(menuItem);
90        }
91      }
92    }
93
94    protected override void OnContentChanged() {
95      base.OnContentChanged();
96
97      string selectedName = null;
98      if ((itemsListView.SelectedItems.Count == 1) && (itemsListView.SelectedItems[0].Tag != null))
99        selectedName = ((IRun)itemsListView.SelectedItems[0].Tag).Name;
100
101      while (itemsListView.Items.Count > 0) RemoveListViewItem(itemsListView.Items[0]);
102      viewHost.Content = null;
103
104      if (Content != null) {
105        if (RunCollection != null) {
106          if (!tabControl.TabPages.Contains(constraintPage))
107            tabControl.TabPages.Add(constraintPage);
108          runCollectionConstraintCollectionView.Content = RunCollection.Constraints;
109          runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
110        }
111        foreach (IRun item in Content) {
112          ListViewItem listViewItem = CreateListViewItem(item);
113          AddListViewItem(listViewItem);
114          UpdateRun(item);
115          if ((selectedName != null) && item.Name.Equals(selectedName))
116            listViewItem.Selected = true;
117        }
118      } else {
119        runCollectionConstraintCollectionView.Content = null;
120        if (tabControl.TabPages.Contains(constraintPage))
121          tabControl.TabPages.Remove(constraintPage);
122      }
123    }
124
125    protected override void SetEnabledStateOfControls() {
126      base.SetEnabledStateOfControls();
127      if (Content == null) {
128        analyzeRunsToolStripDropDownButton.Enabled = false;
129        runCollectionConstraintCollectionView.ReadOnly = true;
130        itemsListView.Enabled = false;
131        detailsGroupBox.Enabled = false;
132        viewHost.Enabled = false;
133        removeButton.Enabled = false;
134        clearButton.Enabled = false;
135      } else {
136        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
137        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
138        itemsListView.Enabled = true;
139        detailsGroupBox.Enabled = true;
140        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && !Content.IsReadOnly && !ReadOnly;
141        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
142        viewHost.Enabled = true;
143      }
144    }
145
146    protected virtual ListViewItem CreateListViewItem(IRun item) {
147      ListViewItem listViewItem = new ListViewItem();
148      listViewItem.Text = item.ToString();
149      listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
150      itemsListView.SmallImageList.Images.Add(item.ItemImage);
151      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
152      listViewItem.Tag = item;
153      return listViewItem;
154    }
155    protected virtual void AddListViewItem(ListViewItem listViewItem) {
156      itemsListView.Items.Add(listViewItem);
157      ((IRun)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
158      ((IRun)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
159      AdjustListViewColumnSizes();
160    }
161    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
162      ((IRun)listViewItem.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
163      ((IRun)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
164      listViewItem.Remove();
165      foreach (ListViewItem other in itemsListView.Items)
166        if (other.ImageIndex > listViewItem.ImageIndex) other.ImageIndex--;
167      itemsListView.SmallImageList.Images.RemoveAt(listViewItem.ImageIndex);
168    }
169    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
170      int i = listViewItem.ImageIndex;
171      listViewItem.ImageList.Images[i] = ((IRun)listViewItem.Tag).ItemImage;
172      listViewItem.ImageIndex = -1;
173      listViewItem.ImageIndex = i;
174    }
175    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
176      if (!listViewItem.Text.Equals(listViewItem.Tag.ToString()))
177        listViewItem.Text = listViewItem.Tag.ToString();
178    }
179    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(IRun item) {
180      foreach (ListViewItem listViewItem in itemsListView.Items) {
181        if (((IRun)listViewItem.Tag) == item)
182          yield return listViewItem;
183      }
184    }
185
186    #region ListView Events
187    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
188      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && (Content != null) && !Content.IsReadOnly && !ReadOnly;
189      AdjustListViewColumnSizes();
190      if (itemsListView.SelectedItems.Count == 1) {
191        IRun item = (IRun)itemsListView.SelectedItems[0].Tag;
192        detailsGroupBox.Enabled = true;
193        viewHost.Content = item;
194      } else {
195        viewHost.Content = null;
196        detailsGroupBox.Enabled = false;
197      }
198    }
199    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
200      if (e.KeyCode == Keys.Delete) {
201        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
202          foreach (ListViewItem item in itemsListView.SelectedItems)
203            Content.Remove((IRun)item.Tag);
204        }
205      }
206    }
207    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
208      if (itemsListView.SelectedItems.Count == 1) {
209        IRun item = (IRun)itemsListView.SelectedItems[0].Tag;
210        IContentView view = MainFormManager.MainForm.ShowContent(item);
211        if (view != null) {
212          view.ReadOnly = ReadOnly;
213          view.Locked = Locked;
214        }
215      }
216    }
217    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
218      if (!Locked) {
219        ListViewItem listViewItem = (ListViewItem)e.Item;
220        IRun item = (IRun)listViewItem.Tag;
221        DataObject data = new DataObject();
222        data.SetData("Type", item.GetType());
223        data.SetData("Value", item);
224        if (Content.IsReadOnly || ReadOnly) {
225          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
226        } else {
227          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
228          if ((result & DragDropEffects.Move) == DragDropEffects.Move)
229            Content.Remove(item);
230        }
231      }
232    }
233    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
234      e.Effect = DragDropEffects.None;
235      Type type = e.Data.GetData("Type") as Type;
236      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(IRun).IsAssignableFrom(type))) {
237        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
238        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
239        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
240        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
241        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
242      }
243    }
244    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
245      if (e.Effect != DragDropEffects.None) {
246        IRun item = e.Data.GetData("Value") as IRun;
247        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (IRun)item.Clone();
248        Content.Add(item);
249      }
250    }
251    #endregion
252
253    #region Button Events
254    protected virtual void menuItem_Click(object sender, EventArgs e) {
255      ToolStripMenuItem menuItem = (ToolStripMenuItem)sender;
256      Type viewType = (Type)menuItem.Tag;
257      IContentView view = MainFormManager.MainForm.ShowContent(Content, viewType);
258      if (view != null) {
259        view.Locked = Locked;
260        view.ReadOnly = ReadOnly;
261      }
262    }
263    protected virtual void removeButton_Click(object sender, EventArgs e) {
264      if (itemsListView.SelectedItems.Count > 0) {
265        foreach (ListViewItem item in itemsListView.SelectedItems)
266          Content.Remove((IRun)item.Tag);
267        itemsListView.SelectedItems.Clear();
268      }
269    }
270    protected virtual void clearButton_Click(object sender, EventArgs e) {
271      Content.Clear();
272    }
273    #endregion
274
275    #region Content Events
276    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
277      if (InvokeRequired)
278        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
279      else {
280        RegisterRunEvents(e.Items);
281        foreach (IRun item in e.Items)
282          AddListViewItem(CreateListViewItem(item));
283        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
284        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
285        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
286      }
287    }
288    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
289      if (InvokeRequired)
290        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved), sender, e);
291      else {
292        DeregisterRunEvents(e.Items);
293        foreach (IRun item in e.Items) {
294          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
295            RemoveListViewItem(listViewItem);
296            break;
297          }
298        }
299        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
300        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
301        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
302      }
303    }
304    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
305      if (InvokeRequired)
306        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset), sender, e);
307      else {
308        DeregisterRunEvents(e.OldItems);
309        foreach (IRun item in e.OldItems) {
310          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
311            RemoveListViewItem(listViewItem);
312            break;
313          }
314        }
315        RegisterRunEvents(e.Items);
316        foreach (IRun item in e.Items)
317          AddListViewItem(CreateListViewItem(item));
318        analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
319        clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
320        runCollectionConstraintCollectionView.ReadOnly = itemsListView.Items.Count == 0;
321      }
322    }
323    #endregion
324
325    #region Item Events
326    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
327      if (InvokeRequired)
328        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
329      else {
330        IRun item = (IRun)sender;
331        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
332          UpdateListViewItemImage(listViewItem);
333      }
334    }
335    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
336      if (InvokeRequired)
337        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
338      else {
339        IRun item = (IRun)sender;
340        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
341          UpdateListViewItemText(listViewItem);
342        AdjustListViewColumnSizes();
343      }
344    }
345    protected virtual void Run_Changed(object sender, EventArgs e) {
346      if (InvokeRequired)
347        this.Invoke(new EventHandler(Run_Changed), sender, e);
348      else {
349        IRun run = (IRun)sender;
350        UpdateRun(run);
351      }
352    }
353
354    protected virtual void UpdateRun(IRun run) {
355      foreach (ListViewItem listViewItem in GetListViewItemsForItem(run)) {
356        if (run.Visible) {
357          listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular);
358          listViewItem.ForeColor = run.Color;
359        } else {
360          listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
361          listViewItem.ForeColor = Color.LightGray;
362        }
363      }
364    }
365    #endregion
366
367    #region Helpers
368    protected virtual void AdjustListViewColumnSizes() {
369      if (itemsListView.Items.Count > 0) {
370        for (int i = 0; i < itemsListView.Columns.Count; i++) {
371          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
372        }
373      }
374    }
375    #endregion
376  }
377}
378
Note: See TracBrowser for help on using the repository browser.