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

Last change on this file since 1610 was 1610, checked in by kopal, 11 years ago
  • changes of the plugins icon will now be shown in realtime if execution engine is not running
File size: 9.4 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;
28
29namespace WorkspaceManager.Model
30{
31    /// <summary>
32    /// Class to represent and wrap a IPlugin in our model graph
33    /// </summary>
34    [Serializable]
35    public class PluginModel : VisualElementModel
36    {       
37        [NonSerialized]
38        private IPlugin plugin;
39     
40        private int imageIndex = 0;
41       
42        /// <summary>
43        /// All ingoing connectors of this PluginModel
44        /// </summary>
45        public List<ConnectorModel> InputConnectors = null;
46
47        /// <summary>
48        /// All outgoing connectors of this PluginModel
49        /// </summary>
50        public List<ConnectorModel> OutputConnectors = null;
51
52        /// <summary>
53        /// The wrapped IPlugin of this PluginModel
54        /// </summary>
55        public IPlugin Plugin{
56            get { 
57                if(plugin==null && PluginType != null){
58                    plugin = PluginType.CreateObject();                   
59                }
60                return plugin;
61            }
62
63            private set
64            {
65                plugin = value;
66            }
67        } 
68
69        /// <summary>
70        /// The Type of the Wrapped IPlugin of this PluginModel
71        /// Depending on this the Plugin of this PluginModel will be instanciated
72        /// </summary>       
73        public Type PluginType = null;
74       
75        /// <summary>
76        /// Is the Plugin actually minimized?
77        /// </summary>
78        public bool Minimized { get; set; }
79
80        /// <summary>
81        /// The execution state of the progress of the wrapped plugin
82        /// </summary>
83        public double PercentageFinished { private get; set; }
84
85        /// <summary>
86        /// Create a new PluginModel
87        /// </summary>
88        public PluginModel()
89        {
90            this.InputConnectors = new List<ConnectorModel>();
91            this.OutputConnectors = new List<ConnectorModel>();
92        }
93
94        /// <summary>
95        /// The WorkspaceModel of this PluginModel
96        /// </summary>
97        public WorkspaceModel WorkspaceModel { get; set; }
98
99        /// <summary>
100        /// Generates all Connectors of this Plugin.
101        /// Warning: Before generation all "old" Connectors will be deleted
102        /// </summary>
103        public void generateConnectors(){
104           
105            if (Plugin != null)
106            {
107                this.InputConnectors.Clear();
108                this.OutputConnectors.Clear();
109
110                foreach (PropertyInfoAttribute propertyInfoAttribute in Plugin.GetProperties())
111                {                   
112                    if (propertyInfoAttribute.Direction.Equals(Direction.InputData))
113                    {
114                        ConnectorModel connectorModel = new ConnectorModel();
115                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
116                        connectorModel.WorkspaceModel = WorkspaceModel;
117                        connectorModel.PluginModel = this;
118                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
119                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
120                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
121                        connectorModel.ConnectorOrientation = ConnectorOrientation.West;
122                        InputConnectors.Add(connectorModel);
123                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
124                    }
125                    else if (propertyInfoAttribute.Direction.Equals(Direction.OutputData))
126                    {
127                        ConnectorModel connectorModel = new ConnectorModel();
128                        connectorModel.ConnectorType = propertyInfoAttribute.PropertyInfo.PropertyType;
129                        connectorModel.WorkspaceModel = WorkspaceModel;
130                        connectorModel.PluginModel = this;
131                        connectorModel.IsMandatory = propertyInfoAttribute.Mandatory;
132                        connectorModel.PropertyName = propertyInfoAttribute.PropertyName;
133                        connectorModel.ToolTip = propertyInfoAttribute.ToolTip;
134                        connectorModel.ConnectorOrientation = ConnectorOrientation.East;
135                        connectorModel.Outgoing = true;
136                        Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
137                        OutputConnectors.Add(connectorModel);
138                        WorkspaceModel.AllConnectorModels.Add(connectorModel);
139                    }                   
140                }
141            }     
142        }
143
144        /// <summary>
145        /// Get the Image of the Plugin
146        /// </summary>
147        /// <returns></returns>
148        public Image getImage()
149        {
150            return Plugin.GetImage(imageIndex);
151        }
152
153        /// <summary>
154        /// Returns the Presentation of the wrapped IPlugin
155        /// </summary>
156        public UserControl PluginPresentation
157        {
158            get
159            {
160                if(this.Plugin.Presentation != null){
161                    return this.Plugin.Presentation;
162                }else{
163                    return this.Plugin.QuickWatchPresentation;
164                }
165            }
166        }
167             
168        /// <summary>
169        /// Should be called by the UI-Thread to paint changes of the PluginModel
170        /// </summary>
171        public void paint()
172        {
173            //Enter some Code which calls the paint method of the IPlugin
174        }
175
176
177        /// <summary>
178        /// Checks wether this PluginModel is executable or not and sets the isExecutable bool
179        /// </summary>
180        /// <returns></returns>
181        public void checkExecutable(ProtocolBase protocolBase)
182        {                           
183            bool AtLeastOneInputSet = false;
184            //First test if every mandatory Connector has data
185            foreach (ConnectorModel connectorModel in this.InputConnectors)
186            {
187                if (connectorModel.IsMandatory && !connectorModel.HasData)
188                {
189                    return;
190                }
191                else if (connectorModel.HasData)
192                {
193                    AtLeastOneInputSet = true;
194                }
195
196            }
197
198            //Next test if every connected Connection is not active
199            foreach (ConnectorModel connectorModel in this.OutputConnectors)
200            {
201                foreach (ConnectionModel connection in connectorModel.OutputConnections)
202                {
203                    if (connection.Active)
204                    {                           
205                       return;
206                    }                       
207                }
208            }
209
210            if (AtLeastOneInputSet || this.InputConnectors.Count == 0)
211            {
212                MessagePreExecution msg = new MessagePreExecution();
213                msg.PluginModel = this;
214                protocolBase.BroadcastMessageReliably(msg);
215            }
216            return;
217        }
218
219        /// <summary>
220        /// Progress of the plugin changed
221        /// </summary>
222        /// <param name="sender"></param>
223        /// <param name="args"></param>
224        public void PluginProgressChanged(IPlugin sender, PluginProgressEventArgs args)
225        {
226            this.PercentageFinished = args.Value / args.Max;
227        }
228
229        /// <summary>
230        /// Status of the plugin changed
231        /// </summary>
232        /// <param name="sender"></param>
233        /// <param name="args"></param>
234        public void PluginStatusChanged(IPlugin sender, StatusEventArgs args)
235        {
236            if (args.StatusChangedMode == StatusChangedMode.ImageUpdate)
237            {
238                this.imageIndex = args.ImageIndex;
239                if (this.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
240                {
241                    this.GuiNeedsUpdate = true;
242                }
243                else
244                {
245                    this.WorkspaceModel.WorkspaceManagerEditor.Presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
246                    {
247                        this.UpdateableView.update();
248                    }, null);
249                }
250            }
251        }
252
253        /// <summary>
254        ///
255        /// </summary>
256        public PluginProtocol PluginProtocol { get; set; }
257    }
258}
Note: See TracBrowser for help on using the repository browser.