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

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