package org.tinytlf.layout
{
    import flash.text.engine.TextBlock;
    import flash.text.engine.TextLine;

    public class TextLayout
    {
        private var containers:Vector.<TextContainer> = new <TextContainer>[];
        
        public function addContainer(container:TextContainer):void
        {
            containers.push(container);
        }
        
        public function removeContainer(container:TextContainer):void
        {
            var i:int = containers.indexOf(container);
            
            if(i != -1)
                containers.splice(i, 1);
        }
        
        /**
         * Renders as many lines from the list of TextBlocks into the specified
         * conatiners as possible.
         */
        public function render(blocks:Vector.<TextBlock>):void
        {
            if (!containers || !containers.length || !blocks || !blocks.length)
                return;
            
            containers.forEach(function(c:TextContainer, ...args):void{
                c.preLayout();
            });
            
            var block:TextBlock = blocks[0];
            var i:int = 0;
            var container:TextContainer = containers[0];
            
            while (block && container)
            {
                container = renderBlockAcrossContainers(block, container);
                block = ++i < blocks.length ? blocks[i] : null;
            }
        }
        
        private function renderBlockAcrossContainers(block:TextBlock, startContainer:TextContainer):TextContainer
        {
            var container:TextContainer = startContainer;
            var containerIndex:int = containers.indexOf(container);
            
            var line:TextLine = container.layout(block, block.firstLine);
            
            while (line)
            {
                if(++containerIndex < containers.length)
                    container = containers[containerIndex];
                else
                    return null;
                
                line = container.layout(block, line);
            }
            
            return container;
        }
    }
}