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

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

added first support for connecting IControl Connections

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