Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PluginInfrastructure Refactoring/HeuristicLab.AdvancedOptimizationFrontend/3.2/MainForm.cs @ 2587

Last change on this file since 2587 was 2587, checked in by gkronber, 14 years ago

Fixed projects to work with new plugin infrastructure. #799

File size: 10.9 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.Text;
28using System.Linq;
29using System.Threading;
30using System.Windows.Forms;
31using WeifenLuo.WinFormsUI.Docking;
32using HeuristicLab.PluginInfrastructure;
33using HeuristicLab.Core;
34using System.IO;
35
36namespace HeuristicLab.AdvancedOptimizationFrontend {
37  /// <summary>
38  /// The main form of the application.
39  /// </summary>
40  public partial class MainForm : Form, IControlManager {
41    #region Inner Types
42    private class Task {
43      public string filename;
44      public IStorable storable;
45      public IEditor editor;
46
47      private Task() { }
48      public Task(string filename, IStorable storable, IEditor editor) {
49        this.filename = filename;
50        this.storable = storable;
51        this.editor = editor;
52      }
53    }
54    #endregion
55
56    private object locker;
57    private int runningTasks;
58
59    /// <summary>
60    /// Initializes a new instance of <see cref="MainForm"/>.
61    /// </summary>
62    public MainForm() {
63      InitializeComponent();
64
65      locker = new object();
66      runningTasks = 0;
67
68      AvailableOperatorsForm form = new AvailableOperatorsForm();
69      form.Show(dockPanel);
70
71      // discover creatable items
72      var creatables = from x in ApplicationManager.Manager.GetTypes(typeof(IEditable))
73                       orderby x.Name
74                       select x;     
75      foreach (Type type in creatables) {
76        if (!type.IsAbstract) {
77          ToolStripMenuItem item = new ToolStripMenuItem();
78          item.Tag = type;
79          item.Text = "&" + type.Name + "...";
80          item.Click += new EventHandler(newToolStripMenuItem_Click);
81          newToolStripMenuItem.DropDownItems.Add(item);
82
83          item = new ToolStripMenuItem();
84          item.Tag = type;
85          item.Text = "&" + type.Name + "...";
86          item.Click += new EventHandler(newToolStripMenuItem_Click);
87          newToolStripDropDownButton.DropDownItems.Add(item);
88        }
89      }
90    }
91
92    #region IControlManager Members
93    /// <summary>
94    /// Displays the given <paramref name="control"/>.
95    /// </summary>
96    /// <exception cref="InvalidOperationException">Thrown when the given <paramref name="control"/>
97    /// is neither a view nor an editor.</exception>
98    /// <param name="control">The control to display.</param>
99    public void ShowControl(object control) {
100      if (InvokeRequired) Invoke((Action<object>)ShowControl, control);
101      else {
102        DockContent content;
103        if (control is IEditor)
104          content = new EditorForm((IEditor)control);
105        else if (control is IView)
106          content = new ViewForm((IView)control);
107        else
108          throw new InvalidOperationException("Control is neither a view nor an editor.");
109
110        content.TabText = content.Text;
111        content.Show(dockPanel);
112      }
113    }
114    #endregion
115
116    private void EnableDisableItems() {
117      closeToolStripMenuItem.Enabled = false;
118      closeAllToolStripMenuItem.Enabled = false;
119      saveToolStripMenuItem.Enabled = false;
120      saveToolStripButton.Enabled = false;
121      saveAsToolStripMenuItem.Enabled = false;
122      saveAllToolStripMenuItem.Enabled = false;
123      saveAllToolStripButton.Enabled = false;
124
125      if (ActiveMdiChild != null) {
126        closeToolStripMenuItem.Enabled = true;
127        closeAllToolStripMenuItem.Enabled = true;
128        saveAllToolStripMenuItem.Enabled = true;
129        saveAllToolStripButton.Enabled = true;
130        EditorForm form = ActiveMdiChild as EditorForm;
131        if (form != null) {
132          if (((Control)form.Editor).Enabled) {
133            saveToolStripMenuItem.Enabled = true;
134            saveToolStripButton.Enabled = true;
135            saveAsToolStripMenuItem.Enabled = true;
136          } else {
137            closeToolStripMenuItem.Enabled = false;
138            closeAllToolStripMenuItem.Enabled = false;
139          }
140        }
141      }
142    }
143
144    #region Open and Save Methods
145    private void Open() {
146      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
147        lock (locker) runningTasks++;
148        Cursor = Cursors.AppStarting;
149        Task task = new Task(openFileDialog.FileName, null, null);
150        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousLoad), task);
151      }
152    }
153    private void AsynchronousLoad(object state) {
154      Task task = (Task)state;
155      try {
156        task.storable = PersistenceManager.Load(task.filename);
157      }
158      catch (FileNotFoundException fileNotFoundEx) {
159        MessageBox.Show("Sorry couldn't open file \"" + task.filename + "\".\nThe file or plugin \"" + fileNotFoundEx.FileName + "\" is not available.\nPlease make sure you have all necessary plugins installed.",
160          "Reader Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
161      }
162      catch (TypeLoadException typeLoadEx) {
163        MessageBox.Show("Sorry couldn't open file \"" + task.filename + "\".\nThe type \"" + typeLoadEx.TypeName + "\" is not available.\nPlease make sure that you have the correct version the plugin installed.",
164          "Reader Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
165      }
166      LoadFinished(task);
167    }
168    private delegate void TaskFinishedDelegate(Task task);
169    private void LoadFinished(Task task) {
170      if (InvokeRequired)
171        Invoke(new TaskFinishedDelegate(LoadFinished), task);
172      else {
173        IEditor editor = null;
174        if (task.storable != null) {
175          IEditable editable = task.storable as IEditable;
176          if (editable != null)
177            editor = editable.CreateEditor();
178        }
179        if (editor == null)
180          MessageBox.Show("Could not open item. The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
181        else {
182          editor.Filename = task.filename;
183          editor.SaveFinished += new EventHandler(SaveFinished);
184          ControlManager.Manager.ShowControl(editor);
185        }
186        lock (locker) {
187          runningTasks--;
188          if (runningTasks == 0)
189            Cursor = Cursors.Default;
190        }
191      }
192    }
193    private void Save(EditorForm form) {
194      if (form.Editor.Filename == null)
195        SaveAs(form);
196      else {
197        lock (locker) runningTasks++;
198        Cursor = Cursors.AppStarting;
199        EnableDisableItems();
200        form.Editor.Save();
201      }
202    }
203    private void SaveAs(EditorForm form) {
204      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
205        form.Editor.Filename = saveFileDialog.FileName;
206        Save(form);
207      }
208    }
209    private void SaveFinished(object sender, EventArgs e) {
210      if (InvokeRequired)
211        Invoke(new EventHandler(SaveFinished), sender, e);
212      else {
213        EnableDisableItems();
214        lock (locker) {
215          runningTasks--;
216          if (runningTasks == 0)
217            Cursor = Cursors.Default;
218        }
219      }
220    }
221    #endregion
222
223    private void MainForm_MdiChildActivate(object sender, EventArgs e) {
224      EnableDisableItems();
225    }
226
227    #region Menu Events
228    private void newToolStripMenuItem_Click(object sender, EventArgs e) {
229      ToolStripItem item = (ToolStripItem)sender;
230      Type type = (Type)item.Tag;
231      IEditable editable = (IEditable)Activator.CreateInstance(type);
232      if (editable == null) {
233        MessageBox.Show("The selected item is not editable.", "Editable Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
234      } else {
235        IEditor editor = editable.CreateEditor();
236        if (editor == null) {
237          MessageBox.Show("The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
238        } else {
239          editor.SaveFinished += new EventHandler(SaveFinished);
240          ControlManager.Manager.ShowControl(editor);
241          EnableDisableItems();
242        }
243      }
244    }
245    private void openToolStripMenuItem_Click(object sender, EventArgs e) {
246      Open();
247    }
248    private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
249      EditorForm form = ActiveMdiChild as EditorForm;
250      Save(form);
251    }
252    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {
253      EditorForm form = ActiveMdiChild as EditorForm;
254      SaveAs(form);
255    }
256    private void saveAllToolStripMenuItem_Click(object sender, EventArgs e) {
257      for (int i = 0; i < MdiChildren.Length; i++) {
258        EditorForm form = MdiChildren[i] as EditorForm;
259        if (((Control)form.Editor).Enabled) Save(form);
260      }
261    }
262    private void closeToolStripMenuItem_Click(object sender, EventArgs e) {
263      ActiveMdiChild.Close();
264      EnableDisableItems();
265    }
266    private void closeAllToolStripMenuItem_Click(object sender, EventArgs e) {
267      while (MdiChildren.Length > 0)
268        MdiChildren[0].Close();
269      EnableDisableItems();
270    }
271    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
272      Application.Exit();
273    }
274    private void availableOperatorsToolStripMenuItem_Click(object sender, EventArgs e) {
275      AvailableOperatorsForm form = new AvailableOperatorsForm();
276      form.Show(dockPanel);
277    }
278    private void collectGarbageToolStripMenuItem_Click(object sender, EventArgs e) {
279      GC.Collect();
280    }
281    private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
282      AboutDialog dialog = new AboutDialog();
283      dialog.ShowDialog(this);
284      dialog.Dispose();
285    }
286    #endregion
287
288    #region ToolStrip Events
289    private void openToolStripButton_Click(object sender, EventArgs e) {
290      Open();
291    }
292    private void saveToolStripButton_Click(object sender, EventArgs e) {
293      EditorForm form = ActiveMdiChild as EditorForm;
294      Save(form);
295    }
296    private void saveAllToolStripButton_Click(object sender, EventArgs e) {
297      for (int i = 0; i < MdiChildren.Length; i++) {
298        EditorForm form = MdiChildren[i] as EditorForm;
299        if (form != null && ((Control)form.Editor).Enabled) Save(form);
300      }
301    }
302    #endregion
303  }
304}
Note: See TracBrowser for help on using the repository browser.