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

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

-Fullscreen enhanced
-TextInput added
-Picture scaling added
-Textinput scaling added
-Textinput format command added
-Several style changes
-Progressbar redesigned
-Last log message now appearing
-IControlContainer commenced
-Several icons added
-Plugin state now stored and loaded
-Plugin height and width now storing and loading
-Several misc changes

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