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

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