diff options
author | Jeremias Maerki <jeremias@apache.org> | 2008-04-25 10:07:58 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2008-04-25 10:07:58 +0000 |
commit | c47f87ac1bc127389597c979e1e4a344b3e9fe88 (patch) | |
tree | e6baed78671b837d2d9fcbe05b2da5614156f2a1 | |
parent | 69f2bb15e9268dae8440e5254e89b6914c8c46c3 (diff) | |
download | xmlgraphics-fop-c47f87ac1bc127389597c979e1e4a344b3e9fe88.tar.gz xmlgraphics-fop-c47f87ac1bc127389597c979e1e4a344b3e9fe88.zip |
Second part of the implementation of stage 1 for advanced keeps (see Wiki): Integer values are treated differently from "always" values in keep-with-next/previous.within-column for all block-level FOs.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@651558 13f79535-47bb-0310-9956-ffa450edef68
36 files changed, 1465 insertions, 315 deletions
diff --git a/src/java/org/apache/fop/fo/flow/table/EffRow.java b/src/java/org/apache/fop/fo/flow/table/EffRow.java index 31a8260cc..fc8209b01 100644 --- a/src/java/org/apache/fop/fo/flow/table/EffRow.java +++ b/src/java/org/apache/fop/fo/flow/table/EffRow.java @@ -165,55 +165,47 @@ public class EffRow { } /** - * Returns true if the enclosing (if any) fo:table-row element of this row, or if any - * of the cells starting on this row, have keep-with-previous set. + * Returns the strength of the keep constraint if the enclosing (if any) fo:table-row element + * of this row, or if any of the cells starting on this row, have keep-with-previous set. * - * @return true if this row must be kept with the previous content + * @return the strength of the keep-with-previous constraint */ - public boolean mustKeepWithPrevious() { - boolean keepWithPrevious = false; + public int getKeepWithPreviousStrength() { + int strength = BlockLevelLayoutManager.KEEP_AUTO; TableRow row = getTableRow(); if (row != null) { - keepWithPrevious = row.mustKeepWithPrevious(); + strength = Math.max(strength, + KeepUtil.getCombinedBlockLevelKeepStrength(row.getKeepWithPrevious())); } for (Iterator iter = gridUnits.iterator(); iter.hasNext();) { GridUnit gu = (GridUnit) iter.next(); if (gu.isPrimary()) { - keepWithPrevious |= gu.getPrimary().mustKeepWithPrevious(); + strength = Math.max(strength, gu.getPrimary().getKeepWithPreviousStrength()); } } - return keepWithPrevious; + return strength; } /** - * Returns true if the enclosing (if any) fo:table-row element of this row, or if any - * of the cells ending on this row, have keep-with-next set. + * Returns the strength of the keep constraint if the enclosing (if any) fo:table-row element + * of this row, or if any of the cells ending on this row, have keep-with-next set. * - * @return true if this row must be kept with the next content + * @return the strength of the keep-with-next constraint */ - public boolean mustKeepWithNext() { - boolean keepWithNext = false; + public int getKeepWithNextStrength() { + int strength = BlockLevelLayoutManager.KEEP_AUTO; TableRow row = getTableRow(); if (row != null) { - keepWithNext = row.mustKeepWithNext(); + strength = Math.max(strength, + KeepUtil.getCombinedBlockLevelKeepStrength(row.getKeepWithNext())); } for (Iterator iter = gridUnits.iterator(); iter.hasNext();) { GridUnit gu = (GridUnit) iter.next(); if (!gu.isEmpty() && gu.getColSpanIndex() == 0 && gu.isLastGridUnitRowSpan()) { - keepWithNext |= gu.getPrimary().mustKeepWithNext(); + strength = Math.max(strength, gu.getPrimary().getKeepWithNextStrength()); } } - return keepWithNext; - } - - /** - * Returns true if this row is enclosed by an fo:table-row element that has - * keep-together set. - * - * @return true if this row must be kept together - */ - public boolean mustKeepTogether() { - return getKeepTogetherStrength() != BlockLevelLayoutManager.KEEP_AUTO; + return strength; } /** diff --git a/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java b/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java index 8af896fa2..55bcfa44e 100644 --- a/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java +++ b/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.fop.fo.Constants; import org.apache.fop.fo.FONode; import org.apache.fop.fo.properties.CommonBorderPaddingBackground; +import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.ElementListUtils; import org.apache.fop.layoutmgr.table.TableCellLayoutManager; @@ -53,8 +54,8 @@ public class PrimaryGridUnit extends GridUnit { private boolean isSeparateBorderModel; private int halfBorderSeparationBPD; - private boolean keepWithPrevious; - private boolean keepWithNext; + private int keepWithPrevious = BlockLevelLayoutManager.KEEP_AUTO; + private int keepWithNext = BlockLevelLayoutManager.KEEP_AUTO; private int breakBefore = Constants.EN_AUTO; private int breakAfter = Constants.EN_AUTO; @@ -328,37 +329,39 @@ public class PrimaryGridUnit extends GridUnit { } /** - * Returns true if the first child block (or its descendants) of this cell has - * keep-with-previous. + * Returns the strength of the keep constraint if the first child block (or its descendants) + * of this cell has keep-with-previous. * - * @return the value of keep-with-previous + * @return the keep-with-previous strength */ - public boolean mustKeepWithPrevious() { + public int getKeepWithPreviousStrength() { return keepWithPrevious; } /** * Don't use, reserved for TableCellLM. TODO + * @param strength the keep strength */ - public void setKeepWithPrevious() { - this.keepWithPrevious = true; + public void setKeepWithPreviousStrength(int strength) { + this.keepWithPrevious = strength; } /** - * Returns true if the last child block (or its descendants) of this cell has - * keep-with-next. + * Returns the strength of the keep constraint if the last child block (or its descendants) of + * this cell has keep-with-next. * - * @return the value of keep-with-next + * @return the keep-with-next strength */ - public boolean mustKeepWithNext() { + public int getKeepWithNextStrength() { return keepWithNext; } /** * Don't use, reserved for TableCellLM. TODO + * @param strength the keep strength */ - public void setKeepWithNext() { - this.keepWithNext = true; + public void setKeepWithNextStrength(int strength) { + this.keepWithNext = strength; } /** diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java index c0220e75e..a44669371 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java @@ -263,6 +263,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager if (!firstVisibleMarkServed) { addKnuthElementsForSpaceBefore(returnList, alignment); + context.updateKeepWithPreviousPending(getKeepWithPreviousStrength()); } addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed); @@ -284,6 +285,11 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager // get elements from curLM returnedList = curLM.getNextKnuthElements(childLC, alignment); + if (contentList.size() == 0 && childLC.isKeepWithPreviousPending()) { + //Propagate keep-with-previous up from the first child + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + childLC.clearKeepWithPreviousPending(); + } if (returnedList.size() == 1 && ((ListElement)returnedList.getFirst()).isForcedBreak()) { // a descendant of this block has break-before @@ -329,6 +335,9 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager return returnList; } } + // propagate and clear + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); + childLC.clearKeepsPending(); prevLM = curLM; } @@ -377,6 +386,8 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager context.clearPendingMarks(); addKnuthElementsForBreakAfter(returnList, context); + context.updateKeepWithNextPending(getKeepWithNextStrength()); + setFinished(true); return returnList; } @@ -990,26 +1001,22 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getBlockContainerFO().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getBlockContainerFO().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength( + getBlockContainerFO().getKeepTogether()); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - //TODO Keeps will have to be more sophisticated sooner or later - return !getBlockContainerFO().getKeepWithPrevious().getWithinPage().isAuto() - || !getBlockContainerFO().getKeepWithPrevious().getWithinColumn().isAuto(); + public int getKeepWithNextStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength( + getBlockContainerFO().getKeepWithNext()); } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return !getBlockContainerFO().getKeepWithNext().getWithinPage().isAuto() - || !getBlockContainerFO().getKeepWithNext().getWithinColumn().isAuto(); + public int getKeepWithPreviousStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength( + getBlockContainerFO().getKeepWithPrevious()); } /** @@ -1021,16 +1028,12 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager // --------- Property Resolution related functions --------- // - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean getGeneratesReferenceArea() { return true; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean getGeneratesBlockArea() { return true; } diff --git a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java index 253ec2af1..48bf47caf 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java @@ -30,6 +30,7 @@ import org.apache.fop.area.Area; import org.apache.fop.area.Block; import org.apache.fop.area.LineArea; import org.apache.fop.datatypes.Length; +import org.apache.fop.fo.properties.KeepProperty; import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontTriplet; @@ -209,26 +210,20 @@ public class BlockLayoutManager extends BlockStackingLayoutManager /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getBlockFO().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getBlockFO().getKeepTogether().getWithinColumn())); + KeepProperty keep = getBlockFO().getKeepTogether(); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength(keep); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - //TODO Keeps will have to be more sophisticated sooner or later - return !getBlockFO().getKeepWithPrevious().getWithinPage().isAuto() - || !getBlockFO().getKeepWithPrevious().getWithinColumn().isAuto(); + public int getKeepWithNextStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getBlockFO().getKeepWithNext()); } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return !getBlockFO().getKeepWithNext().getWithinPage().isAuto() - || !getBlockFO().getKeepWithNext().getWithinColumn().isAuto(); + public int getKeepWithPreviousStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getBlockFO().getKeepWithPrevious()); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/layoutmgr/BlockLevelLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLevelLayoutManager.java index 3dc7ed46e..765bb1086 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockLevelLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockLevelLayoutManager.java @@ -56,11 +56,23 @@ public interface BlockLevelLayoutManager extends LayoutManager { boolean mustKeepTogether(); /** + * Returns the keep-with-previous strength for this element. + * @return the keep-with-previous strength + */ + int getKeepWithPreviousStrength(); + + /** * @return true if this element must be kept with the previous element. */ boolean mustKeepWithPrevious(); /** + * Returns the keep-with-next strength for this element. + * @return the keep-with-next strength + */ + int getKeepWithNextStrength(); + + /** * @return true if this element must be kept with the next element. */ boolean mustKeepWithNext(); diff --git a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java index c6ead8d59..e9d529ebe 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java @@ -265,6 +265,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager if (!firstVisibleMarkServed) { addKnuthElementsForSpaceBefore(returnList, alignment); + context.updateKeepWithPreviousPending(getKeepWithPreviousStrength()); } addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed); @@ -296,8 +297,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager // get elements from curLM returnedList = curLM.getNextKnuthElements(childLC, alignment); if (contentList.size() == 0 && childLC.isKeepWithPreviousPending()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + //Propagate keep-with-previous up from the first child + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + childLC.clearKeepWithPreviousPending(); } if (returnedList != null && returnedList.size() == 1 @@ -364,9 +366,8 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } } // propagate and clear - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, childLC.isKeepWithNextPending()); - childLC.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); + childLC.clearKeepsPending(); prevLM = curLM; } @@ -400,12 +401,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager wrapPositionElement(forcedBreakAfterLast, returnList, false); } - if (mustKeepWithNext()) { - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); - } - if (mustKeepWithPrevious()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - } + context.updateKeepWithNextPending(getKeepWithNextStrength()); setFinished(true); @@ -425,14 +421,15 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager || childLC.isKeepWithPreviousPending()) { int strength = getKeepTogetherStrength(); - if (context.isKeepWithNextPending()) { - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - strength = KEEP_ALWAYS; - } - if (childLC.isKeepWithPreviousPending()) { - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); - strength = KEEP_ALWAYS; - } + + //Handle pending keep-with-next + strength = Math.max(strength, context.getKeepWithNextPending()); + context.clearKeepWithNextPending(); + + //Handle pending keep-with-previous from child LM + strength = Math.max(strength, childLC.getKeepWithPreviousPending()); + childLC.clearKeepWithPreviousPending(); + int penalty = KeepUtil.getPenaltyForKeep(strength); // add a penalty to forbid or discourage a break between blocks @@ -823,12 +820,12 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager /** {@inheritDoc} */ public boolean mustKeepWithPrevious() { - return false; + return getKeepWithPreviousStrength() > KEEP_AUTO; } /** {@inheritDoc} */ public boolean mustKeepWithNext() { - return false; + return getKeepWithNextStrength() > KEEP_AUTO; } /** diff --git a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java index ecfcbe2b4..c54f0ce12 100644 --- a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java @@ -107,8 +107,8 @@ public class FlowLayoutManager extends BlockStackingLayoutManager returnedList = curLM.getNextKnuthElements(childLC, alignment); //log.debug("FLM.getNextKnuthElements> returnedList.size() = " + returnedList.size()); if (returnList.size() == 0 && childLC.isKeepWithPreviousPending()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + childLC.clearKeepWithPreviousPending(); } // "wrap" the Position inside each element @@ -124,20 +124,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager return returnList; } else { if (returnList.size() > 0) { - // there is a block before this one - if (context.isKeepWithNextPending() - || childLC.isKeepWithPreviousPending()) { - //Clear pending keep flag - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); - // add an infinite penalty to forbid a break between blocks - returnList.add(new BreakElement( - new Position(this), KnuthElement.INFINITE, context)); - } else if (!((ListElement) returnList.getLast()).isGlue()) { - // add a null penalty to allow a break between blocks - returnList.add(new BreakElement( - new Position(this), 0, context)); - } + addInBetweenBreak(returnList, context, childLC); } if (returnedList.size() > 0) { returnList.addAll(returnedList); @@ -155,11 +142,12 @@ public class FlowLayoutManager extends BlockStackingLayoutManager } } } - if (childLC.isKeepWithNextPending()) { - //Clear and propagate - childLC.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); - } + + //Propagate and clear + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); + childLC.clearKeepWithNextPending(); + + context.updateKeepWithNextPending(getKeepWithNextStrength()); } SpaceResolver.resolveElementList(returnList); @@ -213,18 +201,16 @@ public class FlowLayoutManager extends BlockStackingLayoutManager } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - return false; + public int getKeepWithNextStrength() { + return KEEP_AUTO; } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return false; + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; } - - /** - * {@inheritDoc} - */ + + /** {@inheritDoc} */ public LinkedList getChangedKnuthElements(List oldList, /*int flaggedPenalty,*/ int alignment) { ListIterator oldListIterator = oldList.listIterator(); KnuthElement returnedElement; @@ -357,6 +343,6 @@ public class FlowLayoutManager extends BlockStackingLayoutManager public int getContentAreaBPD() { return (int) getCurrentPV().getBodyRegion().getBPD(); } - + } diff --git a/src/java/org/apache/fop/layoutmgr/FootnoteBodyLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FootnoteBodyLayoutManager.java index 351504cd7..34b931c03 100644 --- a/src/java/org/apache/fop/layoutmgr/FootnoteBodyLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/FootnoteBodyLayoutManager.java @@ -96,4 +96,14 @@ public class FootnoteBodyLayoutManager extends BlockStackingLayoutManager { return getParentKeepTogetherStrength(); } + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + } + } diff --git a/src/java/org/apache/fop/layoutmgr/KeepUtil.java b/src/java/org/apache/fop/layoutmgr/KeepUtil.java index 1fd595ae0..8c80a1b10 100644 --- a/src/java/org/apache/fop/layoutmgr/KeepUtil.java +++ b/src/java/org/apache/fop/layoutmgr/KeepUtil.java @@ -20,6 +20,7 @@ package org.apache.fop.layoutmgr; import org.apache.fop.fo.Constants; +import org.apache.fop.fo.properties.KeepProperty; import org.apache.fop.fo.properties.Property; /** @@ -47,6 +48,29 @@ public class KeepUtil { } /** + * Returns the combined block-level keep strength from a keep property. + * <p> + * Note: This is a temporary method to be used until it is possible to differentiate between + * page and column keeps! + * @param keep the keep property + * @return the combined keep strength + */ + public static int getCombinedBlockLevelKeepStrength(KeepProperty keep) { + return Math.max( + getKeepStrength(keep.getWithinPage()), + getKeepStrength(keep.getWithinColumn())); + } + + /** + * Indicates whether a keep strength indicates a keep constraint. + * @param strength the keep strength + * @return true if the keep is not "auto" + */ + public static boolean hasKeep(int strength) { + return strength > BlockLevelLayoutManager.KEEP_AUTO; + } + + /** * Returns the penalty value to be used for a certain keep strength. * <ul> * <li>"auto": returns 0</li> @@ -67,4 +91,19 @@ public class KeepUtil { return penalty; } + /** + * Returns a string representation of a keep strength value. + * @param keepStrength the keep strength + * @return the string representation + */ + public static String keepStrengthToString(int keepStrength) { + if (keepStrength == BlockLevelLayoutManager.KEEP_AUTO) { + return "auto"; + } else if (keepStrength == BlockLevelLayoutManager.KEEP_ALWAYS) { + return "always"; + } else { + return Integer.toString(keepStrength); + } + } + } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutContext.java b/src/java/org/apache/fop/layoutmgr/LayoutContext.java index 79b5e232f..5ac9808f2 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutContext.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutContext.java @@ -63,12 +63,12 @@ public class LayoutContext { * This flag indicates that there's a keep-with-next that hasn't * been processed, yet. */ - public static final int KEEP_WITH_NEXT_PENDING = 0x200; + //public static final int KEEP_WITH_NEXT_PENDING = 0x200; /** * This flag indicates that there's a keep-with-previous that hasn't * been processed, yet. */ - public static final int KEEP_WITH_PREVIOUS_PENDING = 0x400; + //public static final int KEEP_WITH_PREVIOUS_PENDING = 0x400; private int flags; // Contains some set of flags defined above @@ -135,7 +135,6 @@ public class LayoutContext { /** Amount of space before / start */ private int spaceBefore = 0; - /** Amount of space after / end */ private int spaceAfter = 0; @@ -145,9 +144,11 @@ public class LayoutContext { private int lineEndBorderAndPaddingWidth = 0; private int breakBefore; - private int breakAfter; + private int pendingKeepWithNext = BlockLevelLayoutManager.KEEP_AUTO; + private int pendingKeepWithPrevious = BlockLevelLayoutManager.KEEP_AUTO; + /** * Copy constructor for creating child layout contexts. * @param parentLC the parent layout context to copy from @@ -167,6 +168,8 @@ public class LayoutContext { this.lineStartBorderAndPaddingWidth = parentLC.lineStartBorderAndPaddingWidth; this.lineEndBorderAndPaddingWidth = parentLC.lineEndBorderAndPaddingWidth; copyPendingMarksFrom(parentLC); + this.pendingKeepWithNext = parentLC.pendingKeepWithNext; + this.pendingKeepWithPrevious = parentLC.pendingKeepWithPrevious; // Copy other fields as necessary. } @@ -228,12 +231,74 @@ public class LayoutContext { return ((this.flags & SUPPRESS_LEADING_SPACE) != 0); } + /** + * Returns the strength of a keep-with-next currently pending. + * @return the keep-with-next strength + */ + public int getKeepWithNextPending() { + return this.pendingKeepWithNext; + } + + /** + * Returns the strength of a keep-with-previous currently pending. + * @return the keep-with-previous strength + */ + public int getKeepWithPreviousPending() { + return this.pendingKeepWithPrevious; + } + + /** + * Clears any pending keep-with-next strength. + */ + public void clearKeepWithNextPending() { + this.pendingKeepWithNext = BlockLevelLayoutManager.KEEP_AUTO; + } + + /** + * Clears any pending keep-with-previous strength. + */ + public void clearKeepWithPreviousPending() { + this.pendingKeepWithPrevious = BlockLevelLayoutManager.KEEP_AUTO; + } + + /** + * Clears both keep-with-previous and keep-with-next strengths. + */ + public void clearKeepsPending() { + clearKeepWithPreviousPending(); + clearKeepWithNextPending(); + } + + /** + * Updates the currently pending keep-with-next strength. + * @param strength the new strength to consider + */ + public void updateKeepWithNextPending(int strength) { + this.pendingKeepWithNext = Math.max(this.pendingKeepWithNext, strength); + } + + /** + * Updates the currently pending keep-with-previous strength. + * @param strength the new strength to consider + */ + public void updateKeepWithPreviousPending(int strength) { + this.pendingKeepWithPrevious = Math.max(this.pendingKeepWithPrevious, strength); + } + + /** + * Indicates whether a keep-with-next constraint is pending. + * @return true if a keep-with-next constraint is pending + */ public boolean isKeepWithNextPending() { - return ((this.flags & KEEP_WITH_NEXT_PENDING) != 0); + return getKeepWithNextPending() != BlockLevelLayoutManager.KEEP_AUTO; } + /** + * Indicates whether a keep-with-previous constraint is pending. + * @return true if a keep-with-previous constraint is pending + */ public boolean isKeepWithPreviousPending() { - return ((this.flags & KEEP_WITH_PREVIOUS_PENDING) != 0); + return getKeepWithPreviousPending() != BlockLevelLayoutManager.KEEP_AUTO; } public void setLeadingSpace(SpaceSpecifier space) { @@ -595,8 +660,9 @@ public class LayoutContext { + "\nStarts New Area: \t" + startsNewArea() + "\nIs Last Area: \t" + isLastArea() + "\nTry Hyphenate: \t" + tryHyphenate() - + "\nKeeps: \t[" + (isKeepWithNextPending() ? "keep-with-next" : "") + "][" - + (isKeepWithPreviousPending() ? "keep-with-previous" : "") + "] pending" + + "\nKeeps: \t[keep-with-next=" + KeepUtil.keepStrengthToString(getKeepWithNextPending()) + + "][keep-with-previous=" + + KeepUtil.keepStrengthToString(getKeepWithPreviousPending()) + "] pending" + "\nBreaks: \tforced [" + (breakBefore != Constants.EN_AUTO ? "break-before" : "") + "][" + (breakAfter != Constants.EN_AUTO ? "break-after" : "") + "]"; } diff --git a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java index 0d88f2a1d..42ddcc220 100644 --- a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java @@ -410,5 +410,15 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager { return KEEP_AUTO; } + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + } + } diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java index e9919e02f..f3bb66022 100755 --- a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java @@ -314,7 +314,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager { // get KnuthElements from curLM returnedList = curLM.getNextKnuthElements(childLC, alignment); if (returnList.size() == 0 && childLC.isKeepWithPreviousPending()) { - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + childLC.clearKeepWithPreviousPending(); } if (returnedList == null || returnedList.size() == 0) { @@ -324,7 +324,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager { } if (curLM instanceof InlineLevelLayoutManager) { - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); + context.clearKeepWithNextPending(); // "wrap" the Position stored in each element of returnedList ListIterator seqIter = returnedList.listIterator(); while (seqIter.hasNext()) { @@ -365,10 +365,8 @@ public class InlineLayoutManager extends InlineStackingLayoutManager { returnList.add(sequence); } // propagate and clear - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, - childLC.isKeepWithNextPending()); - childLC.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); + childLC.clearKeepsPending(); } lastSequence = (KnuthSequence) returnList.getLast(); lastChildLM = curLM; diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java index 08a3f3eff..8c46796eb 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java @@ -1281,23 +1281,27 @@ public class LineLayoutManager extends InlineStackingLayoutManager return ((BlockLevelLayoutManager) getParent()).getKeepTogetherStrength(); } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean mustKeepWithPrevious() { - return false; + return getKeepWithPreviousStrength() > KEEP_AUTO; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean mustKeepWithNext() { - return false; + return getKeepWithNextStrength() > KEEP_AUTO; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + } + + /** {@inheritDoc} */ public int negotiateBPDAdjustment(int adj, KnuthElement lastElement) { LeafPosition pos = (LeafPosition)lastElement.getPosition(); int totalAdj = adj; diff --git a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java index eb64e0bf0..57114eee2 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java @@ -280,26 +280,20 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getListBlockFO().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getListBlockFO().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength( + getListBlockFO().getKeepTogether()); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - //TODO Keeps will have to be more sophisticated sooner or later - return !getListBlockFO().getKeepWithPrevious().getWithinPage().isAuto() - || !getListBlockFO().getKeepWithPrevious().getWithinColumn().isAuto(); + public int getKeepWithNextStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getListBlockFO().getKeepWithNext()); } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return !getListBlockFO().getKeepWithNext().getWithinPage().isAuto() - || !getListBlockFO().getKeepWithNext().getWithinColumn().isAuto(); + public int getKeepWithPreviousStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getListBlockFO().getKeepWithPrevious()); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java index be7dbdbba..e3b88b0ac 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java @@ -222,14 +222,20 @@ public class ListItemContentLayoutManager extends BlockStackingLayoutManager { /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getPartFO().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getPartFO().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength(getPartFO().getKeepTogether()); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + } + } diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index b727f8860..5e7288f04 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -32,6 +32,7 @@ import org.apache.fop.area.Block; import org.apache.fop.fo.flow.ListItem; import org.apache.fop.fo.flow.ListItemBody; import org.apache.fop.fo.flow.ListItemLabel; +import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.BlockStackingLayoutManager; import org.apache.fop.layoutmgr.BreakElement; import org.apache.fop.layoutmgr.ConditionalElementListener; @@ -80,8 +81,8 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager private MinOptMax effSpaceBefore; private MinOptMax effSpaceAfter; - private boolean keepWithNextPendingOnLabel; - private boolean keepWithNextPendingOnBody; + private int keepWithNextPendingOnLabel; + private int keepWithNextPendingOnBody; private int listItemHeight; @@ -223,10 +224,8 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager SpaceResolver.resolveElementList(labelList); ElementListObserver.observe(labelList, "list-item-label", label.getPartFO().getId()); - if (childLC.isKeepWithPreviousPending()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - } - this.keepWithNextPendingOnLabel = childLC.isKeepWithNextPending(); + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + this.keepWithNextPendingOnLabel = childLC.getKeepWithNextPending(); // body childLC = new LayoutContext(0); @@ -239,10 +238,8 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager SpaceResolver.resolveElementList(bodyList); ElementListObserver.observe(bodyList, "list-item-body", body.getPartFO().getId()); - if (childLC.isKeepWithPreviousPending()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - } - this.keepWithNextPendingOnBody = childLC.isKeepWithNextPending(); + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + this.keepWithNextPendingOnBody = childLC.getKeepWithNextPending(); // create a combined list LinkedList returnedList = getCombinedKnuthElementsForListItem(labelList, bodyList, context); @@ -254,12 +251,10 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager addKnuthElementsForSpaceAfter(returnList, alignment); addKnuthElementsForBreakAfter(returnList, context); - if (keepWithNextPendingOnLabel || keepWithNextPendingOnBody || mustKeepWithNext()) { - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); - } - if (mustKeepWithPrevious()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - } + context.updateKeepWithNextPending(this.keepWithNextPendingOnLabel); + context.updateKeepWithNextPending(this.keepWithNextPendingOnBody); + context.updateKeepWithNextPending(getKeepWithNextStrength()); + context.updateKeepWithPreviousPending(getKeepWithPreviousStrength()); setFinished(true); resetSpaces(); @@ -281,21 +276,17 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager int totalHeight = Math.max(fullHeights[0], fullHeights[1]); int step; int addedBoxHeight = 0; - boolean keepWithNextActive = false; + int keepWithNextActive = BlockLevelLayoutManager.KEEP_AUTO; LinkedList returnList = new LinkedList(); while ((step = getNextStep(elementLists, start, end, partialHeights)) > 0) { if (end[0] + 1 == elementLists[0].size()) { - if (keepWithNextPendingOnLabel) { - keepWithNextActive = true; - } + keepWithNextActive = Math.max(keepWithNextActive, keepWithNextPendingOnLabel); } if (end[1] + 1 == elementLists[1].size()) { - if (keepWithNextPendingOnBody) { - keepWithNextActive = true; - } + keepWithNextActive = Math.max(keepWithNextActive, keepWithNextPendingOnBody); } // compute penalty height and box height @@ -327,12 +318,12 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager start[0], end[0], start[1], end[1]); returnList.add(new KnuthBox(boxHeight, stepPosition, false)); if (addedBoxHeight < totalHeight) { + int strength = BlockLevelLayoutManager.KEEP_AUTO; + strength = Math.max(strength, keepWithNextActive); + strength = Math.max(strength, getKeepTogetherStrength()); int p = stepPenalty; - if (keepWithNextActive) { - p = KnuthPenalty.INFINITE; - } - if (mustKeepTogether()) { - p = Math.max(p, KeepUtil.getPenaltyForKeep(getKeepTogetherStrength())); + if (p > -KnuthElement.INFINITE) { + p = Math.max(p, KeepUtil.getPenaltyForKeep(strength)); } returnList.add(new BreakElement(stepPosition, penaltyHeight, p, -1, context)); } @@ -637,26 +628,20 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getListItemFO().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getListItemFO().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength( + getListItemFO().getKeepTogether()); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - //TODO Keeps will have to be more sophisticated sooner or later - return !getListItemFO().getKeepWithPrevious().getWithinPage().isAuto() - || !getListItemFO().getKeepWithPrevious().getWithinColumn().isAuto(); + public int getKeepWithNextStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getListItemFO().getKeepWithNext()); } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return !getListItemFO().getKeepWithNext().getWithinPage().isAuto() - || !getListItemFO().getKeepWithNext().getWithinColumn().isAuto(); + public int getKeepWithPreviousStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getListItemFO().getKeepWithPrevious()); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java index ab65a1d28..70e2b2330 100644 --- a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java +++ b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java @@ -24,11 +24,13 @@ import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.apache.fop.fo.Constants; import org.apache.fop.fo.flow.table.ConditionalBorder; import org.apache.fop.fo.flow.table.EffRow; import org.apache.fop.fo.flow.table.PrimaryGridUnit; import org.apache.fop.fo.properties.CommonBorderPaddingBackground; +import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.ElementListUtils; import org.apache.fop.layoutmgr.KnuthBox; import org.apache.fop.layoutmgr.KnuthElement; @@ -70,7 +72,7 @@ class ActiveCell { /** True if the next CellPart that will be created will be the last one for this cell. */ private boolean lastCellPart; - private boolean keepWithNextSignal; + private int keepWithNextStrength; private int spanIndex = 0; @@ -202,7 +204,7 @@ class ActiveCell { includedLength = -1; // Avoid troubles with cells having content of zero length totalLength = previousRowsLength + ElementListUtils.calcContentLength(elementList); endRowIndex = rowIndex + pgu.getCell().getNumberRowsSpanned() - 1; - keepWithNextSignal = false; + keepWithNextStrength = BlockLevelLayoutManager.KEEP_AUTO; remainingLength = totalLength - previousRowsLength; afterNextStep = new Step(previousRowsLength); @@ -506,14 +508,14 @@ class ActiveCell { */ CellPart createCellPart() { if (nextStep.end + 1 == elementList.size()) { - keepWithNextSignal = pgu.mustKeepWithNext(); + keepWithNextStrength = pgu.getKeepWithNextStrength(); // TODO if keep-with-next is set on the row, must every cell of the row // contribute some content from children blocks? // see http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-dev/200802.mbox/ // %3c47BDA379.4050606@anyware-tech.com%3e // Assuming no, but if yes the following code should enable this behaviour // if (pgu.getRow() != null && pgu.getRow().mustKeepWithNext()) { -// keepWithNextSignal = true; +// keepWithNextSignal = true; //to be converted to integer strengths // } } int bpBeforeFirst; @@ -536,8 +538,8 @@ class ActiveCell { } } - boolean keepWithNextSignal() { - return keepWithNextSignal; + int getKeepWithNextStrength() { + return keepWithNextStrength; } diff --git a/src/java/org/apache/fop/layoutmgr/table/RowGroupLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/RowGroupLayoutManager.java index 72e78b84f..19b97322c 100644 --- a/src/java/org/apache/fop/layoutmgr/table/RowGroupLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/RowGroupLayoutManager.java @@ -33,7 +33,6 @@ import org.apache.fop.fo.flow.table.TableColumn; import org.apache.fop.fo.flow.table.TableRow; import org.apache.fop.fo.properties.CommonBorderPaddingBackground; import org.apache.fop.fo.properties.LengthRangeProperty; -import org.apache.fop.layoutmgr.BlockLevelEventProducer; import org.apache.fop.layoutmgr.ElementListObserver; import org.apache.fop.layoutmgr.LayoutContext; import org.apache.fop.layoutmgr.MinOptMaxUtil; @@ -61,10 +60,8 @@ class RowGroupLayoutManager { LinkedList returnList = new LinkedList(); createElementsForRowGroup(context, alignment, bodyType, returnList); - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, - rowGroup[0].mustKeepWithPrevious()); - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, - rowGroup[rowGroup.length - 1].mustKeepWithNext()); + context.updateKeepWithPreviousPending(rowGroup[0].getKeepWithPreviousStrength()); + context.updateKeepWithNextPending(rowGroup[rowGroup.length - 1].getKeepWithNextStrength()); int breakBefore = Constants.EN_AUTO; TableRow firstRow = rowGroup[0].getTableRow(); diff --git a/src/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java index fc0d587ff..c20060723 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java @@ -49,6 +49,14 @@ public class TableAndCaptionLayoutManager extends BlockStackingLayoutManager { } /** + * Returns the table-and-caption formatting object. + * @return the table-and-caption formatting object + */ + public TableAndCaption getTableAndCaptionFO() { + return (TableAndCaption)this.fobj; + } + + /** * Get the next break possibility. * * @param context the layout context for getting breaks @@ -196,13 +204,29 @@ public class TableAndCaptionLayoutManager extends BlockStackingLayoutManager { public int getKeepTogetherStrength() { int strength = KEEP_AUTO; /* TODO Complete me! - strength = Math.max(strength, KeepUtil.getKeepStrength( - getTableAndCaption().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getTableAndCaption().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength( + getTableAndCaptionFO().getKeepTogether()); */ strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + /* TODO Complete me! + return KeepUtil.getCombinedBlockLevelKeepStrength( + getTableAndCaptionFO().getKeepWithNext()); + */ + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + /* TODO Complete me! + return KeepUtil.getCombinedBlockLevelKeepStrength( + getTableAndCaptionFO().getKeepWithPrevious()); + */ + } + }
\ No newline at end of file diff --git a/src/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java index 8c4908547..615145fa1 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java @@ -47,7 +47,7 @@ public class TableCaptionLayoutManager extends BlockStackingLayoutManager { } /** @return the table-caption FO */ - public TableCaption getTableCaption() { + public TableCaption getTableCaptionFO() { return (TableCaption)this.fobj; } @@ -201,13 +201,31 @@ public class TableCaptionLayoutManager extends BlockStackingLayoutManager { int strength = KEEP_AUTO; /* TODO Complete me! strength = Math.max(strength, KeepUtil.getKeepStrength( - getTableCaption().getKeepTogether().getWithinPage())); + getTableCaptionFO().getKeepTogether().getWithinPage())); strength = Math.max(strength, KeepUtil.getKeepStrength( - getTableCaption().getKeepTogether().getWithinColumn())); + getTableCaptionFO().getKeepTogether().getWithinColumn())); */ strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; + /* TODO Complete me! + return KeepUtil.getCombinedBlockLevelKeepStrength( + getTableCaptionFO().getKeepWithNext()); + */ + } + + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; + /* TODO Complete me! + return KeepUtil.getCombinedBlockLevelKeepStrength( + getTableCaptionFO().getKeepWithPrevious()); + */ + } + } diff --git a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java index 291e27ae2..6067af4bc 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java @@ -153,8 +153,8 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager log.debug("child LM signals pending keep with next"); } if (contentList.size() == 0 && childLC.isKeepWithPreviousPending()) { - primaryGridUnit.setKeepWithPrevious(); - childLC.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, false); + primaryGridUnit.setKeepWithPreviousStrength(childLC.getKeepWithPreviousPending()); + childLC.clearKeepWithPreviousPending(); } if (prevLM != null) { @@ -169,14 +169,12 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager } if (childLC.isKeepWithNextPending()) { //Clear and propagate - childLC.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING, false); - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); + childLC.clearKeepWithNextPending(); } prevLM = curLM; } - if (context.isKeepWithNextPending()) { - primaryGridUnit.setKeepWithNext(); - } + primaryGridUnit.setKeepWithNextStrength(context.getKeepWithNextPending()); returnedList = new LinkedList(); if (contentList.size() > 0) { @@ -569,24 +567,15 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager } /** {@inheritDoc} */ - public boolean mustKeepWithPrevious() { - //TODO Keeps will have to be more sophisticated sooner or later - return false; //TODO FIX ME - /* - return !fobj.getKeepWithPrevious().getWithinPage().isAuto() - || !fobj.getKeepWithPrevious().getWithinColumn().isAuto(); - */ + public int getKeepWithNextStrength() { + return KEEP_AUTO; //TODO FIX ME (table-cell has no keep-with-next!) } /** {@inheritDoc} */ - public boolean mustKeepWithNext() { - return false; //TODO FIX ME - /* - return !fobj.getKeepWithNext().getWithinPage().isAuto() - || !fobj.getKeepWithNext().getWithinColumn().isAuto(); - */ + public int getKeepWithPreviousStrength() { + return KEEP_AUTO; //TODO FIX ME (table-cell has no keep-with-previous!) } - + // --------- Property Resolution related functions --------- // /** diff --git a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java index 235bc1fd2..7a2ee171c 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java @@ -35,6 +35,7 @@ import org.apache.fop.fo.flow.table.EffRow; import org.apache.fop.fo.flow.table.PrimaryGridUnit; import org.apache.fop.fo.flow.table.Table; import org.apache.fop.fo.flow.table.TableBody; +import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.BreakElement; import org.apache.fop.layoutmgr.ElementListUtils; import org.apache.fop.layoutmgr.KeepUtil; @@ -208,31 +209,37 @@ public class TableContentLayoutManager implements PercentBaseContext { LinkedList returnList = new LinkedList(); EffRow[] rowGroup = iter.getNextRowGroup(); // TODO homogenize the handling of keeps and breaks - context.unsetFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING - | LayoutContext.KEEP_WITH_NEXT_PENDING); + context.clearKeepsPending(); context.setBreakBefore(Constants.EN_AUTO); context.setBreakAfter(Constants.EN_AUTO); - boolean keepWithPrevious = false; + int keepWithPrevious = BlockLevelLayoutManager.KEEP_AUTO; int breakBefore = Constants.EN_AUTO; if (rowGroup != null) { RowGroupLayoutManager rowGroupLM = new RowGroupLayoutManager(getTableLM(), rowGroup, stepper); List nextRowGroupElems = rowGroupLM.getNextKnuthElements(context, alignment, bodyType); - keepWithPrevious = context.isKeepWithPreviousPending(); - boolean keepBetween = context.isKeepWithNextPending(); + keepWithPrevious = Math.max(keepWithPrevious, context.getKeepWithPreviousPending()); breakBefore = context.getBreakBefore(); int breakBetween = context.getBreakAfter(); returnList.addAll(nextRowGroupElems); while ((rowGroup = iter.getNextRowGroup()) != null) { rowGroupLM = new RowGroupLayoutManager(getTableLM(), rowGroup, stepper); + + //Note previous pending keep-with-next and clear the strength + //(as the layout context is reused) + int keepWithNextPending = context.getKeepWithNextPending(); + context.clearKeepWithNextPending(); + + //Get elements for next row group nextRowGroupElems = rowGroupLM.getNextKnuthElements(context, alignment, bodyType); - int penaltyValue = 0; - keepBetween |= context.isKeepWithPreviousPending(); - if (keepBetween) { - penaltyValue = KnuthElement.INFINITE; - } - penaltyValue = Math.max(penaltyValue, - KeepUtil.getPenaltyForKeep(getTableLM().getKeepTogetherStrength())); + + //Determine keep constraints + int penaltyStrength = BlockLevelLayoutManager.KEEP_AUTO; + penaltyStrength = Math.max(penaltyStrength, keepWithNextPending); + penaltyStrength = Math.max(penaltyStrength, context.getKeepWithPreviousPending()); + context.clearKeepWithPreviousPending(); + penaltyStrength = Math.max(penaltyStrength, getTableLM().getKeepTogetherStrength()); + int penaltyValue = KeepUtil.getPenaltyForKeep(penaltyStrength); breakBetween = BreakUtil.compareBreakClasses(breakBetween, context.getBreakBefore()); @@ -255,10 +262,9 @@ public class TableContentLayoutManager implements PercentBaseContext { penaltyLen, penaltyValue, breakBetween, context)); returnList.addAll(nextRowGroupElems); breakBetween = context.getBreakAfter(); - keepBetween = context.isKeepWithNextPending(); } } - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING, keepWithPrevious); + context.updateKeepWithPreviousPending(keepWithPrevious); context.setBreakBefore(breakBefore); //fox:widow-content-limit diff --git a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java index 5738a027c..75189a6b9 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java @@ -256,12 +256,11 @@ public class TableLayoutManager extends BlockStackingLayoutManager log.debug(contentKnuthElements); wrapPositionElements(contentKnuthElements, returnList); - if (mustKeepWithPrevious() || childLC.isKeepWithPreviousPending()) { - context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING); - } - if (mustKeepWithNext() || childLC.isKeepWithNextPending()) { - context.setFlags(LayoutContext.KEEP_WITH_NEXT_PENDING); - } + context.updateKeepWithPreviousPending(getKeepWithPreviousStrength()); + context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); + + context.updateKeepWithNextPending(getKeepWithNextStrength()); + context.updateKeepWithNextPending(childLC.getKeepWithNextPending()); if (getTable().isSeparateBorderModel()) { addKnuthElementsForBorderPaddingAfter(returnList, true); @@ -448,29 +447,19 @@ public class TableLayoutManager extends BlockStackingLayoutManager /** {@inheritDoc} */ public int getKeepTogetherStrength() { - int strength = KEEP_AUTO; - strength = Math.max(strength, KeepUtil.getKeepStrength( - getTable().getKeepTogether().getWithinPage())); - strength = Math.max(strength, KeepUtil.getKeepStrength( - getTable().getKeepTogether().getWithinColumn())); + int strength = KeepUtil.getCombinedBlockLevelKeepStrength(getTable().getKeepTogether()); strength = Math.max(strength, getParentKeepTogetherStrength()); return strength; } - /** - * {@inheritDoc} - */ - public boolean mustKeepWithPrevious() { - return !getTable().getKeepWithPrevious().getWithinPage().isAuto() - || !getTable().getKeepWithPrevious().getWithinColumn().isAuto(); + /** {@inheritDoc} */ + public int getKeepWithNextStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getTable().getKeepWithNext()); } - /** - * {@inheritDoc} - */ - public boolean mustKeepWithNext() { - return !getTable().getKeepWithNext().getWithinPage().isAuto() - || !getTable().getKeepWithNext().getWithinColumn().isAuto(); + /** {@inheritDoc} */ + public int getKeepWithPreviousStrength() { + return KeepUtil.getCombinedBlockLevelKeepStrength(getTable().getKeepWithPrevious()); } // --------- Property Resolution related functions --------- // diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java index 07894a07b..2d3c990f8 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java @@ -30,9 +30,11 @@ import org.apache.fop.fo.Constants; import org.apache.fop.fo.flow.table.EffRow; import org.apache.fop.fo.flow.table.GridUnit; import org.apache.fop.fo.flow.table.PrimaryGridUnit; +import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.BreakElement; import org.apache.fop.layoutmgr.KeepUtil; import org.apache.fop.layoutmgr.KnuthBox; +import org.apache.fop.layoutmgr.KnuthElement; import org.apache.fop.layoutmgr.KnuthGlue; import org.apache.fop.layoutmgr.KnuthPenalty; import org.apache.fop.layoutmgr.LayoutContext; @@ -198,11 +200,20 @@ public class TableStepper { } //Put all involved grid units into a list + int stepPenalty = 0; List cellParts = new java.util.ArrayList(columnCount); for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); CellPart part = activeCell.createCellPart(); cellParts.add(part); + + //Record highest penalty value of part + if (part.end >= 0) { + KnuthElement endEl = (KnuthElement)part.pgu.getElements().get(part.end); + if (endEl instanceof KnuthPenalty) { + stepPenalty = Math.max(stepPenalty, endEl.getP()); + } + } } //Create elements for step @@ -230,39 +241,37 @@ public class TableStepper { } } - int p = 0; - boolean keepWithNext = false; + int strength = BlockLevelLayoutManager.KEEP_AUTO; for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); - keepWithNext |= activeCell.keepWithNextSignal(); - } - if (keepWithNext) { - p = KnuthPenalty.INFINITE; + strength = Math.max(strength, activeCell.getKeepWithNextStrength()); } if (!rowFinished) { - p = Math.max(p, KeepUtil.getPenaltyForKeep( - rowGroup[activeRowIndex].getKeepTogetherStrength())); + strength = Math.max(strength, rowGroup[activeRowIndex].getKeepTogetherStrength()); //The above call doesn't take the penalty from the table into account, so... - p = Math.max(p, KeepUtil.getPenaltyForKeep( - getTableLM().getKeepTogetherStrength())); + strength = Math.max(strength, getTableLM().getKeepTogetherStrength()); } else if (activeRowIndex < rowGroup.length - 1) { - if (rowGroup[activeRowIndex].mustKeepWithNext() - || rowGroup[activeRowIndex + 1].mustKeepWithPrevious()) { - p = KnuthPenalty.INFINITE; - } + strength = Math.max(strength, + rowGroup[activeRowIndex].getKeepWithNextStrength()); + strength = Math.max(strength, + rowGroup[activeRowIndex + 1].getKeepWithPreviousStrength()); nextBreakClass = BreakUtil.compareBreakClasses(nextBreakClass, rowGroup[activeRowIndex].getBreakAfter()); nextBreakClass = BreakUtil.compareBreakClasses(nextBreakClass, rowGroup[activeRowIndex + 1].getBreakBefore()); } - if (nextBreakClass != Constants.EN_AUTO) { - log.trace("Forced break encountered"); - p = -KnuthPenalty.INFINITE; //Overrides any keeps (see 4.8 in XSL 1.0) - } + int p = KeepUtil.getPenaltyForKeep(strength); if (rowHeightSmallerThanFirstStep) { rowHeightSmallerThanFirstStep = false; p = KnuthPenalty.INFINITE; } + if (p > -KnuthElement.INFINITE) { + p = Math.max(p, stepPenalty); + } + if (nextBreakClass != Constants.EN_AUTO) { + log.trace("Forced break encountered"); + p = -KnuthPenalty.INFINITE; //Overrides any keeps (see 4.8 in XSL 1.0) + } returnList.add(new BreakElement(penaltyPos, effPenaltyLen, p, nextBreakClass, context)); if (penaltyOrGlueLen < 0) { returnList.add(new KnuthGlue(-penaltyOrGlueLen, 0, 0, new Position(null), true)); diff --git a/status.xml b/status.xml index 6d55b69d4..d6b3c6941 100644 --- a/status.xml +++ b/status.xml @@ -58,6 +58,11 @@ Added SVG support for AFP (GOCA). </action> --> + <action context="Layout" dev="JM" type="add"> + Added minimal support for integer keep values on the various keep properties on block-level + FOs. For now, all integer values are treated the same (i.e. without strength distinction). + Using integers allows to avoid overflows that can happen when "always" is used extensively. + </action> <action context="Renderers" dev="JM" type="add"> Added support for rendering pages using JPS (Java Printing System). See new example: examples/embedding/java/ExamplesFO2JPSPrint.java diff --git a/test/layoutengine/disabled-testcases.xml b/test/layoutengine/disabled-testcases.xml index b4de16ef4..12d7ed1aa 100644 --- a/test/layoutengine/disabled-testcases.xml +++ b/test/layoutengine/disabled-testcases.xml @@ -165,18 +165,6 @@ <reference>http://www.nabble.com/leaders-with-leader-pattern%3D%22use-content%22-t546244.html</reference> </testcase> <testcase> - <name>keep-with-previous doesn't work in lists</name> - <file>list-block_keep-with-previous.xml</file> - <description>Keep-with-previous doesn't work inside tables and - lists, yet.</description> - </testcase> - <testcase> - <name>keep-with-previous doesn't work in lists</name> - <file>list-item_block_keep-with-previous.xml</file> - <description>Keep-with-previous doesn't work inside tables and - lists, yet.</description> - </testcase> - <testcase> <name>Page breaking doesn't deal with IPD changes</name> <file>page-breaking_4.xml</file> <description>Page breaking currently doesn't support changing available IPD diff --git a/test/layoutengine/standard-testcases/block-container_keep-with-next_1.xml b/test/layoutengine/standard-testcases/block-container_keep-with-next_1.xml new file mode 100644 index 000000000..c43e06359 --- /dev/null +++ b/test/layoutengine/standard-testcases/block-container_keep-with-next_1.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-next on fo:block-container. + </p> + <p> + Widows and Orphans are disabled in this test to avoid side-effects. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="12 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block-container keep-with-next.within-column="always"> + <fo:block>block1</fo:block> + <fo:block>block2</fo:block> + </fo:block-container> + <fo:block-container keep-with-next.within-column="1"> + <fo:block>block3</fo:block> + <fo:block>block4</fo:block> + </fo:block-container> + <fo:block-container> + <fo:block>block5</fo:block> + </fo:block-container> + <fo:block-container> + <fo:block>block6</fo:block> + <fo:block keep-with-next.within-column="1">block7</fo:block> + </fo:block-container> + <fo:block keep-with-next.within-column="always">block8</fo:block> + <fo:block-container keep-with-next.within-column="1"> + <fo:block>block9</fo:block> + <fo:block keep-with-next.within-column="always">block10</fo:block> + </fo:block-container> + <fo:block>block11</fo:block> + <fo:block-container keep-with-next.within-column="always"> + <fo:block>block12</fo:block> + <fo:block keep-with-next.within-column="1">block13</fo:block> + </fo:block-container> + <fo:block>block14</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> <!-- 1 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> <!-- 5 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> <!-- 10 --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + + <skip>3</skip> + </element-list> + + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/block-container_keep-with-previous_1.xml b/test/layoutengine/standard-testcases/block-container_keep-with-previous_1.xml new file mode 100644 index 000000000..1c318ca0c --- /dev/null +++ b/test/layoutengine/standard-testcases/block-container_keep-with-previous_1.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-previous on fo:block-container. + </p> + <p> + Widows and Orphans are disabled in this test to avoid side-effects. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="12 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:block-container keep-with-previous.within-column="always"> + <fo:block>block2</fo:block> + <fo:block>block3</fo:block> + </fo:block-container> + <fo:block-container keep-with-previous.within-column="1"> + <fo:block>block4</fo:block> + <fo:block>block5</fo:block> + </fo:block-container> + <fo:block-container> + <fo:block>block6</fo:block> + </fo:block-container> + <fo:block-container> + <fo:block keep-with-previous.within-column="1">block7</fo:block> + <fo:block>block8</fo:block> + </fo:block-container> + <fo:block keep-with-previous.within-column="always">block9</fo:block> + <fo:block-container keep-with-previous.within-column="1"> + <fo:block keep-with-previous.within-column="always">block10</fo:block> + <fo:block>block11</fo:block> + </fo:block-container> + <fo:block>block12</fo:block> + <fo:block-container keep-with-previous.within-column="always"> + <fo:block keep-with-previous.within-column="1">block13</fo:block> + <fo:block>block14</fo:block> + </fo:block-container> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> <!-- 1 --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> <!-- 5 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="INF"/> + <box/> <!-- 10 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + + <skip>3</skip> + </element-list> + + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/block_keep-with-next_integers_1.xml b/test/layoutengine/standard-testcases/block_keep-with-next_integers_1.xml new file mode 100644 index 000000000..a1e89f3c2 --- /dev/null +++ b/test/layoutengine/standard-testcases/block_keep-with-next_integers_1.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-next.wuithin-column with integer values. + </p> + <p> + Widows and Orphans are disabled in this test to avoid side-effects. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="4.5 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:block keep-with-next.within-column="always">block2</fo:block> + <fo:block keep-with-next.within-column="1">block3</fo:block> + <fo:block>block4</fo:block> + <fo:block keep-with-next.within-column="1"> + <fo:block>block5</fo:block> + <fo:block>block6</fo:block> + </fo:block> + <fo:block>block7</fo:block> + <fo:block keep-with-next.within-column="1"> + <fo:block>block8</fo:block> + <fo:block keep-with-next.within-column="always">block9</fo:block> + </fo:block> + <fo:block>block10</fo:block> + <fo:block keep-with-next.within-column="always"> + <fo:block>block11</fo:block> + <fo:block keep-with-next.within-column="1">block12</fo:block> + </fo:block> + <fo:block>block13</fo:block> + <fo:block> + <fo:block keep-with-next.within-column="1">block14</fo:block> + <fo:block>block15</fo:block> + </fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> <!-- 1 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> <!-- 5 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> <!-- 10 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/block_keep-with-previous_integers_1.xml b/test/layoutengine/standard-testcases/block_keep-with-previous_integers_1.xml new file mode 100644 index 000000000..d43d45608 --- /dev/null +++ b/test/layoutengine/standard-testcases/block_keep-with-previous_integers_1.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-previous.wuithin-column with integer values. + </p> + <p> + Widows and Orphans are disabled in this test to avoid side-effects. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="4.5 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:block keep-with-previous.within-column="always">block2</fo:block> + <fo:block keep-with-previous.within-column="1">block3</fo:block> + <fo:block>block4</fo:block> + <fo:block keep-with-previous.within-column="1"> + <fo:block>block5</fo:block> + <fo:block>block6</fo:block> + </fo:block> + <fo:block>block7</fo:block> + <fo:block keep-with-previous.within-column="1"> + <fo:block keep-with-previous.within-column="always">block8</fo:block> + <fo:block>block9</fo:block> + </fo:block> + <fo:block>block10</fo:block> + <fo:block keep-with-previous.within-column="always"> + <fo:block keep-with-previous.within-column="1">block11</fo:block> + <fo:block>block12</fo:block> + </fo:block> + <fo:block>block13</fo:block> + <fo:block> + <fo:block>block14</fo:block> + <fo:block keep-with-previous.within-column="1">block15</fo:block> + </fo:block> + <fo:block>block16</fo:block> + <fo:block keep-with-previous.within-column="1"> + <fo:block>block17</fo:block> + <fo:block break-before="page">block18</fo:block> + <fo:block>block19</fo:block> + </fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker" index="0"> + <box/> <!-- 1 --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> <!-- 5 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> <!-- 10 --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> <!-- 15 --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + + <skip>3</skip> + </element-list> + <element-list category="breaker" index="1"> + <box/> <!-- 18 --> + <penalty w="0" p="0"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/list-block_keep-with-next_integers_1.xml b/test/layoutengine/standard-testcases/list-block_keep-with-next_integers_1.xml new file mode 100644 index 000000000..2c02806a3 --- /dev/null +++ b/test/layoutengine/standard-testcases/list-block_keep-with-next_integers_1.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-next with lists. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="10 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:list-block + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm" + keep-with-next.within-column="1"> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label2</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item2</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block2</fo:block> + <fo:list-block + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm"> + <fo:list-item keep-with-next.within-column="1"> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + <fo:block keep-with-next.within-column="1">item1</fo:block> + <fo:block>item1</fo:block> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label2</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item2</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block3</fo:block> + <fo:list-block keep-with-next.within-column="1" + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm"> + <fo:list-item keep-with-next.within-column="2"> + <fo:list-item-label end-indent="label-end()"> + <fo:block keep-with-next.within-column="always">label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block4</fo:block> + <fo:list-block + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm"> + <fo:list-item > + <fo:list-item-label end-indent="label-end()"> + <fo:block keep-with-next.within-column="1">label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block5</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> + <penalty w="0" p="0"/> + <!-- list 1 starts --> + <box/> + <penalty w="0" p="0"/> + <box/> + <!-- list 1 end --> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <!-- list 2 starts --> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- list 2 end --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <!-- list 3 starts --> + <box/> + <!-- list 3 end --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <!-- list 4 starts --> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- list 4 end --> + <penalty w="0" p="999"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/list-block_keep-with-previous.xml b/test/layoutengine/standard-testcases/list-block_keep-with-previous.xml index 62b0f634c..cec98836a 100644 --- a/test/layoutengine/standard-testcases/list-block_keep-with-previous.xml +++ b/test/layoutengine/standard-testcases/list-block_keep-with-previous.xml @@ -63,7 +63,6 @@ </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>item1</fo:block> - <fo:block>item1</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item keep-with-previous.within-page="always"> @@ -117,8 +116,6 @@ <box w="14400"/> <penalty w="0" p="INF"/> <box w="14400"/> - <penalty w="0" p="INF"/> - <box w="14400"/> <!-- list 2 end --> <penalty w="0" p="0"/> <box w="14400"/> diff --git a/test/layoutengine/standard-testcases/list-block_keep-with-previous_integers_1.xml b/test/layoutengine/standard-testcases/list-block_keep-with-previous_integers_1.xml new file mode 100644 index 000000000..7b9c9fb0f --- /dev/null +++ b/test/layoutengine/standard-testcases/list-block_keep-with-previous_integers_1.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks keep-with-previous with lists. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="10 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:list-block + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm" + keep-with-previous.within-column="1"> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label2</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item2</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block2</fo:block> + <fo:list-block + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm"> + <fo:list-item keep-with-previous.within-column="1"> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + <fo:list-item keep-with-previous.within-column="1"> + <fo:list-item-label end-indent="label-end()"> + <fo:block>label2</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item2</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block3</fo:block> + <fo:list-block keep-with-previous.within-column="1" + provisional-distance-between-starts="25mm" + provisional-label-separation="5mm"> + <fo:list-item keep-with-previous.within-column="2"> + <fo:list-item-label end-indent="label-end()"> + <fo:block keep-with-previous.within-column="always">label1</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>item1</fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + <fo:block>block4</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> + <penalty w="0" p="999"/> + <!-- list 1 starts --> + <box/> + <penalty w="0" p="0"/> + <box/> + <!-- list 1 end --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <!-- list 2 starts --> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- list 2 end --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="INF"/> + <!-- list 3 starts --> + <box/> + <!-- list 3 end --> + <penalty w="0" p="0"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/list-item_block_keep-with-previous.xml b/test/layoutengine/standard-testcases/list-item_block_keep-with-previous.xml index 5c0a5da16..d2f5a18a8 100644 --- a/test/layoutengine/standard-testcases/list-item_block_keep-with-previous.xml +++ b/test/layoutengine/standard-testcases/list-item_block_keep-with-previous.xml @@ -41,7 +41,6 @@ </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>item1</fo:block> - <fo:block>item2</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> @@ -88,8 +87,6 @@ <box w="14400"/> <penalty w="0" p="INF"/> <box w="14400"/> - <penalty w="0" p="INF"/> - <box w="14400"/> <!-- list 1 end --> <penalty w="0" p="0"/> <box w="14400"/> diff --git a/test/layoutengine/standard-testcases/table_keep-with-next_integers_1.xml b/test/layoutengine/standard-testcases/table_keep-with-next_integers_1.xml new file mode 100644 index 000000000..9774feb53 --- /dev/null +++ b/test/layoutengine/standard-testcases/table_keep-with-next_integers_1.xml @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks that keep-with-next works on tables. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="10 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:table width="100%" table-layout="fixed" keep-with-next.within-column="1"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block2</fo:block> + <fo:table width="100%" table-layout="fixed"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row keep-with-next.within-column="1"> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row> + <fo:table-cell> + <fo:block keep-with-next.within-column="1">cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row keep-with-next.within-column="1"> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block3</fo:block> + <fo:table width="100%" table-layout="fixed"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block keep-with-next.within-column="1">cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block4</fo:block> + <fo:table width="100%" table-layout="fixed" keep-with-next.within-column="1"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row keep-with-next.within-column="2"> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block keep-with-next.within-column="always">cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block5</fo:block> + <fo:table width="100%" table-layout="fixed"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <!-- Check that keeps are processed correctly inside the cell --> + <fo:block keep-with-next.within-column="1">cell1/2</fo:block> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row> + <fo:table-cell> + <!-- This cell stops earlier than the one next to it --> + <fo:block keep-with-next.within-column="1">cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block6</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> + <penalty w="0" p="0"/> + <!-- table 1 starts --> + <box/> + <!-- table 1 end --> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 2 starts --> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- table 2 end --> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 3 starts --> + <box/> + <!-- table 3 end --> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 4 starts --> + <box/> + <!-- table 4 end --> + <penalty w="0" p="INF"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 5 starts --> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- table 5 end --> + <penalty w="0" p="999"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/table_keep-with-previous_integers_1.xml b/test/layoutengine/standard-testcases/table_keep-with-previous_integers_1.xml new file mode 100644 index 000000000..ea5fada5f --- /dev/null +++ b/test/layoutengine/standard-testcases/table_keep-with-previous_integers_1.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- $Id$ --> +<testcase> + <info> + <p> + This test checks that keep-with-previous works on tables. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" widows="0" orphans="0"> + <fo:layout-master-set> + <fo:simple-page-master master-name="normal" page-width="5in" page-height="10 * 14.4pt"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="normal"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>block1</fo:block> + <fo:table width="100%" table-layout="fixed" keep-with-previous.within-column="1"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block2</fo:block> + <fo:table width="100%" table-layout="fixed"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row keep-with-previous.within-column="1"> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row> + <fo:table-cell> + <fo:block keep-with-previous.within-column="1">cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block3</fo:block> + <fo:table width="100%" table-layout="fixed"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row> + <fo:table-cell> + <fo:block>cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block>cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block keep-with-previous.within-column="1">block4</fo:block> + <fo:table width="100%" table-layout="fixed" keep-with-previous.within-column="1"> + <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/> + <fo:table-body> + <fo:table-row keep-with-previous.within-column="2"> + <fo:table-cell> + <fo:block keep-with-previous.within-column="3">cell1/1</fo:block> + </fo:table-cell> + <fo:table-cell> + <fo:block keep-with-previous.within-column="always">cell1/2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + <fo:block>block5</fo:block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <element-list category="breaker"> + <box/> + <penalty w="0" p="999"/> + <!-- table 1 starts --> + <box/> + <!-- table 1 end --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 2 starts --> + <box/> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="999"/> + <box/> + <!-- table 2 end --> + <penalty w="0" p="0"/> + <box/> + <penalty w="0" p="0"/> + <!-- table 3 starts --> + <box/> + <!-- table 3 end --> + <penalty w="0" p="999"/> + <box/> + <penalty w="0" p="INF"/> + <!-- table 4 starts --> + <box/> + <!-- table 4 end --> + <penalty w="0" p="0"/> + <box/> + + <skip>3</skip> + </element-list> + </checks> +</testcase> |