private void AssignLists(IEnumerable <ItemNode> itemNodes) { ItemNode source = itemNodes.First(n => n.HasFlag(NodeFlags.Source)); foreach (ItemNode itemNode in itemNodes.Where(n => !n.HasFlag(NodeFlags.Source))) { ItemNode parentItem = source.Metadata.MemberOf.Equals(itemNode.Metadata.Parent.MemberOf) ? source : itemNodes.FirstOrDefault(n => n.Metadata == itemNode.Metadata.Parent.MemberOf); MemberNode listMember = parentItem.FindNode(itemNode.Metadata.Parent); MemberNode listParent = parentItem.FindNode(listMember.Metadata.Parent) ?? parentItem; ListNode listNode = new ListNode() { Metadata = listMember.Metadata, FieldIndex = listMember.FieldIndex, Flags = NodeFlags.List, Item = itemNode, }; if (listMember.HasFlag(NodeFlags.Source)) { listNode.Flags |= NodeFlags.Source; listNode.FieldIndex = null; } else if (listMember.HasFlag(NodeFlags.Field)) { listNode.Flags |= NodeFlags.Field; } listParent.Members.Remove(listMember); listParent.Members.Add(listNode); itemNode.List = listNode; } }
private void AddMemberNode(ItemNode itemNode, MemberNode node) { MemberNode parentNode = itemNode.FindNode(node.Metadata?.Parent); MemberNode thisNode = itemNode.FindNode(node.Metadata); if (thisNode == null && parentNode != null) { parentNode.Members.Add(node); } else if (node != itemNode && parentNode == null) { MemberNode newParent = this.CreateMemberNode(node.Metadata.Parent); newParent.Members.Add(node); this.AddMemberNode(itemNode, newParent); } }