source: trunk/CrypPlugins/WorkspaceManager/WorkspaceManager.cs @ 1637

Last change on this file since 1637 was 1637, checked in by kopal, 12 years ago
  • added a benchmarking function to the ExecutionEngine
File size: 15.5 KB
Line 
1/*                             
2   Copyright 2010 Nils Kopal, Viktor M.
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17
18using System;
19using System.Collections.Generic;
20using System.Linq;
21using System.Text;
22using Cryptool.Core;
23using Cryptool.PluginBase.Editor;
24using Cryptool.UiPluginBase;
25using Cryptool.PluginBase.IO;
26using Cryptool.PluginBase;
27
28using WorkspaceManager.Model;
29using WorkspaceManager.View;
30using WorkspaceManager.Execution;
31using WorkspaceManager.View.Container;
32using WorkspaceManager.View.Converter;
33using System.Windows;
34using System.Windows.Threading;
35using System.Threading;
36
37//Disable warnings for unused or unassigned fields and events:
38#pragma warning disable 0169, 0414, 0067
39
40namespace WorkspaceManager
41{
42    /// <summary>
43    /// Workspace Manager - PluginEditor based on MVC Pattern
44    /// </summary>
45    [EditorInfo("cwm")]
46    [Author("Viktor Matkovic,Nils Kopal", "nils.kopal@cryptool.org", "Universität Duisburg-Essen", "http://www.uni-due.de")]
47    [PluginInfo("WorkspaceManager.Resources.Attributes", false, "Workspace Manager", "Graphical plugin editor for the CrypTool workspace", null,
48      "AnotherEditor/icon.png",
49      "AnotherEditor/Images/addWorkspace.png",
50      "AnotherEditor/Images/deleteWorkspace.png",
51      "AnotherEditor/Images/importSubWorkspace.png")]
52    public class WorkspaceManager : IEditor
53    {
54
55        /// <summary>
56        /// Create a new Instance of the Editor
57        /// </summary>
58        public WorkspaceManager()
59        {
60            Settings = new WorkspaceManagerSettings();
61            New();                                 
62        }
63
64        #region private Members
65
66        private WorkspaceModel WorkspaceModel = null;
67        private WorkSpaceEditorView WorkspaceManagerEditorView = null;
68        private ExecutionEngine ExecutionEngine = null;
69        private bool executing = false;
70
71        #endregion
72
73        /// <summary>
74        /// Is this Editor executing?
75        /// </summary>
76        public bool isExecuting(){
77            return executing;
78        }
79
80        #region IEditor Members
81
82        /// <summary>
83        ///
84        /// </summary>
85        public event ChangeDisplayLevelHandler OnChangeDisplayLevel;
86
87        /// <summary>
88        ///
89        /// </summary>
90        public event SelectedPluginChangedHandler OnSelectedPluginChanged;
91
92        /// <summary>
93        ///
94        /// </summary>
95        public event ProjectTitleChangedHandler OnProjectTitleChanged;
96
97        /// <summary>
98        ///
99        /// </summary>
100        public event OpenProjectFileHandler OnOpenProjectFile;
101
102        /// <summary>
103        ///
104        /// </summary>
105        public event EditorSpecificPluginsChanged OnEditorSpecificPluginsChanged;
106
107        /// <summary>
108        /// Called by clicking on the new button of CrypTool
109        /// Creates a new Model
110        /// </summary>
111        public void New()
112        {
113            WorkspaceModel = new WorkspaceModel();
114            WorkspaceModel.WorkspaceManagerEditor = this;
115            WorkspaceManagerEditorView = new WorkSpaceEditorView(WorkspaceModel);
116            ExecutionEngine = new ExecutionEngine(this);
117            HasChanges = false;
118        }
119
120        /// <summary>
121        /// Called by clicking on the open button of CrypTool
122        /// </summary>
123        /// <param name="fileName"></param>
124        public void Open(string fileName)
125        {
126            try
127            {
128                GuiLogMessage("Loading Model: " + fileName, NotificationLevel.Info);
129                WorkspaceModel = ModelPersistance.loadModel(fileName);
130                HasChanges = false;
131            }
132            catch (Exception ex)
133            {
134                GuiLogMessage("Could not load Model:" + ex.ToString(), NotificationLevel.Error);
135            }
136        }
137
138        /// <summary>
139        /// Called by clicking on the save button of CrypTool
140        /// Serializes the Model into an xml file
141        /// </summary>
142        /// <param name="fileName"></param>
143        public void Save(string fileName)
144        {
145            try
146            {
147                GuiLogMessage("Saving Model: " + fileName, NotificationLevel.Info);
148                ModelPersistance.saveModel(this.WorkspaceModel, fileName);
149                HasChanges = false;
150            }
151            catch (Exception ex)
152            {
153                GuiLogMessage("Could not save Model:" + ex.ToString(), NotificationLevel.Error);               
154            }
155        }
156
157        /// <summary>
158        /// Called by double clicking on a plugin symbol of CrypTool
159        /// Adds a new PluginModel wrapping an instance of the selected plugin
160        /// </summary>
161        /// <param name="type"></param>
162        public void Add(Type type)
163        {
164            /*if (!executing)
165            {
166                PluginModel newPluginModel = WorkspaceModel.newPluginModel(new Point(10, 10), 100, 100, type);
167                GuiLogMessage("Added by double click: " + newPluginModel.Name, NotificationLevel.Info);
168                HasChanges = true;
169            }*/
170        }
171
172        /// <summary>
173        ///
174        /// </summary>
175        /// <param name="espi"></param>
176        public void AddEditorSpecific(EditorSpecificPluginInfo espi)
177        {
178            //to be implemented
179        }
180
181        /// <summary>
182        ///
183        /// </summary>
184        /// <param name="espi"></param>
185        public void DeleteEditorSpecific(EditorSpecificPluginInfo espi)
186        {
187            //to be implemented   
188        }
189
190        /// <summary>
191        /// Undo changes
192        /// </summary>
193        public void Undo()
194        {
195            //to be implemented
196        }
197
198        /// <summary>
199        /// Redo changes
200        /// </summary>
201        public void Redo()
202        {
203            //to be implemented
204        }
205
206        /// <summary>
207        /// Show the Help site
208        /// </summary>
209        public void ShowHelp()
210        {
211            //to be implemented
212        }
213
214        /// <summary>
215        /// Show the Description of the selected plugin
216        /// </summary>
217        public void ShowSelectedPluginDescription()
218        {
219            //to be implemented
220        }
221
222        /// <summary>
223        /// Is Undo possible
224        /// </summary>
225        public bool CanUndo
226        {
227            get;
228            set;
229        }
230
231        /// <summary>
232        /// Is Redo possible?
233        /// </summary>
234        public bool CanRedo
235        {
236            get;
237            set;
238        }
239
240        /// <summary>
241        /// Can the ExecutionEngine be started?
242        /// </summary>
243        public bool CanExecute
244        {
245            get{return !executing;}
246        }
247
248        /// <summary>
249        /// Can the ExecutionEngine be stopped?
250        /// </summary>
251        public bool CanStop
252        {
253            get { return executing; }
254        }
255
256        /// <summary>
257        /// Does this Editor has changes?
258        /// </summary>
259        public bool HasChanges
260        {
261            get;
262            set;
263        }
264
265        /// <summary>
266        /// DisplayLevel
267        /// </summary>
268        public DisplayLevel DisplayLevel
269        {
270            get;
271            set;
272           
273        }
274
275        /// <summary>
276        ///
277        /// </summary>
278        public List<EditorSpecificPluginInfo> EditorSpecificPlugins
279        {
280            get;
281            set;
282        }
283
284        #endregion
285
286        #region IPlugin Members
287
288        /// <summary>
289        ///
290        /// </summary>
291        public event StatusChangedEventHandler OnPluginStatusChanged;
292
293        /// <summary>
294        ///
295        /// </summary>
296        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
297
298        /// <summary>
299        ///
300        /// </summary>
301        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
302
303        /// <summary>
304        /// Settings of this editor
305        /// </summary>
306        public ISettings Settings
307        {
308            get;
309            set;
310        }
311
312        /// <summary>
313        /// The Presentation of this editor
314        /// </summary>
315        public System.Windows.Controls.UserControl Presentation
316        {
317            get {return WorkspaceManagerEditorView;}
318            set { WorkspaceManagerEditorView = (WorkSpaceEditorView)value; }
319        }
320
321        /// <summary>
322        /// The QuickWatchPresentation of this editor
323        /// </summary>
324        public System.Windows.Controls.UserControl QuickWatchPresentation
325        {
326            get;
327            set;
328        }
329
330        /// <summary>
331        /// Called before execution
332        /// </summary>
333        public void PreExecution()
334        {
335            //to be implemented
336        }
337
338        /// <summary>
339        /// Starts the ExecutionEngine to execute the model
340        /// </summary>
341        public void Execute()
342        {
343            if (executing)
344            {
345                return;
346            }
347           
348            try
349            {
350                GuiLogMessage("Execute Model now!", NotificationLevel.Info);
351                executing = true;
352
353                //Get the gui Thread
354                this.WorkspaceManagerEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
355                {
356                    this.WorkspaceManagerEditorView.root.IsEnabled = false;   
357                }
358                , null);
359
360                try
361                {
362                    ExecutionEngine.CheckInterval = long.Parse(((WorkspaceManagerSettings)this.Settings).CheckInterval);
363                }
364                catch (Exception ex)
365                {
366                    GuiLogMessage("Could not set CheckInterval: " + ex.Message, NotificationLevel.Warning);
367                    ExecutionEngine.CheckInterval = 10;
368                }
369
370                try
371                {
372                    ExecutionEngine.GuiUpdateInterval = long.Parse(((WorkspaceManagerSettings)this.Settings).GuiUpdateInterval);
373                }
374                catch (Exception ex)
375                {
376                    GuiLogMessage("Could not set GuiUpdateInterval: " + ex.Message, NotificationLevel.Warning);
377                    ExecutionEngine.GuiUpdateInterval = 100;
378                }
379
380                ExecutionEngine.BenchmarkPlugins = ((WorkspaceManagerSettings)this.Settings).BenchmarkPlugins;
381
382                ExecutionEngine.Execute(WorkspaceModel);               
383            }
384            catch (Exception ex)
385            {
386                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
387                executing = false;
388            }
389        }
390
391        /// <summary>
392        /// Called after the execution
393        /// </summary>
394        public void PostExecution()
395        {
396            //to be implemented
397        }
398
399        /// <summary>
400        /// Pause the execution
401        /// </summary>
402        public void Pause()
403        {
404            ExecutionEngine.Pause();
405        }
406
407        /// <summary>
408        /// Stop the ExecutionEngine
409        /// </summary>
410        public void Stop()
411        {
412            if (!executing)
413            {
414                return;
415            }
416
417            try
418            {
419                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
420                ExecutionEngine.Stop();
421                //Get the gui Thread
422                this.WorkspaceManagerEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
423                {
424                    this.WorkspaceManagerEditorView.root.IsEnabled = true;
425                }
426                , null);
427            }
428            catch (Exception ex)
429            {
430                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
431               
432            }
433            executing = false;
434        }
435
436        /// <summary>
437        /// Called to initialize the editor
438        /// </summary>
439        public void Initialize()
440        {
441            //to be implemented
442        }
443
444        /// <summary>
445        /// Called when the editor is disposed
446        /// </summary>
447        public void Dispose()
448        {
449            if (ExecutionEngine.IsRunning)
450            {
451                ExecutionEngine.Stop();
452            }
453        }
454
455        #endregion
456
457        #region INotifyPropertyChanged Members
458
459        /// <summary>
460        ///
461        /// </summary>
462        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
463
464        #endregion
465
466        #region IApplication Members
467
468        /// <summary>
469        ///
470        /// </summary>
471        private PluginManager pluginManager;
472        public PluginManager PluginManager
473        {
474            get { return pluginManager; }
475            set
476            {
477                pluginManager = value;
478                DragDropDataObjectToPluginConverter.PluginManager = value;
479            }         
480        }
481
482        #endregion
483
484        #region GuiLogMessage, Progress
485
486        /// <summary>
487        /// Loggs a message to the logging mechanism of CrypTool
488        /// </summary>
489        /// <param name="Message"></param>
490        /// <param name="notificationLevel"></param>
491        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
492        {
493            if (OnGuiLogNotificationOccured != null)
494            {
495                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
496                args.Title = "-";
497                OnGuiLogNotificationOccured(this, args);
498            }
499        }
500
501        /// <summary>
502        /// GuiLogNotificationOccured
503        /// </summary>
504        /// <param name="sender"></param>
505        /// <param name="args"></param>
506        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
507        {
508            if (OnGuiLogNotificationOccured != null)
509                OnGuiLogNotificationOccured(sender, args);
510        }
511
512        /// <summary>
513        /// Progress of this editor
514        /// </summary>
515        /// <param name="Value"></param>
516        /// <param name="MaxValue"></param>
517        private void Progress(int Value, int MaxValue)
518        {
519            if (OnPluginProgressChanged != null)
520            {
521                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
522            }
523        }
524        #endregion GuiLogMessage, Progress
525
526        /// <summary>
527        /// Selected Plugin changed by View
528        /// </summary>
529        /// <param name="args"></param>
530        public void onSelectedPluginChanged(PluginChangedEventArgs args)
531        {
532            this.OnSelectedPluginChanged(this, args);
533        }
534    }
535}
536
537//Restore warnings for unused or unassigned fields and events:
538#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.