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)); }
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); } }