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

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