source: trunk/CrypPlugins/WorkspaceManager/Model/Elements/PluginModel.cs @ 2738

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

-WorkspaceManager: Restructuring Function visuals.(not testable)

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