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

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

-fixed "Fit to Screen"
-fixed Scrollbars
-fixed Dragging
-added custom names
-New: IControl- Presentation
--Loading adjusted
-New: Multi selection
-New: Copy /Past (not complete)
-New: Multi Dragging
-New: PluginContainerView Highlighting added

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