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

Last change on this file since 1892 was 1884, checked in by kopal, 11 years ago
  • created multi processor gears4net scheduler for execution engine
  • added setting for thread priority
File size: 21.1 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).Threads);
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                ExecutionEngine.ThreadPriority = ((WorkspaceManagerSettings)this.Settings).ThreadPriority;
430
431                ExecutionEngine.Execute(WorkspaceModel, schedulers);               
432            }
433            catch (Exception ex)
434            {
435                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
436                executing = false;
437                if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
438                {
439                    EventsHelper.AsynchronousProgressChanged = true;
440                    EventsHelper.AsynchronousGuiLogMessage = true;
441                    EventsHelper.AsynchronousStatusChanged = true;
442                }
443            }
444        }
445
446        /// <summary>
447        /// Called after the execution
448        /// </summary>
449        public void PostExecution()
450        {
451            //to be implemented
452        }
453
454        /// <summary>
455        /// Pause the execution
456        /// </summary>
457        public void Pause()
458        {
459            ExecutionEngine.Pause();
460        }
461
462        /// <summary>
463        /// Stop the ExecutionEngine
464        /// </summary>
465        public void Stop()
466        {
467            if (!executing)
468            {
469                return;
470            }
471
472            EventsHelper.AsynchronousPropertyChanged = true;
473
474            if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
475            {
476                EventsHelper.AsynchronousProgressChanged = true;
477                EventsHelper.AsynchronousGuiLogMessage = true;
478                EventsHelper.AsynchronousStatusChanged = true;
479            }
480
481            try
482            {
483                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
484                ExecutionEngine.Stop();
485                //Get the gui Thread
486                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
487                {
488                    this.WorkspaceSpaceEditorView.ResetConnections();
489                    this.WorkspaceSpaceEditorView.State = EditorState.READY;
490                }
491                , null);
492            }
493            catch (Exception ex)
494            {
495                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
496               
497            }
498            executing = false;
499        }
500
501        /// <summary>
502        /// Called to initialize the editor
503        /// </summary>
504        public void Initialize()
505        {
506            //to be implemented
507        }
508
509        /// <summary>
510        /// Called when the editor is disposed
511        /// </summary>
512        public void Dispose()
513        {
514            if (ExecutionEngine.IsRunning)
515            {
516                ExecutionEngine.Stop();
517            }
518            EventsHelper.AsynchronousPropertyChanged = true;
519        }
520
521        #endregion
522
523        #region INotifyPropertyChanged Members
524
525        /// <summary>
526        ///
527        /// </summary>
528        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
529
530        #endregion
531
532        #region IApplication Members
533
534        /// <summary>
535        ///
536        /// </summary>
537        private PluginManager pluginManager;
538        public PluginManager PluginManager
539        {
540            get { return pluginManager; }
541            set
542            {
543                pluginManager = value;
544                DragDropDataObjectToPluginConverter.PluginManager = value;
545            }         
546        }
547
548        #endregion
549
550        #region GuiLogMessage, Progress
551
552        /// <summary>
553        /// Loggs a message to the logging mechanism of CrypTool
554        /// </summary>
555        /// <param name="Message"></param>
556        /// <param name="notificationLevel"></param>
557        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
558        {
559            if (OnGuiLogNotificationOccured != null)
560            {
561                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
562                args.Title = "-";
563                OnGuiLogNotificationOccured(this, args);
564            }
565        }
566
567        /// <summary>
568        /// GuiLogNotificationOccured
569        /// </summary>
570        /// <param name="sender"></param>
571        /// <param name="args"></param>
572        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
573        {
574            //Check if the logging event is Warning or Error and set the State of the PluginModel to
575            //the corresponding PluginModelState
576            if (args.NotificationLevel == NotificationLevel.Warning)
577            {               
578                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
579                {
580                    if (pluginModel.Plugin == sender)
581                    {
582                        pluginModel.State = PluginModelState.Warning;
583                        pluginModel.GuiNeedsUpdate = true;
584                    }
585                }
586            }
587
588            if (args.NotificationLevel == NotificationLevel.Error)
589            {               
590                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
591                {
592                    if (pluginModel.Plugin == sender)
593                    {
594                        pluginModel.State = PluginModelState.Error;
595                        pluginModel.GuiNeedsUpdate = true;
596                    }
597                }
598            }
599
600            if (OnGuiLogNotificationOccured != null)
601            {
602                switch (((WorkspaceManagerSettings)this.Settings).LogLevel)
603                {
604                    case 3://Error
605                        if (args.NotificationLevel == NotificationLevel.Debug ||
606                            args.NotificationLevel == NotificationLevel.Info ||
607                            args.NotificationLevel == NotificationLevel.Warning)
608                        {
609                            return;
610                        }
611                        break;
612
613                    case 2://Warning
614                        if (args.NotificationLevel == NotificationLevel.Debug ||
615                            args.NotificationLevel == NotificationLevel.Info)
616                        {
617                            return;
618                        }
619                        break;
620
621                    case 1://Info
622                        if (args.NotificationLevel == NotificationLevel.Debug)
623                        {
624                            return;
625                        }
626                        break;
627                }
628                OnGuiLogNotificationOccured(sender, args);
629            }
630               
631        }
632
633        /// <summary>
634        /// Progress of this editor
635        /// </summary>
636        /// <param name="Value"></param>
637        /// <param name="MaxValue"></param>
638        private void Progress(int Value, int MaxValue)
639        {
640            if (OnPluginProgressChanged != null)
641            {
642                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
643            }
644        }
645        #endregion GuiLogMessage, Progress
646
647        /// <summary>
648        /// Selected Plugin changed by View
649        /// </summary>
650        /// <param name="args"></param>
651        public void onSelectedPluginChanged(PluginChangedEventArgs args)
652        {
653            this.OnSelectedPluginChanged(this, args);
654        }
655    }
656}
657
658//Restore warnings for unused or unassigned fields and events:
659#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.