Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.cs @ 2520

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

Implemented first draft of MainForm support in HeuristicLab.Core/HeuristicLab.Core.Views and all other depending plugins (#770)

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