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

Last change on this file since 1680 was 1680, checked in by kopal, 12 years ago
  • Execution now is always triggered when one input changed and provides also old inputs
  • Added support for dynamic Connectors
  • some small bug fixing
File size: 7.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
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using System.ComponentModel;
22using System.Threading;
23using Cryptool.PluginBase;
24using WorkspaceManager.View.Container;
25using System.Windows.Media;
26
27namespace WorkspaceManager.Model
28{
29   
30
31    /// <summary>
32    /// Class to represent the Connection between two Connector Models
33    /// </summary>
34    [Serializable]
35    public class ConnectorModel : VisualElementModel
36    {       
37        [NonSerialized]
38        private bool hasData = false;
39
40        [NonSerialized]
41        private object data;
42       
43        /// <summary>
44        /// The PluginModel this Connector belongs to
45        /// </summary>
46        public PluginModel PluginModel { get; set; }
47
48        /// <summary>
49        /// The data type of this ConnectorModel
50        /// </summary>
51        public Type ConnectorType { get; set; }
52
53        /// <summary>
54        /// Is this Connector Outgoing?
55        /// </summary>
56        public bool Outgoing { get; set; }
57       
58        /// <summary>
59        /// The InputConnection of this ConnectorModel
60        /// </summary>
61        public ConnectionModel InputConnection { get; set; }
62
63        /// <summary>
64        /// The OutputConnections of this ConnectorModel
65        /// </summary>
66        public List<ConnectionModel> OutputConnections;
67
68        /// <summary>
69        /// Creates a new ConnectorModel
70        /// </summary>
71        public ConnectorModel()
72        {
73            this.OutputConnections = new List<ConnectionModel>();
74        }
75
76        /// <summary>
77        /// The WorkspaceModel of this PluginModel
78        /// </summary>
79        public WorkspaceModel WorkspaceModel { get; set; }
80
81        /// <summary>
82        /// Is this Connectors Data mandatory?
83        /// </summary>
84        /// <returns></returns>
85        public bool IsMandatory
86        {
87            get;
88            set;
89        }
90
91        /// <summary>
92        /// Is this a dynamic connector?
93        /// </summary>
94        public bool IsDynamic
95        {
96            get;
97            set;
98        }
99
100        /// <summary>
101        /// DynamicGetterName
102        /// </summary>
103        public string DynamicGetterName
104        {
105            get;
106            set;
107        }
108
109        /// <summary>
110        /// DynamicSetterName
111        /// </summary>
112        public string DynamicSetterName
113        {
114            get;
115            set;
116        }
117
118        /// <summary>
119        /// Does this Connector currently provides Data?
120        /// </summary>
121        /// <returns></returns>
122        public bool HasData
123        {
124            get { 
125                    return hasData; 
126            }
127
128            set 
129            {   
130                hasData = value; 
131            }
132        }
133
134        /// <summary>
135        /// Data of this Connector
136        /// </summary>
137        public object Data
138        {
139            get
140            {
141                return data;
142            }
143
144            set
145            {
146                data = value;
147            }
148        }       
149
150        /// <summary>
151        /// Name of the represented Property of the IPlugin of this ConnectorModel
152        /// </summary>
153        public string PropertyName{get;set;}
154
155        /// <summary>
156        /// ToolTip of this Connector
157        /// </summary>
158        public string ToolTip { get; set; }
159
160        /// <summary>
161        /// Plugin informs the Connector that a PropertyChanged
162        /// </summary>
163        /// <param name="sender"></param>
164        /// <param name="propertyChangedEventArgs"></param>
165        public void PropertyChangedOnPlugin(Object sender, PropertyChangedEventArgs propertyChangedEventArgs)
166        {
167            if(sender == this.PluginModel.Plugin && 
168                propertyChangedEventArgs.PropertyName.Equals(PropertyName) && 
169                Outgoing){
170               
171                foreach (ConnectionModel connectionModel in this.OutputConnections)
172                {
173                    if (IsDynamic)
174                    {
175                        connectionModel.To.Data = sender.GetType().GetMethod(DynamicGetterName).Invoke(sender, new object[] { this.PropertyName });
176                    }
177                    else
178                    {
179                        connectionModel.To.Data = sender.GetType().GetProperty(propertyChangedEventArgs.PropertyName).GetValue(sender, null);
180                    }
181                    connectionModel.To.HasData = true;
182                    connectionModel.Active = true;
183                   
184                    //We changed an input on the PluginModel where "To" is belonging to so
185                    //we have to check if this is executable now
186                    connectionModel.To.PluginModel.checkExecutable(connectionModel.To.PluginModel.PluginProtocol);
187                }
188            }                       
189        }
190
191        /// <summary>
192        /// Orientation of this Connecor
193        /// </summary>
194        public ConnectorOrientation ConnectorOrientation { get; set; }
195
196        /// <summary>
197        ///
198        /// </summary>
199        public void PropertyTypeChangedOnPlugin(IPlugin plugin)
200        {
201            Dictionary<string, DynamicProperty> dictionary = plugin.GetDynamicPropertyList();
202            DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = plugin.GetDynamicPropertyInfo();
203            foreach (DynamicProperty dynamicProperty in dictionary.Values)
204            {
205               
206                if (this.PropertyName == dynamicProperty.Name)
207                {
208                    if(this.InputConnection != null){
209                        this.WorkspaceModel.deleteConnectionModel(this.InputConnection);
210                    }
211                    foreach(ConnectionModel connectionModel in new List<ConnectionModel>(this.OutputConnections))
212                    {
213                        this.WorkspaceModel.deleteConnectionModel(connectionModel);
214                    }
215                    this.ConnectorType = dynamicProperty.Type;
216                    if (this.UpdateableView != null)
217                    {
218                        ((ConnectorView)this.UpdateableView).Ellipse.Fill = new SolidColorBrush(ColorHelper.GetColor(this.ConnectorType));
219                    }
220                }
221            }
222        }
223    }
224
225    /// <summary>
226    /// Enumeration for connector orientation:
227    ///
228    ///        North
229    ///       --------
230    ///       |      |
231    /// West  |      |  East
232    ///       |      |
233    ///       --------
234    ///        South
235    /// </summary>
236    public enum ConnectorOrientation
237    {
238        North,
239        East,
240        South,
241        West
242    }
243}
Note: See TracBrowser for help on using the repository browser.