@Override public Rectangle getOccupiedAreaBBox() { Rectangle bBox = occupiedArea.getBBox().clone(); Float rotationAngle = this.<Float>getProperty(Property.ROTATION_ANGLE); if (rotationAngle != null) { if (!hasOwnProperty(Property.ROTATION_INITIAL_WIDTH) || !hasOwnProperty(Property.ROTATION_INITIAL_HEIGHT)) { Logger logger = LoggerFactory.getLogger(BlockRenderer.class); logger.error(MessageFormatUtil.format(LogMessageConstant.ROTATION_WAS_NOT_CORRECTLY_PROCESSED_FOR_RENDERER, getClass().getSimpleName())); } else { bBox.setWidth((float) this.getPropertyAsFloat(Property.ROTATION_INITIAL_WIDTH)); bBox.setHeight((float) this.getPropertyAsFloat(Property.ROTATION_INITIAL_HEIGHT)); } } return bBox; }
@Override public Rectangle getOccupiedAreaBBox() { Rectangle bBox = occupiedArea.getBBox().clone(); Float rotationAngle = this.<Float>getProperty(Property.ROTATION_ANGLE); if (rotationAngle != null) { if (!hasOwnProperty(Property.ROTATION_INITIAL_WIDTH) || !hasOwnProperty(Property.ROTATION_INITIAL_HEIGHT)) { Logger logger = LoggerFactory.getLogger(BlockRenderer.class); logger.error(MessageFormatUtil.format(LogMessageConstant.ROTATION_WAS_NOT_CORRECTLY_PROCESSED_FOR_RENDERER, getClass().getSimpleName())); } else { bBox.setWidth((float) this.getPropertyAsFloat(Property.ROTATION_INITIAL_WIDTH)); bBox.setHeight((float) this.getPropertyAsFloat(Property.ROTATION_INITIAL_HEIGHT)); } } return bBox; }
protected void extendLastRow(CellRenderer[] lastRow, Rectangle freeBox) { if (null != lastRow && 0 != heights.size()) { heights.set(heights.size() - 1, heights.get(heights.size() - 1) + freeBox.getHeight()); occupiedArea.getBBox().moveDown(freeBox.getHeight()).increaseHeight(freeBox.getHeight()); for (CellRenderer cell : lastRow) { if (null != cell) { cell.occupiedArea.getBBox().moveDown(freeBox.getHeight()).increaseHeight(freeBox.getHeight()); } } freeBox.moveUp(freeBox.getHeight()).setHeight(0); } }
protected void extendLastRow(CellRenderer[] lastRow, Rectangle freeBox) { if (null != lastRow && 0 != heights.size()) { heights.set(heights.size() - 1, heights.get(heights.size() - 1) + freeBox.getHeight()); occupiedArea.getBBox().moveDown(freeBox.getHeight()).increaseHeight(freeBox.getHeight()); for (CellRenderer cell : lastRow) { if (null != cell) { cell.occupiedArea.getBBox().moveDown(freeBox.getHeight()).increaseHeight(freeBox.getHeight()); } } freeBox.moveUp(freeBox.getHeight()).setHeight(0); } }
boolean applyMaxHeight(Rectangle parentBBox, Float blockMaxHeight, MarginsCollapseHandler marginsCollapseHandler, boolean isCellRenderer, boolean wasParentsHeightClipped, OverflowPropertyValue overflowY) { if (null == blockMaxHeight || (blockMaxHeight >= parentBBox.getHeight() && (isOverflowFit(overflowY)))) { return false; } boolean wasHeightClipped = false; if (blockMaxHeight <= parentBBox.getHeight()) { wasHeightClipped = true; } float heightDelta = parentBBox.getHeight() - (float) blockMaxHeight; if (marginsCollapseHandler != null && !isCellRenderer) { marginsCollapseHandler.processFixedHeightAdjustment(heightDelta); } parentBBox.moveUp(heightDelta).setHeight((float) blockMaxHeight); return wasHeightClipped; }
boolean applyMaxHeight(Rectangle parentBBox, Float blockMaxHeight, MarginsCollapseHandler marginsCollapseHandler, boolean isCellRenderer, boolean wasParentsHeightClipped, OverflowPropertyValue overflowY) { if (null == blockMaxHeight || (blockMaxHeight >= parentBBox.getHeight() && (isOverflowFit(overflowY)))) { return false; } boolean wasHeightClipped = false; if (blockMaxHeight <= parentBBox.getHeight()) { wasHeightClipped = true; } float heightDelta = parentBBox.getHeight() - (float) blockMaxHeight; if (marginsCollapseHandler != null && !isCellRenderer) { marginsCollapseHandler.processFixedHeightAdjustment(heightDelta); } parentBBox.moveUp(heightDelta).setHeight((float) blockMaxHeight); return wasHeightClipped; }
protected void shrinkCurrentAreaAndProcessRenderer(IRenderer renderer, List<IRenderer> resultRenderers, LayoutResult result) { if (currentArea != null) { float resultRendererHeight = result.getOccupiedArea().getBBox().getHeight(); currentArea.getBBox().setHeight(currentArea.getBBox().getHeight() - resultRendererHeight); if (currentArea.isEmptyArea() && (resultRendererHeight > 0 || FloatingHelper.isRendererFloating(renderer))) { currentArea.setEmptyArea(false); } processRenderer(renderer, resultRenderers); } if (!immediateFlush) { childRenderers.addAll(resultRenderers); } }
protected void shrinkCurrentAreaAndProcessRenderer(IRenderer renderer, List<IRenderer> resultRenderers, LayoutResult result) { if (currentArea != null) { float resultRendererHeight = result.getOccupiedArea().getBBox().getHeight(); currentArea.getBBox().setHeight(currentArea.getBBox().getHeight() - resultRendererHeight); if (currentArea.isEmptyArea() && (resultRendererHeight > 0 || FloatingHelper.isRendererFloating(renderer))) { currentArea.setEmptyArea(false); } processRenderer(renderer, resultRenderers); } if (!immediateFlush) { childRenderers.addAll(resultRenderers); } }
private void restoreLayoutBoxAfterFailedLayoutAttempt(Rectangle layoutBox) { layoutBox.setX(backupLayoutBox.getX()).setY(backupLayoutBox.getY()) .setWidth(backupLayoutBox.getWidth()).setHeight(backupLayoutBox.getHeight()); backupCollapseInfo.copyTo(collapseInfo); backupLayoutBox = null; backupCollapseInfo = null; }
private void restoreLayoutBoxAfterFailedLayoutAttempt(Rectangle layoutBox) { layoutBox.setX(backupLayoutBox.getX()).setY(backupLayoutBox.getY()) .setWidth(backupLayoutBox.getWidth()).setHeight(backupLayoutBox.getHeight()); backupCollapseInfo.copyTo(collapseInfo); backupLayoutBox = null; backupCollapseInfo = null; }
private void applyBottomMargin(Rectangle box, float bottomIndent) { // Here we don't subtract used buffer space from topBuffer, because every kid is assumed to be // the last one on the page, and so every kid always has parent's bottom buffer, however only the true last kid // uses it for real. Also, bottom margin are always applied after top margins, so it doesn't matter anyway. float bottomIndentLeftovers = bottomIndent - collapseInfo.getBufferSpaceOnBottom(); if (bottomIndentLeftovers < 0) { collapseInfo.setUsedBufferSpaceOnBottom(bottomIndent); collapseInfo.setBufferSpaceOnBottom(-bottomIndentLeftovers); } else { collapseInfo.setUsedBufferSpaceOnBottom(collapseInfo.getBufferSpaceOnBottom()); collapseInfo.setBufferSpaceOnBottom(0); box.setY(box.getY() + bottomIndentLeftovers); box.setHeight(box.getHeight() - bottomIndentLeftovers); } }
private void applyBottomMargin(Rectangle box, float bottomIndent) { // Here we don't subtract used buffer space from topBuffer, because every kid is assumed to be // the last one on the page, and so every kid always has parent's bottom buffer, however only the true last kid // uses it for real. Also, bottom margin are always applied after top margins, so it doesn't matter anyway. float bottomIndentLeftovers = bottomIndent - collapseInfo.getBufferSpaceOnBottom(); if (bottomIndentLeftovers < 0) { collapseInfo.setUsedBufferSpaceOnBottom(bottomIndent); collapseInfo.setBufferSpaceOnBottom(-bottomIndentLeftovers); } else { collapseInfo.setUsedBufferSpaceOnBottom(collapseInfo.getBufferSpaceOnBottom()); collapseInfo.setBufferSpaceOnBottom(0); box.setY(box.getY() + bottomIndentLeftovers); box.setHeight(box.getHeight() - bottomIndentLeftovers); } }
static LayoutArea adjustResultOccupiedAreaForFloatAndClear(IRenderer renderer, List<Rectangle> floatRendererAreas, Rectangle parentBBox, float clearHeightCorrection, boolean marginsCollapsingEnabled) { LayoutArea occupiedArea = renderer.getOccupiedArea(); LayoutArea editedArea = occupiedArea; if (isRendererFloating(renderer)) { editedArea = occupiedArea.clone(); if (occupiedArea.getBBox().getWidth() > 0) { floatRendererAreas.add(occupiedArea.getBBox()); } editedArea.getBBox().setY(parentBBox.getTop()); editedArea.getBBox().setHeight(0); } else if (clearHeightCorrection > 0 && !marginsCollapsingEnabled) { editedArea = occupiedArea.clone(); editedArea.getBBox().increaseHeight(clearHeightCorrection); } return editedArea; }
private void applyTopMargin(Rectangle box, float topIndent) { float bufferLeftoversOnTop = collapseInfo.getBufferSpaceOnTop() - topIndent; float usedTopBuffer = bufferLeftoversOnTop > 0 ? topIndent : collapseInfo.getBufferSpaceOnTop(); collapseInfo.setUsedBufferSpaceOnTop(usedTopBuffer); subtractUsedTopBufferFromBottomBuffer(usedTopBuffer); if (bufferLeftoversOnTop >= 0) { collapseInfo.setBufferSpaceOnTop(bufferLeftoversOnTop); box.moveDown(topIndent); } else { box.moveDown(collapseInfo.getBufferSpaceOnTop()); collapseInfo.setBufferSpaceOnTop(0); box.setHeight(box.getHeight() + bufferLeftoversOnTop); } }
static LayoutArea adjustResultOccupiedAreaForFloatAndClear(IRenderer renderer, List<Rectangle> floatRendererAreas, Rectangle parentBBox, float clearHeightCorrection, boolean marginsCollapsingEnabled) { LayoutArea occupiedArea = renderer.getOccupiedArea(); LayoutArea editedArea = occupiedArea; if (isRendererFloating(renderer)) { editedArea = occupiedArea.clone(); if (occupiedArea.getBBox().getWidth() > 0) { floatRendererAreas.add(occupiedArea.getBBox()); } editedArea.getBBox().setY(parentBBox.getTop()); editedArea.getBBox().setHeight(0); } else if (clearHeightCorrection > 0 && !marginsCollapsingEnabled) { editedArea = occupiedArea.clone(); editedArea.getBBox().increaseHeight(clearHeightCorrection); } return editedArea; }
private void applyTopMargin(Rectangle box, float topIndent) { float bufferLeftoversOnTop = collapseInfo.getBufferSpaceOnTop() - topIndent; float usedTopBuffer = bufferLeftoversOnTop > 0 ? topIndent : collapseInfo.getBufferSpaceOnTop(); collapseInfo.setUsedBufferSpaceOnTop(usedTopBuffer); subtractUsedTopBufferFromBottomBuffer(usedTopBuffer); if (bufferLeftoversOnTop >= 0) { collapseInfo.setBufferSpaceOnTop(bufferLeftoversOnTop); box.moveDown(topIndent); } else { box.moveDown(collapseInfo.getBufferSpaceOnTop()); collapseInfo.setBufferSpaceOnTop(0); box.setHeight(box.getHeight() + bufferLeftoversOnTop); } }
private void fixPrevChildOccupiedArea(int childIndex) { IRenderer prevRenderer = getRendererChild(childIndex - 1); Rectangle bBox = prevRenderer.getOccupiedArea().getBBox(); boolean prevChildHasAppliedCollapseAfter = !prevChildMarginInfo.isIgnoreOwnMarginBottom() && (!prevChildMarginInfo.isSelfCollapsing() || !prevChildMarginInfo.isIgnoreOwnMarginTop()); if (prevChildHasAppliedCollapseAfter) { float bottomMargin = prevChildMarginInfo.getCollapseAfter().getCollapsedMarginsSize(); bBox.setHeight(bBox.getHeight() - bottomMargin); bBox.moveUp(bottomMargin); ignoreModelBottomMargin(prevRenderer); } boolean isNotBlockChild = !isBlockElement(getRendererChild(childIndex)); boolean prevChildCanApplyCollapseAfter = !prevChildMarginInfo.isSelfCollapsing() || !prevChildMarginInfo.isIgnoreOwnMarginTop(); if (isNotBlockChild && prevChildCanApplyCollapseAfter) { float ownCollapsedMargins = prevChildMarginInfo.getOwnCollapseAfter().getCollapsedMarginsSize(); bBox.setHeight(bBox.getHeight() + ownCollapsedMargins); bBox.moveDown(ownCollapsedMargins); overrideModelBottomMargin(prevRenderer, ownCollapsedMargins); } }
private void fixPrevChildOccupiedArea(int childIndex) { IRenderer prevRenderer = getRendererChild(childIndex - 1); Rectangle bBox = prevRenderer.getOccupiedArea().getBBox(); boolean prevChildHasAppliedCollapseAfter = !prevChildMarginInfo.isIgnoreOwnMarginBottom() && (!prevChildMarginInfo.isSelfCollapsing() || !prevChildMarginInfo.isIgnoreOwnMarginTop()); if (prevChildHasAppliedCollapseAfter) { float bottomMargin = prevChildMarginInfo.getCollapseAfter().getCollapsedMarginsSize(); bBox.setHeight(bBox.getHeight() - bottomMargin); bBox.moveUp(bottomMargin); ignoreModelBottomMargin(prevRenderer); } boolean isNotBlockChild = !isBlockElement(getRendererChild(childIndex)); boolean prevChildCanApplyCollapseAfter = !prevChildMarginInfo.isSelfCollapsing() || !prevChildMarginInfo.isIgnoreOwnMarginTop(); if (isNotBlockChild && prevChildCanApplyCollapseAfter) { float ownCollapsedMargins = prevChildMarginInfo.getOwnCollapseAfter().getCollapsedMarginsSize(); bBox.setHeight(bBox.getHeight() + ownCollapsedMargins); bBox.moveDown(ownCollapsedMargins); overrideModelBottomMargin(prevRenderer, ownCollapsedMargins); } }
AbstractRenderer applyMinHeight(OverflowPropertyValue overflowY, Rectangle layoutBox) { AbstractRenderer overflowRenderer = null; Float blockMinHeight = retrieveMinHeight(); if (!Boolean.TRUE.equals(getPropertyAsBoolean(Property.FORCED_PLACEMENT)) && null != blockMinHeight && blockMinHeight > occupiedArea.getBBox().getHeight()) { float blockBottom = occupiedArea.getBBox().getBottom() - ((float) blockMinHeight - occupiedArea.getBBox().getHeight()); if (isFixedLayout()) { occupiedArea.getBBox().setY(blockBottom).setHeight((float) blockMinHeight); } else { if (isOverflowFit(overflowY) && blockBottom < layoutBox.getBottom()) { float hDelta = occupiedArea.getBBox().getBottom() - layoutBox.getBottom(); occupiedArea.getBBox() .increaseHeight(hDelta) .setY(layoutBox.getBottom()); if (occupiedArea.getBBox().getHeight() < 0) { occupiedArea.getBBox().setHeight(0); } this.isLastRendererForModelElement = false; overflowRenderer = createOverflowRenderer(LayoutResult.PARTIAL); overflowRenderer.updateMinHeight(UnitValue.createPointValue((float) blockMinHeight - occupiedArea.getBBox().getHeight())); if (hasProperty(Property.HEIGHT)) { overflowRenderer.updateHeight(UnitValue.createPointValue((float) retrieveHeight() - occupiedArea.getBBox().getHeight())); } } else { occupiedArea.getBBox().setY(blockBottom).setHeight((float) blockMinHeight); } } } return overflowRenderer; }
static void processWaitingDrawing(IRenderer child, Transform transformProp, List<IRenderer> waitingDrawing) { if (FloatingHelper.isRendererFloating(child) || transformProp != null) { waitingDrawing.add(child); } Border outlineProp = child.<Border>getProperty(Property.OUTLINE); if (outlineProp != null && child instanceof AbstractRenderer) { AbstractRenderer abstractChild = (AbstractRenderer) child; if (abstractChild.isRelativePosition()) abstractChild.applyRelativePositioningTranslation(false); Div outlines = new Div(); outlines.getAccessibilityProperties().setRole(null); if (transformProp != null) outlines.setProperty(Property.TRANSFORM, transformProp); outlines.setProperty(Property.BORDER, outlineProp); float offset = outlines.<Border>getProperty(Property.BORDER).getWidth(); if (abstractChild.getPropertyAsFloat(Property.OUTLINE_OFFSET) != null) offset += (float) abstractChild.getPropertyAsFloat(Property.OUTLINE_OFFSET); DivRenderer div = new DivRenderer(outlines); div.setParent(abstractChild.getParent()); Rectangle divOccupiedArea = abstractChild.applyMargins(abstractChild.occupiedArea.clone().getBBox(), false).moveLeft(offset).moveDown(offset); divOccupiedArea.setWidth(divOccupiedArea.getWidth() + 2 * offset).setHeight(divOccupiedArea.getHeight() + 2 * offset); div.occupiedArea = new LayoutArea(abstractChild.getOccupiedArea().getPageNumber(), divOccupiedArea); float outlineWidth = div.<Border>getProperty(Property.BORDER).getWidth(); if (divOccupiedArea.getWidth() >= outlineWidth * 2 && divOccupiedArea.getHeight() >= outlineWidth * 2) { waitingDrawing.add(div); } if (abstractChild.isRelativePosition()) abstractChild.applyRelativePositioningTranslation(true); } }