Esempio n. 1
0
 protected WrapperList(
     IUxContainerInternals container,
     IEnumerable <TSyntax> initialSyntaxList,
     Func <TSyntax, TItem> itemCtor)
 {
     Container = container;
     _inner    = initialSyntaxList.Select((syntax, i) => Attach(itemCtor(syntax), i)).ToList();
 }
 public static WorkList <UxNode> Create(IUxContainerInternals container)
 {
     return(new WorkList <UxNode>(
                container.Nodes.FirstOrDefault(),
                container.Nodes.LastOrDefault(),
                x => x.NextNode,
                x => x.PreviousNode));
 }
Esempio n. 3
0
 public NodeList(IUxContainerInternals container, IImmutableList <NodeSyntax> initialSyntaxList) : base(
         container,
         initialSyntaxList,
         FromSyntax)
 {
 }
        static void MergeChildNodes(IUxContainerInternals dst, IUxContainerInternals src)
        {
            var dstNodes = WorkList.Create(dst);
            var srcNodes = WorkList.Create(src);

            // First skip all _identical_ nodes
            // (doesn't actually merge anything, just removes identical nodes from work list)
            MergeNodesBothDirections(
                dstNodes,
                srcNodes,
                DeepEquals);

            // First merge all where name matches
            MergeNodesBothDirections(
                dstNodes,
                srcNodes,
                (dstNode, srcNode) =>
            {
                if (dstNode.NodeType != srcNode.NodeType)
                {
                    return(false);
                }
                if (dstNode.NodeType == XmlNodeType.Element)
                {
                    if (((UxElement)dstNode).Name != ((UxElement)srcNode).Name)
                    {
                        return(false);
                    }
                }
                Merge(dstNode, srcNode);
                return(true);
            });

            // Then merge all where only node type matches
            MergeNodesBothDirections(
                dstNodes,
                srcNodes,
                (dstNode, srcNode) =>
            {
                if (dstNode.NodeType != srcNode.NodeType)
                {
                    return(false);
                }
                Merge(dstNode, srcNode);
                return(true);
            });

            while (!dstNodes.IsEmpty)
            {
                var node = dstNodes.Pop(Position.Tail);
                node.Remove();
            }

            while (!srcNodes.IsEmpty)
            {
                // We need to know where to insert this.
                var srcNode = srcNodes.Pop(Position.Head);
                var dstNode = CloneNode(srcNode);
                dst.Nodes.Insert(srcNode.NodeIndex, dstNode);
            }
        }