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

Last change on this file since 1791 was 1791, checked in by kopal, 11 years ago
  • Plugins without Presentation now can not be maximized
  • Enum Settings will be saved/loaded correctly now
  • Change of Settings (which have a PropertyChangedEvent) will cause editor to have "hasChanges"
File size: 16.6 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                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
204                        OutputConnectors.Add(connectorModel);
205                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
206                    }
207                    else if (propertyInfoAttribute.Direction.Equals(Direction.ControlMaster))
208                    {
209                        ConnectorModel connectorModel = new ConnectorModel();
210                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
211                        connectorModel.WorkspaceModel = WorkspaceModel;
212                        connectorModel.PluginModel = this;
213                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
214                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
215                        connectorModel.Name = propertyInfoAttribute.PropertyName;
216                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
217                        connectorModel.Outgoing = true;
218                        connectorModel.IControl = true;
219                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
220                        OutputConnectors.Add(connectorModel);
221                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
222                    }
223                }
224
225                Dictionary<string, DynamicProperty> dictionary = Plugin.GetDynamicPropertyList();
226                if (dictionary != null)
227                {
228                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = Plugin.GetDynamicPropertyInfo();
229                    foreach (DynamicProperty dynamicProperty in dictionary.Values)
230                    {
231
232                        if (dynamicProperty.PInfo.Direction.Equals(Direction.InputData))
233                        {
234                            ConnectorModel connectorModel = new ConnectorModel();
235                            connectorModel.ConnectorType = dynamicProperty.Type;
236                            connectorModel.WorkspaceModel = WorkspaceModel;
237                            connectorModel.PluginModel = this;
238                            connectorModel.IsMandatory = dynamicProperty.PInfo.Mandatory;
239                            connectorModel.PropertyName = dynamicProperty.Name;
240                            connectorModel.Name = dynamicProperty.Name;
241                            connectorModel.ToolTip = dynamicProperty.PInfo.ToolTip;
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                             EventInfo eventinfo = Plugin.GetType().GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
261                            eventinfo.AddEventHandler(Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
262                            connectorModel.IsDynamic = true;
263                            connectorModel.DynamicGetterName = dynamicPropertyInfoAttribute.MethodGetValue;
264                            connectorModel.DynamicSetterName = dynamicPropertyInfoAttribute.MethodSetValue;
265                            connectorModel.Outgoing = true;
266                            Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
267                            OutputConnectors.Add(connectorModel);
268                            WorkspaceModel.AllConnectorModels.Add(connectorModel);
269
270                        }
271                    }
272                }
273            }
274        }
275        /// <summary>
276        /// Get the Image of the Plugin
277        /// </summary>
278        /// <returns></returns>
279        public Image getImage()
280        {
281            return Plugin.GetImage(imageIndex);
282        }
283
284        /// <summary>
285        /// Returns the Presentation of the wrapped IPlugin
286        /// </summary>
287        public UserControl PluginPresentation
288        {
289            get
290            {
291                if(this.Plugin.Presentation != null){
292                    return this.Plugin.Presentation;
293                }else{
294                    return this.Plugin.QuickWatchPresentation;
295                }
296            }
297        }
298             
299        /// <summary>
300        /// Should be called by the UI-Thread to paint changes of the PluginModel
301        /// </summary>
302        public void paint()
303        {
304            //Enter some Code which calls the paint method of the IPlugin
305        }       
306
307        /// <summary>
308        /// Progress of the plugin changed
309        /// </summary>
310        /// <param name="sender"></param>
311        /// <param name="args"></param>
312        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
313        {
314            //Calculate % of the plugins process
315            this.PercentageFinished = args.Value / args.Max;
316            //Tell the ExecutionEngine that this plugin needs a gui update
317            this.GuiNeedsUpdate = true;
318        }
319
320        /// <summary>
321        /// Status of the plugin changed
322        /// </summary>
323        /// <param name="sender"></param>
324        /// <param name="args"></param>
325        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
326        {
327            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
328            {
329                this.imageIndex = args.ImageIndex;
330            }
331               
332            if (this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
333            {
334                this.GuiNeedsUpdate = true;
335            }
336            else
337            {
338                this.WorkspaceModel.WorkspaceManagerEditor.Presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
339                {
340                    this.UpdateableView.update();
341                }, null);
342            }           
343        }
344
345        /// <summary>
346        /// The pluginProtocol of the current ExecutionEngine run to set/get
347        /// </summary>
348        public PluginProtocol PluginProtocol {
349            get { return pluginProtocol; }
350            set { pluginProtocol = value;}
351        }
352
353        /// <summary>
354        /// All occured log events of this plugin
355        /// </summary>
356        [NonSerialized]
357        public List<GuiLogEventArgs> GuiLogEvents = new List<GuiLogEventArgs>();
358
359        /// <summary>
360        /// GuiLogNotificationOccured
361        /// saves the plugins log events and tells the gui that it needs
362        /// an update
363        /// </summary>
364        /// <param name="sender"></param>
365        /// <param name="args"></param>
366        public void GuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
367        {
368            if (sender == this.plugin)
369            {
370                this.GuiLogEvents.Add(args);
371                this.GuiNeedsUpdate = true;
372            }
373        }
374
375        /// <summary>
376        /// Called if a Setting of a Plugin is changed and notifies the Editor that
377        /// there is a change
378        /// </summary>
379        /// <param name="sender"></param>
380        /// <param name="propertyChangedEventArgs"></param>
381        public void SettingsPropertyChanged(Object sender, PropertyChangedEventArgs propertyChangedEventArgs)
382        {
383            this.WorkspaceModel.WorkspaceManagerEditor.HasChanges = true;
384        }
385
386        #endregion
387    }
388
389    /// <summary>
390    /// The internal state of a Plugin Model
391    /// </summary>
392    public enum PluginModelState{
393        Normal,
394        Warning,
395        Error
396    }
397}
Note: See TracBrowser for help on using the repository browser.