in fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java [36:127]
protected LayoutManager getRestartAtLM(AbstractBreaker breaker, PageBreakingAlgorithm alg,
boolean ipdChangesOnNextPage, boolean onLastPageAndIPDChanges,
boolean visitedBefore, AbstractBreaker.BlockSequence blockList, int start) {
lineBreakPosition = null;
BreakingAlgorithm.KnuthNode optimalBreak = ipdChangesOnNextPage ? alg.getBestNodeBeforeIPDChange() : alg
.getBestNodeForLastPage();
if (onLastPageAndIPDChanges && visitedBefore && breaker.originalRestartAtLM == null) {
optimalBreak = null;
}
findPositionIndex(breaker, optimalBreak, alg, start);
if (!breaker.getPageProvider().foUserAgent.isLegacyLastPageChangeIPD()
&& breaker.positionAtBreak.getLM() instanceof BlockLayoutManager) {
findPositionIndexForBlockLayout(breaker, optimalBreak, alg);
}
if (ipdChangesOnNextPage || (breaker.positionAtBreak != null && breaker.positionAtBreak.getIndex() > -1)) {
breaker.firstElementsForRestart = Collections.EMPTY_LIST;
if (ipdChangesOnNextPage) {
if (breaker.containsNonRestartableLM(breaker.positionAtBreak)) {
if (alg.getIPDdifference() > 0) {
EventBroadcaster eventBroadcaster = breaker.getCurrentChildLM().getFObj()
.getUserAgent().getEventBroadcaster();
BlockLevelEventProducer eventProducer = BlockLevelEventProducer.Provider
.get(eventBroadcaster);
eventProducer.nonRestartableContentFlowingToNarrowerPage(this);
}
breaker.firstElementsForRestart = new LinkedList<>();
boolean boxFound = false;
Iterator iter = blockList.listIterator(positionIndex + 1);
Position position = null;
while (iter.hasNext()
&& (position == null || breaker.containsNonRestartableLM(position))) {
positionIndex++;
KnuthElement element = (KnuthElement) iter.next();
position = element.getPosition();
if (element.isBox()) {
boxFound = true;
breaker.firstElementsForRestart.add(element);
} else if (boxFound) {
breaker.firstElementsForRestart.add(element);
}
}
if (position instanceof SpaceResolver.SpaceHandlingBreakPosition) {
/* Retrieve the original position wrapped into this space position */
breaker.positionAtBreak = position.getPosition();
} else {
breaker.positionAtBreak = null;
}
}
}
}
LayoutManager restartAtLM = null;
if (ipdChangesOnNextPage || !(breaker.positionAtBreak != null && breaker.positionAtBreak.getIndex() > -1)) {
if (breaker.positionAtBreak != null && breaker.positionAtBreak.getIndex() == -1) {
Position position;
Iterator iter = blockList.listIterator(positionIndex + 1);
do {
KnuthElement nextElement = (KnuthElement) iter.next();
position = nextElement.getPosition();
} while (position == null
|| position instanceof SpaceResolver.SpaceHandlingPosition
|| position instanceof SpaceResolver.SpaceHandlingBreakPosition
&& position.getPosition().getIndex() == -1);
LayoutManager surroundingLM = breaker.positionAtBreak.getLM();
while (position.getLM() != surroundingLM) {
position = position.getPosition();
}
if (position.getPosition() == null) {
if (!position.getLM().getFObj().isForceKeepTogether()) {
position.getLM().getFObj().setForceKeepTogether(true);
invalidPosition = true;
}
return null;
}
restartAtLM = position.getPosition().getLM();
}
if (onLastPageAndIPDChanges && restartAtLM != null) {
if (breaker.originalRestartAtLM == null) {
breaker.originalRestartAtLM = restartAtLM;
} else {
restartAtLM = breaker.originalRestartAtLM;
}
breaker.firstElementsForRestart = Collections.EMPTY_LIST;
}
}
if (onLastPageAndIPDChanges && !visitedBefore && breaker.positionAtBreak.getPosition() != null) {
restartAtLM = breaker.positionAtBreak.getPosition().getLM();
}
if (lineBreakPosition != null && restartAtLM instanceof BlockLayoutManager) {
breaker.positionAtBreak = lineBreakPosition;
}
return restartAtLM;
}