}
// now, build the line and update the array ..
pendingElements.clear();
contexts.clear();
RenderBox firstBox = null;
RenderBox box = null;
for (int i = 0; i < lastPosition; i++)
{
final RenderNode node = nodes[i];
final InlineSequenceElement element = sequenceElements[i];
if (element instanceof EndSequenceElement)
{
contexts.pop();
final long boxX2 = (elementPositions[i] + elementDimensions[i]);
box.setCachedWidth(boxX2 - box.getCachedX());
if (contexts.isEmpty())
{
box = null;
}
else
{
final RenderNode tmpnode = box;
box = (RenderBox) contexts.peek();
box.addGeneratedChild(tmpnode);
}
continue;
}
if (element instanceof StartSequenceElement)
{
box = (RenderBox) node.derive(false);
box.setCachedX(elementPositions[i]);
contexts.push(box);
if (firstBox == null)
{
firstBox = box;
}
continue;
}
if (box == null)
{
throw new IllegalStateException("Invalid sequence: " +
"Cannot have elements before we open the box context.");
}
// Content element: Perform a deep-deriveForAdvance, so that we preserve the
// possibly existing sub-nodes.
final RenderNode child = node.derive(true);
child.setCachedX(elementPositions[i]);
child.setCachedWidth(elementDimensions[i]);
if (box.getStaticBoxLayoutProperties().isPreserveSpace() &&
box.getStyleSheet().getBooleanStyleProperty(TextStyleKeys.TRIM_TEXT_CONTENT) == false)
{
// Take a shortcut as we know that we will never have any pending elements if preserve is true and
// trim-content is false.
box.addGeneratedChild(child);
continue;
}
if (child.isIgnorableForRendering())
{
pendingElements.add(child);
}
else
{
for (int j = 0; j < pendingElements.size(); j++)
{
final RenderNode pendingNode = (RenderNode) pendingElements.get(j);
box.addGeneratedChild(pendingNode);
}
pendingElements.clear();
box.addGeneratedChild(child);
}
}
// Remove all spacers and other non printable content that might
// look ugly at the beginning of a new line ..
for (; lastPosition < sequenceFill; lastPosition++)
{
final RenderNode node = nodes[lastPosition];
final StyleSheet styleSheet = node.getStyleSheet();
if (WhitespaceCollapse.PRESERVE.equals(styleSheet.getStyleProperty(TextStyleKeys.WHITE_SPACE_COLLAPSE)) &&
styleSheet.getBooleanStyleProperty(TextStyleKeys.TRIM_TEXT_CONTENT) == false)
{
break;
}
if (node.isIgnorableForRendering() == false)
{
break;
}
}
// If there are open contexts, then add the split-result to the new line
// and update the width of the current line
RenderBox previousContext = null;
final int openContexts = contexts.size();
for (int i = 0; i < openContexts; i++)
{
final RenderBox renderBox = (RenderBox) contexts.get(i);
renderBox.setCachedWidth(getEndOfLine() - box.getCachedX());
final InlineRenderBox rightBox = (InlineRenderBox) renderBox.split(RenderNode.HORIZONTAL_AXIS);
sequenceElements[i] = StartSequenceElement.INSTANCE;
nodes[i] = rightBox;
if (previousContext != null)
{
previousContext.addGeneratedChild(renderBox);