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

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