Free cookie consent management tool by TermsFeed Policy Generator

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

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

changed access modifier of FireMainFormChanged back to protected.
if it is really necessary to be accessed from other classes, then it should be reopened with the new keyword.
although it would be better if the mainform reacts automatically on changes. (ticket #857)

File size: 12.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.Linq;
28using System.Text;
29using System.Windows.Forms;
30
31using HeuristicLab.PluginInfrastructure;
32using System.Collections;
33
34namespace HeuristicLab.MainForm.WindowsForms {
35  public partial class MainForm : Form, IMainForm {
36    private bool initialized;
37
38    protected MainForm()
39      : base() {
40      InitializeComponent();
41      this.views = new Dictionary<IView, Form>();
42      this.userInterfaceItems = new List<IUserInterfaceItem>();
43      this.initialized = false;
44    }
45
46    protected MainForm(Type userInterfaceItemType)
47      : this() {
48      this.userInterfaceItemType = userInterfaceItemType;
49    }
50
51    #region properties
52    public string Title {
53      get { return this.Text; }
54      set {
55        if (InvokeRequired) {
56          Action<string> action = delegate(string s) { this.Title = s; };
57          Invoke(action, value);
58        } else
59          this.Text = value;
60      }
61    }
62
63    public override Cursor Cursor {
64      get { return base.Cursor; }
65      set {
66        if (InvokeRequired) {
67          Action<Cursor> action = delegate(Cursor c) { this.Cursor = c; };
68          Invoke(action, value);
69        } else
70          base.Cursor = value;
71      }
72    }
73
74    private Type userInterfaceItemType;
75    public Type UserInterfaceItemType {
76      get { return this.userInterfaceItemType; }
77    }
78
79    private Dictionary<IView, Form> views;
80    public IEnumerable<IView> Views {
81      get { return views.Keys; }
82    }
83
84    private IView activeView;
85    public IView ActiveView {
86      get { return this.activeView; }
87      protected set {
88        if (this.activeView != value) {
89          if (InvokeRequired) {
90            Action<IView> action = delegate(IView activeView) { this.ActiveView = activeView; };
91            Invoke(action, value);
92          } else {
93            this.activeView = value;
94            OnActiveViewChanged();
95          }
96        }
97      }
98    }
99
100    private List<IUserInterfaceItem> userInterfaceItems;
101    protected IEnumerable<IUserInterfaceItem> UserInterfaceItems {
102      get { return this.userInterfaceItems; }
103    }
104    #endregion
105
106    #region events
107    public event EventHandler ActiveViewChanged;
108    protected virtual void OnActiveViewChanged() {
109      if (InvokeRequired)
110        Invoke((MethodInvoker)OnActiveViewChanged);
111      else if (ActiveViewChanged != null)
112        ActiveViewChanged(this, new EventArgs());
113    }
114
115    public event EventHandler<ViewEventArgs> ViewClosed;
116    protected virtual void OnViewClosed(IView view) {
117      if (InvokeRequired) Invoke((Action<IView>)OnViewClosed, view);
118      else if (this.ViewClosed != null) {
119        this.ViewClosed(this, new ViewEventArgs(view));
120      }
121    }
122
123    public event EventHandler<ViewShownEventArgs> ViewShown;
124    protected virtual void OnViewShown(IView view, bool firstTimeShown) {
125      if (InvokeRequired) Invoke((Action<IView, bool>)OnViewShown, view, firstTimeShown);
126      else if (this.ViewShown != null) {
127        this.ViewShown(this, new ViewShownEventArgs(view, firstTimeShown));
128      }
129    }
130
131    public event EventHandler<ViewEventArgs> ViewHidden;
132    protected virtual void OnViewHidden(IView view) {
133      if (InvokeRequired) Invoke((Action<IView>)OnViewHidden, view);
134      else if (this.ViewHidden != null) {
135        this.ViewHidden(this, new ViewEventArgs(view));
136      }
137    }
138
139    public event EventHandler Changed;
140    protected void FireMainFormChanged() {
141      if (InvokeRequired)
142        Invoke((MethodInvoker)FireMainFormChanged);
143      else if (Changed != null)
144        Changed(this, new EventArgs());
145    }
146
147    private void MainFormBase_Load(object sender, EventArgs e) {
148      if (!DesignMode) {
149        MainFormManager.RegisterMainForm(this);
150        if (!this.initialized) {
151          this.initialized = true;
152          this.OnInitialized(new EventArgs());
153        }
154        this.CreateGUI();
155      }
156    }
157
158    protected virtual void OnInitialized(EventArgs e) {
159    }
160
161    private void ChildFormClosed(object sender, FormClosedEventArgs e) {
162      Form form = (Form)sender;
163      IView view = GetView(form);
164
165      form.Activated -= new EventHandler(FormActivated);
166      form.FormClosed -= new FormClosedEventHandler(ChildFormClosed);
167
168      views.Remove(view);
169      this.OnViewClosed(view);
170      if (ActiveView == view)
171        ActiveView = null;
172    }
173
174    private void FormActivated(object sender, EventArgs e) {
175      this.ActiveView = GetView((Form)sender);
176    }
177    #endregion
178
179    #region create, get, show, hide, close views
180    protected virtual Form CreateForm(IView view) {
181      throw new NotImplementedException("CreateForm must be implemented in subclasses of MainFormBase.");
182    }
183
184    internal Form GetForm(IView view) {
185      if (views.ContainsKey(view))
186        return views[view];
187      return null;
188    }
189
190    internal IView GetView(Form form) {
191      return views.Where(x => x.Value == form).Single().Key;
192    }
193
194    internal void ShowView(IView view,bool firstTimeShown) {
195      if (InvokeRequired) Invoke((Action<IView, bool>)ShowView, view,firstTimeShown);
196      else {
197        if (firstTimeShown) {
198          Form form = CreateForm(view);
199          this.views[view] = form;
200          form.Activated += new EventHandler(FormActivated);
201          form.FormClosed += new FormClosedEventHandler(ChildFormClosed);
202        }
203        this.Show(view, firstTimeShown);
204        this.OnViewShown(view, firstTimeShown);
205      }
206    }
207
208    protected virtual void Show(IView view, bool firstTimeShown) {
209    }
210
211    internal void HideView(IView view) {
212      if (InvokeRequired) Invoke((Action<IView>)HideView, view);
213      else {
214        if (this.views.ContainsKey(view)) {
215          this.Hide(view);
216          this.OnViewHidden(view);
217        }
218      }
219    }
220
221    protected virtual void Hide(IView view) {
222    }
223
224    internal void CloseView(IView view) {
225      if (InvokeRequired) Invoke((Action<IView>)CloseView, view);
226      else {
227        if (this.views.ContainsKey(view)) {
228          this.views[view].Close();
229          this.OnViewClosed(view);
230        }
231      }
232    }
233
234    internal void CloseView(IView view, CloseReason closeReason) {
235      if (InvokeRequired) Invoke((Action<IView>)CloseView, view);
236      else {
237        if (this.views.ContainsKey(view)) {
238          ((View)view).closeReason = closeReason;
239          this.CloseView(view);
240        }
241      }
242    }
243
244    public void CloseAllViews() {
245      foreach (IView view in views.Keys.ToArray())
246        CloseView(view);
247    }
248
249    public void CloseAllViews(CloseReason closeReason) {
250      foreach (IView view in views.Keys.ToArray())
251        CloseView(view, closeReason);
252    }
253    #endregion
254
255    #region create menu and toolbar
256    private void CreateGUI() {
257      IEnumerable<object> allUserInterfaceItems = ApplicationManager.Manager.GetInstances(userInterfaceItemType);
258
259      IEnumerable<IPositionableUserInterfaceItem> toolStripMenuItems =
260        from mi in allUserInterfaceItems
261        where (mi is IPositionableUserInterfaceItem) &&
262              (mi is IMenuItem || mi is IMenuSeparatorItem)
263        orderby ((IPositionableUserInterfaceItem)mi).Position
264        select (IPositionableUserInterfaceItem)mi;
265
266      foreach (IPositionableUserInterfaceItem menuItem in toolStripMenuItems) {
267        if (menuItem is IMenuItem)
268          AddToolStripMenuItem((IMenuItem)menuItem);
269        else if (menuItem is IMenuSeparatorItem)
270          AddToolStripMenuItem((IMenuSeparatorItem)menuItem);
271      }
272
273      IEnumerable<IPositionableUserInterfaceItem> toolStripButtonItems =
274        from bi in allUserInterfaceItems
275        where (bi is IPositionableUserInterfaceItem) &&
276              (bi is IToolBarItem || bi is IToolBarSeparatorItem)
277        orderby ((IPositionableUserInterfaceItem)bi).Position
278        select (IPositionableUserInterfaceItem)bi;
279
280      foreach (IPositionableUserInterfaceItem toolStripButtonItem in toolStripButtonItems) {
281        if (toolStripButtonItem is IToolBarItem)
282          AddToolStripButtonItem((IToolBarItem)toolStripButtonItem);
283        else if (toolStripButtonItem is IToolBarSeparatorItem)
284          AddToolStripButtonItem((IToolBarSeparatorItem)toolStripButtonItem);
285      }
286
287      this.AdditionalCreationOfGUIElements();
288    }
289
290    protected virtual void AdditionalCreationOfGUIElements() {
291    }
292
293    private void AddToolStripMenuItem(IMenuItem menuItem) {
294      ToolStripMenuItem item = new ToolStripMenuItem();
295      this.SetToolStripItemProperties(item, menuItem);
296      if (menuItem is MenuItem) {
297        MenuItem menuItemBase = (MenuItem)menuItem;
298        menuItemBase.ToolStripItem = item;
299        item.ShortcutKeys = menuItemBase.ShortCutKeys;
300        item.DisplayStyle = menuItemBase.ToolStripItemDisplayStyle;
301      }
302      this.InsertItem(menuItem.Structure, typeof(ToolStripMenuItem), item, menuStrip.Items);
303    }
304
305    private void AddToolStripMenuItem(IMenuSeparatorItem menuItem) {
306      this.InsertItem(menuItem.Structure, typeof(ToolStripMenuItem), new ToolStripSeparator(), menuStrip.Items);
307    }
308
309    private void AddToolStripButtonItem(IToolBarItem buttonItem) {
310      ToolStripItem item = new ToolStripButton();
311      if (buttonItem is ToolBarItem) {
312        ToolBarItem buttonItemBase = (ToolBarItem)buttonItem;
313        if (buttonItemBase.IsDropDownButton)
314          item = new ToolStripDropDownButton();
315
316        item.DisplayStyle = buttonItemBase.ToolStripItemDisplayStyle;
317        buttonItemBase.ToolStripItem = item;
318      }
319
320      this.SetToolStripItemProperties(item, buttonItem);
321      this.InsertItem(buttonItem.Structure, typeof(ToolStripDropDownButton), item, toolStrip.Items);
322    }
323
324    private void AddToolStripButtonItem(IToolBarSeparatorItem buttonItem) {
325      this.InsertItem(buttonItem.Structure, typeof(ToolStripDropDownButton), new ToolStripSeparator(), toolStrip.Items);
326    }
327
328    private void InsertItem(IEnumerable<string> structure, Type t, ToolStripItem item, ToolStripItemCollection parentItems) {
329      ToolStripDropDownItem parent = null;
330      foreach (string s in structure) {
331        if (parentItems.ContainsKey(s))
332          parent = (ToolStripDropDownItem)parentItems[s];
333        else {
334          parent = (ToolStripDropDownItem)Activator.CreateInstance(t, s, null, null, s); ;
335          parentItems.Add(parent);
336        }
337        parentItems = parent.DropDownItems;
338      }
339      parentItems.Add(item);
340    }
341
342    private void SetToolStripItemProperties(ToolStripItem toolStripItem, IActionUserInterfaceItem userInterfaceItem) {
343      toolStripItem.Name = userInterfaceItem.Name;
344      toolStripItem.Text = userInterfaceItem.Name;
345      toolStripItem.ToolTipText = userInterfaceItem.ToolTipText;
346      toolStripItem.Tag = userInterfaceItem;
347      toolStripItem.Image = userInterfaceItem.Image;
348      toolStripItem.Click += new EventHandler(ToolStripItemClicked);
349      this.userInterfaceItems.Add(userInterfaceItem);
350    }
351
352    private void ToolStripItemClicked(object sender, EventArgs e) {
353      System.Windows.Forms.ToolStripItem item = (System.Windows.Forms.ToolStripItem)sender;
354      ((IActionUserInterfaceItem)item.Tag).Execute();
355    }
356    #endregion
357  }
358}
Note: See TracBrowser for help on using the repository browser.