/// <inheritdoc/> public void Dispose() { var visitor = new GraphVisitorBase(); visitor.Visiting += UnregisterNode; visitor.Visit(rootNode); }
private void ContentPrepareChange(object sender, ContentChangeEventArgs e) { var node = e.Content.OwnerNode as IGraphNode; if (node != null) { var visitor = new GraphVisitorBase(); visitor.Visiting += UnregisterNode; visitor.ShouldVisit = shouldRegisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: // The changed node itself is still valid, we don't want to unregister it visitor.SkipRootNode = true; visitor.Visit(node); break; case ContentChangeType.CollectionRemove: if (node.Content.IsReference && e.OldValue != null) { var removedNode = node.Content.Reference.AsEnumerable[e.Index].TargetNode; if (removedNode != null) { visitor.Visit(removedNode); } } break; } } PrepareChange?.Invoke(sender, new GraphContentChangeEventArgs(e)); }
private void ContentPrepareChange(object sender, MemberNodeChangeEventArgs e) { var node = e.Member; var visitor = new GraphVisitorBase(); visitor.Visiting += (node1, path) => UnregisterNode(node1); visitor.ShouldVisit = shouldRegisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: case ContentChangeType.CollectionUpdate: // The changed node itself is still valid, we don't want to unregister it visitor.SkipRootNode = true; visitor.Visit(node); // TODO: In case of CollectionUpdate we could probably visit only the target node of the corresponding index break; case ContentChangeType.CollectionRemove: if (node.IsReference && e.OldValue != null) { var removedNode = node.ItemReferences[e.Index].TargetNode; if (removedNode != null) { visitor.Visit(removedNode, node as MemberContent); } } break; } }
/// <inheritdoc/> public void Dispose() { var visitor = new GraphVisitorBase(); visitor.Visiting += (node, path) => UnregisterNode(node); visitor.Visit(rootNode); }
private void RegisterAllNodes() { var visitor = new GraphVisitorBase(); visitor.Visiting += RegisterNode; visitor.Visit(rootNode); }
private void RegisterAllNodes() { var visitor = new GraphVisitorBase(); visitor.Visiting += (node, path) => RegisterNode(node); visitor.ShouldVisit = shouldRegisterNode; visitor.Visit(rootNode); }
private void ContentFinalizeChange(object sender, ContentChangeEventArgs e) { var node = e.Content.OwnerNode as IGraphNode; if (node != null) { var visitor = new GraphVisitorBase(); visitor.Visiting += (node1, path) => RegisterNode(node1); visitor.ShouldVisit = shouldRegisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: // The changed node itself is still valid, we don't want to re-register it visitor.SkipRootNode = true; visitor.Visit(node); break; case ContentChangeType.CollectionAdd: if (node.Content.IsReference && e.NewValue != null) { IGraphNode addedNode; Index index; if (!e.Index.IsEmpty) { index = e.Index; addedNode = node.Content.Reference.AsEnumerable[e.Index].TargetNode; } else { var reference = node.Content.Reference.AsEnumerable.First(x => x.TargetNode.Content.Retrieve() == e.NewValue); index = reference.Index; addedNode = reference.TargetNode; } if (addedNode != null) { var path = new GraphNodePath(node).PushIndex(index); visitor.Visit(addedNode, path); } } break; } } FinalizeChange?.Invoke(sender, new GraphContentChangeEventArgs(e)); }
private void ContentFinalizeChange(object sender, MemberNodeChangeEventArgs e) { var visitor = new GraphVisitorBase(); visitor.Visiting += (node, path) => RegisterNode(node); visitor.ShouldVisit = shouldRegisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: case ContentChangeType.CollectionUpdate: // The changed node itself is still valid, we don't want to re-register it visitor.SkipRootNode = true; visitor.Visit(e.Member); // TODO: In case of CollectionUpdate we could probably visit only the target node of the corresponding index break; case ContentChangeType.CollectionAdd: if (e.Member.IsReference && e.NewValue != null) { IContentNode addedNode; Index index; if (!e.Index.IsEmpty) { index = e.Index; addedNode = e.Member.ItemReferences[e.Index].TargetNode; } else { var reference = e.Member.ItemReferences.First(x => x.TargetNode.Retrieve() == e.NewValue); index = reference.Index; addedNode = reference.TargetNode; } if (addedNode != null) { var path = new GraphNodePath(e.Member).PushIndex(index); visitor.Visit(addedNode, e.Member as MemberContent, path); } } break; } }
public void ResetOverride(Index indexToReset) { // TODO: comment if (indexToReset.IsEmpty) { OverrideContent(false); } else { OverrideItem(false, indexToReset); } var visitor = new GraphVisitorBase { SkipRootNode = true }; visitor.Visiting += (node, path) => { var childNode = (AssetNode)node; childNode.OverrideContent(false); foreach (var overrideItem in childNode.GetOverriddenItemIndices()) { childNode.OverrideItem(false, overrideItem); } foreach (var overrideKey in childNode.GetOverriddenKeyIndices()) { childNode.OverrideKey(false, overrideKey); } }; visitor.Visit(this); // TODO: we should reconcile directly only assetNode, not the whole asset PropertyGraph.ReconcileWithBase(); }
private void ContentFinalizeChange(object sender, ContentChangeEventArgs e) { var node = e.Content.OwnerNode as IGraphNode; var path = GetPath(e.Content.OwnerNode); if (node != null) { var visitor = new GraphVisitorBase(); visitor.Visiting += RegisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: // The changed node itself is still valid, we don't want to re-register it visitor.SkipRootNode = true; visitor.Visit(node, path); break; case ContentChangeType.CollectionAdd: if (node.Content.IsReference && e.NewValue != null) { var index = e.Index; IGraphNode addedNode; if (!index.IsEmpty) { addedNode = node.Content.Reference.AsEnumerable[e.Index].TargetNode; } else { var reference = node.Content.Reference.AsEnumerable.First(x => x.TargetNode.Content.Retrieve() == e.NewValue); index = reference.Index; addedNode = reference.TargetNode; } if (addedNode != null) { var addedNodePath = path?.PushIndex(index); visitor.Visit(addedNode, addedNodePath); } } break; } } FinalizeChange?.Invoke(sender, new GraphContentChangeEventArgs(e, path)); }
private void ContentPrepareChange(object sender, ContentChangeEventArgs e) { var node = e.Content.OwnerNode as IGraphNode; var path = GetPath(e.Content.OwnerNode); if (node != null) { var visitor = new GraphVisitorBase(); visitor.Visiting += UnregisterNode; switch (e.ChangeType) { case ContentChangeType.ValueChange: // The changed node itself is still valid, we don't want to unregister it visitor.SkipRootNode = true; visitor.Visit(node, path); break; case ContentChangeType.CollectionRemove: if (node.Content.IsReference && e.OldValue != null) { var removedNode = node.Content.Reference.AsEnumerable[e.Index].TargetNode; var removedNodePath = path?.PushIndex(e.Index); if (removedNode != null) { visitor.Visit(removedNode, removedNodePath); } } break; } } PrepareChange?.Invoke(sender, new GraphContentChangeEventArgs(e, path)); }