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

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