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

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