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

Last change on this file since 1803 was 1803, checked in by kopal, 11 years ago

removed events of connectors and put date exchange directly into the ExecutionEngine to improve the performance

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