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

Last change on this file since 1711 was 1711, checked in by kopal, 12 years ago
  • serialization of model now works (still needed view reconstruction using the deserialized model)
File size: 17.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            WorkspaceManagerEditorView = 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 WorkspaceManagerEditorView = 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        }
125
126        /// <summary>
127        /// Called by clicking on the open button of CrypTool
128        /// loads a serialized model
129        /// </summary>
130        /// <param name="fileName"></param>
131        public void Open(string fileName)
132        {
133            try
134            {
135                GuiLogMessage("Loading Model: " + fileName, NotificationLevel.Info);               
136                WorkspaceModel = ModelPersistance.loadModel(fileName);
137                WorkspaceModel.WorkspaceManagerEditor = this;
138                WorkspaceManagerEditorView.Model = WorkspaceModel;
139                HasChanges = false;
140            }
141            catch (Exception ex)
142            {
143                GuiLogMessage("Could not load Model:" + ex.ToString(), NotificationLevel.Error);
144            }
145        }
146
147        /// <summary>
148        /// Called by clicking on the save button of CrypTool
149        /// serializes the current model
150        /// </summary>
151        /// <param name="fileName"></param>
152        public void Save(string fileName)
153        {
154            try
155            {
156                GuiLogMessage("Saving Model: " + fileName, NotificationLevel.Info);
157                ModelPersistance.saveModel(this.WorkspaceModel, fileName);
158                HasChanges = false;
159            }
160            catch (Exception ex)
161            {
162                GuiLogMessage("Could not save Model:" + ex.ToString(), NotificationLevel.Error);               
163            }
164        }
165
166        /// <summary>
167        /// Called by double clicking on a plugin symbol of CrypTool
168        /// Adds a new PluginModel wrapping an instance of the selected plugin
169        /// </summary>
170        /// <param name="type"></param>
171        public void Add(Type type)
172        {
173            /*if (!executing)
174            {
175                PluginModel newPluginModel = WorkspaceModel.newPluginModel(new Point(10, 10), 100, 100, type);
176                GuiLogMessage("Added by double click: " + newPluginModel.Name, NotificationLevel.Info);
177                HasChanges = true;
178            }*/
179        }
180
181        /// <summary>
182        ///
183        /// </summary>
184        /// <param name="espi"></param>
185        public void AddEditorSpecific(EditorSpecificPluginInfo espi)
186        {
187            //to be implemented
188        }
189
190        /// <summary>
191        ///
192        /// </summary>
193        /// <param name="espi"></param>
194        public void DeleteEditorSpecific(EditorSpecificPluginInfo espi)
195        {
196            //to be implemented   
197        }
198
199        /// <summary>
200        /// Undo changes
201        /// </summary>
202        public void Undo()
203        {
204            //to be implemented
205        }
206
207        /// <summary>
208        /// Redo changes
209        /// </summary>
210        public void Redo()
211        {
212            //to be implemented
213        }
214
215        /// <summary>
216        /// Show the Help site
217        /// </summary>
218        public void ShowHelp()
219        {
220            //to be implemented
221        }
222
223        /// <summary>
224        /// Show the Description of the selected plugin
225        /// </summary>
226        public void ShowSelectedPluginDescription()
227        {
228            //to be implemented
229        }
230
231        /// <summary>
232        /// Is Undo possible
233        /// </summary>
234        public bool CanUndo
235        {
236            get;
237            set;
238        }
239
240        /// <summary>
241        /// Is Redo possible?
242        /// </summary>
243        public bool CanRedo
244        {
245            get;
246            set;
247        }
248
249        /// <summary>
250        /// Can the ExecutionEngine be started?
251        /// </summary>
252        public bool CanExecute
253        {
254            get{return !executing;}
255        }
256
257        /// <summary>
258        /// Can the ExecutionEngine be stopped?
259        /// </summary>
260        public bool CanStop
261        {
262            get { return executing; }
263        }
264
265        /// <summary>
266        /// Does this Editor has changes?
267        /// </summary>
268        public bool HasChanges
269        {
270            get;
271            set;
272        }
273
274        /// <summary>
275        /// DisplayLevel
276        /// </summary>
277        public DisplayLevel DisplayLevel
278        {
279            get;
280            set;
281           
282        }
283
284        /// <summary>
285        ///
286        /// </summary>
287        public List<EditorSpecificPluginInfo> EditorSpecificPlugins
288        {
289            get;
290            set;
291        }
292
293        #endregion
294
295        #region IPlugin Members
296
297        /// <summary>
298        ///
299        /// </summary>
300        public event StatusChangedEventHandler OnPluginStatusChanged;
301
302        /// <summary>
303        ///
304        /// </summary>
305        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
306
307        /// <summary>
308        ///
309        /// </summary>
310        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
311
312        /// <summary>
313        /// Settings of this editor
314        /// </summary>
315        public ISettings Settings
316        {
317            get;
318            set;
319        }
320
321        /// <summary>
322        /// The Presentation of this editor
323        /// </summary>
324        public System.Windows.Controls.UserControl Presentation
325        {
326            get {return WorkspaceManagerEditorView;}
327            set { WorkspaceManagerEditorView = (WorkSpaceEditorView)value; }
328        }
329
330        /// <summary>
331        /// The QuickWatchPresentation of this editor
332        /// </summary>
333        public System.Windows.Controls.UserControl QuickWatchPresentation
334        {
335            get;
336            set;
337        }
338
339        /// <summary>
340        /// Called before execution
341        /// </summary>
342        public void PreExecution()
343        {
344            //to be implemented
345        }
346
347        /// <summary>
348        /// Starts the ExecutionEngine to execute the model
349        /// </summary>
350        public void Execute()
351        {
352            if (executing)
353            {
354                return;
355            }
356           
357            try
358            {
359                GuiLogMessage("Execute Model now!", NotificationLevel.Info);
360                executing = true;
361
362                //Get the gui Thread
363                this.WorkspaceManagerEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
364                {
365                    this.WorkspaceManagerEditorView.root.IsEnabled = false;                   
366                }
367                , null);               
368
369                try
370                {
371                    ExecutionEngine.GuiUpdateInterval = long.Parse(((WorkspaceManagerSettings)this.Settings).GuiUpdateInterval);
372                    if (ExecutionEngine.GuiUpdateInterval <= 0)
373                    {
374                        GuiLogMessage("GuiUpdateInterval can not be <=0; Use GuiUpdateInterval = 1", NotificationLevel.Warning);
375                        ExecutionEngine.GuiUpdateInterval = 1;
376                    }
377                }
378                catch (Exception ex)
379                {
380                    GuiLogMessage("Could not set GuiUpdateInterval: " + ex.Message, NotificationLevel.Warning);
381                    ExecutionEngine.GuiUpdateInterval = 100;
382                }
383
384                ExecutionEngine.BenchmarkPlugins = ((WorkspaceManagerSettings)this.Settings).BenchmarkPlugins;
385
386                ExecutionEngine.Execute(WorkspaceModel);               
387            }
388            catch (Exception ex)
389            {
390                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
391                executing = false;
392            }
393        }
394
395        /// <summary>
396        /// Called after the execution
397        /// </summary>
398        public void PostExecution()
399        {
400            //to be implemented
401        }
402
403        /// <summary>
404        /// Pause the execution
405        /// </summary>
406        public void Pause()
407        {
408            ExecutionEngine.Pause();
409        }
410
411        /// <summary>
412        /// Stop the ExecutionEngine
413        /// </summary>
414        public void Stop()
415        {
416            if (!executing)
417            {
418                return;
419            }
420
421            try
422            {
423                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
424                ExecutionEngine.Stop();
425                //Get the gui Thread
426                this.WorkspaceManagerEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
427                {
428                    this.WorkspaceManagerEditorView.root.IsEnabled = true;
429                }
430                , null);
431            }
432            catch (Exception ex)
433            {
434                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
435               
436            }
437            executing = false;
438        }
439
440        /// <summary>
441        /// Called to initialize the editor
442        /// </summary>
443        public void Initialize()
444        {
445            //to be implemented
446        }
447
448        /// <summary>
449        /// Called when the editor is disposed
450        /// </summary>
451        public void Dispose()
452        {
453            if (ExecutionEngine.IsRunning)
454            {
455                ExecutionEngine.Stop();
456            }
457        }
458
459        #endregion
460
461        #region INotifyPropertyChanged Members
462
463        /// <summary>
464        ///
465        /// </summary>
466        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
467
468        #endregion
469
470        #region IApplication Members
471
472        /// <summary>
473        ///
474        /// </summary>
475        private PluginManager pluginManager;
476        public PluginManager PluginManager
477        {
478            get { return pluginManager; }
479            set
480            {
481                pluginManager = value;
482                DragDropDataObjectToPluginConverter.PluginManager = value;
483            }         
484        }
485
486        #endregion
487
488        #region GuiLogMessage, Progress
489
490        /// <summary>
491        /// Loggs a message to the logging mechanism of CrypTool
492        /// </summary>
493        /// <param name="Message"></param>
494        /// <param name="notificationLevel"></param>
495        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
496        {
497            if (OnGuiLogNotificationOccured != null)
498            {
499                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
500                args.Title = "-";
501                OnGuiLogNotificationOccured(this, args);
502            }
503        }
504
505        /// <summary>
506        /// GuiLogNotificationOccured
507        /// </summary>
508        /// <param name="sender"></param>
509        /// <param name="args"></param>
510        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
511        {
512            //Check if the logging event is Warning or Error and set the State of the PluginModel to
513            //the corresponding PluginModelState
514            if (args.NotificationLevel == NotificationLevel.Warning)
515            {               
516                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
517                {
518                    if (pluginModel.Plugin == sender)
519                    {
520                        pluginModel.State = PluginModelState.Warning;
521                        pluginModel.GuiNeedsUpdate = true;
522                    }
523                }
524            }
525
526            if (args.NotificationLevel == NotificationLevel.Error)
527            {               
528                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
529                {
530                    if (pluginModel.Plugin == sender)
531                    {
532                        pluginModel.State = PluginModelState.Error;
533                        pluginModel.GuiNeedsUpdate = true;
534                    }
535                }
536            }
537           
538            if (OnGuiLogNotificationOccured != null)
539                OnGuiLogNotificationOccured(sender, args);
540        }
541
542        /// <summary>
543        /// Progress of this editor
544        /// </summary>
545        /// <param name="Value"></param>
546        /// <param name="MaxValue"></param>
547        private void Progress(int Value, int MaxValue)
548        {
549            if (OnPluginProgressChanged != null)
550            {
551                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
552            }
553        }
554        #endregion GuiLogMessage, Progress
555
556        /// <summary>
557        /// Selected Plugin changed by View
558        /// </summary>
559        /// <param name="args"></param>
560        public void onSelectedPluginChanged(PluginChangedEventArgs args)
561        {
562            this.OnSelectedPluginChanged(this, args);
563        }
564    }
565}
566
567//Restore warnings for unused or unassigned fields and events:
568#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.