Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs @ 2818

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

Operator architecture refactoring (#95)

  • corrected several bugs in order to get SGA working
File size: 5.4 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.Common;
27using HeuristicLab.MainForm;
28
29namespace HeuristicLab.Core.Views {
30  public sealed partial class ViewHost : UserControl {
31    private Dictionary<Type, ToolStripMenuItem> typeMenuItemTable;
32
33    public IEnumerable<Type> AvailableViewTypes {
34      get { return typeMenuItemTable.Keys; }
35    }
36
37    private Type viewType;
38    public Type ViewType {
39      get { return this.viewType; }
40      set {
41        if (!ViewCanShowContent(value, content))
42          throw new ArgumentException(string.Format("View \"{0}\" cannot display content \"{1}\".",
43                                                    value.GetPrettyName(),
44                                                    content.GetType().GetPrettyName()));
45        viewType = value;
46        UpdateView();
47      }
48    }
49
50    private object content;
51    public object Content {
52      get { return content; }
53      set {
54        if (value != content) {
55          content = value;
56          Initialize();
57        }
58      }
59    }
60
61    public ViewHost() {
62      typeMenuItemTable = new Dictionary<Type, ToolStripMenuItem>();
63      viewType = null;
64      content = null;
65      InitializeComponent();
66      Initialize();
67    }
68
69    private void Initialize() {
70      viewsLabel.Enabled = false;
71      viewsLabel.Visible = false;
72      typeMenuItemTable.Clear();
73      contextMenuStrip.Items.Clear();
74      contextMenuStrip.Enabled = false;
75      messageLabel.Visible = false;
76      if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose();
77      viewPanel.Controls.Clear();
78      viewPanel.Enabled = false;
79      viewPanel.Visible = false;
80
81      if (Content != null) {
82        var viewTypes = from t in MainFormManager.GetViewTypes(Content.GetType())
83                        orderby t.Name ascending
84                        select t;
85        foreach (Type v in viewTypes) {
86          ToolStripMenuItem item = new ToolStripMenuItem(v.GetPrettyName());
87          item.Name = v.FullName;
88          item.ToolTipText = v.GetPrettyName(true);
89          item.Tag = v;
90          contextMenuStrip.Items.Add(item);
91          typeMenuItemTable.Add(v, item);
92        }
93        if (contextMenuStrip.Items.Count == 0) {
94          messageLabel.Visible = true;
95        } else {
96          viewsLabel.Enabled = true;
97          viewsLabel.Visible = true;
98          contextMenuStrip.Enabled = true;
99          messageLabel.Visible = false;
100        }
101
102        if (!ViewCanShowContent(viewType, Content)) {
103          viewType = MainFormManager.GetDefaultViewType(Content.GetType());
104          if ((viewType == null) && (contextMenuStrip.Items.Count > 0))  // create first available view if default view is not available
105            viewType = (Type)contextMenuStrip.Items[0].Tag;
106        }
107        UpdateView();
108      }
109    }
110
111    private void UpdateView() {
112      if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose();
113      viewPanel.Controls.Clear();
114
115      if (viewType == null || content == null)
116        return;
117
118      if (!ViewCanShowContent(viewType, content))
119        throw new ArgumentException(string.Format("View \"{0}\" cannot display content \"{1}\".",
120                                                  viewType.GetPrettyName(),
121                                                  Content.GetType().GetPrettyName()));
122
123      foreach (ToolStripMenuItem item in typeMenuItemTable.Values) {
124        item.Checked = false;
125        item.Enabled = true;
126      }
127      typeMenuItemTable[viewType].Checked = true;
128      typeMenuItemTable[viewType].Enabled = false;
129
130      Control view = (Control)MainFormManager.CreateView(viewType, Content);
131      viewPanel.Controls.Add(view);
132      viewPanel.Tag = view;
133      view.Dock = DockStyle.Fill;
134      viewPanel.Enabled = true;
135      viewPanel.Visible = true;
136    }
137
138    private bool ViewCanShowContent(Type viewType, object content) {
139      if (content == null) // every view can display null
140        return true;
141      if (viewType == null)
142        return false;
143      return ContentAttribute.CanViewType(viewType, Content.GetType()) && typeMenuItemTable.ContainsKey(viewType);
144    }
145
146    private void viewsLabel_DoubleClick(object sender, EventArgs e) {
147      MainFormManager.CreateView(viewPanel.Tag.GetType(), Content).Show();
148    }
149    private void contextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {
150      Type viewType = (Type)e.ClickedItem.Tag;
151      ViewType = viewType;
152    }
153  }
154}
Note: See TracBrowser for help on using the repository browser.