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

Last change on this file since 1760 was 1760, checked in by matkovic, 11 years ago

-Style changes
-Images added
-Various changes

File size: 17.3 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                ExecutionEngine.BenchmarkPlugins = ((WorkspaceManagerSettings)this.Settings).BenchmarkPlugins;
389
390                ExecutionEngine.Execute(WorkspaceModel);               
391            }
392            catch (Exception ex)
393            {
394                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
395                executing = false;
396            }
397        }
398
399        /// <summary>
400        /// Called after the execution
401        /// </summary>
402        public void PostExecution()
403        {
404            //to be implemented
405        }
406
407        /// <summary>
408        /// Pause the execution
409        /// </summary>
410        public void Pause()
411        {
412            ExecutionEngine.Pause();
413        }
414
415        /// <summary>
416        /// Stop the ExecutionEngine
417        /// </summary>
418        public void Stop()
419        {
420            if (!executing)
421            {
422                return;
423            }
424
425            try
426            {
427                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
428                ExecutionEngine.Stop();
429                //Get the gui Thread
430                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
431                {
432                    this.WorkspaceSpaceEditorView.ResetConnections();
433                    this.WorkspaceSpaceEditorView.State = EditorState.READY;
434                }
435                , null);
436            }
437            catch (Exception ex)
438            {
439                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
440               
441            }
442            executing = false;
443        }
444
445        /// <summary>
446        /// Called to initialize the editor
447        /// </summary>
448        public void Initialize()
449        {
450            //to be implemented
451        }
452
453        /// <summary>
454        /// Called when the editor is disposed
455        /// </summary>
456        public void Dispose()
457        {
458            if (ExecutionEngine.IsRunning)
459            {
460                ExecutionEngine.Stop();
461            }
462        }
463
464        #endregion
465
466        #region INotifyPropertyChanged Members
467
468        /// <summary>
469        ///
470        /// </summary>
471        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
472
473        #endregion
474
475        #region IApplication Members
476
477        /// <summary>
478        ///
479        /// </summary>
480        private PluginManager pluginManager;
481        public PluginManager PluginManager
482        {
483            get { return pluginManager; }
484            set
485            {
486                pluginManager = value;
487                DragDropDataObjectToPluginConverter.PluginManager = value;
488            }         
489        }
490
491        #endregion
492
493        #region GuiLogMessage, Progress
494
495        /// <summary>
496        /// Loggs a message to the logging mechanism of CrypTool
497        /// </summary>
498        /// <param name="Message"></param>
499        /// <param name="notificationLevel"></param>
500        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
501        {
502            if (OnGuiLogNotificationOccured != null)
503            {
504                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
505                args.Title = "-";
506                OnGuiLogNotificationOccured(this, args);
507            }
508        }
509
510        /// <summary>
511        /// GuiLogNotificationOccured
512        /// </summary>
513        /// <param name="sender"></param>
514        /// <param name="args"></param>
515        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
516        {
517            //Check if the logging event is Warning or Error and set the State of the PluginModel to
518            //the corresponding PluginModelState
519            if (args.NotificationLevel == NotificationLevel.Warning)
520            {               
521                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
522                {
523                    if (pluginModel.Plugin == sender)
524                    {
525                        pluginModel.State = PluginModelState.Warning;
526                        pluginModel.GuiNeedsUpdate = true;
527                    }
528                }
529            }
530
531            if (args.NotificationLevel == NotificationLevel.Error)
532            {               
533                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
534                {
535                    if (pluginModel.Plugin == sender)
536                    {
537                        pluginModel.State = PluginModelState.Error;
538                        pluginModel.GuiNeedsUpdate = true;
539                    }
540                }
541            }
542           
543            if (OnGuiLogNotificationOccured != null)
544                OnGuiLogNotificationOccured(sender, args);
545        }
546
547        /// <summary>
548        /// Progress of this editor
549        /// </summary>
550        /// <param name="Value"></param>
551        /// <param name="MaxValue"></param>
552        private void Progress(int Value, int MaxValue)
553        {
554            if (OnPluginProgressChanged != null)
555            {
556                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
557            }
558        }
559        #endregion GuiLogMessage, Progress
560
561        /// <summary>
562        /// Selected Plugin changed by View
563        /// </summary>
564        /// <param name="args"></param>
565        public void onSelectedPluginChanged(PluginChangedEventArgs args)
566        {
567            this.OnSelectedPluginChanged(this, args);
568        }
569    }
570}
571
572//Restore warnings for unused or unassigned fields and events:
573#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.