Package org.apache.fop.layoutmgr
Class BalancingColumnBreakingAlgorithm
java.lang.Object
org.apache.fop.layoutmgr.BreakingAlgorithm
org.apache.fop.layoutmgr.BalancingColumnBreakingAlgorithm
This is a the breaking algorithm that is responsible for balancing columns in multi-column
layout.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.apache.fop.layoutmgr.BreakingAlgorithm
BreakingAlgorithm.BestRecords, BreakingAlgorithm.KnuthNode -
Field Summary
FieldsFields inherited from class org.apache.fop.layoutmgr.BreakingAlgorithm
activeLines, activeNodeCount, alignment, alignmentLast, ALL_BREAKS, best, considerTooShort, endLine, incompatibleFitnessDemerit, indentFirstPart, INFINITE_RATIO, lineWidth, maxFlaggedPenaltiesCount, NO_FLAGGED_PENALTIES, ONLY_FORCED_BREAKS, par, repeatedFlaggedDemerit, startLine, totalShrink, totalStretch, totalWidth -
Constructor Summary
ConstructorsConstructorDescriptionBalancingColumnBreakingAlgorithm(LayoutManager topLevelLM, PageProvider pageProvider, org.apache.fop.layoutmgr.PageBreakingAlgorithm.PageBreakingLayoutListener layoutListener, int alignment, int alignmentLast, MinOptMax footnoteSeparatorLength, boolean partOverflowRecovery, int columnCount) -
Method Summary
Modifier and TypeMethodDescriptionprotected voidaddNode(int line, BreakingAlgorithm.KnuthNode node) Add a node at the end of the given line's existing active nodes.protected BreakingAlgorithm.KnuthNodeCompare two KnuthNodes and return the node with the least demerit.protected doublecomputeAdjustmentRatio(BreakingAlgorithm.KnuthNode activeNode, int difference) Return the adjustment ratio needed to make up for the difference.protected doublecomputeDemerits(BreakingAlgorithm.KnuthNode activeNode, KnuthElement element, int fitnessClass, double r) Computes the demerits of the current breaking (that is, up to the given element), if the next-to-last chosen breakpoint is the given active node.protected intcomputeDifference(BreakingAlgorithm.KnuthNode activeNode, KnuthElement element, int elementIndex) Return the difference between the natural width of a line that would be made between the given active node and the given element, and the available width of the real line.protected voidconsiderLegalBreak(KnuthElement element, int elementIdx) Determines if the given breakpoint is a feasible breakpoint.protected voidcreateForcedNodes(BreakingAlgorithm.KnuthNode node, int line, int elementIdx, int difference, double r, double demerits, int fitnessClass, int availableShrink, int availableStretch, int newWidth, int newStretch, int newShrink) protected BreakingAlgorithm.KnuthNodecreateNode(int position, int line, int fitness, int totalWidth, int totalStretch, int totalShrink) Creates a new active node for a break from the best active node of the given fitness class to the element at the given position.protected BreakingAlgorithm.KnuthNodecreateNode(int position, int line, int fitness, int totalWidth, int totalStretch, int totalShrink, double adjustRatio, int availableShrink, int availableStretch, int difference, double totalDemerits, BreakingAlgorithm.KnuthNode previous) Creates a new active node for a feasible breakpoint at the given position.protected voiddeactivateNode(BreakingAlgorithm.KnuthNode node, int line) Deactivate the given nodeprotected voidprotected booleanelementCanEndLine(KnuthElement element, int line, int difference) Check if the givenKnuthElementcan end the line with the given number.protected intFilter active nodes.protected voidfinish()Hook for subclasses to trigger special behavior after ending the main loop inBreakingAlgorithm.findBreakingPoints(KnuthSequence,int,double,boolean,int)protected BreakingAlgorithm.KnuthNodeprotected intprotected AbstractBreaker.FloatPositiongetFObj()protected final List<KnuthElement> getFootnoteList(int index) Obtain the element-list corresponding to the footnote at the given index.protected intobtain ipd differenceprotected intgetLineWidth(int line) Returns the line/part width of a given line/part.protected voidPage-breaking specific handling of the given box.protected intprotected inthandle ipd changeprotected voidhandlePenaltyAt(KnuthPenalty penalty, int position, int allowedBreaks) Overridden to consider penalties with valueKnuthElement.INFINITEas legal break-points, if the current keep-context allows this (a keep-*.within-page="always" constraint still permits column-breaks) Handle aKnuthPenaltyat the given position, taking into account the type of breaks allowed.protected booleanprotected booleanprotected booleanprotected voidInitializes the algorithm's variables.voidInsert the givenAbstractBreaker.PageBreakPositionas the first element in the list of page-breaksvoidloadFootnotes(List fl, List<Integer> ll, int tfl, int ifl, boolean fp, boolean nf, int fnfi, int fli, int fei, MinOptMax fsl, int pfli, int pfei) protected BreakingAlgorithm.KnuthNodeRecover from an overflow condition.protected BreakingAlgorithm.KnuthNoderecoverFromTooLong(BreakingAlgorithm.KnuthNode lastTooLong) Overridden to defer a part to the next page, if it must be kept within one page, but is too large to fit in the last column.voidvoidRemoves all page breaks from the result list.protected intrestartFrom(BreakingAlgorithm.KnuthNode restartingNode, int currentIndex) Restart from the given node at the given index.voidupdateData1(int total, double demerits) Empty method, hook for subclasses.voidupdateData2(BreakingAlgorithm.KnuthNode bestActiveNode, KnuthSequence sequence, int total) Empty method, hook for subclasses.Methods inherited from class org.apache.fop.layoutmgr.BreakingAlgorithm
activateNode, calculateBreakPoints, findBreakingPoints, findBreakingPoints, forceNode, getAlignment, getAlignmentLast, getElement, getLastTooLong, getLastTooShort, getLineWidth, getMaxRecoveryAttempts, getNode, handleElementAt, handleGlueAt, isPartOverflowRecoveryActivated, removeNode, replaceLastDeactivated, setConstantLineWidth, toString
-
Field Details
-
bestNodeForLastPage
-
-
Constructor Details
-
BalancingColumnBreakingAlgorithm
public BalancingColumnBreakingAlgorithm(LayoutManager topLevelLM, PageProvider pageProvider, org.apache.fop.layoutmgr.PageBreakingAlgorithm.PageBreakingLayoutListener layoutListener, int alignment, int alignmentLast, MinOptMax footnoteSeparatorLength, boolean partOverflowRecovery, int columnCount)
-
-
Method Details
-
computeDemerits
protected double computeDemerits(BreakingAlgorithm.KnuthNode activeNode, KnuthElement element, int fitnessClass, double r) Computes the demerits of the current breaking (that is, up to the given element), if the next-to-last chosen breakpoint is the given active node. This adds to the total demerits of the given active node, the demerits of a line starting at this node and ending at the given element.- Parameters:
activeNode- considered preceding line breakelement- considered current line breakfitnessClass- fitness of the current liner- adjustment ratio for the current line- Returns:
- the demerit of the current line
-
initialize
protected void initialize()Initializes the algorithm's variables.- Overrides:
initializein classBreakingAlgorithm
-
recoverFromTooLong
Overridden to defer a part to the next page, if it must be kept within one page, but is too large to fit in the last column. Recover from aBreakingAlgorithm.KnuthNodeleading to a line that is too long. The default implementation creates a new node corresponding to a break point after the previous node that led to a line that was too short.- Overrides:
recoverFromTooLongin classBreakingAlgorithm- Parameters:
lastTooLong- the node that leads to a "too long" line- Returns:
- node corresponding to a breakpoint after the previous "too short" line
-
compareNodes
protected BreakingAlgorithm.KnuthNode compareNodes(BreakingAlgorithm.KnuthNode node1, BreakingAlgorithm.KnuthNode node2) Compare two KnuthNodes and return the node with the least demerit.- Overrides:
compareNodesin classBreakingAlgorithm- Parameters:
node1- The first knuth node.node2- The other knuth node.- Returns:
- the node with the least demerit.
-
createNode
protected BreakingAlgorithm.KnuthNode createNode(int position, int line, int fitness, int totalWidth, int totalStretch, int totalShrink, double adjustRatio, int availableShrink, int availableStretch, int difference, double totalDemerits, BreakingAlgorithm.KnuthNode previous) Creates a new active node for a feasible breakpoint at the given position. Only called in forced mode.- Overrides:
createNodein classBreakingAlgorithm- Parameters:
position- index of the element in the Knuth sequenceline- number of the line ending at the breakpointfitness- fitness class of the line ending at the breakpoint. One of 0, 1, 2, 3.totalWidth- accumulated width of the KnuthElements up to after the breakpointtotalStretch- accumulated stretchability of the KnuthElements up to after the breakpointtotalShrink- accumulated shrinkability of the KnuthElements up to after the breakpointadjustRatio- adjustment ratio if the line ends at this breakpointavailableShrink- available stretch of the line ending at this breakpointavailableStretch- available shrink of the line ending at this breakpointdifference- difference between target and actual line widthtotalDemerits- minimum total demerits up to the breakpointprevious- active node for the preceding breakpoint- Returns:
- a new node
-
createNode
protected BreakingAlgorithm.KnuthNode createNode(int position, int line, int fitness, int totalWidth, int totalStretch, int totalShrink) Creates a new active node for a break from the best active node of the given fitness class to the element at the given position.- Overrides:
createNodein classBreakingAlgorithm- Parameters:
position- index of the element in the Knuth sequenceline- number of the line ending at the breakpointfitness- fitness class of the line ending at the breakpoint. One of 0, 1, 2, 3.totalWidth- accumulated width of the KnuthElements up to after the breakpointtotalStretch- accumulated stretchability of the KnuthElements up to after the breakpointtotalShrink- accumulated shrinkability of the KnuthElements up to after the breakpoint- Returns:
- a new node
- See Also:
-
handleBox
Page-breaking specific handling of the given box. Currently it adds the footnotes cited in the given box to the list of to-be-handled footnotes. Handle aKnuthBox.
Note: default implementation just adds the box's width to the total content width. Subclasses that do not keep track of this themselves, but override this method, should remember to callsuper.handleBox(box)to avoid unwanted side-effects.- Overrides:
handleBoxin classBreakingAlgorithm- Parameters:
box- theKnuthBoxto handle
-
handlePenaltyAt
Overridden to consider penalties with valueKnuthElement.INFINITEas legal break-points, if the current keep-context allows this (a keep-*.within-page="always" constraint still permits column-breaks) Handle aKnuthPenaltyat the given position, taking into account the type of breaks allowed.- Overrides:
handlePenaltyAtin classBreakingAlgorithm- Parameters:
penalty- theKnuthPenaltyto handleposition- the position of the penalty in the listallowedBreaks- the type of breaks that are allowed
-
restartFrom
Restart from the given node at the given index.- Overrides:
restartFromin classBreakingAlgorithm- Parameters:
restartingNode- theBreakingAlgorithm.KnuthNodeto restart fromcurrentIndex- the current position index- Returns:
- the index of the restart point
-
considerLegalBreak
Determines if the given breakpoint is a feasible breakpoint. That is, if a decent line may be built between one of the currently active nodes and this breakpoint.- Overrides:
considerLegalBreakin classBreakingAlgorithm- Parameters:
element- the paragraph's element to considerelementIdx- the element's index inside the paragraph
-
elementCanEndLine
Check if the givenKnuthElementcan end the line with the given number.- Overrides:
elementCanEndLinein classBreakingAlgorithm- Parameters:
element- the elementline- the line numberdifference- an integer- Returns:
trueif the element can end the line
-
computeDifference
protected int computeDifference(BreakingAlgorithm.KnuthNode activeNode, KnuthElement element, int elementIndex) Return the difference between the natural width of a line that would be made between the given active node and the given element, and the available width of the real line.- Overrides:
computeDifferencein classBreakingAlgorithm- Parameters:
activeNode- node for the previous breakpointelement- currently considered breakpointelementIndex- index of the element that is considered as a breakpoint- Returns:
- The difference in width. Positive numbers mean extra space in the line, negative number that the line overflows.
-
computeAdjustmentRatio
Return the adjustment ratio needed to make up for the difference. A ratio of- 0 means that the break has the exact right width
- >= -1 && < 0 means that the break is wider than the line, but within the minimim values of the glues.
- >0 && < 1 means that the break is smaller than the line width, but within the maximum values of the glues.
- > 1 means that the break is too small to make up for the glues.
- Overrides:
computeAdjustmentRatioin classBreakingAlgorithm- Parameters:
activeNode- the currently active nodedifference- the difference between content-length and available width- Returns:
- The adjustment ratio.
-
finish
protected void finish()Hook for subclasses to trigger special behavior after ending the main loop inBreakingAlgorithm.findBreakingPoints(KnuthSequence,int,double,boolean,int)- Overrides:
finishin classBreakingAlgorithm
-
getPageBreaks
- Returns:
- a list of
AbstractBreaker.PageBreakPositionelements corresponding to the computed page- and column-breaks
-
insertPageBreakAsFirst
Insert the givenAbstractBreaker.PageBreakPositionas the first element in the list of page-breaks- Parameters:
pageBreak- the position to insert
-
removeAllPageBreaks
public void removeAllPageBreaks()Removes all page breaks from the result list. This is used by block-containers and static-content when it is only desired to know where there is an overflow but later the whole content should be painted as one part. -
updateData1
public void updateData1(int total, double demerits) Empty method, hook for subclasses. Called before determining the optimal breakpoints corresponding to a given active node.- Specified by:
updateData1in classBreakingAlgorithm- Parameters:
total- number of lines for the active nodedemerits- total demerits of the paragraph for the active node
-
updateData2
public void updateData2(BreakingAlgorithm.KnuthNode bestActiveNode, KnuthSequence sequence, int total) Empty method, hook for subclasses. Called when determining the optimal breakpoints for a given active node.- Specified by:
updateData2in classBreakingAlgorithm- Parameters:
bestActiveNode- a node in the chain of best active nodes, corresponding to one of the optimal breakpointssequence- the corresponding paragraphtotal- the number of lines into which the paragraph will be broken
-
filterActiveNodes
protected int filterActiveNodes()Filter active nodes.- Specified by:
filterActiveNodesin classBreakingAlgorithm- Returns:
- an integer
-
getFootnoteList
Obtain the element-list corresponding to the footnote at the given index.- Parameters:
index- the index in the list of footnotes- Returns:
- the element-list
-
getFObj
- Returns:
- the associated top-level formatting object.
-
getLineWidth
protected int getLineWidth(int line) Returns the line/part width of a given line/part.- Overrides:
getLineWidthin classBreakingAlgorithm- Parameters:
line- the line/part number- Returns:
- the width/length in millipoints
-
recoverFromOverflow
Description copied from class:BreakingAlgorithmRecover from an overflow condition.- Overrides:
recoverFromOverflowin classBreakingAlgorithm- Returns:
- the new
lastForcednode
-
getIPDdifference
protected int getIPDdifference()obtain ipd difference- Overrides:
getIPDdifferencein classBreakingAlgorithm- Returns:
- an integer
-
handleIpdChange
protected int handleIpdChange()handle ipd change- Overrides:
handleIpdChangein classBreakingAlgorithm- Returns:
- an integer
-
addNode
Add a node at the end of the given line's existing active nodes. If this is the first node in the line, adjust endLine accordingly.- Overrides:
addNodein classBreakingAlgorithm- Parameters:
line- number of the line ending at the node's corresponding breakpointnode- the active node to add
-
handlingFloat
protected boolean handlingFloat()- Overrides:
handlingFloatin classBreakingAlgorithm
-
createForcedNodes
protected void createForcedNodes(BreakingAlgorithm.KnuthNode node, int line, int elementIdx, int difference, double r, double demerits, int fitnessClass, int availableShrink, int availableStretch, int newWidth, int newStretch, int newShrink) - Overrides:
createForcedNodesin classBreakingAlgorithm
-
handleFloat
protected int handleFloat()- Overrides:
handleFloatin classBreakingAlgorithm
-
getBestFloatEdgeNode
-
getFloatPosition
-
getFloatHeight
protected int getFloatHeight() -
handlingStartOfFloat
protected boolean handlingStartOfFloat() -
handlingEndOfFloat
protected boolean handlingEndOfFloat() -
deactivateNode
Deactivate the given node- Overrides:
deactivateNodein classBreakingAlgorithm- Parameters:
node- the nodeline- the line number
-
disableFloatHandling
protected void disableFloatHandling()- Overrides:
disableFloatHandlingin classBreakingAlgorithm
-
loadFootnotes
-
relayFootnotes
-