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

Last change on this file since 1905 was 1905, checked in by kopal, 11 years ago

fixed problem with adding plugins with BigInteger/s

File size: 10.7 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 volatile Data 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                Data Data = new Data();
240                Data.value = data;
241                this.Data = Data;
242
243                List<ConnectionModel> outputConnections = this.OutputConnections;
244                foreach (ConnectionModel connectionModel in outputConnections)
245                {
246                    Data = new Data();
247                    Data.value = data;
248                    connectionModel.To.Data = Data;
249                    connectionModel.To.HasData = true;
250                    connectionModel.Active = true;
251                    connectionModel.GuiNeedsUpdate = true;
252                }
253
254                //We changed an input on the PluginModels where "To"s are belonging to so
255                //we have to check if there are executable now
256                foreach (ConnectionModel connectionModel in outputConnections)
257                {
258                    MessageExecution msg = new MessageExecution();
259                    msg.PluginModel = connectionModel.To.PluginModel;
260                    connectionModel.To.PluginModel.PluginProtocol.BroadcastMessageReliably(msg);
261                }
262            }
263            else
264            {
265                this.Data = null;
266                this.hasData = false;
267                this.GuiNeedsUpdate = true;
268
269                List<ConnectionModel> inputConnections = this.InputConnections;
270                foreach (ConnectionModel connectionModel in inputConnections)
271                {
272                    connectionModel.Active = false;
273                    connectionModel.GuiNeedsUpdate = true;
274                }
275                foreach (ConnectionModel connectionModel in inputConnections)
276                {
277                    if (!connectionModel.From.PluginModel.Startable ||
278                        (connectionModel.From.PluginModel.Startable && connectionModel.From.PluginModel.RepeatStart))
279                    {
280                        MessageExecution message_exec = new MessageExecution();
281                        message_exec.PluginModel = connectionModel.From.PluginModel;
282                        connectionModel.From.PluginModel.PluginProtocol.BroadcastMessageReliably(message_exec);
283                    }
284                }
285            }
286        }
287
288
289        /// <summary>
290        /// The data type of the wrapped property changes
291        /// </summary>       
292        public void PropertyTypeChangedOnPlugin(IPlugin plugin)
293        {
294            Dictionary<string, DynamicProperty> dictionary = plugin.GetDynamicPropertyList();
295            DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = plugin.GetDynamicPropertyInfo();
296            foreach (DynamicProperty dynamicProperty in dictionary.Values)
297            {
298
299                if (this.PropertyName == dynamicProperty.Name)
300                {
301                    foreach (ConnectionModel connectionModel in new List<ConnectionModel>(InputConnections))
302                    {
303                        this.WorkspaceModel.deleteConnectionModel(connectionModel);
304                    }
305                    foreach (ConnectionModel connectionModel in new List<ConnectionModel>(this.OutputConnections))
306                    {
307                        this.WorkspaceModel.deleteConnectionModel(connectionModel);
308                    }
309                    this.ConnectorType = dynamicProperty.Type;
310                    if (this.UpdateableView != null)
311                    {
312                        ((ConnectorView)this.UpdateableView).ConnectorRep.Fill = new SolidColorBrush(ColorHelper.GetColor(this.ConnectorType));
313                    }
314                }
315            }
316        }
317
318        #endregion
319               
320    }
321
322    public class Data
323    {
324        public volatile object value;
325    }
326
327}
Note: See TracBrowser for help on using the repository browser.