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

Last change on this file since 1831 was 1831, checked in by matkovic, 11 years ago

-LogInfo now pops up
-Added new icon for NotificationLevels
-Several style changes on LogPresentation

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