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

Last change on this file since 1872 was 1872, checked in by kopal, 11 years ago
  • the user can choose the LogLevel now
File size: 21.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;
38using Cryptool.PluginBase.Miscellaneous;
39
40//Disable warnings for unused or unassigned fields and events:
41#pragma warning disable 0169, 0414, 0067
42
43namespace WorkspaceManager
44{
45    /// <summary>
46    /// Workspace Manager - PluginEditor based on MVC Pattern
47    /// </summary>
48    [EditorInfo("cwm")]
49    [Author("Viktor Matkovic,Nils Kopal", "nils.kopal@cryptool.org", "Universität Duisburg-Essen", "http://www.uni-due.de")]
50    [PluginInfo("WorkspaceManager.Resources.Attributes", false, "Workspace Manager", "Graphical plugin editor for the CrypTool workspace", null,
51      "AnotherEditor/icon.png",
52      "AnotherEditor/Images/addWorkspace.png",
53      "AnotherEditor/Images/deleteWorkspace.png",
54      "AnotherEditor/Images/importSubWorkspace.png")]
55    public class WorkspaceManager : IEditor
56    {
57
58        /// <summary>
59        /// Create a new Instance of the Editor
60        /// </summary>
61        public WorkspaceManager()
62        {
63            Settings = new WorkspaceManagerSettings();
64            WorkspaceModel = new WorkspaceModel();
65            WorkspaceModel.WorkspaceManagerEditor = this;
66            WorkspaceSpaceEditorView = new WorkSpaceEditorView(WorkspaceModel);
67            ExecutionEngine = new ExecutionEngine(this);
68            HasChanges = false;                               
69        }
70
71        #region private Members
72
73        private WorkspaceModel WorkspaceModel = null;
74        private WorkSpaceEditorView WorkspaceSpaceEditorView = null;
75        private ExecutionEngine ExecutionEngine = null;
76        private volatile bool executing = false;
77
78        #endregion
79
80        /// <summary>
81        /// Is this Editor executing?
82        /// </summary>
83        public bool isExecuting(){
84            return executing;
85        }
86
87        #region IEditor Members
88
89        /// <summary>
90        ///
91        /// </summary>
92        public event ChangeDisplayLevelHandler OnChangeDisplayLevel;
93
94        /// <summary>
95        ///
96        /// </summary>
97        public event SelectedPluginChangedHandler OnSelectedPluginChanged;
98
99        /// <summary>
100        ///
101        /// </summary>
102        public event ProjectTitleChangedHandler OnProjectTitleChanged;
103
104        /// <summary>
105        ///
106        /// </summary>
107        public event OpenProjectFileHandler OnOpenProjectFile;
108
109        /// <summary>
110        ///
111        /// </summary>
112        public event EditorSpecificPluginsChanged OnEditorSpecificPluginsChanged;
113
114        /// <summary>
115        /// Called by clicking on the new button of CrypTool
116        /// Creates a new Model
117        /// </summary>
118        public void New()
119        {
120            foreach (PluginModel pluginModel in new List<PluginModel>(WorkspaceModel.AllPluginModels))
121            {
122                WorkspaceModel.deletePluginModel(pluginModel);
123            }
124            this.HasChanges = false;
125            this.OnProjectTitleChanged.BeginInvoke(this, "unnamed project", null, null);
126        }
127
128        /// <summary>
129        /// Called by clicking on the open button of CrypTool
130        /// loads a serialized model
131        /// </summary>
132        /// <param name="fileName"></param>
133        public void Open(string fileName)
134        {
135            try
136            {
137                New();
138                GuiLogMessage("Loading Model: " + fileName, NotificationLevel.Info);               
139                WorkspaceModel = ModelPersistance.loadModel(fileName,this);               
140                WorkspaceSpaceEditorView.Load(WorkspaceModel);
141                HasChanges = false;
142                this.OnProjectTitleChanged.BeginInvoke(this, fileName, null, null);
143            }
144            catch (Exception ex)
145            {
146                GuiLogMessage("Could not load Model:" + ex.ToString(), NotificationLevel.Error);
147            }
148        }
149
150        /// <summary>
151        /// Called by clicking on the save button of CrypTool
152        /// serializes the current model
153        /// </summary>
154        /// <param name="fileName"></param>
155        public void Save(string fileName)
156        {
157            try
158            {
159                GuiLogMessage("Saving Model: " + fileName, NotificationLevel.Info);
160                ModelPersistance.saveModel(this.WorkspaceModel, fileName);
161                HasChanges = false;
162                this.OnProjectTitleChanged.BeginInvoke(this, fileName, null, null);
163            }
164            catch (Exception ex)
165            {
166                GuiLogMessage("Could not save Model:" + ex.ToString(), NotificationLevel.Error);               
167            }
168           
169        }
170
171        /// <summary>
172        /// Called by double clicking on a plugin symbol of CrypTool
173        /// Adds a new PluginModel wrapping an instance of the selected plugin
174        /// </summary>
175        /// <param name="type"></param>
176        public void Add(Type type)
177        {
178            /*if (!executing)
179            {
180                PluginModel newPluginModel = WorkspaceModel.newPluginModel(new Point(10, 10), 100, 100, type);
181                GuiLogMessage("Added by double click: " + newPluginModel.Name, NotificationLevel.Info);
182                HasChanges = true;
183            }*/
184        }
185
186        /// <summary>
187        ///
188        /// </summary>
189        /// <param name="espi"></param>
190        public void AddEditorSpecific(EditorSpecificPluginInfo espi)
191        {
192            //to be implemented
193        }
194
195        /// <summary>
196        ///
197        /// </summary>
198        /// <param name="espi"></param>
199        public void DeleteEditorSpecific(EditorSpecificPluginInfo espi)
200        {
201            //to be implemented   
202        }
203
204        /// <summary>
205        /// Undo changes
206        /// </summary>
207        public void Undo()
208        {
209            //to be implemented
210        }
211
212        /// <summary>
213        /// Redo changes
214        /// </summary>
215        public void Redo()
216        {
217            //to be implemented
218        }
219
220        /// <summary>
221        /// Show the Help site
222        /// </summary>
223        public void ShowHelp()
224        {
225            //to be implemented
226        }
227
228        /// <summary>
229        /// Show the Description of the selected plugin
230        /// </summary>
231        public void ShowSelectedPluginDescription()
232        {
233            //to be implemented
234        }
235
236        /// <summary>
237        /// Is Undo possible
238        /// </summary>
239        public bool CanUndo
240        {
241            get;
242            set;
243        }
244
245        /// <summary>
246        /// Is Redo possible?
247        /// </summary>
248        public bool CanRedo
249        {
250            get;
251            set;
252        }
253
254        /// <summary>
255        /// Can the ExecutionEngine be started?
256        /// </summary>
257        public bool CanExecute
258        {
259            get{return !executing;}
260        }
261
262        /// <summary>
263        /// Can the ExecutionEngine be stopped?
264        /// </summary>
265        public bool CanStop
266        {
267            get { return executing; }
268        }
269
270        /// <summary>
271        /// Does this Editor has changes?
272        /// </summary>
273        public bool HasChanges
274        {
275            get;
276            set;
277        }
278
279        /// <summary>
280        /// DisplayLevel
281        /// </summary>
282        public DisplayLevel DisplayLevel
283        {
284            get;
285            set;
286           
287        }
288
289        /// <summary>
290        ///
291        /// </summary>
292        public List<EditorSpecificPluginInfo> EditorSpecificPlugins
293        {
294            get;
295            set;
296        }
297
298        #endregion
299
300        #region IPlugin Members
301
302        /// <summary>
303        ///
304        /// </summary>
305        public event StatusChangedEventHandler OnPluginStatusChanged;
306
307        /// <summary>
308        ///
309        /// </summary>
310        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
311
312        /// <summary>
313        ///
314        /// </summary>
315        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
316
317        /// <summary>
318        /// Settings of this editor
319        /// </summary>
320        public ISettings Settings
321        {
322            get;
323            set;
324        }
325
326        /// <summary>
327        /// The Presentation of this editor
328        /// </summary>
329        public System.Windows.Controls.UserControl Presentation
330        {
331            get {return WorkspaceSpaceEditorView;}
332            set { WorkspaceSpaceEditorView = (WorkSpaceEditorView)value; }
333        }
334
335        /// <summary>
336        /// The QuickWatchPresentation of this editor
337        /// </summary>
338        public System.Windows.Controls.UserControl QuickWatchPresentation
339        {
340            get;
341            set;
342        }
343
344        /// <summary>
345        /// Called before execution
346        /// </summary>
347        public void PreExecution()
348        {
349            //to be implemented
350        }
351
352        /// <summary>
353        /// Starts the ExecutionEngine to execute the model
354        /// </summary>
355        public void Execute()
356        {
357            if (executing)
358            {
359                return;
360            }
361            EventsHelper.AsynchronousPropertyChanged = false;
362            try
363            {
364                GuiLogMessage("Execute Model now!", NotificationLevel.Info);
365                executing = true;
366
367                if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
368                {
369                    EventsHelper.AsynchronousProgressChanged = false;
370                    EventsHelper.AsynchronousGuiLogMessage = false;
371                    EventsHelper.AsynchronousStatusChanged = false;
372                }
373
374                //Get the gui Thread
375                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
376                {
377                    this.WorkspaceSpaceEditorView.ResetConnections();
378                    this.WorkspaceSpaceEditorView.State = EditorState.BUSY;                   
379                }
380                , null);               
381
382                try
383                {
384                    ExecutionEngine.GuiUpdateInterval = long.Parse(((WorkspaceManagerSettings)this.Settings).GuiUpdateInterval);
385                    if (ExecutionEngine.GuiUpdateInterval <= 0)
386                    {
387                        GuiLogMessage("GuiUpdateInterval can not be <=0; Use GuiUpdateInterval = 1", NotificationLevel.Warning);
388                        ExecutionEngine.GuiUpdateInterval = 1;
389                    }
390                }
391                catch (Exception ex)
392                {
393                    GuiLogMessage("Could not set GuiUpdateInterval: " + ex.Message, NotificationLevel.Warning);
394                    ExecutionEngine.GuiUpdateInterval = 100;
395                }
396
397                try
398                {
399                    ExecutionEngine.SleepTime = int.Parse(((WorkspaceManagerSettings)this.Settings).SleepTime);
400                    if (ExecutionEngine.SleepTime < 0)
401                    {
402                        GuiLogMessage("SleepTime can not be <=0; Use GuiUpdateInterval = 0", NotificationLevel.Warning);
403                        ExecutionEngine.SleepTime = 0;
404                    }
405                }
406                catch (Exception ex)
407                {
408                    GuiLogMessage("Could not set SleepTime: " + ex.Message, NotificationLevel.Warning);
409                    ExecutionEngine.GuiUpdateInterval = 0;
410                }
411
412                int schedulers=0;
413                try
414                {
415                   schedulers = int.Parse(((WorkspaceManagerSettings)this.Settings).Schedulers);
416                    if (ExecutionEngine.SleepTime < 0)
417                    {
418                        GuiLogMessage("Schedulers can not be <=0; Use Schedulers = 1", NotificationLevel.Warning);
419                        schedulers = 1;
420                    }
421                }
422                catch (Exception ex)
423                {
424                    GuiLogMessage("Could not set Schedulers: " + ex.Message, NotificationLevel.Warning);
425                    schedulers = 1;
426                }
427
428                ExecutionEngine.BenchmarkPlugins = ((WorkspaceManagerSettings)this.Settings).BenchmarkPlugins;
429
430                ExecutionEngine.Execute(WorkspaceModel, schedulers);               
431            }
432            catch (Exception ex)
433            {
434                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
435                executing = false;
436                if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
437                {
438                    EventsHelper.AsynchronousProgressChanged = true;
439                    EventsHelper.AsynchronousGuiLogMessage = true;
440                    EventsHelper.AsynchronousStatusChanged = true;
441                }
442            }
443        }
444
445        /// <summary>
446        /// Called after the execution
447        /// </summary>
448        public void PostExecution()
449        {
450            //to be implemented
451        }
452
453        /// <summary>
454        /// Pause the execution
455        /// </summary>
456        public void Pause()
457        {
458            ExecutionEngine.Pause();
459        }
460
461        /// <summary>
462        /// Stop the ExecutionEngine
463        /// </summary>
464        public void Stop()
465        {
466            if (!executing)
467            {
468                return;
469            }
470
471            EventsHelper.AsynchronousPropertyChanged = true;
472
473            if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
474            {
475                EventsHelper.AsynchronousProgressChanged = true;
476                EventsHelper.AsynchronousGuiLogMessage = true;
477                EventsHelper.AsynchronousStatusChanged = true;
478            }
479
480            try
481            {
482                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
483                ExecutionEngine.Stop();
484                //Get the gui Thread
485                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
486                {
487                    this.WorkspaceSpaceEditorView.ResetConnections();
488                    this.WorkspaceSpaceEditorView.State = EditorState.READY;
489                }
490                , null);
491            }
492            catch (Exception ex)
493            {
494                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
495               
496            }
497            executing = false;
498        }
499
500        /// <summary>
501        /// Called to initialize the editor
502        /// </summary>
503        public void Initialize()
504        {
505            //to be implemented
506        }
507
508        /// <summary>
509        /// Called when the editor is disposed
510        /// </summary>
511        public void Dispose()
512        {
513            if (ExecutionEngine.IsRunning)
514            {
515                ExecutionEngine.Stop();
516            }
517            EventsHelper.AsynchronousPropertyChanged = true;
518        }
519
520        #endregion
521
522        #region INotifyPropertyChanged Members
523
524        /// <summary>
525        ///
526        /// </summary>
527        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
528
529        #endregion
530
531        #region IApplication Members
532
533        /// <summary>
534        ///
535        /// </summary>
536        private PluginManager pluginManager;
537        public PluginManager PluginManager
538        {
539            get { return pluginManager; }
540            set
541            {
542                pluginManager = value;
543                DragDropDataObjectToPluginConverter.PluginManager = value;
544            }         
545        }
546
547        #endregion
548
549        #region GuiLogMessage, Progress
550
551        /// <summary>
552        /// Loggs a message to the logging mechanism of CrypTool
553        /// </summary>
554        /// <param name="Message"></param>
555        /// <param name="notificationLevel"></param>
556        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
557        {
558            if (OnGuiLogNotificationOccured != null)
559            {
560                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
561                args.Title = "-";
562                OnGuiLogNotificationOccured(this, args);
563            }
564        }
565
566        /// <summary>
567        /// GuiLogNotificationOccured
568        /// </summary>
569        /// <param name="sender"></param>
570        /// <param name="args"></param>
571        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
572        {
573            //Check if the logging event is Warning or Error and set the State of the PluginModel to
574            //the corresponding PluginModelState
575            if (args.NotificationLevel == NotificationLevel.Warning)
576            {               
577                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
578                {
579                    if (pluginModel.Plugin == sender)
580                    {
581                        pluginModel.State = PluginModelState.Warning;
582                        pluginModel.GuiNeedsUpdate = true;
583                    }
584                }
585            }
586
587            if (args.NotificationLevel == NotificationLevel.Error)
588            {               
589                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
590                {
591                    if (pluginModel.Plugin == sender)
592                    {
593                        pluginModel.State = PluginModelState.Error;
594                        pluginModel.GuiNeedsUpdate = true;
595                    }
596                }
597            }
598
599            if (OnGuiLogNotificationOccured != null)
600            {
601                switch (((WorkspaceManagerSettings)this.Settings).LogLevel)
602                {
603                    case 3://Error
604                        if (args.NotificationLevel == NotificationLevel.Debug ||
605                            args.NotificationLevel == NotificationLevel.Info ||
606                            args.NotificationLevel == NotificationLevel.Warning)
607                        {
608                            return;
609                        }
610                        break;
611
612                    case 2://Warning
613                        if (args.NotificationLevel == NotificationLevel.Debug ||
614                            args.NotificationLevel == NotificationLevel.Info)
615                        {
616                            return;
617                        }
618                        break;
619
620                    case 1://Info
621                        if (args.NotificationLevel == NotificationLevel.Debug)
622                        {
623                            return;
624                        }
625                        break;
626                }
627                OnGuiLogNotificationOccured(sender, args);
628            }
629               
630        }
631
632        /// <summary>
633        /// Progress of this editor
634        /// </summary>
635        /// <param name="Value"></param>
636        /// <param name="MaxValue"></param>
637        private void Progress(int Value, int MaxValue)
638        {
639            if (OnPluginProgressChanged != null)
640            {
641                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
642            }
643        }
644        #endregion GuiLogMessage, Progress
645
646        /// <summary>
647        /// Selected Plugin changed by View
648        /// </summary>
649        /// <param name="args"></param>
650        public void onSelectedPluginChanged(PluginChangedEventArgs args)
651        {
652            this.OnSelectedPluginChanged(this, args);
653        }
654    }
655}
656
657//Restore warnings for unused or unassigned fields and events:
658#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.