protected virtual LayoutNode LayoutElement(LayoutNode currentNode, Element element) { // Eliminate empty groups, and groups with only one element GroupElement groupElement = element as GroupElement; if (groupElement != null) { if (groupElement.Elements.Count == 0) { return(currentNode); } if (!groupElement.ContainsMultipleElements()) { return(LayoutElement(currentNode, groupElement.Elements[0])); } } ElementNode elementNode = new ElementNode(element); if ((element is GroupElement) && (((GroupElement)element).Elements.Count > 0)) { LayoutNode newNode = new LayoutBuilder().Layout(((GroupElement)element).Elements); if (newNode != null) { elementNode.Children.Add(newNode); } } if (currentNode != null) { LayoutNode parent; if (_flowBreak || _return) { parent = PrepareLayout(currentNode, ReverseFlow(_flow)); } else { parent = PrepareLayout(currentNode, _flow); } if (_break) { PrepareLayout(parent, ReverseFlow(_flow)).Children.Add(PrepareLayout(elementNode, _flow)); } else if (_return) { PrepareLayout(parent, _flow).Children.Add(elementNode); } else { parent.Children.Add(elementNode); } } switch (element.Flow) { case Flow.Horizontal: case Flow.Vertical: _flow = element.Flow; break; } _return = _flowBreak && !element.FlowBreak; _break = element.Break; _flowBreak = element.FlowBreak; return(elementNode); }