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

Last change on this file since 2426 was 2426, checked in by sauer, 11 years ago

Wizard: sample input

File size: 27.3 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;
39using WorkspaceManager.View.VisualComponents;
40using System.Windows.Media.Imaging;
41using System.Printing;
42using System.Windows.Documents;
43using System.Windows.Markup;
44
45//Disable warnings for unused or unassigned fields and events:
46#pragma warning disable 0169, 0414, 0067
47
48namespace WorkspaceManager
49{
50    /// <summary>
51    /// Workspace Manager - PluginEditor based on MVC Pattern
52    /// </summary>
53    [EditorInfo("cwm")]
54    [Author("Viktor Matkovic,Nils Kopal", "nils.kopal@cryptool.org", "Universität Duisburg-Essen", "http://www.uni-due.de")]
55    [PluginInfo("WorkspaceManager.Resources.Attributes", false, "Workspace Manager", "Graphical plugin editor for the CrypTool workspace", null,
56      "AnotherEditor/icon.png",
57      "AnotherEditor/Images/addWorkspace.png",
58      "AnotherEditor/Images/deleteWorkspace.png",
59      "AnotherEditor/Images/importSubWorkspace.png")]
60    public class WorkspaceManager : IEditor
61    {
62
63        /// <summary>
64        /// Create a new Instance of the Editor
65        /// </summary>
66        public WorkspaceManager()
67        {
68            Settings = new WorkspaceManagerSettings(this);
69            WorkspaceModel = new WorkspaceModel();
70            WorkspaceModel.WorkspaceManagerEditor = this;
71            WorkspaceSpaceEditorView = new WorkSpaceEditorView(WorkspaceModel);
72            HasChanges = false;                               
73        }
74
75        #region private Members
76
77        private WorkspaceModel WorkspaceModel = null;
78        private WorkSpaceEditorView WorkspaceSpaceEditorView = null;
79        private ExecutionEngine ExecutionEngine = null;
80        private volatile bool executing = false;
81        private volatile bool stopping = false;
82
83        #endregion
84
85        /// <summary>
86        /// Is this Editor executing?
87        /// </summary>
88        public bool isExecuting(){
89            return executing;
90        }
91
92        #region IEditor Members
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        /// Current filename
116        /// </summary>
117        public string CurrentFilename { private set; get; }
118
119        /// <summary>
120        /// Called by clicking on the new button of CrypTool
121        /// Creates a new Model
122        /// </summary>
123        public void New()
124        {
125            foreach (PluginModel pluginModel in new List<PluginModel>(WorkspaceModel.AllPluginModels))
126            {
127                WorkspaceModel.deletePluginModel(pluginModel);
128            }
129            this.HasChanges = false;
130            CurrentFilename = "unnamed project";
131            this.OnProjectTitleChanged.BeginInvoke(this, "unnamed project", null, null);
132        }
133
134        /// <summary>
135        /// Open the given model in the editor
136        /// </summary>
137        /// <param name="fileName"></param>
138        public void Open(WorkspaceModel model)
139        {
140            try
141            {
142                New();
143                WorkspaceSpaceEditorView.Load(model);               
144            }
145            catch (Exception ex)
146            {
147                GuiLogMessage("Could not open Model:" + ex.ToString(), NotificationLevel.Error);
148            }
149        }
150       
151        /// <summary>
152        /// Called by clicking on the open button of CrypTool
153        /// loads a serialized model
154        /// </summary>
155        /// <param name="fileName"></param>
156        public void Open(string fileName)
157        {
158            try
159            {
160                New();
161                GuiLogMessage("Loading Model: " + fileName, NotificationLevel.Info);               
162                WorkspaceModel = ModelPersistance.loadModel(fileName,this);               
163                WorkspaceSpaceEditorView.Load(WorkspaceModel);
164                HasChanges = false;
165                this.OnProjectTitleChanged.BeginInvoke(this, System.IO.Path.GetFileName(fileName), null, null);
166                CurrentFilename = fileName;
167            }
168            catch (Exception ex)
169            {
170                GuiLogMessage("Could not load Model:" + ex.ToString(), NotificationLevel.Error);
171            }
172        }
173
174        /// <summary>
175        /// Called by clicking on the save button of CrypTool
176        /// serializes the current model
177        /// </summary>
178        /// <param name="fileName"></param>
179        public void Save(string fileName)
180        {
181            try
182            {
183                GuiLogMessage("Saving Model: " + fileName, NotificationLevel.Info);
184                ModelPersistance.saveModel(this.WorkspaceModel, fileName);
185                HasChanges = false;
186                this.OnProjectTitleChanged.BeginInvoke(this, System.IO.Path.GetFileName(fileName), null, null);
187                CurrentFilename = fileName;
188            }
189            catch (Exception ex)
190            {
191                GuiLogMessage("Could not save Model:" + ex.ToString(), NotificationLevel.Error);               
192            }
193           
194        }
195
196        /// <summary>
197        /// Called by double clicking on a plugin symbol of CrypTool
198        /// Adds a new PluginModel wrapping an instance of the selected plugin
199        /// </summary>
200        /// <param name="type"></param>
201        public void Add(Type type)
202        {
203            /*if (!executing)
204            {
205                PluginModel newPluginModel = WorkspaceModel.newPluginModel(new Point(10, 10), 100, 100, type);
206                GuiLogMessage("Added by double click: " + newPluginModel.Name, NotificationLevel.Info);
207                HasChanges = true;
208            }*/
209        }
210
211        /// <summary>
212        ///
213        /// </summary>
214        /// <param name="espi"></param>
215        public void AddEditorSpecific(EditorSpecificPluginInfo espi)
216        {
217            //to be implemented
218        }
219
220        /// <summary>
221        ///
222        /// </summary>
223        /// <param name="espi"></param>
224        public void DeleteEditorSpecific(EditorSpecificPluginInfo espi)
225        {
226            //to be implemented   
227        }
228
229        /// <summary>
230        /// Undo changes
231        /// </summary>
232        public void Undo()
233        {
234            //to be implemented
235        }
236
237        /// <summary>
238        /// Redo changes
239        /// </summary>
240        public void Redo()
241        {
242            //to be implemented
243        }
244
245        public void Cut()
246        {
247           
248        }
249
250        public void Copy()
251        {
252           
253        }
254
255        public void Paste()
256        {
257           
258        }
259
260        public void Remove()
261        {
262           
263        }
264
265        public void Print()
266        {
267            try
268            {
269                Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
270                double dx = m.M11 * 96;
271                double dy = m.M22 * 96;
272                this.GuiLogMessage("dx=" + dx + " dy=" + dy, NotificationLevel.Debug);
273                const int factor = 4;
274                ModifiedCanvas control = (ModifiedCanvas)((WorkSpaceEditorView)this.Presentation).scrollViewer.Content;
275                PrintDialog dialog = new PrintDialog();
276                dialog.PageRangeSelection = PageRangeSelection.AllPages;
277                dialog.UserPageRangeEnabled = true;
278
279                Nullable<Boolean> print = dialog.ShowDialog();
280                if (print == true)
281                {
282                    this.GuiLogMessage("Printing document \"" + this.CurrentFilename + "\" now", NotificationLevel.Info);
283                   
284                    PrintCapabilities capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
285                    System.Windows.Size pageSize = new System.Windows.Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
286                    System.Windows.Size visibleSize = new System.Windows.Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
287
288                    FixedDocument fixedDoc = new FixedDocument();
289                    control.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
290                    control.Arrange(new Rect(new System.Windows.Point(0, 0), control.DesiredSize));
291                    System.Windows.Size size = control.DesiredSize;
292
293                    RenderTargetBitmap bmp = new RenderTargetBitmap((int)size.Width * factor, (int)size.Height * factor, dx * factor, dy * factor, PixelFormats.Pbgra32);
294                    bmp.Render(control);
295
296
297                    double xOffset = 0;
298                    double yOffset = 0;
299                    while (xOffset < size.Width)
300                    {
301                        yOffset = 0;
302                        while (yOffset < size.Height)
303                        {
304                            PageContent pageContent = new PageContent();
305                            FixedPage page = new FixedPage();
306                            ((IAddChild)pageContent).AddChild(page);
307                            fixedDoc.Pages.Add(pageContent);
308                            page.Width = pageSize.Width;
309                            page.Height = pageSize.Height;
310                            int width = (xOffset + visibleSize.Width) > size.Width ? (int)(size.Width - xOffset) : (int)visibleSize.Width;
311                            int height = (yOffset + visibleSize.Height) > size.Height ? (int)(size.Height - yOffset) : (int)visibleSize.Height;
312                            System.Windows.Controls.Image croppedImage = new System.Windows.Controls.Image();                           
313                            CroppedBitmap cb = new CroppedBitmap(bmp, new Int32Rect((int)xOffset * factor, (int)yOffset *factor, width * factor, height * factor));
314                            croppedImage.Source = cb;
315                            croppedImage.Width = width;
316                            croppedImage.Height = height;
317                            page.Children.Add(croppedImage);
318                            yOffset += visibleSize.Height;
319                        }
320                        xOffset += visibleSize.Width;
321                    }
322                    dialog.PrintDocument(fixedDoc.DocumentPaginator, "WorkspaceManager_" + this.CurrentFilename);
323                    this.GuiLogMessage("Printed \"" + fixedDoc.DocumentPaginator.PageCount + "\" pages of document \"" + this.CurrentFilename + "\"", NotificationLevel.Info);
324                }
325            }
326            catch (Exception ex)
327            {
328                this.GuiLogMessage("Exception while printing: " + ex.Message, NotificationLevel.Error);
329            }
330        }
331
332        /// <summary>
333        /// Show the Help site
334        /// </summary>
335        public void ShowHelp()
336        {
337            //to be implemented
338        }
339
340        /// <summary>
341        /// Show the Description of the selected plugin
342        /// </summary>
343        public void ShowSelectedPluginDescription()
344        {
345            //to be implemented
346        }
347
348        /// <summary>
349        /// Is Undo possible
350        /// </summary>
351        public bool CanUndo
352        {
353            get;
354            set;
355        }
356
357        /// <summary>
358        /// Is Redo possible?
359        /// </summary>
360        public bool CanRedo
361        {
362            get;
363            set;
364        }
365
366        public bool CanCut
367        {
368            get { return false; }
369        }
370
371        public bool CanCopy
372        {
373            get { return false; }
374        }
375
376        public bool CanPaste
377        {
378            get { return false; }
379        }
380
381        public bool CanRemove
382        {
383            get { return false; }
384        }
385
386        /// <summary>
387        /// Can the ExecutionEngine be started?
388        /// </summary>
389        public bool CanExecute
390        {
391            get{return !executing;}
392        }
393
394        /// <summary>
395        /// Can the ExecutionEngine be stopped?
396        /// </summary>
397        public bool CanStop
398        {
399            get { return executing; }
400        }
401
402        /// <summary>
403        /// Does this Editor has changes?
404        /// </summary>
405        public bool HasChanges
406        {
407            get;
408            set;
409        }
410
411        public bool CanPrint
412        {
413            get { return true; }
414        }
415
416        public string SamplesDir
417        {
418            set {  }
419        }
420
421        /// <summary>
422        ///
423        /// </summary>
424        public List<EditorSpecificPluginInfo> EditorSpecificPlugins
425        {
426            get;
427            set;
428        }
429
430        public bool ReadOnly { get; set; }
431
432        #endregion
433
434        #region IPlugin Members
435
436        /// <summary>
437        ///
438        /// </summary>
439        public event StatusChangedEventHandler OnPluginStatusChanged;
440
441        /// <summary>
442        ///
443        /// </summary>
444        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
445
446        /// <summary>
447        ///
448        /// </summary>
449        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
450
451        /// <summary>
452        /// Settings of this editor
453        /// </summary>
454        public ISettings Settings
455        {
456            get;
457            set;
458        }
459
460        /// <summary>
461        /// The Presentation of this editor
462        /// </summary>
463        public System.Windows.Controls.UserControl Presentation
464        {
465            get {return WorkspaceSpaceEditorView;}
466            set { WorkspaceSpaceEditorView = (WorkSpaceEditorView)value; }
467        }
468
469        /// <summary>
470        /// The QuickWatchPresentation of this editor
471        /// </summary>
472        public System.Windows.Controls.UserControl QuickWatchPresentation
473        {
474            get;
475            set;
476        }
477
478        /// <summary>
479        /// Called before execution
480        /// </summary>
481        public void PreExecution()
482        {
483            //to be implemented
484        }
485
486        /// <summary>
487        /// Starts the ExecutionEngine to execute the model
488        /// </summary>
489        public void Execute()
490        {
491            if (executing)
492            {
493                return;
494            }
495            EventsHelper.AsynchronousPropertyChanged = false;
496            try
497            {
498                GuiLogMessage("Execute Model now!", NotificationLevel.Info);
499                executing = true;
500
501                if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
502                {
503                    EventsHelper.AsynchronousProgressChanged = false;
504                    EventsHelper.AsynchronousGuiLogMessage = false;
505                    EventsHelper.AsynchronousStatusChanged = false;
506                }
507
508                //Get the gui Thread
509                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
510                {
511                    this.WorkspaceSpaceEditorView.ResetConnections();
512                    this.WorkspaceSpaceEditorView.State = EditorState.BUSY;                   
513                }
514                , null);
515
516                this.ExecutionEngine = new ExecutionEngine(this);
517
518                try
519                {
520                    ExecutionEngine.GuiUpdateInterval = int.Parse(((WorkspaceManagerSettings)this.Settings).GuiUpdateInterval);
521                    if (ExecutionEngine.GuiUpdateInterval <= 0)
522                    {
523                        GuiLogMessage("GuiUpdateInterval can not be <=0; Use GuiUpdateInterval = 1", NotificationLevel.Warning);
524                        ExecutionEngine.GuiUpdateInterval = 1;
525                    }
526                }
527                catch (Exception ex)
528                {
529                    GuiLogMessage("Could not set GuiUpdateInterval: " + ex.Message, NotificationLevel.Warning);
530                    ExecutionEngine.GuiUpdateInterval = 100;
531                }
532
533                try
534                {
535                    ExecutionEngine.SleepTime = int.Parse(((WorkspaceManagerSettings)this.Settings).SleepTime);
536                    if (ExecutionEngine.SleepTime < 0)
537                    {
538                        GuiLogMessage("SleepTime can not be <=0; Use GuiUpdateInterval = 0", NotificationLevel.Warning);
539                        ExecutionEngine.SleepTime = 0;
540                    }
541                }
542                catch (Exception ex)
543                {
544                    GuiLogMessage("Could not set SleepTime: " + ex.Message, NotificationLevel.Warning);
545                    ExecutionEngine.GuiUpdateInterval = 0;
546                }
547
548                int schedulers=0;
549                try
550                {
551                   schedulers = int.Parse(((WorkspaceManagerSettings)this.Settings).Threads);
552                    if (ExecutionEngine.SleepTime < 0)
553                    {
554                        GuiLogMessage("Schedulers can not be <=0; Use Schedulers = 1", NotificationLevel.Warning);
555                        schedulers = 1;
556                    }
557                }
558                catch (Exception ex)
559                {
560                    GuiLogMessage("Could not set Schedulers: " + ex.Message, NotificationLevel.Warning);
561                    schedulers = 1;
562                }
563
564                ExecutionEngine.BenchmarkPlugins = ((WorkspaceManagerSettings)this.Settings).BenchmarkPlugins;
565                ExecutionEngine.ThreadPriority = ((WorkspaceManagerSettings)this.Settings).ThreadPriority;
566
567                ExecutionEngine.Execute(WorkspaceModel, schedulers);               
568            }
569            catch (Exception ex)
570            {
571                GuiLogMessage("Exception during the execution: " + ex.Message, NotificationLevel.Error);
572                executing = false;
573                if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
574                {
575                    EventsHelper.AsynchronousProgressChanged = true;
576                    EventsHelper.AsynchronousGuiLogMessage = true;
577                    EventsHelper.AsynchronousStatusChanged = true;
578                }
579            }
580        }
581
582        /// <summary>
583        /// Called after the execution
584        /// </summary>
585        public void PostExecution()
586        {
587            //to be implemented
588        }
589
590        /// <summary>
591        /// Pause the execution
592        /// </summary>
593        public void Pause()
594        {   
595            //to be implemented
596        }
597
598        /// <summary>
599        /// Stop the ExecutionEngine
600        /// </summary>
601        public void Stop()
602        {
603            if (!executing || stopping)
604            {
605                return;
606            }
607
608            stopping = true;
609
610            Thread stopThread = new Thread(new ThreadStart(waitingStop));
611            stopThread.Start(); 
612
613            EventsHelper.AsynchronousPropertyChanged = true;
614
615            if (((WorkspaceManagerSettings)this.Settings).SynchronousEvents)
616            {
617                EventsHelper.AsynchronousProgressChanged = true;
618                EventsHelper.AsynchronousGuiLogMessage = true;
619                EventsHelper.AsynchronousStatusChanged = true;
620            }
621
622                       
623        }
624
625        /// <summary>
626        /// Stops the execution engine and blocks until this work is done
627        /// </summary>
628        private void waitingStop()
629        {
630            try
631            {
632                GuiLogMessage("Executing stopped by User!", NotificationLevel.Info);
633                ExecutionEngine.Stop();
634                //Get the gui Thread
635                this.WorkspaceSpaceEditorView.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
636                {
637                    this.WorkspaceSpaceEditorView.ResetConnections();
638                    this.WorkspaceSpaceEditorView.State = EditorState.READY;
639                }
640                , null);
641            }
642            catch (Exception ex)
643            {
644                GuiLogMessage("Exception during the stopping of the execution: " + ex.Message, NotificationLevel.Error);
645            }
646            executing = false;
647            this.ExecutionEngine = null;
648            GC.Collect();
649            stopping = false;
650        }
651
652        /// <summary>
653        /// Called to initialize the editor
654        /// </summary>
655        public void Initialize()
656        {
657            //to be implemented
658        }
659
660        /// <summary>
661        /// Called when the editor is disposed
662        /// </summary>
663        public void Dispose()
664        {
665            if (ExecutionEngine != null && ExecutionEngine.IsRunning)
666            {
667                ExecutionEngine.Stop();
668            }
669            EventsHelper.AsynchronousPropertyChanged = true;
670        }
671
672        #endregion
673
674        #region INotifyPropertyChanged Members
675
676        /// <summary>
677        ///
678        /// </summary>
679        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
680
681        #endregion
682
683        #region IApplication Members
684
685        /// <summary>
686        ///
687        /// </summary>
688        private PluginManager pluginManager;
689        public PluginManager PluginManager
690        {
691            get { return pluginManager; }
692            set
693            {
694                pluginManager = value;
695                DragDropDataObjectToPluginConverter.PluginManager = value;
696            }         
697        }
698
699        #endregion
700
701        #region GuiLogMessage, Progress
702
703        /// <summary>
704        /// Loggs a message to the logging mechanism of CrypTool
705        /// </summary>
706        /// <param name="Message"></param>
707        /// <param name="notificationLevel"></param>
708        public void GuiLogMessage(string Message, NotificationLevel notificationLevel)
709        {
710            if (OnGuiLogNotificationOccured != null)
711            {
712                GuiLogEventArgs args = new GuiLogEventArgs(Message, this, notificationLevel);
713                args.Title = "-";
714                OnGuiLogNotificationOccured(this, args);
715            }
716        }
717
718        /// <summary>
719        /// GuiLogNotificationOccured
720        /// </summary>
721        /// <param name="sender"></param>
722        /// <param name="args"></param>
723        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
724        {
725            //Check if the logging event is Warning or Error and set the State of the PluginModel to
726            //the corresponding PluginModelState
727            if (args.NotificationLevel == NotificationLevel.Warning)
728            {               
729                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
730                {
731                    if (pluginModel.Plugin == sender)
732                    {
733                        pluginModel.State = PluginModelState.Warning;
734                        pluginModel.GuiNeedsUpdate = true;
735                    }
736                }
737            }
738
739            if (args.NotificationLevel == NotificationLevel.Error)
740            {               
741                foreach (PluginModel pluginModel in this.WorkspaceModel.AllPluginModels)
742                {
743                    if (pluginModel.Plugin == sender)
744                    {
745                        pluginModel.State = PluginModelState.Error;
746                        pluginModel.GuiNeedsUpdate = true;
747                    }
748                }
749            }
750
751            if (OnGuiLogNotificationOccured != null)
752            {
753                switch (((WorkspaceManagerSettings)this.Settings).LogLevel)
754                {
755                    case 3://Error
756                        if (args.NotificationLevel == NotificationLevel.Debug ||
757                            args.NotificationLevel == NotificationLevel.Info ||
758                            args.NotificationLevel == NotificationLevel.Warning)
759                        {
760                            return;
761                        }
762                        break;
763
764                    case 2://Warning
765                        if (args.NotificationLevel == NotificationLevel.Debug ||
766                            args.NotificationLevel == NotificationLevel.Info)
767                        {
768                            return;
769                        }
770                        break;
771
772                    case 1://Info
773                        if (args.NotificationLevel == NotificationLevel.Debug)
774                        {
775                            return;
776                        }
777                        break;
778                }
779                OnGuiLogNotificationOccured(sender, args);
780            }
781               
782        }
783
784        /// <summary>
785        /// Progress of this editor
786        /// </summary>
787        /// <param name="Value"></param>
788        /// <param name="MaxValue"></param>
789        private void Progress(int Value, int MaxValue)
790        {
791            if (OnPluginProgressChanged != null)
792            {
793                OnPluginProgressChanged(this, new PluginProgressEventArgs(Value, MaxValue));
794            }
795        }
796        #endregion GuiLogMessage, Progress
797
798        /// <summary>
799        /// Selected Plugin changed by View
800        /// </summary>
801        /// <param name="args"></param>
802        public void onSelectedPluginChanged(PluginChangedEventArgs args)
803        {
804            this.OnSelectedPluginChanged(this, args);
805        }
806
807        #region IEditor Members
808
809
810        public void Active()
811        {
812            var b = true;
813        }
814
815        #endregion
816
817        #region IEditor Members
818
819
820        public event OpenTabHandler OnOpenTab;
821
822        #endregion
823    }
824}
825
826//Restore warnings for unused or unassigned fields and events:
827#pragma warning restore 0169, 0414, 0067
Note: See TracBrowser for help on using the repository browser.