public void exportText(RenderingContext c, Writer writer) throws IOException { int baselinePos = getAbsY() + getBaseline(); if (baselinePos >= c.getPage().getBottom() && isInDocumentFlow()) { exportPageBoxText(c, writer, baselinePos); } for (Iterator i = getNonFlowContent().iterator(); i.hasNext(); ) { Box b = (Box)i.next(); b.exportText(c, writer); } if (isContainsContent()) { StringBuffer result = new StringBuffer(); collectText(c, result); writer.write(result.toString().trim()); writer.write(LINE_SEPARATOR); } }
private static LineBox newLine(LayoutContext c, int y, Box box) { LineBox result = new LineBox(); result.setStyle(box.getStyle().createAnonymousStyle(IdentValue.BLOCK)); result.setParent(box); result.initContainingLayer(c); result.setY(y); result.calcCanvasLocation(); return result; }
public void paintInline(RenderingContext c) { if (! getParent().getStyle().isVisible()) { return; } if (isContainsDynamicFunction()) { lookForDynamicFunctions(c); int totalLineWidth = InlineBoxing.positionHorizontally(c, this, 0); setContentWidth(totalLineWidth); calcChildLocations(); align(true); calcPaintingInfo(c, false); } if (_textDecorations != null) { c.getOutputDevice().drawTextDecoration(c, this); } if (c.debugDrawLineBoxes()) { c.getOutputDevice().drawDebugOutline(c, this, FSRGBColor.GREEN); } }
public String dump(LayoutContext c, String indent, int which) { if (which != Box.DUMP_RENDER) { throw new IllegalArgumentException(); } StringBuffer result = new StringBuffer(indent); result.append(this); result.append('\n'); dumpBoxes(c, indent, getNonFlowContent(), Box.DUMP_RENDER, result); if (getNonFlowContent().size() > 0 ) { result.append('\n'); } dumpBoxes(c, indent, getChildren(), Box.DUMP_RENDER, result); return result.toString(); }
public void collectText(RenderingContext c, StringBuffer buffer) throws IOException { for (Iterator i = getNonFlowContent().iterator(); i.hasNext(); ) { Box b = (Box)i.next(); b.collectText(c, buffer); } if (isContainsDynamicFunction()) { lookForDynamicFunctions(c); } super.collectText(c, buffer); }
currentLine.addChildForLayout(c, currentIB); } else { previousIB.addInlineChild(c, currentIB); InlineText inlineText = layoutText( c, iB.getStyle(), remainingWidth - fit, lbContext, false); if (lbContext.isUnbreakable() && ! currentLine.isContainsContent()) { int delta = c.getBlockFormattingContext().getNextLineBoxDelta(c, currentLine, maxAvailableWidth); if (delta > 0) { currentLine.setY(currentLine.getY() + delta); currentLine.calcCanvasLocation(); remainingWidth = maxAvailableWidth; remainingWidth -= c.getBlockFormattingContext().getFloatDistance(c, currentLine, maxAvailableWidth); (lbContext.isUnbreakable() && ! currentLine.isContainsContent())) { if (iB.isDynamicFunction()) { inlineText.setFunctionData(new FunctionData( currentLine.setContainsDynamicFunction(inlineText.isDynamicFunction()); currentIB.addInlineChild(c, inlineText); currentLine.setContainsContent(true); lbContext.setStart(lbContext.getEnd()); remainingWidth -= inlineText.getWidth(); markerData = null; contentStart = 0; if (currentLine.isFirstLine() && hasFirstLinePEs) { lbContext.setMaster(TextUtil.transformText(iB.getText(), iB.getStyle()));
boolean hasFirstLinePCs, List pendingInlineLayers, MarkerData markerData, int contentStart, boolean alwaysBreak) { current.setContentStart(contentStart); current.prunePendingInlineBoxes(); current.setContentWidth(totalLineWidth); if (current.getHeight() != 0 && current.getHeight() < minHeight && ! current.isContainsOnlyBlockLevelContent()) { current.setHeight(minHeight); current.checkPagePosition(c, alwaysBreak); current.calcChildLocations(); if (hasFirstLinePCs && current.isFirstLine()) { c.getFirstLinesTracker().clearStyles(); block.styleText(c); FloatLayoutResult layoutResult = (FloatLayoutResult)i.next(); LayoutUtil.layoutFloated(c, current, layoutResult.getBlock(), maxAvailableWidth, null); current.addNonFlowContent(layoutResult.getBlock());
public void align(boolean dynamic) { IdentValue align = getParent().getStyle().getIdent(CSSName.TEXT_ALIGN); int floatDistance = getFloatDistances().getLeftFloatDistance(); calcX = getContentStart() + floatDistance; if (align == IdentValue.JUSTIFY && dynamic) { justify(); int leftFloatDistance = getFloatDistances().getLeftFloatDistance(); int rightFloatDistance = getFloatDistances().getRightFloatDistance(); (getParent().getContentWidth() - leftFloatDistance - rightFloatDistance) / 2; calcX = midpoint - (getContentWidth() + getContentStart()) / 2; } else if (align == IdentValue.RIGHT) { int floatDistance = getFloatDistances().getRightFloatDistance(); calcX = getParent().getContentWidth() - floatDistance - getContentWidth(); if (calcX != getX()) { setX(calcX); calcCanvasLocation(); calcChildLocations();
public void justify() { if (! isLastLineWithContent()) { int leftFloatDistance = getFloatDistances().getLeftFloatDistance(); int rightFloatDistance = getFloatDistances().getRightFloatDistance(); int available = getParent().getContentWidth() - leftFloatDistance - rightFloatDistance - getContentStart(); if (available > getContentWidth()) { int toAdd = available - getContentWidth(); CharCounts counts = countJustifiableChars(); if (! getParent().getStyle().isIdent(CSSName.LETTER_SPACING, IdentValue.NORMAL)) { info.setNonSpaceAdjust(0.0f); info.setSpaceAdjust((float)toAdd / counts.getSpaceCount()); adjustChildren(info); setJustificationInfo(info);
public void checkPagePosition(LayoutContext c, boolean alwaysBreak) { if (! c.isPageBreaksAllowed()) { return; } PageBox pageBox = c.getRootLayer().getFirstPage(c, this); if (pageBox != null) { boolean needsPageBreak = alwaysBreak || getAbsY() + getHeight() >= pageBox.getBottom() - c.getExtraSpaceBottom(); if (needsPageBreak) { forcePageBreakBefore(c, IdentValue.ALWAYS, false); calcCanvasLocation(); } else if (pageBox.getTop() + c.getExtraSpaceTop() > getAbsY()) { int diff = pageBox.getTop() + c.getExtraSpaceTop() - getAbsY(); setY(getY() + diff); calcCanvasLocation(); } } }
private static void alignLine(final LayoutContext c, final LineBox current, final int maxAvailableWidth) { if (! current.isContainsDynamicFunction() && ! current.getParent().getStyle().isTextJustify()) { current.setFloatDistances(new FloatDistances() { public int getLeftFloatDistance() { return c.getBlockFormattingContext().getLeftFloatDistance(c, current, maxAvailableWidth); } public int getRightFloatDistance() { return c.getBlockFormattingContext().getRightFloatDistance(c, current, maxAvailableWidth); } }); } else { FloatDistances distances = new FloatDistances(); distances.setLeftFloatDistance( c.getBlockFormattingContext().getLeftFloatDistance( c, current, maxAvailableWidth)); distances.setRightFloatDistance( c.getBlockFormattingContext().getRightFloatDistance( c, current, maxAvailableWidth)); current.setFloatDistances(distances); } current.align(false); if (! current.isContainsDynamicFunction() && ! current.getParent().getStyle().isTextJustify()) { current.setFloatDistances(null); } }
public void reset(LayoutContext c) { for (int i = 0; i < getNonFlowContent().size(); i++) { Box content = (Box)getNonFlowContent().get(i); content.reset(c); } if (_markerData != null) { _markerData.restorePreviousReferenceLine(this); } super.reset(c); }
private void adjustChildren(JustificationInfo info) { float adjust = 0.0f; for (Iterator i = getChildIterator(); i.hasNext(); ) { Box b = (Box)i.next(); b.setX(b.getX() + Math.round(adjust)); if (b instanceof InlineLayoutBox) { adjust += ((InlineLayoutBox)b).adjustHorizontalPosition(info, adjust); } } calcChildLocations(); }
private static int processOutOfFlowContent( LayoutContext c, LineBox current, BlockBox block, int available, List pendingFloats) { int result = 0; CalculatedStyle style = block.getStyle(); if (style.isAbsolute() || style.isFixed()) { LayoutUtil.layoutAbsolute(c, current, block); current.addNonFlowContent(block); } else if (style.isFloated()) { FloatLayoutResult layoutResult = LayoutUtil.layoutFloated( c, current, block, available, pendingFloats); if (layoutResult.isPending()) { pendingFloats.add(layoutResult); } else { result = layoutResult.getBlock().getWidth(); current.addNonFlowContent(layoutResult.getBlock()); } } else if (style.isRunning()) { block.setStaticEquivalent(current); c.getRootLayer().addRunningBlock(block); } return result; }
line.addChildForLayout(c, currentIB); first = false; } else {
(container.getPaintingInfo() == null && container.intersects(c, clip))) { inlineContent.add(container); ((LineBox)container).addAllChildren(inlineContent, layer);
currentLine.addChildForLayout(c, currentIB); } else { previousIB.addInlineChild(c, currentIB); c, iB.getStyle(), remainingWidth - fit, lbContext, false); if (!lbContext.isUnbreakable() || (lbContext.isUnbreakable() && ! currentLine.isContainsContent())) { if (iB.isDynamicFunction()) { inlineText.setFunctionData(new FunctionData( currentLine.setContainsDynamicFunction(inlineText.isDynamicFunction()); currentIB.addInlineChild(c, inlineText); currentLine.setContainsContent(true); lbContext.setStart(lbContext.getEnd()); remainingWidth -= inlineText.getWidth(); markerData = null; contentStart = 0; if (currentLine.isFirstLine() && hasFirstLinePEs) { lbContext.setMaster(TextUtil.transformText(iB.getText(), iB.getStyle())); if (child.getWidth() > remainingWidth && currentLine.isContainsContent()) { saveLine(currentLine, c, box, minimumLineHeight, maxAvailableWidth, pendingFloats, hasFirstLinePEs, currentLine.addChildForLayout(c, child); } else { currentIB.addInlineChild(c, child);
boolean hasFirstLinePCs, List pendingInlineLayers, MarkerData markerData, int contentStart, boolean alwaysBreak) { current.setContentStart(contentStart); current.prunePendingInlineBoxes(); current.setContentWidth(totalLineWidth); if (current.getHeight() != 0 && current.getHeight() < minHeight && ! current.isContainsOnlyBlockLevelContent()) { current.setHeight(minHeight); current.checkPagePosition(c, alwaysBreak); current.calcChildLocations(); if (hasFirstLinePCs && current.isFirstLine()) { c.getFirstLinesTracker().clearStyles(); block.styleText(c); FloatLayoutResult layoutResult = (FloatLayoutResult)i.next(); LayoutUtil.layoutFloated(c, current, layoutResult.getBlock(), maxAvailableWidth, null); current.addNonFlowContent(layoutResult.getBlock());
public void align(boolean dynamic) { IdentValue align = getParent().getStyle().getIdent(CSSName.TEXT_ALIGN); int floatDistance = getFloatDistances().getLeftFloatDistance(); calcX = getContentStart() + floatDistance; if (align == IdentValue.JUSTIFY && dynamic) { justify(); int leftFloatDistance = getFloatDistances().getLeftFloatDistance(); int rightFloatDistance = getFloatDistances().getRightFloatDistance(); (getParent().getContentWidth() - leftFloatDistance - rightFloatDistance) / 2; calcX = midpoint - (getContentWidth() + getContentStart()) / 2; } else if (align == IdentValue.RIGHT) { int floatDistance = getFloatDistances().getRightFloatDistance(); calcX = getParent().getContentWidth() - floatDistance - getContentWidth(); if (calcX != getX()) { setX(calcX); calcCanvasLocation(); calcChildLocations();
public void justify() { if (! isLastLineWithContent()) { int leftFloatDistance = getFloatDistances().getLeftFloatDistance(); int rightFloatDistance = getFloatDistances().getRightFloatDistance(); int available = getParent().getContentWidth() - leftFloatDistance - rightFloatDistance - getContentStart(); if (available > getContentWidth()) { int toAdd = available - getContentWidth(); CharCounts counts = countJustifiableChars(); if (! getParent().getStyle().isIdent(CSSName.LETTER_SPACING, IdentValue.NORMAL)) { info.setNonSpaceAdjust(0.0f); info.setSpaceAdjust((float)toAdd / counts.getSpaceCount()); adjustChildren(info); setJustificationInfo(info);