source: trunk/CrypPlugins/WorkspaceManager/Model/PluginModel.cs @ 1895

Last change on this file since 1895 was 1895, checked in by kopal, 11 years ago
  • removed Parent because it did not work well (have to implement new Parent concept)
  • TextModels (RichTextBox) data is now saved/loaded
File size: 18.8 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.PluginBase;
23using System.Threading;
24using System.Windows.Controls;
25using Gears4Net;
26using WorkspaceManager.Execution;
27using System.Windows.Threading;
28using Cryptool.PluginBase.IO;
29using System.Reflection;
30using System.ComponentModel;
31using WorkspaceManager.View.Container;
32
33namespace WorkspaceManager.Model
34{
35    /// <summary>
36    /// Log updated event
37    /// </summary>
38    public class LogUpdated : EventArgs
39    {
40        public GuiLogEventArgs log;
41    }
42
43    /// <summary>
44    /// Class to represent and wrap a IPlugin in our model graph
45    /// </summary>
46    [Serializable]
47    public class PluginModel : VisualElementModel
48    {
49        #region private members
50
51        [NonSerialized]
52        private PluginProtocol pluginProtocol;
53        [NonSerialized]
54        private IPlugin plugin;         
55        private int imageIndex = 0;
56        [NonSerialized]
57        private PluginModelState state = PluginModelState.Normal;
58        private string PluginTypeName = null;
59        private string PluginTypeAssemblyName = null;
60       
61        #endregion
62
63        #region public members
64
65        [field: NonSerialized]
66        public event EventHandler<LogUpdated> LogUpdated;
67
68        /// <summary>
69        /// State of the Plugin
70        /// </summary>
71       
72        public PluginModelState State {
73            get { return state; } 
74            set { state = value; }
75        }
76
77        /// <summary>
78        /// All ingoing connectors of this PluginModel
79        /// </summary>
80        public List<ConnectorModel> InputConnectors = null;
81
82        /// <summary>
83        /// All outgoing connectors of this PluginModel
84        /// </summary>
85        public List<ConnectorModel> OutputConnectors = null;
86
87        /// <summary>
88        /// The wrapped IPlugin of this PluginModel
89        /// if there is currently no plugin instance it
90        /// will automatically create one. Otherwise
91        /// this acts as singleton and returns the created
92        /// instance
93        /// </summary>       
94        public IPlugin Plugin{
95            get { 
96                if(plugin==null && PluginType != null){
97                    plugin = PluginType.CreateObject();                   
98                }
99                return plugin;
100            }
101
102            private set
103            {
104                plugin = value;
105            }
106        }
107
108        /// <summary>
109        /// The Type of the Wrapped IPlugin of this PluginModel
110        /// Depending on this the Plugin of this PluginModel will be instanciated
111        /// </summary>       
112        public Type PluginType{
113            get{
114                if (this.PluginTypeName != null){
115                    Assembly assembly = Assembly.Load(PluginTypeAssemblyName);
116                    Type t = assembly.GetType(PluginTypeName);
117                    return t;
118                }
119                else
120                {
121                    return null;
122                }
123            } 
124            set{
125                this.PluginTypeName = value.FullName;
126                this.PluginTypeAssemblyName = value.Assembly.FullName;
127            }
128        }
129
130        /// <summary>
131        /// Should this plugin may be startet again when it
132        /// is startable?
133        /// </summary>
134        public bool RepeatStart;
135
136        /// <summary>
137        /// Is the wrapped plugin startable
138        /// </summary>
139        public bool Startable;
140       
141        /// <summary>
142        /// Is the Plugin actually minimized?
143        /// </summary>
144        public bool Minimized { get; set; }
145
146        /// <summary>
147        /// The execution state of the progress of the wrapped plugin
148        /// </summary>
149        public double PercentageFinished { get; set; }
150
151        /// <summary>
152        /// Create a new PluginModel
153        /// </summary>
154        public PluginModel()
155        {
156            this.InputConnectors = new List<ConnectorModel>();
157            this.OutputConnectors = new List<ConnectorModel>();
158        }
159     
160        /// <summary>
161        /// The WorkspaceModel of this PluginModel
162        /// </summary>
163        public WorkspaceModel WorkspaceModel { get; set; }
164
165        /// <summary>
166        /// Current View state
167        /// </summary>
168        public PluginViewState ViewState { get; set; }
169
170        /// <summary>
171        /// Generates all Connectors of this Plugin.
172        /// </summary>
173        public void generateConnectors()
174        {
175
176            if (Plugin != null)
177            {   
178                foreach (PropertyInfoAttribute propertyInfoAttribute in Plugin.GetProperties())
179                {
180                    if (propertyInfoAttribute.Direction.Equals(Direction.InputData))
181                    {
182                        ConnectorModel connectorModel = new ConnectorModel();
183                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
184                        connectorModel.WorkspaceModel = WorkspaceModel;
185                        connectorModel.PluginModel = this;
186                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
187                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
188                        connectorModel.Name = propertyInfoAttribute.PropertyName;
189                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
190                        connectorModel.IControl = false;
191                        connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
192                        InputConnectors.Add(connectorModel);
193                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
194                    }
195                    else if (propertyInfoAttribute.Direction.Equals(Direction.ControlSlave))
196                    {
197                        ConnectorModel connectorModel = new ConnectorModel();
198                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
199                        connectorModel.WorkspaceModel = WorkspaceModel;
200                        connectorModel.PluginModel = this;
201                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
202                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
203                        connectorModel.Name = propertyInfoAttribute.PropertyName;
204                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
205                        connectorModel.IControl = true;
206                        connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
207                        InputConnectors.Add(connectorModel);
208                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
209                    }
210                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
211                    {
212                        ConnectorModel connectorModel = new ConnectorModel();
213                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
214                        connectorModel.WorkspaceModel = WorkspaceModel;
215                        connectorModel.PluginModel = this;
216                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
217                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
218                        connectorModel.Name = propertyInfoAttribute.PropertyName;
219                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
220                        connectorModel.Outgoing = true;
221                        connectorModel.IControl = false;
222                        connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
223                        OutputConnectors.Add(connectorModel);
224                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
225                    }
226                    else if (propertyInfoAttribute.Direction.Equals(Direction.ControlMaster))
227                    {
228                        ConnectorModel connectorModel = new ConnectorModel();
229                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
230                        connectorModel.WorkspaceModel = WorkspaceModel;
231                        connectorModel.PluginModel = this;
232                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
233                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
234                        connectorModel.Name = propertyInfoAttribute.PropertyName;
235                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
236                        connectorModel.Outgoing = true;
237                        connectorModel.IControl = true;
238                        connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
239                        OutputConnectors.Add(connectorModel);
240                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
241                    }
242                }
243
244                Dictionary<string, DynamicProperty> dictionary = Plugin.GetDynamicPropertyList();
245                if (dictionary != null)
246                {
247                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = Plugin.GetDynamicPropertyInfo();
248                    foreach (DynamicProperty dynamicProperty in dictionary.Values)
249                    {
250
251                        if (dynamicProperty.PInfo.Direction.Equals(Direction.InputData))
252                        {
253                            ConnectorModel connectorModel = new ConnectorModel();
254                            connectorModel.ConnectorType = dynamicProperty.Type;
255                            connectorModel.WorkspaceModel = WorkspaceModel;
256                            connectorModel.PluginModel = this;
257                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
258                            connectorModel.PropertyName = dynamicProperty.Name;
259                            connectorModel.Name = dynamicProperty.Name;
260                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
261                            EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
262                            connectorModel.IsDynamic = true;
263                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
264                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
265                            connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
266                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));                           
267                            InputConnectors.Add(connectorModel);
268                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
269                        }
270                        else if (dynamicProperty.PInfo.Direction.Equals(Direction.OutputData))
271                        {
272                            ConnectorModel connectorModel = new ConnectorModel();
273                            connectorModel.ConnectorType = dynamicProperty.Type;
274                            connectorModel.WorkspaceModel = WorkspaceModel;
275                            connectorModel.PluginModel = this;
276                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
277                            connectorModel.PropertyName = dynamicProperty.Name;
278                            connectorModel.Name = dynamicProperty.Name;
279                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
280                             EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
281                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
282                            connectorModel.IsDynamic = true;
283                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
284                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
285                            connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
286                            connectorModel.Outgoing = true;
287                            OutputConnectors.Add(connectorModel);
288                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
289
290                        }
291                    }
292                }
293            }
294        }
295        /// <summary>
296        /// Get the Image of the Plugin
297        /// </summary>
298        /// <returns></returns>
299        public Image getImage()
300        {
301            return Plugin.GetImage(imageIndex);
302        }
303
304        /// <summary>
305        /// Returns the Presentation of the wrapped IPlugin
306        /// </summary>
307        public UserControl PluginPresentation
308        {
309            get
310            {
311                if(this.Plugin.Presentation != null){
312                    return this.Plugin.Presentation;
313                }else{
314                    return this.Plugin.QuickWatchPresentation;
315                }
316            }
317        }
318             
319        /// <summary>
320        /// Should be called by the UI-Thread to paint changes of the PluginModel
321        /// </summary>
322        public void paint()
323        {
324            //Enter some Code which calls the paint method of the IPlugin
325        }       
326
327        /// <summary>
328        /// Progress of the plugin changed
329        /// </summary>
330        /// <param name="sender"></param>
331        /// <param name="args"></param>
332        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
333        {
334            //Calculate % of the plugins process
335            this.PercentageFinished = args.Value / args.Max;
336            //Tell the ExecutionEngine that this plugin needs a gui update
337            this.GuiNeedsUpdate = true;
338        }
339
340        /// <summary>
341        /// Status of the plugin changed
342        /// </summary>
343        /// <param name="sender"></param>
344        /// <param name="args"></param>
345        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
346        {
347            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
348            {
349                this.imageIndex = args.ImageIndex;
350            }
351               
352            if (this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
353            {
354                this.GuiNeedsUpdate = true;
355            }
356            else
357            {
358                this.WorkspaceModel.WorkspaceManagerEditor.Presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
359                {
360                    this.UpdateableView.update();
361                }, null);
362            }           
363        }
364
365        /// <summary>
366        /// The pluginProtocol of the current ExecutionEngine run to set/get
367        /// </summary>
368        public PluginProtocol PluginProtocol {
369            get { return pluginProtocol; }
370            set { pluginProtocol = value;}
371        }
372
373        /// <summary>
374        /// All occured log events of this plugin
375        /// </summary>
376        [NonSerialized]
377        public List<GuiLogEventArgs> GuiLogEvents = new List<GuiLogEventArgs>();
378
379        /// <summary>
380        /// GuiLogNotificationOccured
381        /// saves the plugins log events and tells the gui that it needs
382        /// an update. If the Workspace is not executing an event is invoked
383        /// </summary>
384        /// <param name="sender"></param>
385        /// <param name="args"></param>
386        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
387        {
388            switch (((WorkspaceManagerSettings)this.WorkspaceModel.WorkspaceManagerEditor.Settings).LogLevel)
389            {
390                case 3://Error
391                    if (args.NotificationLevel == NotificationLevel.Debug ||
392                        args.NotificationLevel == NotificationLevel.Info ||
393                        args.NotificationLevel == NotificationLevel.Warning)
394                    {
395                        return;
396                    }
397                    break;
398
399                case 2://Warning
400                    if (args.NotificationLevel == NotificationLevel.Debug ||
401                        args.NotificationLevel == NotificationLevel.Info)
402                    {
403                        return;
404                    }
405                    break;
406
407                case 1://Info
408                    if (args.NotificationLevel == NotificationLevel.Debug)
409                    {
410                        return;
411                    }
412                    break;
413            }
414            if (sender == this.plugin)
415            {
416                this.GuiLogEvents.Add(args);
417                this.GuiNeedsUpdate = true;
418            }
419
420            if (this.LogUpdated != null)
421            {
422                if(!this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
423                    this.LogUpdated.Invoke(this, new LogUpdated {});
424            }
425        }
426
427        /// <summary>
428        /// Called if a Setting of a Plugin is changed and notifies the Editor that
429        /// there is a change
430        /// </summary>
431        /// <param name="sender"></param>
432        /// <param name="propertyChangedEventArgs"></param>
433        public void SettingsPropertyChanged(Object sender, PropertyChangedEventArgs propertyChangedEventArgs)
434        {
435            this.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
436        }       
437
438        #endregion
439    }
440
441    /// <summary>
442    /// The internal state of a Plugin Model
443    /// </summary>
444    public enum PluginModelState{
445        Normal,
446        Warning,
447        Error
448    }
449}
Note: See TracBrowser for help on using the repository browser.