Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/MainForm.cs @ 659

Last change on this file since 659 was 659, checked in by gkronber, 16 years ago

fixed #303.

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