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