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

Last change on this file since 1717 was 1717, checked in by matkovic, 12 years ago

-added loading from Model
-added several images
-added Connector data presentation
-several style changes

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