Beispiel #1
0
        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);
        }