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

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