Changeset 6443 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs
- Timestamp:
- 06/19/11 21:32:06 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs
r6233 r6443 21 21 22 22 using System; 23 using System.Linq; 23 24 using HeuristicLab.Common; 24 25 using HeuristicLab.Core; 25 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 27 using System.Collections.Generic; 26 28 27 29 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { … … 111 113 #endregion 112 114 115 [StorableHook(HookType.AfterDeserialization)] 116 private void AfterDeserialization() { 117 foreach (ISymbol symbol in symbols.Values) 118 RegisterSymbolEvents(symbol); 119 } 113 120 [StorableConstructor] 114 121 protected SymbolicExpressionGrammar(bool deserializing) : base(deserializing) { } 115 122 protected SymbolicExpressionGrammar(SymbolicExpressionGrammar original, Cloner cloner) 116 123 : base(original, cloner) { 124 foreach (ISymbol symbol in Symbols) 125 RegisterSymbolEvents(symbol); 126 117 127 programRootSymbol = cloner.Clone(original.programRootSymbol); 118 128 startSymbol = cloner.Clone(original.StartSymbol); … … 153 163 } 154 164 165 protected override void AddSymbol(ISymbol symbol) { 166 base.AddSymbol(symbol); 167 RegisterSymbolEvents(symbol); 168 } 169 protected override void RemoveSymbol(ISymbol symbol) { 170 DeregisterSymbolEvents(symbol); 171 base.RemoveSymbol(symbol); 172 } 173 155 174 public event EventHandler ReadOnlyChanged; 156 175 protected virtual void OnReadOnlyChanged() { … … 166 185 } 167 186 #endregion 187 188 #region symbol events 189 protected virtual void RegisterSymbolEvents(ISymbol symbol) { 190 symbol.NameChanging += new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging); 191 symbol.NameChanged += new EventHandler(Symbol_NameChanged); 192 } 193 protected virtual void DeregisterSymbolEvents(ISymbol symbol) { 194 symbol.NameChanging -= new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging); 195 symbol.NameChanged -= new EventHandler(Symbol_NameChanged); 196 } 197 198 private void Symbol_NameChanging(object sender, CancelEventArgs<string> e) { 199 if (symbols.ContainsKey(e.Value)) e.Cancel = true; 200 } 201 private void Symbol_NameChanged(object sender, EventArgs e) { 202 ISymbol symbol = (ISymbol)sender; 203 string oldName = symbols.Where(x => x.Value == symbol).First().Key; 204 string newName = symbol.Name; 205 206 symbols.Remove(oldName); 207 symbols.Add(newName, symbol); 208 209 var subtreeCount = symbolSubtreeCount[oldName]; 210 symbolSubtreeCount.Remove(oldName); 211 symbolSubtreeCount.Add(newName, subtreeCount); 212 213 List<string> allowedChilds; 214 if (allowedChildSymbols.TryGetValue(oldName, out allowedChilds)) { 215 allowedChildSymbols.Remove(oldName); 216 allowedChildSymbols.Add(newName, allowedChilds); 217 } 218 219 for (int i = 0; i < GetMaximumSubtreeCount(symbol); i++) { 220 if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(oldName, i), out allowedChilds)) { 221 allowedChildSymbolsPerIndex.Remove(Tuple.Create(oldName, i)); 222 allowedChildSymbolsPerIndex.Add(Tuple.Create(newName, i), allowedChilds); 223 } 224 } 225 226 foreach (var parent in Symbols) { 227 if (allowedChildSymbols.TryGetValue(parent.Name, out allowedChilds)) 228 if (allowedChilds.Remove(oldName)) 229 allowedChilds.Add(newName); 230 231 for (int i = 0; i < GetMaximumSubtreeCount(parent); i++) { 232 if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, i), out allowedChilds)) 233 if (allowedChilds.Remove(oldName)) allowedChilds.Add(newName); 234 } 235 } 236 237 ClearCaches(); 238 } 239 #endregion 168 240 } 169 241 }
Note: See TracChangeset
for help on using the changeset viewer.