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

Last change on this file since 1681 was 1681, checked in by kopal, 12 years ago

some bug fixes

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