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

Last change on this file since 2182 was 2182, checked in by Sven Rech, 11 years ago

ribbon stuff

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