Exemple #1
0
        /// <inheritdoc/>
        public void Dispose()
        {
            var visitor = new GraphVisitorBase();

            visitor.Visiting += UnregisterNode;
            visitor.Visit(rootNode);
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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;
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #6
0
        private void RegisterAllNodes()
        {
            var visitor = new GraphVisitorBase();

            visitor.Visiting   += (node, path) => RegisterNode(node);
            visitor.ShouldVisit = shouldRegisterNode;
            visitor.Visit(rootNode);
        }
Exemple #7
0
        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));
        }
Exemple #8
0
        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 RegisterAllNodes()
 {
     var visitor = new GraphVisitorBase();
     visitor.Visiting += RegisterNode;
     visitor.Visit(rootNode);
 }
 /// <inheritdoc/>
 public void Dispose()
 {
     var visitor = new GraphVisitorBase();
     visitor.Visiting += UnregisterNode;
     visitor.Visit(rootNode);
 }
        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));
        }
 private void RegisterAllNodes()
 {
     var visitor = new GraphVisitorBase();
     visitor.Visiting += (node, path) => RegisterNode(node);
     visitor.ShouldVisit = shouldRegisterNode;
     visitor.Visit(rootNode);
 }
 /// <inheritdoc/>
 public void Dispose()
 {
     var visitor = new GraphVisitorBase();
     visitor.Visiting += (node, path) => UnregisterNode(node);
     visitor.Visit(rootNode);
 }