public override void Kill() { base.Kill(); if (Anonymous) { _formGroup.RemoveAnonymousItem(this, false); } else { _formGroup.RemoveItem(_formName); } // Calling Kill(false) will prevent attempts to remove the fixin from the dictionaries while iterating foreach (var fixin in UpdateFixins.Values) { fixin.Kill(false); } foreach (var fixin in RenderFixins.Values) { fixin.Kill(false); } UpdateFixins.Clear(); RenderFixins.Clear(); }
/// <summary> /// Attach a given fixin to this form. /// </summary> /// <param name="fixin"></param> protected internal void AttachFixin(AbstractFixin fixin) { if (fixin == null) { throw new ArgumentNullException( String.Format("Cannot attach null fixin to form '{0}'.", Anonymous ? (object)this : Name)); } bool attached = false; switch (fixin.FixinType) { case FixinType.Render: if (_midRenderFixins) { _fixinsToAdd.Add(fixin); } else { RenderFixins.Add(fixin.Name, fixin); fixin._form = this; attached = true; } break; case FixinType.Update: if (_midRenderFixins) { _fixinsToAdd.Add(fixin); } else { UpdateFixins.Add(fixin.Name, fixin); fixin._form = this; attached = true; } break; case FixinType.Render | FixinType.Update: if (_midUpdateFixins | _midRenderFixins) { _fixinsToAdd.Add(fixin); } else { RenderFixins.Add(fixin.Name, fixin); UpdateFixins.Add(fixin.Name, fixin); fixin._form = this; attached = true; } break; } if (attached && fixin.OnAttachToForm != null) { fixin.OnAttachToForm(); } }
private void DetachFixin(AbstractFixin fixin, string fixinName) { if (fixin == null && fixinName == null) { throw new ArgumentNullException( String.Format( "When detaching a fixin from form '{0}', both parameters " + "('fixin' and 'fixinName') can't be null.", Anonymous ? (object)this : Name)); } if (fixin == null) { fixin = UpdateFixins.ContainsKey(fixinName) ? UpdateFixins[fixinName] : RenderFixins.ContainsKey(fixinName) ? RenderFixins[fixinName] : null; if (fixin == null) { return; } } else if (fixinName == null) { fixinName = fixin.Name; } var type = fixin.FixinType; // There's probably a simpler if statement for this... if (type == FixinType.Update && _midUpdateFixins || type == FixinType.Render && _midRenderFixins || type == (FixinType.Update | FixinType.Render) && (_midRenderFixins || _midUpdateFixins)) { _fixinsToRemove.Add(fixinName); } else { switch (type) { case FixinType.Update: UpdateFixins.Remove(fixinName); break; case FixinType.Render: RenderFixins.Remove(fixinName); break; case FixinType.Update | FixinType.Render: UpdateFixins.Remove(fixinName); RenderFixins.Remove(fixinName); break; } fixin.Kill(false); } }