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

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

some bug fixes

File size: 13.7 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
46        #endregion privates
47
48        /// <summary>
49        /// All ingoing connectors of this PluginModel
50        /// </summary>
51        public List<ConnectorModel> InputConnectors = null;
52
53        /// <summary>
54        /// All outgoing connectors of this PluginModel
55        /// </summary>
56        public List<ConnectorModel> OutputConnectors = null;
57
58        /// <summary>
59        /// The wrapped IPlugin of this PluginModel
60        /// if there is currently no plugin instance it
61        /// will automatically create one. Otherwise
62        /// this acts as singleton and returns the created
63        /// instance
64        /// </summary>
65        public IPlugin Plugin{
66            get { 
67                if(plugin==null && PluginType != null){
68                    plugin = PluginType.CreateObject();                   
69                }
70                return plugin;
71            }
72
73            private set
74            {
75                plugin = value;
76            }
77        } 
78
79        /// <summary>
80        /// The Type of the Wrapped IPlugin of this PluginModel
81        /// Depending on this the Plugin of this PluginModel will be instanciated
82        /// </summary>       
83        public Type PluginType = null;
84
85        /// <summary>
86        /// Is the wrapped plugin startable
87        /// </summary>
88        public bool Startable;
89       
90        /// <summary>
91        /// Is the Plugin actually minimized?
92        /// </summary>
93        public bool Minimized { get; set; }
94
95        /// <summary>
96        /// The execution state of the progress of the wrapped plugin
97        /// </summary>
98        public double PercentageFinished { get; set; }
99
100        /// <summary>
101        /// Create a new PluginModel
102        /// </summary>
103        public PluginModel()
104        {
105            this.InputConnectors = new List<ConnectorModel>();
106            this.OutputConnectors = new List<ConnectorModel>();
107        }
108
109        /// <summary>
110        /// The WorkspaceModel of this PluginModel
111        /// </summary>
112        public WorkspaceModel WorkspaceModel { get; set; }
113
114        /// <summary>
115        /// Generates all Connectors of this Plugin.
116        /// </summary>
117        public void generateConnectors()
118        {
119
120            if (Plugin != null)
121            {   
122                foreach (PropertyInfoAttribute propertyInfoAttribute in Plugin.GetProperties())
123                {
124                    if (propertyInfoAttribute.Direction.Equals(Direction.InputData))
125                    {
126                        ConnectorModel connectorModel = new ConnectorModel();
127                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
128                        connectorModel.WorkspaceModel = WorkspaceModel;
129                        connectorModel.PluginModel = this;
130                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
131                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
132                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
133                        connectorModel.ConnectorOrientation = ConnectorOrientation.West;
134                        InputConnectors.Add(connectorModel);
135                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
136                    }
137                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
138                    {
139                        ConnectorModel connectorModel = new ConnectorModel();
140                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
141                        connectorModel.WorkspaceModel = WorkspaceModel;
142                        connectorModel.PluginModel = this;
143                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
144                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
145                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
146                        connectorModel.ConnectorOrientation = ConnectorOrientation.East;
147                        connectorModel.Outgoing = true;
148                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
149                        OutputConnectors.Add(connectorModel);
150                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
151                    }
152                }
153
154                Dictionary<string, DynamicProperty> dictionary = Plugin.GetDynamicPropertyList();
155                if (dictionary != null)
156                {
157                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = Plugin.GetDynamicPropertyInfo();
158                    foreach (DynamicProperty dynamicProperty in dictionary.Values)
159                    {
160
161                        if (dynamicProperty.PInfo.Direction.Equals(Direction.InputData))
162                        {
163                            ConnectorModel connectorModel = new ConnectorModel();
164                            connectorModel.ConnectorType = dynamicProperty.Type;
165                            connectorModel.WorkspaceModel = WorkspaceModel;
166                            connectorModel.PluginModel = this;
167                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
168                            connectorModel.PropertyName = dynamicProperty.Name;                           
169                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
170                            connectorModel.ConnectorOrientation = ConnectorOrientation.West;
171                            EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
172                            connectorModel.IsDynamic = true;
173                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
174                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
175                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
176                            InputConnectors.Add(connectorModel);
177                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
178                        }
179                        else if (dynamicProperty.PInfo.Direction.Equals(Direction.OutputData))
180                        {
181                            ConnectorModel connectorModel = new ConnectorModel();
182                            connectorModel.ConnectorType = dynamicProperty.Type;
183                            connectorModel.WorkspaceModel = WorkspaceModel;
184                            connectorModel.PluginModel = this;
185                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
186                            connectorModel.PropertyName = dynamicProperty.Name;
187                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
188                            connectorModel.ConnectorOrientation = ConnectorOrientation.East;
189                            EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
190                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
191                            connectorModel.IsDynamic = true;
192                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
193                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
194                            connectorModel.Outgoing = true;
195                            Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
196                            OutputConnectors.Add(connectorModel);
197                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
198
199                        }
200                    }
201                }
202            }
203        }
204        /// <summary>
205        /// Get the Image of the Plugin
206        /// </summary>
207        /// <returns></returns>
208        public Image getImage()
209        {
210            return Plugin.GetImage(imageIndex);
211        }
212
213        /// <summary>
214        /// Returns the Presentation of the wrapped IPlugin
215        /// </summary>
216        public UserControl PluginPresentation
217        {
218            get
219            {
220                if(this.Plugin.Presentation != null){
221                    return this.Plugin.Presentation;
222                }else{
223                    return this.Plugin.QuickWatchPresentation;
224                }
225            }
226        }
227             
228        /// <summary>
229        /// Should be called by the UI-Thread to paint changes of the PluginModel
230        /// </summary>
231        public void paint()
232        {
233            //Enter some Code which calls the paint method of the IPlugin
234        }
235
236        /// <summary>
237        /// Checks wether this PluginModel is executable or not and sets the isExecutable bool
238        ///
239        /// There are 3 ways in that a plugin can be executable:
240        ///     1. All mandatory inputs are set + all outputs are "free"
241        ///     2. There are no mandatory inputs and at least one non-mandatory input is set + all outputs are "free"
242        ///     3. There are no inputs + all outputs are "free"
243        /// </summary>
244        public void checkExecutable(ProtocolBase protocolBase)
245        {                           
246            bool AtLeastOneInputSet = false;
247            //First test if every mandatory Connector has data
248            //or one non-mandatory input has data
249            foreach (ConnectorModel connectorModel in this.InputConnectors)
250            {
251                if ((connectorModel.IsMandatory || connectorModel.InputConnection != null) && !connectorModel.HasData)
252                {
253                    return;
254                }
255                else if (connectorModel.HasData)
256                {
257                    AtLeastOneInputSet = true;
258                }
259            }
260
261            if (AtLeastOneInputSet)
262            {
263                MessageExecution msg = new MessageExecution();
264                msg.PluginModel = this;
265               
266                //protocolBase is set at Startup of the ExecutionEngine
267                //but it could be that we have an event before setting
268                //of the protocl base (triggered by user clicking on
269                //a plugins presentation (button or so))
270                if (protocolBase != null)
271                {
272                    protocolBase.BroadcastMessageReliably(msg);
273                }
274            }
275            return;
276        }
277
278        /// <summary>
279        /// Progress of the plugin changed
280        /// </summary>
281        /// <param name="sender"></param>
282        /// <param name="args"></param>
283        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
284        {
285            //Calculate % of the plugins process
286            this.PercentageFinished = args.Value / args.Max;
287            //Tell the ExecutionEngine that this plugin needs a gui update
288            this.GuiNeedsUpdate = true;
289        }
290
291        /// <summary>
292        /// Status of the plugin changed
293        /// </summary>
294        /// <param name="sender"></param>
295        /// <param name="args"></param>
296        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
297        {
298            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
299            {
300                this.imageIndex = args.ImageIndex;
301            }
302               
303            if (this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
304            {
305                this.GuiNeedsUpdate = true;
306            }
307            else
308            {
309                this.WorkspaceModel.WorkspaceManagerEditor.Presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
310                {
311                    this.UpdateableView.update();
312                }, null);
313            }           
314        }
315
316        /// <summary>
317        /// The pluginProtocol of the current ExecutionEngine run to set/get
318        /// </summary>
319        public PluginProtocol PluginProtocol {
320            get { return pluginProtocol; }
321            set { pluginProtocol = value;}
322        }
323    }
324}
Note: See TracBrowser for help on using the repository browser.