Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.MainForm.WindowsForms/3.2/MainFormBase.cs @ 2460

Last change on this file since 2460 was 2460, checked in by mkommend, 15 years ago

added check if MainFormBase is created during design mode (visual studio designer)
to suppress registering at the MainFormManager (ticket #771)

File size: 9.6 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.Linq;
28using System.Text;
29using System.Windows.Forms;
30
31using HeuristicLab.PluginInfrastructure;
32
33namespace HeuristicLab.MainForm.WindowsForms {
34  public partial class MainFormBase : Form, IMainForm {
35    protected MainFormBase()
36      : base() {
37      InitializeComponent();
38      this.views = new Dictionary<IView, Form>();
39      this.userInterfaceItems = new List<IUserInterfaceItem>();
40      if (Site != null && !Site.DesignMode)
41        MainFormManager.RegisterMainForm(this);
42    }
43
44    protected MainFormBase(Type userInterfaceItemType)
45      : this() {
46      this.userInterfaceItemType = userInterfaceItemType;
47      CreateGUI();
48      OnActiveViewChanged();
49      FireMainFormChanged();
50    }
51
52    #region IMainForm Members
53    public string Title {
54      get { return this.Text; }
55      set {
56        if (InvokeRequired) {
57          Action<string> action = delegate(string s) { this.Title = s; };
58          Invoke(action, value);
59        } else
60          this.Text = value;
61      }
62    }
63
64    public override Cursor Cursor {
65      get { return base.Cursor; }
66      set {
67        if (InvokeRequired) {
68          Action<Cursor> action = delegate(Cursor c) { this.Cursor = c; };
69          Invoke(action, value);
70        } else
71          base.Cursor = value;
72      }
73    }
74
75    private Type userInterfaceItemType;
76    public Type UserInterfaceItemType {
77      get { return this.userInterfaceItemType; }
78    }
79
80    private Dictionary<IView, Form> views;
81    public IEnumerable<IView> Views {
82      get { return views.Keys; }
83    }
84
85    public Form GetForm(IView view) {
86      if (views.ContainsKey(view))
87        return views[view];
88      return null;
89    }
90
91    private IView activeView;
92    public IView ActiveView {
93      get { return this.activeView; }
94      protected set {
95        if (this.activeView != value) {
96          if (InvokeRequired) {
97            Action<IView> action = delegate(IView activeView) { this.ActiveView = activeView; };
98            Invoke(action, value);
99          } else {
100            this.activeView = value;
101            OnActiveViewChanged();
102          }
103        }
104      }
105    }
106
107    private List<IUserInterfaceItem> userInterfaceItems;
108    protected IEnumerable<IUserInterfaceItem> UserInterfaceItems {
109      get { return this.userInterfaceItems; }
110    }
111
112    public event EventHandler ActiveViewChanged;
113    protected virtual void OnActiveViewChanged() {
114      if (InvokeRequired)
115        Invoke((MethodInvoker)OnActiveViewChanged);
116      else if (ActiveViewChanged != null)
117        ActiveViewChanged(this, new EventArgs());
118    }
119
120    public event EventHandler Changed;
121    public void FireMainFormChanged() {
122      OnMainFormChanged();
123    }
124    protected virtual void OnMainFormChanged() {
125      if (InvokeRequired)
126        Invoke((MethodInvoker)OnMainFormChanged);
127      else if (Changed != null)
128        Changed(this, new EventArgs());
129    }
130
131    protected virtual Form CreateForm(IView view) {
132      throw new NotImplementedException("CreateForm must be implemented in subclasses of MainFormBase.");
133    }
134
135    public virtual bool ShowView(IView view) {
136      if (InvokeRequired) return (bool)Invoke((Func<IView, bool>)ShowView, view);
137      else {
138        if (!views.Keys.Contains(view)) {
139          Form form = CreateForm(view);
140          views[view] = form;
141          form.Activated += new EventHandler(FormActivated);
142          form.GotFocus += new EventHandler(FormActivated);
143          form.FormClosing += new FormClosingEventHandler(view.OnClosing);
144          form.FormClosed += new FormClosedEventHandler(view.OnClosed);
145          form.FormClosed += new FormClosedEventHandler(ChildFormClosed);
146          foreach (IUserInterfaceItem item in UserInterfaceItems)
147            view.Changed += new EventHandler(item.ViewChanged);
148          return true;
149        } else
150          return false;
151      }
152    }
153
154    public virtual void HideView(IView view) {
155      if (InvokeRequired) Invoke((Action<IView>)HideView, view);
156      else {
157        if (views.ContainsKey(view))
158          views[view].Hide();
159      }
160    }
161
162    public void CloseView(IView view) {
163      if (InvokeRequired) Invoke((Action<IView>)CloseView, view);
164      else {
165        if (views.ContainsKey(view))
166          views[view].Close();
167      }
168    }
169
170    public virtual void CloseAllViews() {
171      foreach (IView view in views.Keys.ToArray())
172        CloseView(view);
173    }
174    #endregion
175
176    #region events
177    private void ChildFormClosed(object sender, FormClosedEventArgs e) {
178      Form form = (Form)sender;
179      IView view = GetViewForForm(form);
180
181      form.Activated -= new EventHandler(FormActivated);
182      form.GotFocus -= new EventHandler(FormActivated);
183      form.FormClosing -= new FormClosingEventHandler(view.OnClosing);
184      form.FormClosed -= new FormClosedEventHandler(view.OnClosed);
185      form.FormClosed -= new FormClosedEventHandler(ChildFormClosed);
186      foreach (IUserInterfaceItem item in UserInterfaceItems)
187        view.Changed -= new EventHandler(item.ViewChanged);
188
189      views.Remove(view);
190      if (ActiveView == view)
191        ActiveView = null;
192    }
193
194    private void FormActivated(object sender, EventArgs e) {
195      this.ActiveView = GetViewForForm((Form)sender);
196    }
197
198    private IView GetViewForForm(Form form) {
199      return views.Where(x => x.Value == form).Single().Key;
200    }
201    #endregion
202
203    #region create menu and toolbar
204    protected virtual void CreateGUI() {
205      DiscoveryService ds = new DiscoveryService();
206
207      object[] items = ds.GetInstances(userInterfaceItemType);
208      IEnumerable<MenuItemBase> toolStripMenuItems =
209        from mi in items
210        where mi is MenuItemBase
211        orderby ((MenuItemBase)mi).Position
212        select (MenuItemBase)mi;
213      foreach (MenuItemBase menuItem in toolStripMenuItems)
214        AddToolStripMenuItem(menuItem);
215
216      items = ds.GetInstances(userInterfaceItemType);
217      IEnumerable<ToolBarItemBase> toolStripButtonItems =
218        from bi in items
219        where bi is ToolBarItemBase
220        orderby ((ToolBarItemBase)bi).Position
221        select (ToolBarItemBase)bi;
222      foreach (ToolBarItemBase toolStripButtonItem in toolStripButtonItems)
223        AddToolStripButtonItem(toolStripButtonItem);
224    }
225
226    private void AddToolStripMenuItem(MenuItemBase menuItem) {
227      ToolStripMenuItem item = new ToolStripMenuItem();
228      SetToolStripItemProperties(item, menuItem);
229      menuItem.ToolStripItem = item;
230      item.ShortcutKeys = menuItem.ShortCutKeys;
231      item.DisplayStyle = menuItem.ToolStripItemDisplayStyle;
232      this.InsertItem(menuItem.Structure, typeof(ToolStripMenuItem), item, menuStrip.Items);
233    }
234
235    private void AddToolStripButtonItem(ToolBarItemBase buttonItem) {
236      ToolStripItem item;
237      if (buttonItem.IsDropDownButton)
238        item = new ToolStripDropDownButton();
239      else
240        item = new ToolStripButton();
241
242      SetToolStripItemProperties(item, buttonItem);
243      item.DisplayStyle = buttonItem.ToolStripItemDisplayStyle;
244      buttonItem.ToolStripItem = item;
245      this.InsertItem(buttonItem.Structure, typeof(ToolStripDropDownButton), item, toolStrip.Items);
246    }
247
248    private void InsertItem(IEnumerable<string> structure, Type t, ToolStripItem item, ToolStripItemCollection parentItems) {
249      ToolStripDropDownItem parent = null;
250      foreach (string s in structure) {
251        if (parentItems.ContainsKey(s))
252          parent = (ToolStripDropDownItem)parentItems[s];
253        else {
254          parent = (ToolStripDropDownItem)Activator.CreateInstance(t, s, null, null, s); ;
255          parentItems.Add(parent);
256        }
257        parentItems = parent.DropDownItems;
258      }
259      parentItems.Add(item);
260    }
261
262    private void SetToolStripItemProperties(ToolStripItem toolStripItem, IUserInterfaceItem userInterfaceItem) {
263      toolStripItem.Name = userInterfaceItem.Name;
264      toolStripItem.Text = userInterfaceItem.Name;
265      toolStripItem.ToolTipText = userInterfaceItem.ToolTipText;
266      toolStripItem.Tag = userInterfaceItem;
267      toolStripItem.Image = userInterfaceItem.Image;
268      this.ActiveViewChanged += new EventHandler(userInterfaceItem.ActiveViewChanged);
269      this.Changed += new EventHandler(userInterfaceItem.MainFormChanged);
270      toolStripItem.Click += new EventHandler(ToolStripItemClicked);
271      this.userInterfaceItems.Add(userInterfaceItem);
272    }
273
274    private void ToolStripItemClicked(object sender, EventArgs e) {
275      System.Windows.Forms.ToolStripItem item = (System.Windows.Forms.ToolStripItem)sender;
276      ((IUserInterfaceItem)item.Tag).Execute();
277    }
278    #endregion
279  }
280}
Note: See TracBrowser for help on using the repository browser.