Package com.itextpdf.layout.renderer
Class TableRenderer
- java.lang.Object
-
- com.itextpdf.layout.renderer.AbstractRenderer
-
- com.itextpdf.layout.renderer.TableRenderer
-
- All Implemented Interfaces:
IPropertyContainer
,IRenderer
public class TableRenderer extends AbstractRenderer
This class represents therenderer
object for aTable
object. It will delegate its drawing operations on to theCellRenderer
instances associated with thetable cells
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
TableRenderer.CellRendererInfo
This are a structs used for convenience in layout.private static class
TableRenderer.OverflowRowsWrapper
Utility class that copies overflow renderer rows on cell replacement so it won't affect original renderer
-
Field Summary
Fields Modifier and Type Field Description (package private) TableBorders
bordersHandler
protected DivRenderer
captionRenderer
private float[]
columnWidths
private float[]
countedColumnWidth
protected TableRenderer
footerRenderer
protected TableRenderer
headerRenderer
private java.util.List<java.lang.Float>
heights
protected boolean
isOriginalNonSplitRenderer
True for newly created renderer.protected Table.RowRange
rowRange
protected java.util.List<CellRenderer[]>
rows
private float
topBorderMaxWidth
private float
totalWidthForColumns
-
Fields inherited from class com.itextpdf.layout.renderer.AbstractRenderer
BOTTOM_SIDE, childRenderers, EPS, flushed, INF, isLastRendererForModelElement, LEFT_SIDE, modelElement, occupiedArea, OVERLAP_EPSILON, parent, positionedRenderers, properties, RIGHT_SIDE, TOP_SIDE
-
-
Constructor Summary
Constructors Modifier Constructor Description private
TableRenderer()
TableRenderer(Table modelElement)
Creates a TableRenderer from aTable
.TableRenderer(Table modelElement, Table.RowRange rowRange)
Creates a TableRenderer from aTable
which will partially render the table.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addChild(IRenderer renderer)
Adds a child to the current rendererprivate void
adjustCaptionAndFixOccupiedArea(Rectangle layoutBox, float verticalBorderSpacing)
If there is some space left, we will move the caption up, because initially the caption is at the very bottom of the area.private void
adjustFooterAndFixOccupiedArea(Rectangle layoutBox, float verticalBorderSpacing)
If there is some space left, we will move the footer up, because initially the footer is at the very bottom of the area.protected boolean
allowLastYLineRecursiveExtraction()
protected Rectangle
applyBorderBox(Rectangle rect, Border[] borders, boolean reverse)
Applies the given border box (borders) on the given rectangleprivate void
applyFixedXOrYPosition(boolean isXPosition, Rectangle layoutBox)
(package private) void
applyMarginsAndPaddingsAndCalculateColumnWidths(Rectangle layoutBox)
Rectangle
applyPaddings(Rectangle rect, boolean reverse)
Applies paddings of the renderer on the given rectangleprotected Rectangle
applyPaddings(Rectangle rect, UnitValue[] paddings, boolean reverse)
Applies given paddings to the given rectangle.private Rectangle
applySingleSpacing(Rectangle rect, float spacing, boolean isHorizontal, boolean reverse)
Applies the given horizontal or vertical spacing on the given rectangleprivate Rectangle
applySpacing(Rectangle rect, float horizontalSpacing, float verticalSpacing, boolean reverse)
Applies the given spacings on the given rectangleprivate void
calculateColumnWidths(float availableWidth)
Returns minWidthprivate void
correctLayoutedCellsOccupiedAreas(LayoutResult[] splits, int row, int[] targetOverflowRowIndex, java.lang.Float blockMinHeight, Rectangle layoutBox, java.util.List<java.lang.Boolean> rowsHasCellWithSetHeight, boolean isLastRenderer, boolean processBigRowspan, boolean skip)
private void
correctRowCellsOccupiedAreas(LayoutResult[] splits, int row, int[] targetOverflowRowIndex, int currentRowIndex, java.util.List<java.lang.Boolean> rowsHasCellWithSetHeight, float cumulativeShift, float additionalCellHeight)
private void
correctRowRange()
protected TableRenderer
createOverflowRenderer(Table.RowRange rowRange)
protected TableRenderer
createSplitRenderer(Table.RowRange rowRange)
void
draw(DrawContext drawContext)
Flushes the renderer subtree contents, i.e.void
drawBackground(DrawContext drawContext)
Draws a background layer if it is defined by a keyProperty.BACKGROUND
in either the layout element or thisIRenderer
itself.protected void
drawBackgrounds(DrawContext drawContext)
void
drawBorder(DrawContext drawContext)
Performs the drawing operation for the border of this renderer, if defined by any of theProperty.BORDER
values in either the layout element or thisIRenderer
itself.protected void
drawBorders(DrawContext drawContext)
private void
drawBorders(DrawContext drawContext, boolean hasHeader, boolean hasFooter)
protected void
drawCaption(DrawContext drawContext)
void
drawChildren(DrawContext drawContext)
Performs the drawing operation for allchildren
of this renderer.private void
enlargeCell(int col, int row, int minRowspan, CellRenderer[] currentRow, TableRenderer.OverflowRowsWrapper overflowRows, int[] targetOverflowRowIndex, TableRenderer[] splitResult)
private void
enlargeCellWithBigRowspan(CellRenderer[] currentRow, TableRenderer.OverflowRowsWrapper overflowRows, int row, int col, int minRowspan, TableRenderer[] splitResult, int[] targetOverflowRowIndex)
private void
ensureFooterOrHeaderHasTheSamePropertiesAsParentTableRenderer(TableRenderer headerOrFooterRenderer)
protected void
extendLastRow(CellRenderer[] lastRow, Rectangle freeBox)
MinMaxWidth
getMinMaxWidth()
Calculates min and max width values for current renderer.IRenderer
getNextRenderer()
Gets a new instance of this class to be used as a next renderer, after this renderer is used, iflayout(LayoutContext)
is called more than once.(package private) Table
getTable()
private float
getTableWidth()
private TableRenderer
initFooterOrHeaderRenderer(boolean footer, Border[] tableBorders)
private void
initializeCaptionRenderer(Div caption)
private void
initializeHeaderAndFooter(boolean isFirstOnThePage)
private void
initializeTableLayoutBorders()
private boolean
isBottomTablePart()
private boolean
isEmptyTableRenderer()
private boolean
isFooterRenderer()
private boolean
isFooterRendererOfLargeTable()
private boolean
isHeaderRenderer()
private boolean
isOriginalRenderer()
private boolean
isTopTablePart()
LayoutResult
layout(LayoutContext layoutContext)
This method simulates positioning of the renderer, including all of its children, and returns theLayoutResult
, representing the layout result, including occupied area, status, i.e.void
move(float dxRight, float dyUp)
Moves the renderer subtree by the specified offset.private TableRenderer
prepareFooterOrHeaderRendererForLayout(TableRenderer renderer, float layoutBoxWidth)
protected java.lang.Float
retrieveWidth(float parentBoxWidth)
Retrieves element's fixed content box width, if it's set.private void
setRowRange(Table.RowRange rowRange)
This method is used to set row range for table renderer during creating a new renderer.protected TableRenderer[]
split(int row)
protected TableRenderer[]
split(int row, boolean hasContent)
protected TableRenderer[]
split(int row, boolean hasContent, boolean cellWithBigRowspanAdded)
-
Methods inherited from class com.itextpdf.layout.renderer.AbstractRenderer
addAllChildRenderers, addAllChildRenderers, addAllProperties, addChildRenderer, alignChildHorizontally, applyAbsolutePosition, applyAbsolutePositionIfNeeded, applyAction, applyBorderBox, applyDestination, applyDestinationsAndAnnotation, applyLinkAnnotation, applyMargins, applyMargins, applyMarginsBordersPaddings, applyRelativePositioningTranslation, beginElementOpacityApplying, beginTransformationIfApplied, calculateAbsolutePdfBBox, calculateAdditionalWidth, calculateBBox, calculatePaddingBorderHeight, calculatePaddingBorderWidth, calculateShiftToPositionBBoxOfPointsAt, clipBackgroundArea, clipBackgroundArea, clipBorderArea, createFontCharacteristics, createXObject, deleteOwnProperty, deleteProperty, drawPositionedChildren, endElementOpacityApplying, endTransformationIfApplied, getAspectRatio, getBackgroundArea, getBorderAreaBBox, getBorderRadii, getBorders, getBorders, getChildRenderers, getDefaultProperty, getFirstYLineRecursively, getInnerAreaBBox, getLastYLineRecursively, getMargins, getModelElement, getOccupiedArea, getOccupiedAreaBBox, getOwnProperties, getOwnProperty, getPaddings, getParent, getPdfDocument, getProperty, getProperty, getPropertyAsBoolean, getPropertyAsColor, getPropertyAsFloat, getPropertyAsFloat, getPropertyAsFloat, getPropertyAsFont, getPropertyAsInteger, getPropertyAsTransparentColor, getPropertyAsUnitValue, getPropertyAsUnitValue, getRootRenderer, hasAbsoluteUnitValue, hasAspectRatio, hasOwnOrModelProperty, hasOwnProperty, hasProperty, hasRelativeUnitValue, initElementAreas, isAbsolutePosition, isBorderBoxSizing, isFirstOnRootArea, isFirstOnRootArea, isFixedLayout, isFlushed, isKeepTogether, isKeepTogether, isNotFittingHeight, isNotFittingLayoutArea, isNotFittingWidth, isOverflowFit, isOverflowProperty, isOverflowProperty, isOverflowProperty, isPositioned, isRelativePosition, isStaticLayout, logWarningIfGetNextRendererNotOverridden, noAbsolutePositionInfo, preparePositionedRendererAndAreaForLayout, processWaitingDrawing, rectangleToPointsList, removeAllChildRenderers, removeChildRenderer, replaceOwnProperty, resolveFirstPdfFont, resolveFirstPdfFont, retrieveHeight, retrieveMaxHeight, retrieveMaxWidth, retrieveMinHeight, retrieveMinWidth, retrieveUnitValue, retrieveUnitValue, returnBackOwnProperty, setBorders, setChildRenderer, setChildRenderers, setMinMaxWidthBasedOnFixedWidth, setParent, setProperty, setThisAsParent, shrinkOccupiedAreaForAbsolutePosition, toString, transformPoints, updateHeight, updateHeightsOnSplit, updateHeightsOnSplit, updateMaxHeight, updateMinHeight, updateWidth
-
-
-
-
Field Detail
-
rows
protected java.util.List<CellRenderer[]> rows
-
rowRange
protected Table.RowRange rowRange
-
headerRenderer
protected TableRenderer headerRenderer
-
footerRenderer
protected TableRenderer footerRenderer
-
captionRenderer
protected DivRenderer captionRenderer
-
isOriginalNonSplitRenderer
protected boolean isOriginalNonSplitRenderer
True for newly created renderer. For split renderers this is set to false. Used for tricky layout.
-
bordersHandler
TableBorders bordersHandler
-
columnWidths
private float[] columnWidths
-
heights
private java.util.List<java.lang.Float> heights
-
countedColumnWidth
private float[] countedColumnWidth
-
totalWidthForColumns
private float totalWidthForColumns
-
topBorderMaxWidth
private float topBorderMaxWidth
-
-
Constructor Detail
-
TableRenderer
private TableRenderer()
-
TableRenderer
public TableRenderer(Table modelElement, Table.RowRange rowRange)
Creates a TableRenderer from aTable
which will partially render the table.- Parameters:
modelElement
- the table to be rendered by this rendererrowRange
- the table rows to be rendered
-
-
Method Detail
-
addChild
public void addChild(IRenderer renderer)
Adds a child to the current renderer- Specified by:
addChild
in interfaceIRenderer
- Overrides:
addChild
in classAbstractRenderer
- Parameters:
renderer
- a child to be added
-
applyBorderBox
protected Rectangle applyBorderBox(Rectangle rect, Border[] borders, boolean reverse)
Description copied from class:AbstractRenderer
Applies the given border box (borders) on the given rectangle- Overrides:
applyBorderBox
in classAbstractRenderer
- Parameters:
rect
- a rectangle paddings will be applied on.borders
- theborders
to be applied on the given rectanglereverse
- indicates whether the border box will be applied inside (in case of false) or outside (in case of false) the rectangle.- Returns:
- a
border box
of the renderer
-
applyPaddings
protected Rectangle applyPaddings(Rectangle rect, UnitValue[] paddings, boolean reverse)
Description copied from class:AbstractRenderer
Applies given paddings to the given rectangle.- Overrides:
applyPaddings
in classAbstractRenderer
- Parameters:
rect
- a rectangle paddings will be applied on.paddings
- the paddings to be applied on the given rectanglereverse
- indicates whether paddings will be applied inside (in case of false) or outside (in case of true) the rectangle.- Returns:
- a
border box
of the renderer
-
applyPaddings
public Rectangle applyPaddings(Rectangle rect, boolean reverse)
Description copied from class:AbstractRenderer
Applies paddings of the renderer on the given rectangle- Overrides:
applyPaddings
in classAbstractRenderer
- Parameters:
rect
- a rectangle paddings will be applied on.reverse
- indicates whether paddings will be applied inside (in case of false) or outside (in case of true) the rectangle.- Returns:
- a
border box
of the renderer - See Also:
AbstractRenderer.getPaddings()
-
applySpacing
private Rectangle applySpacing(Rectangle rect, float horizontalSpacing, float verticalSpacing, boolean reverse)
Applies the given spacings on the given rectangle- Parameters:
rect
- a rectangle spacings will be applied on.horizontalSpacing
- the horizontal spacing to be applied on the given rectangleverticalSpacing
- the vertical spacing to be applied on the given rectanglereverse
- indicates whether the spacings will be applied inside (in case of false) or outside (in case of false) the rectangle.- Returns:
- a
border box
of the renderer
-
applySingleSpacing
private Rectangle applySingleSpacing(Rectangle rect, float spacing, boolean isHorizontal, boolean reverse)
Applies the given horizontal or vertical spacing on the given rectangle- Parameters:
rect
- a rectangle spacings will be applied on.spacing
- the horizontal or vertical spacing to be applied on the given rectangleisHorizontal
- defines whether the provided spacing should be applied as a horizontal or a vertical onereverse
- indicates whether the spacings will be applied inside (in case of false) or outside (in case of false) the rectangle.- Returns:
- a
border box
of the renderer
-
getTable
Table getTable()
-
initializeHeaderAndFooter
private void initializeHeaderAndFooter(boolean isFirstOnThePage)
-
initializeCaptionRenderer
private void initializeCaptionRenderer(Div caption)
-
isOriginalRenderer
private boolean isOriginalRenderer()
-
layout
public LayoutResult layout(LayoutContext layoutContext)
This method simulates positioning of the renderer, including all of its children, and returns theLayoutResult
, representing the layout result, including occupied area, status, i.e. if there was enough place to fit the renderer subtree, etc.LayoutResult
can be extended to return custom layout results for custom elements, e.g.TextRenderer
usesTextLayoutResult
as its result. This method can be called standalone to learn how much area the renderer subtree needs, or can be called beforeIRenderer.draw(DrawContext)
, to prepare the renderer to be flushed to the output stream.- Parameters:
layoutContext
- the description of layout area and any other additional information- Returns:
- result of the layout process
-
draw
public void draw(DrawContext drawContext)
Flushes the renderer subtree contents, i.e. draws itself on canvas, adds necessary objects to thePdfDocument
etc.- Specified by:
draw
in interfaceIRenderer
- Overrides:
draw
in classAbstractRenderer
- Parameters:
drawContext
- contains thePdfDocument
to which the renderer subtree if flushed, thePdfCanvas
on which the renderer subtree is drawn and other additional parameters needed to perform drawing
-
drawChildren
public void drawChildren(DrawContext drawContext)
Performs the drawing operation for allchildren
of this renderer.- Overrides:
drawChildren
in classAbstractRenderer
- Parameters:
drawContext
- the context (canvas, document, etc) of this drawing operation.
-
drawBackgrounds
protected void drawBackgrounds(DrawContext drawContext)
-
drawCaption
protected void drawCaption(DrawContext drawContext)
-
drawBackground
public void drawBackground(DrawContext drawContext)
Description copied from class:AbstractRenderer
Draws a background layer if it is defined by a keyProperty.BACKGROUND
in either the layout element or thisIRenderer
itself.- Overrides:
drawBackground
in classAbstractRenderer
- Parameters:
drawContext
- the context (canvas, document, etc) of this drawing operation.
-
getNextRenderer
public IRenderer getNextRenderer()
Gets a new instance of this class to be used as a next renderer, after this renderer is used, iflayout(LayoutContext)
is called more than once.If a renderer overflows to the next area, iText uses this method to create a renderer for the overflow part. So if one wants to extend
TableRenderer
, one should override this method: otherwise the default method will be used and thus the default rather than the custom renderer will be created.- Returns:
- new renderer instance
-
move
public void move(float dxRight, float dyUp)
Moves the renderer subtree by the specified offset. This method affects occupied area of the renderer.- Specified by:
move
in interfaceIRenderer
- Overrides:
move
in classAbstractRenderer
- Parameters:
dxRight
- the x-axis offset in points. Positive value will move the renderer subtree to the right.dyUp
- the y-axis offset in points. Positive value will move the renderer subtree to the top.
-
split
protected TableRenderer[] split(int row)
-
split
protected TableRenderer[] split(int row, boolean hasContent)
-
split
protected TableRenderer[] split(int row, boolean hasContent, boolean cellWithBigRowspanAdded)
-
createSplitRenderer
protected TableRenderer createSplitRenderer(Table.RowRange rowRange)
-
createOverflowRenderer
protected TableRenderer createOverflowRenderer(Table.RowRange rowRange)
-
retrieveWidth
protected java.lang.Float retrieveWidth(float parentBoxWidth)
Description copied from class:AbstractRenderer
Retrieves element's fixed content box width, if it's set. Takes into accountProperty.BOX_SIZING
,Property.MIN_WIDTH
, andProperty.MAX_WIDTH
properties.- Overrides:
retrieveWidth
in classAbstractRenderer
- Parameters:
parentBoxWidth
- width of the parent element content box. If element has relative width, it will be calculated relatively to this parameter.- Returns:
- element's fixed content box width or null if it's not set.
- See Also:
AbstractRenderer.hasAbsoluteUnitValue(int)
-
getMinMaxWidth
public MinMaxWidth getMinMaxWidth()
Description copied from class:AbstractRenderer
Calculates min and max width values for current renderer.- Overrides:
getMinMaxWidth
in classAbstractRenderer
- Returns:
- instance of
MinMaxWidth
-
allowLastYLineRecursiveExtraction
protected boolean allowLastYLineRecursiveExtraction()
- Overrides:
allowLastYLineRecursiveExtraction
in classAbstractRenderer
-
initializeTableLayoutBorders
private void initializeTableLayoutBorders()
-
correctRowRange
private void correctRowRange()
-
drawBorder
public void drawBorder(DrawContext drawContext)
Description copied from class:AbstractRenderer
Performs the drawing operation for the border of this renderer, if defined by any of theProperty.BORDER
values in either the layout element or thisIRenderer
itself.- Overrides:
drawBorder
in classAbstractRenderer
- Parameters:
drawContext
- the context (canvas, document, etc) of this drawing operation.
-
drawBorders
protected void drawBorders(DrawContext drawContext)
-
drawBorders
private void drawBorders(DrawContext drawContext, boolean hasHeader, boolean hasFooter)
-
isEmptyTableRenderer
private boolean isEmptyTableRenderer()
-
applyFixedXOrYPosition
private void applyFixedXOrYPosition(boolean isXPosition, Rectangle layoutBox)
-
adjustFooterAndFixOccupiedArea
private void adjustFooterAndFixOccupiedArea(Rectangle layoutBox, float verticalBorderSpacing)
If there is some space left, we will move the footer up, because initially the footer is at the very bottom of the area. We also will adjust the occupied area by the footer's size if it is present.- Parameters:
layoutBox
- the layout box which represents the area which is left free.
-
adjustCaptionAndFixOccupiedArea
private void adjustCaptionAndFixOccupiedArea(Rectangle layoutBox, float verticalBorderSpacing)
If there is some space left, we will move the caption up, because initially the caption is at the very bottom of the area. We also will adjust the occupied area by the caption's size if it is present.- Parameters:
layoutBox
- the layout box which represents the area which is left free.
-
correctLayoutedCellsOccupiedAreas
private void correctLayoutedCellsOccupiedAreas(LayoutResult[] splits, int row, int[] targetOverflowRowIndex, java.lang.Float blockMinHeight, Rectangle layoutBox, java.util.List<java.lang.Boolean> rowsHasCellWithSetHeight, boolean isLastRenderer, boolean processBigRowspan, boolean skip)
-
correctRowCellsOccupiedAreas
private void correctRowCellsOccupiedAreas(LayoutResult[] splits, int row, int[] targetOverflowRowIndex, int currentRowIndex, java.util.List<java.lang.Boolean> rowsHasCellWithSetHeight, float cumulativeShift, float additionalCellHeight)
-
extendLastRow
protected void extendLastRow(CellRenderer[] lastRow, Rectangle freeBox)
-
setRowRange
private void setRowRange(Table.RowRange rowRange)
This method is used to set row range for table renderer during creating a new renderer. The purpose to use this method is to remove input argument RowRange from createOverflowRenderer and createSplitRenderer methods.
-
initFooterOrHeaderRenderer
private TableRenderer initFooterOrHeaderRenderer(boolean footer, Border[] tableBorders)
-
ensureFooterOrHeaderHasTheSamePropertiesAsParentTableRenderer
private void ensureFooterOrHeaderHasTheSamePropertiesAsParentTableRenderer(TableRenderer headerOrFooterRenderer)
-
prepareFooterOrHeaderRendererForLayout
private TableRenderer prepareFooterOrHeaderRendererForLayout(TableRenderer renderer, float layoutBoxWidth)
-
isHeaderRenderer
private boolean isHeaderRenderer()
-
isFooterRenderer
private boolean isFooterRenderer()
-
isFooterRendererOfLargeTable
private boolean isFooterRendererOfLargeTable()
-
isTopTablePart
private boolean isTopTablePart()
-
isBottomTablePart
private boolean isBottomTablePart()
-
calculateColumnWidths
private void calculateColumnWidths(float availableWidth)
Returns minWidth
-
getTableWidth
private float getTableWidth()
-
enlargeCellWithBigRowspan
private void enlargeCellWithBigRowspan(CellRenderer[] currentRow, TableRenderer.OverflowRowsWrapper overflowRows, int row, int col, int minRowspan, TableRenderer[] splitResult, int[] targetOverflowRowIndex)
-
enlargeCell
private void enlargeCell(int col, int row, int minRowspan, CellRenderer[] currentRow, TableRenderer.OverflowRowsWrapper overflowRows, int[] targetOverflowRowIndex, TableRenderer[] splitResult)
-
applyMarginsAndPaddingsAndCalculateColumnWidths
void applyMarginsAndPaddingsAndCalculateColumnWidths(Rectangle layoutBox)
-
-