source: trunk/CrypPlugins/WorkspaceManager/Model/ConnectorModel.cs @ 1929

Last change on this file since 1929 was 1929, checked in by kopal, 11 years ago
  • some optimization
  • Benchmark now loggs Plugins/sec and Memory Usage to logg files (only for testing purposes; will be removed in later releases)
File size: 10.5 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
17using System;
18using System.Collections.Generic;
19using System.ComponentModel;
20using System.Windows.Media;
21using Cryptool.PluginBase;
22using WorkspaceManager.View.Container;
23using System.Reflection;
24using WorkspaceManager.Execution;
25using System.Threading;
26
27namespace WorkspaceManager.Model
28{
29   
30    /// <summary>
31    /// Class to represent the Connection between two Connector Models
32    /// </summary>
33    [Serializable]
34    public class ConnectorModel : VisualElementModel
35    {
36        #region private members
37
38        /// <summary>
39        /// Does this Connector Model has actually data?
40        /// </summary>
41        [NonSerialized]
42        private volatile bool hasData = false;
43
44        /// <summary>
45        /// Name of the Connector type
46        /// </summary>
47        private string ConnectorTypeName = null;
48        /// <summary>
49        /// Name of the Connector assembly
50        /// </summary>
51        private string ConnectorTypeAssemblyName = null;
52
53        #endregion
54
55        #region public members
56
57        /// <summary>
58        /// The PluginModel this Connector belongs to
59        /// </summary>
60        public PluginModel PluginModel { get; set; }
61
62        /// <summary>
63        /// The Type of the Connector Model
64        /// </summary>       
65        public Type ConnectorType
66        {
67            get
68            {
69                if (this.ConnectorTypeName != null)
70                {
71                    if (ConnectorTypeName.Equals("System.Numerics.BigInteger"))
72                    {
73                        return typeof(System.Numerics.BigInteger);
74                    }
75                    if (ConnectorTypeName.Equals("System.Numerics.BigInteger[]"))
76                    {
77                        return typeof(System.Numerics.BigInteger[]);
78                    }
79                    Assembly assembly = Assembly.Load(ConnectorTypeAssemblyName);
80                    Type t = assembly.GetType(ConnectorTypeName);
81                    return t;
82                                       
83                }
84                else
85                {
86                    return null;
87                }
88            }
89            set
90            {
91                this.ConnectorTypeName = value.FullName;
92                this.ConnectorTypeAssemblyName = value.Assembly.GetName().Name;
93            }
94        }
95
96        /// <summary>
97        /// Is this Connector Outgoing?
98        /// </summary>
99        public bool Outgoing { get; set; }
100
101        /// <summary>
102        /// Is this Connector Outgoing?
103        /// </summary>
104        public bool IControl { get; set; }
105
106        /// <summary>
107        /// The InputConnections of this ConnectorModel
108        /// </summary>
109        public List<ConnectionModel> InputConnections;
110
111        /// <summary>
112        /// The OutputConnections of this ConnectorModel
113        /// </summary>
114        public List<ConnectionModel> OutputConnections;
115
116        /// <summary>
117        /// The Orientation of this ConnectorModel
118        /// </summary>
119        public ConnectorOrientation Orientation = ConnectorOrientation.Unset;
120
121        /// <summary>
122        /// Creates a new ConnectorModel
123        /// </summary>
124        public ConnectorModel()
125        {
126            this.InputConnections = new List<ConnectionModel>();
127            this.OutputConnections = new List<ConnectionModel>();
128        }
129
130        /// <summary>
131        /// The WorkspaceModel of this PluginModel
132        /// </summary>
133        public WorkspaceModel WorkspaceModel { get; set; }
134
135        /// <summary>
136        /// Is this Connectors Data mandatory?
137        /// </summary>
138        /// <returns></returns>
139        public bool IsMandatory
140        {
141            get;
142            set;
143        }
144
145        /// <summary>
146        /// Is this a dynamic connector?
147        /// </summary>
148        public bool IsDynamic
149        {
150            get;
151            set;
152        }
153
154        /// <summary>
155        /// DynamicGetterName
156        /// </summary>
157        public string DynamicGetterName
158        {
159            get;
160            set;
161        }
162
163        /// <summary>
164        /// DynamicSetterName
165        /// </summary>
166        public string DynamicSetterName
167        {
168            get;
169            set;
170        }
171
172        /// <summary>
173        /// Does this Connector currently provides Data?
174        /// </summary>
175        /// <returns></returns>
176        public bool HasData
177        {           
178            get
179            {
180                return hasData;
181            }
182
183            set
184            {
185                hasData = value;
186            }
187        }
188
189        /// <summary>
190        /// Data of this Connector
191        /// </summary>
192        [NonSerialized]
193        public object Data = null;
194
195        /// <summary>
196        /// Name of the represented Property of the IPlugin of this ConnectorModel
197        /// </summary>
198        public string PropertyName { get; set; }
199
200        /// <summary>
201        /// ToolTip of this Connector
202        /// </summary>
203        public string ToolTip { get; set; }
204
205        /// Plugin informs the Connector that a PropertyChanged
206        /// </summary>
207        /// <param name="sender"></param>
208        /// <param name="propertyChangedEventArgs"></param>
209        public void PropertyChangedOnPlugin(Object sender, PropertyChangedEventArgs propertyChangedEventArgs)
210        {
211            if (!this.PluginModel.WorkspaceModel.WorkspaceManagerEditor.isExecuting() ||
212                !(sender == this.PluginModel.Plugin) ||
213                !propertyChangedEventArgs.PropertyName.Equals(PropertyName))
214            {
215                return;
216            }
217
218            if (Outgoing)
219            {
220                if (this.OutputConnections.Count == 0)
221                {
222                    return;
223                }
224                object data = null;
225                if (IsDynamic)
226                {
227                    data = sender.GetType().GetMethod(DynamicGetterName).Invoke(sender, new object[] { this.PropertyName });
228                }
229                else
230                {
231                    data = sender.GetType().GetProperty(propertyChangedEventArgs.PropertyName).GetValue(sender, null);
232                }
233
234                if (data == null)
235                {
236                    return;
237                }
238
239                this.Data = data;
240
241                List<ConnectionModel> outputConnections = this.OutputConnections;
242                foreach (ConnectionModel connectionModel in outputConnections)
243                {
244                    connectionModel.To.Data = data;
245                    connectionModel.To.HasData = true;
246                    connectionModel.Active = true;
247                    connectionModel.GuiNeedsUpdate = true;
248                }
249
250                //We changed an input on the PluginModels where "To"s are belonging to so
251                //we have to check if there are executable now
252                foreach (ConnectionModel connectionModel in outputConnections)
253                {
254                    if (connectionModel.To.PluginModel.PluginProtocol.QueueLength == 0)
255                    {
256                        connectionModel.To.PluginModel.PluginProtocol.BroadcastMessage(connectionModel.To.PluginModel.MessageExecution);
257                    }
258                }
259            }
260            else
261            {
262                this.Data = null;
263                this.hasData = false;
264                this.GuiNeedsUpdate = true;
265
266                List<ConnectionModel> inputConnections = this.InputConnections;
267                foreach (ConnectionModel connectionModel in inputConnections)
268                {
269                    connectionModel.Active = false;
270                    connectionModel.GuiNeedsUpdate = true;
271                }
272                foreach (ConnectionModel connectionModel in inputConnections)
273                {
274                    if (!connectionModel.From.PluginModel.Startable ||
275                        (connectionModel.From.PluginModel.Startable && connectionModel.From.PluginModel.RepeatStart))
276                    {
277                        if (connectionModel.From.PluginModel.PluginProtocol.QueueLength == 0)
278                        {
279                            connectionModel.From.PluginModel.PluginProtocol.BroadcastMessage(connectionModel.From.PluginModel.MessageExecution);
280                        }
281                    }
282                }
283            }
284        }
285
286
287        /// <summary>
288        /// The data type of the wrapped property changes
289        /// </summary>       
290        public void PropertyTypeChangedOnPlugin(IPlugin plugin)
291        {
292            Dictionary<string, DynamicProperty> dictionary = plugin.GetDynamicPropertyList();
293            DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = plugin.GetDynamicPropertyInfo();
294            foreach (DynamicProperty dynamicProperty in dictionary.Values)
295            {
296
297                if (this.PropertyName == dynamicProperty.Name)
298                {
299                    foreach (ConnectionModel connectionModel in new List<ConnectionModel>(InputConnections))
300                    {
301                        this.WorkspaceModel.deleteConnectionModel(connectionModel);
302                    }
303                    foreach (ConnectionModel connectionModel in new List<ConnectionModel>(this.OutputConnections))
304                    {
305                        this.WorkspaceModel.deleteConnectionModel(connectionModel);
306                    }
307                    this.ConnectorType = dynamicProperty.Type;
308                    if (this.UpdateableView != null)
309                    {
310                        ((ConnectorView)this.UpdateableView).ConnectorRep.Fill = new SolidColorBrush(ColorHelper.GetColor(this.ConnectorType));
311                    }
312                }
313            }
314        }
315
316        #endregion
317               
318    }
319}
Note: See TracBrowser for help on using the repository browser.