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

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

Created first Version of XMLSerializer for the loading/saving of workspaceManager files

File size: 15.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 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                        InputConnectors.Add(connectorModel);
170                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
171                    }
172                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
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.ConnectorOrientation = ConnectorOrientation.East;
183                        connectorModel.Outgoing = true;
184                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
185                        OutputConnectors.Add(connectorModel);
186                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
187                    }
188                }
189
190                Dictionary<string, DynamicProperty> dictionary = Plugin.GetDynamicPropertyList();
191                if (dictionary != null)
192                {
193                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = Plugin.GetDynamicPropertyInfo();
194                    foreach (DynamicProperty dynamicProperty in dictionary.Values)
195                    {
196
197                        if (dynamicProperty.PInfo.Direction.Equals(Direction.InputData))
198                        {
199                            ConnectorModel connectorModel = new ConnectorModel();
200                            connectorModel.ConnectorType = dynamicProperty.Type;
201                            connectorModel.WorkspaceModel = WorkspaceModel;
202                            connectorModel.PluginModel = this;
203                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
204                            connectorModel.PropertyName = dynamicProperty.Name;
205                            connectorModel.Name = dynamicProperty.Name;
206                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
207                            connectorModel.ConnectorOrientation = ConnectorOrientation.West;
208                            EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
209                            connectorModel.IsDynamic = true;
210                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
211                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
212                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
213                            InputConnectors.Add(connectorModel);
214                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
215                        }
216                        else if (dynamicProperty.PInfo.Direction.Equals(Direction.OutputData))
217                        {
218                            ConnectorModel connectorModel = new ConnectorModel();
219                            connectorModel.ConnectorType = dynamicProperty.Type;
220                            connectorModel.WorkspaceModel = WorkspaceModel;
221                            connectorModel.PluginModel = this;
222                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
223                            connectorModel.PropertyName = dynamicProperty.Name;
224                            connectorModel.Name = dynamicProperty.Name;
225                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
226                            connectorModel.ConnectorOrientation = ConnectorOrientation.East;
227                            EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
228                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
229                            connectorModel.IsDynamic = true;
230                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
231                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
232                            connectorModel.Outgoing = true;
233                            Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
234                            OutputConnectors.Add(connectorModel);
235                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
236
237                        }
238                    }
239                }
240            }
241        }
242        /// <summary>
243        /// Get the Image of the Plugin
244        /// </summary>
245        /// <returns></returns>
246        public Image getImage()
247        {
248            return Plugin.GetImage(imageIndex);
249        }
250
251        /// <summary>
252        /// Returns the Presentation of the wrapped IPlugin
253        /// </summary>
254        public UserControl PluginPresentation
255        {
256            get
257            {
258                if(this.Plugin.Presentation != null){
259                    return this.Plugin.Presentation;
260                }else{
261                    return this.Plugin.QuickWatchPresentation;
262                }
263            }
264        }
265             
266        /// <summary>
267        /// Should be called by the UI-Thread to paint changes of the PluginModel
268        /// </summary>
269        public void paint()
270        {
271            //Enter some Code which calls the paint method of the IPlugin
272        }
273
274        /// <summary>
275        /// Checks wether this PluginModel is executable and if yes it broadcasts a execution message
276        /// </summary>
277        public void checkExecutable(ProtocolBase protocolBase)
278        {                     
279            MessageExecution msg;           
280            foreach (ConnectorModel connectorModel in this.InputConnectors)
281            {
282                if ((connectorModel.IsMandatory || connectorModel.InputConnections.Count > 0) && !connectorModel.HasData)
283                {
284                    foreach (ConnectionModel connectionModel in connectorModel.InputConnections)
285                    {
286                        if (connectionModel.From.PluginModel.Startable && connectionModel.From.PluginModel.PluginProtocol.QueueLength == 0)
287                        {                           
288                            msg = new MessageExecution();
289                            msg.PluginModel = connectionModel.From.PluginModel;
290                            connectionModel.From.PluginModel.pluginProtocol.BroadcastMessageReliably(msg);
291                        }
292                    }
293                    return;
294                }               
295            }
296
297            msg = new MessageExecution();
298            msg.PluginModel = this;
299               
300            //protocolBase is set at Startup of the ExecutionEngine
301            //but it could be that we have an event before setting
302            //of the protocl base (triggered by user clicking on
303            //a plugins presentation (button or so))
304            if (protocolBase != null && protocolBase.QueueLength == 0)
305            {
306                protocolBase.BroadcastMessageReliably(msg);
307            }
308
309            return;
310        }
311
312        /// <summary>
313        /// Progress of the plugin changed
314        /// </summary>
315        /// <param name="sender"></param>
316        /// <param name="args"></param>
317        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
318        {
319            //Calculate % of the plugins process
320            this.PercentageFinished = args.Value / args.Max;
321            //Tell the ExecutionEngine that this plugin needs a gui update
322            this.GuiNeedsUpdate = true;
323        }
324
325        /// <summary>
326        /// Status of the plugin changed
327        /// </summary>
328        /// <param name="sender"></param>
329        /// <param name="args"></param>
330        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
331        {
332            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
333            {
334                this.imageIndex = args.ImageIndex;
335            }
336               
337            if (this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
338            {
339                this.GuiNeedsUpdate = true;
340            }
341            else
342            {
343                this.WorkspaceModel.WorkspaceManagerEditor.Presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
344                {
345                    this.UpdateableView.update();
346                }, null);
347            }           
348        }
349
350        /// <summary>
351        /// The pluginProtocol of the current ExecutionEngine run to set/get
352        /// </summary>
353        public PluginProtocol PluginProtocol {
354            get { return pluginProtocol; }
355            set { pluginProtocol = value;}
356        }
357    }
358
359    public enum PluginModelState{
360        Normal,
361        Warning,
362        Error
363    }
364}
Note: See TracBrowser for help on using the repository browser.