Changeset 11564 for branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ProgrammableNode.cs
- Timestamp:
- 11/23/14 05:32:41 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ProgrammableNode.cs
r11563 r11564 27 27 28 28 namespace HeuristicLab.Core.Networks { 29 [Item("ProgrammableNode", "A programmable nodeof a network.")]29 [Item("ProgrammableNode", "Abstract base class for programmable nodes of a network.")] 30 30 [StorableClass] 31 public class ProgrammableNode : ProgrammableNetworkItem, INode { 32 protected override string CodeTemplate { 33 get { return ReadCodeTemplate("HeuristicLab.Optimization.Networks.Core.Networks.ProgrammableNodeTemplate.cs"); } 34 } 35 31 public abstract class ProgrammableNode : ProgrammableNetworkItem, IProgrammableNode { 32 #region Node Members 36 33 new public INetwork Parent { 37 get { return (INetwork)base.Parent; }34 get { return CompiledNetworkItem.Parent; } 38 35 set { 39 36 // NOTE: never call setter directly as the Parent property is set by the network which contains the node 40 base.Parent = value;37 CompiledNetworkItem.Parent = value; 41 38 } 42 }43 public override IEnumerable<INetworkItem> Children {44 get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); }45 39 } 46 40 … … 48 42 private PortCollection ports; 49 43 protected PortCollection Ports { 50 get { return ports; }44 get { return CompiledNetworkItem.Ports; } 51 45 } 52 46 private ReadOnlyKeyedItemCollection<string, IPort> readOnlyPorts; 53 47 IKeyedItemCollection<string, IPort> INode.Ports { 54 48 get { 55 if (readOnlyPorts == null) readOnlyPorts = ports.AsReadOnly();49 if (readOnlyPorts == null) readOnlyPorts = Ports.AsReadOnly(); 56 50 return readOnlyPorts; 57 51 } 58 52 } 53 #endregion 54 55 protected override string CodeTemplate { 56 get { return ReadCodeTemplate("HeuristicLab.Optimization.Networks.Core.Networks.ProgrammableNodeTemplate.cs"); } 57 } 58 59 new protected CompiledProgrammableNode CompiledNetworkItem { 60 get { return (CompiledProgrammableNode)base.CompiledNetworkItem; } 61 } 59 62 60 63 [StorableConstructor] 61 pr ivateProgrammableNode(bool deserializing) : base(deserializing) { }62 pr ivateProgrammableNode(ProgrammableNode original, Cloner cloner)64 protected ProgrammableNode(bool deserializing) : base(deserializing) { } 65 protected ProgrammableNode(ProgrammableNode original, Cloner cloner) 63 66 : base(original, cloner) { 64 ports = cloner.Clone(original.ports); 65 foreach (var p in Ports) 66 p.Parent = this; 67 // ports are cloned in CompiledProgrammableNode 67 68 readOnlyPorts = null; 68 RegisterPortsEvents();69 69 } 70 p ublicProgrammableNode()70 protected ProgrammableNode() 71 71 : base("ProgrammableNode") { 72 72 ports = new PortCollection(); 73 73 readOnlyPorts = null; 74 RegisterPortsEvents();75 74 } 76 p ublicProgrammableNode(string name)75 protected ProgrammableNode(string name) 77 76 : base(name) { 78 77 ports = new PortCollection(); 79 78 readOnlyPorts = null; 80 RegisterPortsEvents();81 79 } 82 p ublicProgrammableNode(string name, string description)80 protected ProgrammableNode(string name, string description) 83 81 : base(name, description) { 84 82 ports = new PortCollection(); 85 83 readOnlyPorts = null; 86 RegisterPortsEvents();87 84 } 88 89 [StorableHook(HookType.AfterDeserialization)]90 private void AfterDeserialization() {91 foreach (var p in Ports)92 p.Parent = this;93 RegisterPortsEvents();94 }95 96 public override IDeepCloneable Clone(Cloner cloner) {97 return new ProgrammableNode(this, cloner);98 }99 100 #region Ports Events101 protected virtual void RegisterPortsEvents() {102 ports.ItemsAdded += Ports_ItemsAdded;103 ports.ItemsRemoved += Ports_ItemsRemoved;104 ports.ItemsReplaced += Ports_ItemsReplaced;105 ports.CollectionReset += Ports_CollectionReset;106 }107 protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {108 foreach (var p in e.Items)109 p.Parent = this;110 }111 protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {112 foreach (var p in e.Items)113 p.Parent = null;114 }115 protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {116 foreach (var p in e.OldItems)117 p.Parent = null;118 foreach (var p in e.Items)119 p.Parent = this;120 }121 protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {122 foreach (var p in e.OldItems)123 p.Parent = null;124 foreach (var p in e.Items)125 p.Parent = this;126 }127 #endregion128 85 129 86 #region CompiledProgrammableNode 130 87 [Item("CompiledProgrammableNode", "Abstract base class for compiled programmable nodes of a network.")] 131 88 public abstract class CompiledProgrammableNode : CompiledProgrammableNetworkItem, INode { 132 protected new ProgrammableNode Context { 89 #region Node Members 90 new public INetwork Parent { 91 get { return (INetwork)base.Parent; } 92 set { 93 // NOTE: never call setter directly as the Parent property is set by the network which contains the node 94 base.Parent = value; 95 } 96 } 97 public override IEnumerable<INetworkItem> Children { 98 get { return base.Children.Concat(Ports.AsEnumerable<INetworkItem>()); } 99 } 100 101 public PortCollection Ports { 102 get { return Context.ports; } 103 } 104 IKeyedItemCollection<string, IPort> INode.Ports { 105 get { return Ports; } 106 } 107 #endregion 108 109 new protected ProgrammableNode Context { 133 110 get { return (ProgrammableNode)base.Context; } 134 111 } … … 136 113 protected CompiledProgrammableNode(CompiledProgrammableNode original, Cloner cloner) 137 114 : base(original, cloner) { 115 Context.ports = cloner.Clone(original.Context.ports); 138 116 } 139 117 protected CompiledProgrammableNode(ProgrammableNode context) … … 141 119 } 142 120 143 #region INode Members 144 public new INetwork Parent { 145 get { return Context.Parent; } 146 set { 147 // NOTE: never call setter directly as the Parent property is set by the network which contains the node 148 Context.Parent = value; 121 protected virtual void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) { } 122 123 #region Events 124 public override void RegisterEvents() { 125 base.RegisterEvents(); 126 Ports.ItemsAdded += Ports_ItemsAdded; 127 Ports.ItemsRemoved += Ports_ItemsRemoved; 128 Ports.ItemsReplaced += Ports_ItemsReplaced; 129 Ports.CollectionReset += Ports_CollectionReset; 130 foreach (var p in Ports) { 131 p.Parent = this; 132 RegisterPortEvents(p); 149 133 } 150 134 } 151 152 public IKeyedItemCollection<string, IPort> Ports { 153 get { return Context.Ports; } 135 public override void DeregisterEvents() { 136 foreach (var p in Ports) { 137 DeregisterPortEvents(p); 138 p.Parent = null; 139 } 140 Ports.ItemsAdded -= Ports_ItemsAdded; 141 Ports.ItemsRemoved -= Ports_ItemsRemoved; 142 Ports.ItemsReplaced -= Ports_ItemsReplaced; 143 Ports.CollectionReset -= Ports_CollectionReset; 144 base.DeregisterEvents(); 145 } 146 protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 147 foreach (var p in e.Items) { 148 p.Parent = this; 149 RegisterPortEvents(p); 150 } 151 } 152 protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 153 foreach (var p in e.Items) { 154 p.Parent = null; 155 DeregisterPortEvents(p); 156 } 157 } 158 protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 159 foreach (var p in e.OldItems) { 160 p.Parent = null; 161 DeregisterPortEvents(p); 162 } 163 foreach (var p in e.Items) { 164 p.Parent = this; 165 RegisterPortEvents(p); 166 } 167 } 168 protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 169 foreach (var p in e.OldItems) { 170 p.Parent = null; 171 DeregisterPortEvents(p); 172 } 173 foreach (var p in e.Items) { 174 p.Parent = this; 175 RegisterPortEvents(p); 176 } 154 177 } 155 178 #endregion 156 179 157 #region Context Events 158 protected override void RegisterContextEvents() { 159 base.RegisterContextEvents(); 160 Context.Ports.ItemsAdded += Ports_ItemsAdded; 161 Context.Ports.ItemsRemoved += Ports_ItemsRemoved; 162 Context.Ports.ItemsReplaced += Ports_ItemsReplaced; 163 Context.Ports.CollectionReset += Ports_CollectionReset; 164 foreach (var p in Context.Ports) 165 RegisterPortEvents(p); 166 } 167 protected override void DeregisterContextEvents() { 168 foreach (var p in Context.Ports) 169 DeregisterPortEvents(p); 170 Context.Ports.ItemsAdded -= Ports_ItemsAdded; 171 Context.Ports.ItemsRemoved -= Ports_ItemsRemoved; 172 Context.Ports.ItemsReplaced -= Ports_ItemsReplaced; 173 Context.Ports.CollectionReset -= Ports_CollectionReset; 174 base.DeregisterContextEvents(); 175 } 176 private void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 177 foreach (var p in e.Items) 178 RegisterPortEvents(p); 179 } 180 private void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 181 foreach (var p in e.Items) 182 DeregisterPortEvents(p); 183 } 184 private void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 185 foreach (var p in e.OldItems) 186 DeregisterPortEvents(p); 187 foreach (var p in e.Items) 188 RegisterPortEvents(p); 189 } 190 private void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) { 191 foreach (var p in e.OldItems) 192 DeregisterPortEvents(p); 193 foreach (var p in e.Items) 194 RegisterPortEvents(p); 195 } 180 #region Port Events 196 181 protected virtual void RegisterPortEvents(IPort port) { 197 182 var mp = port as IMessagePort; … … 204 189 mp.MessageReceived -= MessagePort_MessageReceived; 205 190 } 206 protected virtual void MessagePort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) { }207 191 #endregion 208 192 }
Note: See TracChangeset
for help on using the changeset viewer.