protected LayoutManager getRestartAtLM()

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;
    }