/// <summary> /// Performs actions after a reference's target DOM node has been removed; the /// default behavior is to remove the node from its parent</summary> /// <param name="e">Event args describing reference</param> protected virtual void OnReferentRemoved(ReferenceEventArgs e) { // check if node has been removed already; this can happen if it // has multiple referents that have been removed DomNode parent = e.Owner.Parent; if (parent != null) { // remove node from parent e.Owner.RemoveFromParent(); } }
/// <summary> /// Performs actions after a reference to an external DOM node is removed</summary> /// <param name="e">Event args describing reference</param> protected virtual void OnExternalReferenceRemoved(ReferenceEventArgs e) { ExternalReferenceRemoved.Raise(this, e); }
/// <summary> /// Performs actions after a reference to an external DOM node is added</summary> /// <param name="e">Event args describing reference</param> protected virtual void OnExternalReferenceAdded(ReferenceEventArgs e) { }
/// <summary> /// Performs custom actions on validation Ending events</summary> /// <param name="sender">Validation context</param> /// <param name="e">Event args</param> protected override void OnEnding(object sender, EventArgs e) { if (Suspended) return; while (m_removed.Count > 0) { // get a snapshot of the removed nodes, so we can clear the set, as dangling // reference handling may result in cascading removals DomNode[] removedNodes = m_removed.ToArray(); m_removed.Clear(); // update all dangling references to removed node foreach (DomNode removedNode in removedNodes) { List<Pair<DomNode, AttributeInfo>> referenceList; if (m_nodeReferenceLists.TryGetValue(removedNode, out referenceList)) { foreach (Pair<DomNode, AttributeInfo> pair in referenceList.ToArray()) // copy, as list may be modified { ReferenceEventArgs args = new ReferenceEventArgs(pair.First, pair.Second, removedNode); ReferentRemoved.Raise(this, args); OnReferentRemoved(args); } // remove the list of references to the removed node m_nodeReferenceLists.Remove(removedNode); } } } }
// removes refs from the tracker, and reports removed external refs private void RemoveReference(DomNode owner, AttributeInfo attributeInfo, DomNode target) { List<Pair<DomNode, AttributeInfo>> referenceList; if (m_nodeReferenceLists.TryGetValue(target, out referenceList)) { referenceList.Remove(new Pair<DomNode, AttributeInfo>(owner, attributeInfo)); if (referenceList.Count == 0) { m_nodeReferenceLists.Remove(target); } } // if target's root isn't the context's root, then it's an external reference // that is being removed. DomNode targetRoot = target.GetRoot(); if (DomNode != targetRoot) { ReferenceEventArgs e = new ReferenceEventArgs(owner, attributeInfo, target); OnExternalReferenceRemoved(e); ExternalReferenceRemoved.Raise(this, e); } }
// adds refs to the tracker, and reports added external refs private void AddReference(DomNode owner, AttributeInfo attributeInfo, DomNode target) { List<Pair<DomNode, AttributeInfo>> referenceList; if (!m_nodeReferenceLists.TryGetValue(target, out referenceList)) { referenceList = new List<Pair<DomNode, AttributeInfo>>(); m_nodeReferenceLists.Add(target, referenceList); } referenceList.Add(new Pair<DomNode, AttributeInfo>(owner, attributeInfo)); // if target's root isn't the context's root, then it's an external reference // that is being added. DomNode targetRoot = target.GetRoot(); if (DomNode != targetRoot) { ReferenceEventArgs e = new ReferenceEventArgs(owner, attributeInfo, target); OnExternalReferenceAdded(e); ExternalReferenceAdded.Raise(this, e); } }