You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by vh...@apache.org on 2008/01/23 16:22:11 UTC

svn commit: r614566 [2/3] - in /xmlgraphics/fop/trunk: ./ src/java/org/apache/fop/fo/flow/table/ src/java/org/apache/fop/layoutmgr/ src/java/org/apache/fop/layoutmgr/table/ test/fotree/unittests/table/ test/java/org/apache/fop/fo/flow/table/ test/java/...

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java Wed Jan 23 07:22:05 2008
@@ -28,11 +28,13 @@
 import org.apache.fop.area.Trait;
 import org.apache.fop.datatypes.PercentBaseContext;
 import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.flow.table.ConditionalBorder;
 import org.apache.fop.fo.flow.table.GridUnit;
 import org.apache.fop.fo.flow.table.PrimaryGridUnit;
 import org.apache.fop.fo.flow.table.Table;
 import org.apache.fop.fo.flow.table.TableCell;
 import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.fo.properties.CommonBorderPaddingBackground.BorderInfo;
 import org.apache.fop.layoutmgr.AreaAdditionUtil;
 import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
 import org.apache.fop.layoutmgr.BlockStackingLayoutManager;
@@ -47,6 +49,7 @@
 import org.apache.fop.layoutmgr.PositionIterator;
 import org.apache.fop.layoutmgr.SpaceResolver;
 import org.apache.fop.layoutmgr.TraitSetter;
+import org.apache.fop.traits.BorderProps;
 import org.apache.fop.traits.MinOptMax;
 
 /**
@@ -65,8 +68,6 @@
 
     private Block curBlockArea;
 
-    private int inRowIPDOffset;
-
     private int xoffset;
     private int yoffset;
     private int cellIPD;
@@ -137,7 +138,8 @@
             startIndent /= 2;
             endIndent /= 2;
         }
-        startIndent += getTableCell().getCommonBorderPaddingBackground().getPaddingStart(false, this);
+        startIndent += getTableCell().getCommonBorderPaddingBackground().getPaddingStart(false,
+                this);
         endIndent += getTableCell().getCommonBorderPaddingBackground().getPaddingEnd(false, this);
         return startIndent + endIndent;
     }
@@ -272,15 +274,6 @@
     }
 
     /**
-     * Set the IPD offset of this cell inside the table-row.
-     * This offset is used to determine the absolute position of the cell.
-     * @param off the IPD offset
-     */
-    public void setInRowIPDOffset(int off) {
-        this.inRowIPDOffset = off;
-    }
-
-    /**
      * Set the content height for this cell. This method is used during
      * addAreas() stage.
      *
@@ -291,37 +284,16 @@
     }
 
     /**
-     * Set the row height that contains this cell. This method is used during
-     * addAreas() stage.
-     *
-     * @param h the height of the row
+     * Sets the total height of this cell on the current page. That is, the cell's bpd
+     * plus before and after borders and paddings, plus the table's border-separation.
+     * 
+     * @param h the height of cell
      */
-    public void setRowHeight(int h) {
+    public void setTotalHeight(int h) {
         rowHeight = h;
     }
 
     /**
-     * Returns the bpd of the given grid unit.
-     * @param gu a grid unit belonging to this cell
-     * @return the content height of the grid unit
-     */
-    private int getContentHeight(GridUnit gu) {
-        int bpd = rowHeight;
-        if (isSeparateBorderModel()) {
-            bpd -= gu.getPrimary().getBorders().getBorderBeforeWidth(false);
-            bpd -= gu.getPrimary().getBorders().getBorderAfterWidth(false);
-        } else {
-            bpd -= gu.getPrimary().getHalfMaxBorderWidth();
-        }
-        CommonBorderPaddingBackground cbpb
-            = gu.getCell().getCommonBorderPaddingBackground();
-        bpd -= cbpb.getPaddingBefore(false, this);
-        bpd -= cbpb.getPaddingAfter(false, this);
-        bpd -= 2 * ((TableLayoutManager)getParent()).getHalfBorderSeparationBPD();
-        return bpd;
-    }
-
-    /**
      * Add the areas for the break points. The cell contains block stacking layout
      * managers that add block areas.
      * 
@@ -336,99 +308,151 @@
      * of each spanned grid row
      * @param startRow first grid row on the current page spanned over by the cell,
      * inclusive
-     * @param endRow last grid row on the current page spanned over by the cell, exclusive
+     * @param endRow last grid row on the current page spanned over by the cell, inclusive
+     * @param borderBeforeWhich one of {@link ConditionalBorder#NORMAL},
+     * {@link ConditionalBorder#LEADING_TRAILING} or {@link ConditionalBorder#REST}
+     * @param borderAfterWhich one of {@link ConditionalBorder#NORMAL},
+     * {@link ConditionalBorder#LEADING_TRAILING} or {@link ConditionalBorder#REST}
+     * @param firstOnPage true if the cell will be the very first one on the page, in
+     * which case collapsed before borders must be drawn in the outer mode
+     * @param lastOnPage true if the cell will be the very last one on the page, in which
+     * case collapsed after borders must be drawn in the outer mode
      */
     public void addAreas(PositionIterator parentIter,
                          LayoutContext layoutContext,
                          int[] spannedGridRowHeights,
                          int startRow,
-                         int endRow) {
+                         int endRow,
+                         int borderBeforeWhich,
+                         int borderAfterWhich,
+                         boolean firstOnPage,
+                         boolean lastOnPage) {
         getParentArea(null);
 
         getPSLM().addIDToPage(getTableCell().getId());
 
+        int borderBeforeWidth = primaryGridUnit.getBeforeBorderWidth(startRow, borderBeforeWhich);
+        int borderAfterWidth = primaryGridUnit.getAfterBorderWidth(endRow, borderAfterWhich);
         if (isSeparateBorderModel()) {
             if (!emptyCell || getTableCell().showEmptyCells()) {
-                TraitSetter.addBorders(curBlockArea, getTableCell().getCommonBorderPaddingBackground(),
-                        false, false, false, false, this);
-                TraitSetter.addPadding(curBlockArea, getTableCell().getCommonBorderPaddingBackground(),
-                        false, false, false, false, this);
+                if (borderBeforeWidth > 0) {
+                    int halfBorderSepBPD = getTableCell().getTable().getBorderSeparation().getBPD()
+                            .getLength().getValue() / 2;
+                    adjustYOffset(curBlockArea, halfBorderSepBPD);
+                }
+                TraitSetter.addBorders(curBlockArea,
+                        getTableCell().getCommonBorderPaddingBackground(),
+                        borderBeforeWidth == 0, borderAfterWidth == 0,
+                        false, false, this);
             }
         } else {
+            boolean inFirstColumn = (primaryGridUnit.getStartCol() == 0);
+            boolean inLastColumn = (primaryGridUnit.getStartCol()
+                    + getTableCell().getNumberColumnsSpanned() == getTable()
+                    .getNumberOfColumns());
             if (!primaryGridUnit.hasSpanning()) {
+                adjustYOffset(curBlockArea, -borderBeforeWidth);
                 //Can set the borders directly if there's no span
-                boolean[] outer = new boolean[] {
-                        primaryGridUnit.getFlag(GridUnit.FIRST_IN_TABLE),
-                        primaryGridUnit.getFlag(GridUnit.LAST_IN_TABLE),
-                        primaryGridUnit.getFlag(GridUnit.IN_FIRST_COLUMN),
-                        primaryGridUnit.getFlag(GridUnit.IN_LAST_COLUMN)};
+                boolean[] outer = new boolean[] {firstOnPage, lastOnPage, inFirstColumn,
+                        inLastColumn};
                 TraitSetter.addCollapsingBorders(curBlockArea,
-                        primaryGridUnit.getBorders(), outer, this);
+                        primaryGridUnit.getBorderBefore(borderBeforeWhich),
+                        primaryGridUnit.getBorderAfter(borderAfterWhich),
+                        primaryGridUnit.getBorderStart(),
+                        primaryGridUnit.getBorderEnd(), outer);
             } else {
-                boolean[] outer = new boolean[4];
+                adjustYOffset(curBlockArea, borderBeforeWidth);
+                Block[][] blocks = new Block[getTableCell().getNumberRowsSpanned()][getTableCell()
+                        .getNumberColumnsSpanned()];
+                GridUnit[] gridUnits = (GridUnit[]) primaryGridUnit.getRows().get(startRow);
+                for (int x = 0; x < getTableCell().getNumberColumnsSpanned(); x++) {
+                    GridUnit gu = gridUnits[x];
+                    BorderInfo border = gu.getBorderBefore(borderBeforeWhich);
+                    int borderWidth = border.getRetainedWidth() / 2;
+                    if (borderWidth > 0) {
+                        addBorder(blocks, startRow, x, Trait.BORDER_BEFORE, border, firstOnPage);
+                        adjustYOffset(blocks[startRow][x], -borderWidth);
+                        adjustBPD(blocks[startRow][x], -borderWidth);
+                    }
+                }
+                gridUnits = (GridUnit[]) primaryGridUnit.getRows().get(endRow);
+                for (int x = 0; x < getTableCell().getNumberColumnsSpanned(); x++) {
+                    GridUnit gu = gridUnits[x];
+                    BorderInfo border = gu.getBorderAfter(borderAfterWhich);
+                    int borderWidth = border.getRetainedWidth() / 2;
+                    if (borderWidth > 0) {
+                        addBorder(blocks, endRow, x, Trait.BORDER_AFTER, border, lastOnPage);
+                        adjustBPD(blocks[endRow][x], -borderWidth);
+                    }
+                }
+                for (int y = startRow; y <= endRow; y++) {
+                    gridUnits = (GridUnit[]) primaryGridUnit.getRows().get(y);
+                    BorderInfo border = gridUnits[0].getBorderStart();
+                    int borderWidth = border.getRetainedWidth() / 2;
+                    if (borderWidth > 0) {
+                        addBorder(blocks, y, 0, Trait.BORDER_START, border, inFirstColumn);
+                        adjustXOffset(blocks[y][0], borderWidth);
+                        adjustIPD(blocks[y][0], -borderWidth);
+                    }
+                    border = gridUnits[gridUnits.length - 1].getBorderEnd();
+                    borderWidth = border.getRetainedWidth() / 2;
+                    if (borderWidth > 0) {
+                        addBorder(blocks, y, gridUnits.length - 1, Trait.BORDER_END, border,
+                                inLastColumn);
+                        adjustIPD(blocks[y][gridUnits.length - 1], -borderWidth);
+                    }
+                }
                 int dy = yoffset;
-                for (int y = startRow; y < endRow; y++) {
-                    GridUnit[] gridUnits = (GridUnit[])primaryGridUnit.getRows().get(y);
+                for (int y = startRow; y <= endRow; y++) {
+                    int bpd = spannedGridRowHeights[y - startRow];
                     int dx = xoffset;
                     for (int x = 0; x < gridUnits.length; x++) {
-                        GridUnit gu = gridUnits[x];
-                        if (gu.hasBorders()) {
-                            //Blocks for painting grid unit borders
-                            Block block = new Block();
-                            block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
-                            block.setPositioning(Block.ABSOLUTE);
-    
-                            int bpd = spannedGridRowHeights[y - startRow];
-                            bpd -= gu.getBorders().getBorderBeforeWidth(false) / 2;
-                            bpd -= gu.getBorders().getBorderAfterWidth(false) / 2;
-                            block.setBPD(bpd);
-                            if (log.isTraceEnabled()) {
-                                log.trace("pgu: " + primaryGridUnit + "; gu: " + gu + "; yoffset: "
-                                        + (dy - gu.getBorders().getBorderBeforeWidth(false) / 2)
-                                        + "; bpd: " + bpd);
-                            }
-                            int ipd = gu.getColumn().getColumnWidth().getValue(
-                                    (PercentBaseContext) getParent());
-                            int borderStartWidth = gu.getBorders().getBorderStartWidth(false) / 2;
-                            ipd -= borderStartWidth;
-                            ipd -= gu.getBorders().getBorderEndWidth(false) / 2;
-                            block.setIPD(ipd);
-                            block.setXOffset(dx + borderStartWidth);
-                            block.setYOffset(dy - gu.getBorders().getBorderBeforeWidth(false) / 2);
-                            outer[0] = gu.getFlag(GridUnit.FIRST_IN_TABLE);
-                            outer[1] = gu.getFlag(GridUnit.LAST_IN_TABLE);
-                            outer[2] = gu.getFlag(GridUnit.IN_FIRST_COLUMN);
-                            outer[3] = gu.getFlag(GridUnit.IN_LAST_COLUMN);
-                            TraitSetter.addCollapsingBorders(block, gu.getBorders(), outer, this);
+                        int ipd = getTable().getColumn(primaryGridUnit.getStartCol() + x)
+                                .getColumnWidth().getValue((PercentBaseContext) getParent());
+                        if (blocks[y][x] != null) {
+                            Block block = blocks[y][x];
+                            adjustYOffset(block, dy);
+                            adjustXOffset(block, dx);
+                            adjustIPD(block, ipd);
+                            adjustBPD(block, bpd);
                             parentLM.addChildArea(block);
                         }
-                        dx += gu.getColumn().getColumnWidth().getValue(
-                                (PercentBaseContext) getParent());
+                        dx += ipd;
                     }
-                    dy += spannedGridRowHeights[y - startRow];
+                    dy += bpd;
                 }
             }
         }
-        TraitSetter.addPadding(curBlockArea, primaryGridUnit.getBorders(),
-                false, false, false, false, this);
+
+        CommonBorderPaddingBackground padding = primaryGridUnit.getCell()
+                .getCommonBorderPaddingBackground();
+        TraitSetter.addPadding(curBlockArea,
+                padding,
+                borderBeforeWhich == ConditionalBorder.REST,
+                borderAfterWhich == ConditionalBorder.REST,
+                false, false, this);
+
+        int cellBPD = rowHeight - borderBeforeWidth - borderAfterWidth;
+        cellBPD -= padding.getPaddingBefore(borderBeforeWhich == ConditionalBorder.REST, this);
+        cellBPD -= padding.getPaddingAfter(borderAfterWhich == ConditionalBorder.REST, this);
 
         //Handle display-align
-        int contentBPD = getContentHeight(primaryGridUnit);
-        if (usedBPD < contentBPD) {
+        if (usedBPD < cellBPD) {
             if (getTableCell().getDisplayAlign() == EN_CENTER) {
                 Block space = new Block();
-                space.setBPD((contentBPD - usedBPD) / 2);
+                space.setBPD((cellBPD - usedBPD) / 2);
                 curBlockArea.addBlock(space);
             } else if (getTableCell().getDisplayAlign() == EN_AFTER) {
                 Block space = new Block();
-                space.setBPD((contentBPD - usedBPD));
+                space.setBPD(cellBPD - usedBPD);
                 curBlockArea.addBlock(space);
             }
         }
 
         AreaAdditionUtil.addAreas(this, parentIter, layoutContext);
-
-        curBlockArea.setBPD(contentBPD);
+        // Re-adjust the cell's bpd as it may have been modified by the previous call
+        // for some reason (?)
+        curBlockArea.setBPD(cellBPD);
 
         // Add background after we know the BPD
         if (isSeparateBorderModel()) {
@@ -448,6 +472,34 @@
         curBlockArea = null;
     }
 
+    private void addBorder(Block[][] blocks, int i, int j, Integer side, BorderInfo border,
+            boolean outer) {
+        if (blocks[i][j] == null) {
+            blocks[i][j] = new Block();
+            blocks[i][j].addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
+            blocks[i][j].setPositioning(Block.ABSOLUTE);
+        }
+        blocks[i][j].addTrait(side, new BorderProps(border.getStyle(),
+                border.getRetainedWidth(), border.getColor(),
+                outer ? BorderProps.COLLAPSE_OUTER : BorderProps.COLLAPSE_INNER));
+    }
+
+    private static void adjustXOffset(Block block, int amount) {
+        block.setXOffset(block.getXOffset() + amount);
+    }
+
+    private static void adjustYOffset(Block block, int amount) {
+        block.setYOffset(block.getYOffset() + amount);
+    }
+
+    private static void adjustIPD(Block block, int amount) {
+        block.setIPD(block.getIPD() + amount);
+    }
+
+    private static void adjustBPD(Block block, int amount) {
+        block.setBPD(block.getBPD() + amount);
+    }
+
     /**
      * Return an Area which can contain the passed childArea. The childArea
      * may not yet have any content, but it has essential traits set.
@@ -467,25 +519,10 @@
             curBlockArea.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
             TraitSetter.setProducerID(curBlockArea, getTableCell().getId());
             curBlockArea.setPositioning(Block.ABSOLUTE);
-            // set position
-            int borderAdjust = 0;
-            if (!isSeparateBorderModel()) {
-                if (primaryGridUnit.hasSpanning()) {
-                    borderAdjust -= primaryGridUnit.getHalfMaxBeforeBorderWidth();
-                } else {
-                    borderAdjust += primaryGridUnit.getHalfMaxBeforeBorderWidth();
-                }
-            } else {
-                //borderAdjust += primaryGridUnit.getBorders().getBorderBeforeWidth(false);
-            }
-            TableLayoutManager tableLM = (TableLayoutManager)getParent();
-            curBlockArea.setXOffset(xoffset + inRowIPDOffset + startIndent);
-            curBlockArea.setYOffset(yoffset - borderAdjust
-                    + tableLM.getHalfBorderSeparationBPD());
+            curBlockArea.setXOffset(xoffset + startIndent);
+            curBlockArea.setYOffset(yoffset);
             curBlockArea.setIPD(cellIPD);
-            //curBlockArea.setHeight();
 
-            // Set up dimensions
             /*Area parentArea =*/ parentLM.getParentArea(curBlockArea);
             // Get reference IPD from parentArea
             setCurrentArea(curBlockArea); // ??? for generic operations

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java Wed Jan 23 07:22:05 2008
@@ -19,6 +19,7 @@
 
 package org.apache.fop.layoutmgr.table;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -125,7 +126,7 @@
         return this.footerList;
     }
 
-    /** @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int) */
+    /** {@inheritDoc} */
     public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
         if (log.isDebugEnabled()) {
             log.debug("==> Columns: " + getTableLM().getColumns());
@@ -321,9 +322,12 @@
             } else if (pos instanceof TableHFPenaltyPosition) {
                 //ignore for now, see special handling below if break is at a penalty
                 //Only if the last position in this part/page us such a position it will be used 
-            } else {
-                //leave order as is for the rest
+            } else if (pos instanceof TableContentPosition) {
                 positions.add(pos);
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("Ignoring position: " + pos);
+                }
             }
         }
         if (lastPos instanceof TableHFPenaltyPosition) {
@@ -349,17 +353,20 @@
             //header positions for the last part are the second-to-last element and need to
             //be handled first before all other TableContentPositions
             PositionIterator nestedIter = new KnuthPossPosIter(headerElements);
-            iterateAndPaintPositions(nestedIter, painter);
+            iterateAndPaintPositions(nestedIter, painter, false);
         }
         
         //Iterate over all steps
         Iterator posIter = positions.iterator();
-        iterateAndPaintPositions(posIter, painter);
+        painter.startBody();
+        // Here we are sure that posIter iterates only over TableContentPosition instances
+        iterateAndPaintPositions(posIter, painter, footerElements == null);
+        painter.endBody();
 
         if (footerElements != null) {
             //Positions for footers are simply added at the end
             PositionIterator nestedIter = new KnuthPossPosIter(footerElements);
-            iterateAndPaintPositions(nestedIter, painter);
+            iterateAndPaintPositions(nestedIter, painter, true);
         }
         
         this.usedBPD += painter.getAccumulatedBPD();
@@ -377,9 +384,12 @@
      * @param iterator iterator over Position elements. Those positions correspond to the
      * elements of the table present on the current page
      * @param painter
+     * @param lastOnPage true if the corresponding part will be the last on the page
+     * (either body or footer, obviously)
      */
-    private void iterateAndPaintPositions(Iterator iterator, RowPainter painter) {
-        List lst = new java.util.ArrayList();
+    private void iterateAndPaintPositions(Iterator iterator, RowPainter painter,
+            boolean lastOnPage) {
+        List lst = new ArrayList();
         boolean firstPos = false;
         TableBody body = null;
         while (iterator.hasNext()) {
@@ -405,10 +415,6 @@
                     body = null;
                     lst.clear();
                 }
-            } else {
-                if (log.isDebugEnabled()) {
-                    log.debug("Ignoring position: " + pos);
-                }
             }
         }
         if (body != null) {
@@ -417,7 +423,7 @@
             // lastPos is necessarily false
             handleMarkersAndPositions(lst, body, firstPos, false, painter);
         }
-        painter.addAreasAndFlushRow(true);
+        painter.addAreasAndFlushRow(true, lastOnPage);
     }
 
     private void handleMarkersAndPositions(List positions, TableBody body, boolean firstPos,

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableStepper.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableStepper.java?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableStepper.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/table/TableStepper.java Wed Jan 23 07:22:05 2008
@@ -133,7 +133,8 @@
         for (int i = 0; i < columnCount; i++) {
             GridUnit gu = getActiveGridUnit(i);
             if (gu != null && !gu.isEmpty() && gu.isPrimary()) {
-                activeCells.add(new ActiveCell((PrimaryGridUnit) gu, row, activeRowIndex, previousRowsLength, getTableLM()));
+                activeCells.add(new ActiveCell((PrimaryGridUnit) gu, row, activeRowIndex,
+                        previousRowsLength, getTableLM()));
             }
         }
     }
@@ -173,17 +174,17 @@
             List cellParts = new java.util.ArrayList(maxColumnCount);
             for (Iterator iter = activeCells.iterator(); iter.hasNext();) {
                 ActiveCell activeCell = (ActiveCell) iter.next();
+                CellPart part = activeCell.createCellPart();
+                cellParts.add(part);
                 if (activeCell.contributesContent()) {
-                    CellPart part = activeCell.createCellPart();
-                    cellParts.add(part);
                     forcedBreak = activeCell.isLastForcedBreak();
                     if (forcedBreak) {
                         breakClass = activeCell.getLastBreakClass();
                     }
-                    if (returnList.size() == 0 && part.isFirstPart()
-                            && part.mustKeepWithPrevious()) {
-                        context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING);
-                    }
+                }
+                if (returnList.size() == 0 && part.isFirstPart()
+                        && part.mustKeepWithPrevious()) {
+                    context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING);
                 }
             }
             //log.debug(">>> guPARTS: " + cellParts);
@@ -327,6 +328,7 @@
     private void removeCellsEndingOnCurrentRow() {
         for (Iterator iter = activeCells.iterator(); iter.hasNext();) {
             ActiveCell activeCell = (ActiveCell) iter.next();
+            activeCell.endRow(activeRowIndex);
             if (activeCell.endsOnRow(activeRowIndex)) {
                 iter.remove();
             }

Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Wed Jan 23 07:22:05 2008
@@ -28,6 +28,10 @@
 
   <changes>
     <release version="FOP Trunk">
+      <action context="Layout" dev="VH" type="add" importance="high" fixes-bug="43934">
+          Added support for conditional borders in tables, for both the separate and the collapsing
+          border model.
+      </action>
       <action context="Layout" dev="JM" type="fix" fixes-bug="44160">
         Fixed a possible IndexOutOfBoundsException that could happen with certain constellations
         when footnotes are used.

Modified: xmlgraphics/fop/trunk/test/fotree/unittests/table/collapsed-conditional-borders_test-generator.py
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/fotree/unittests/table/collapsed-conditional-borders_test-generator.py?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/fotree/unittests/table/collapsed-conditional-borders_test-generator.py (original)
+++ xmlgraphics/fop/trunk/test/fotree/unittests/table/collapsed-conditional-borders_test-generator.py Wed Jan 23 07:22:05 2008
@@ -74,7 +74,7 @@
             ]
 
     bordersBefore = None
-    resBefore = None
+    resBefore = {}
     """The comma between each table; nothing before the first one."""
     separator = ''
 
@@ -85,8 +85,8 @@
         Params:
         borderSet: a list of 5 border specifications for resp. table, table-column,
         table-body, table-row and table-cell
-        resolution: the resolved border for the leading and rest cases (for the normal
-        case the resolution is always the same)
+        resolution: the resolved border for the rest case (for the normal and leading
+        cases the resolution is always the same)
         """
         if not self.bordersBefore:
             self.bordersBefore = borderSet
@@ -110,16 +110,14 @@
             sys.stderr.write(self.separator + '{')
             comma = ''
             for beforeAfter in [self.resBefore, resolution]:
-                for leadRest in range(2):
-                    sys.stderr.write(comma + '{border' + beforeAfter[leadRest]['length']
-                            + ', Color.' + beforeAfter[leadRest]['color']
-                            + '}')
-                    comma = ', '
+                sys.stderr.write(comma + '{border' + beforeAfter['length']
+                        + ', Color.' + beforeAfter['color'] + '}')
+                comma = ', '
             sys.stderr.write('}')
             self.separator = ',\n'
             # Reset
             self.bordersBefore = None
-            self.resBefore = None
+            self.resBefore = {}
 
 class TableHFGenerator:
     """Generates on stdout tables with headers and footers, and the border specifications
@@ -254,7 +252,7 @@
         defaultBorders.append({'length': '4pt', 'cond': 'discard', 'color': color})
     defaultBorders[fo_table]['length'] = '8pt'
 
-    resolution = [{'length': '4pt', 'color': 'yellow'}, {'length': '0pt', 'color': 'black'}]
+    resolution = {'length': '0pt', 'color': 'black'}
     tableGenerator.addBorderSet(defaultBorders, resolution)
     for combinations in createAllCombinations()[1:]:
         for combination in combinations:
@@ -266,9 +264,9 @@
                 if index != fo_table:
                     finalBorders[index]['length'] = '6pt'
                 if fo_table in combination:
-                    resolution = [{'length': '8pt', 'color': 'black'}] * 2
+                    resolution = {'length': '8pt', 'color': 'black'}
                 else:
-                    resolution = [{'length': '6pt', 'color': finalBorders[index]['color']}] * 2
+                    resolution = {'length': '6pt', 'color': finalBorders[index]['color']}
                 tableGenerator.addBorderSet(finalBorders, resolution)
     printFOEnd()
 

Modified: xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/CollapsedConditionalBorderTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/CollapsedConditionalBorderTestCase.java?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/CollapsedConditionalBorderTestCase.java (original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/CollapsedConditionalBorderTestCase.java Wed Jan 23 07:22:05 2008
@@ -47,46 +47,46 @@
      * script.
      */
     private Object[][][] resolvedBorders = {
-{{border4pt, Color.yellow}, {border0pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.magenta}, {border6pt, Color.magenta}},
-{{border6pt, Color.blue}, {border6pt, Color.blue}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.magenta}, {border6pt, Color.magenta}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.blue}, {border6pt, Color.blue}},
-{{border6pt, Color.magenta}, {border6pt, Color.magenta}, {border6pt, Color.blue}, {border6pt, Color.blue}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border6pt, Color.magenta}, {border6pt, Color.magenta}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border6pt, Color.blue}, {border6pt, Color.blue}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border6pt, Color.red}, {border6pt, Color.red}},
-{{border6pt, Color.magenta}, {border6pt, Color.magenta}, {border6pt, Color.blue}, {border6pt, Color.blue}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.magenta}, {border6pt, Color.magenta}},
-{{border6pt, Color.yellow}, {border6pt, Color.yellow}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.blue}, {border6pt, Color.blue}},
-{{border6pt, Color.yellow}, {border6pt, Color.yellow}, {border6pt, Color.magenta}, {border6pt, Color.magenta}},
-{{border6pt, Color.blue}, {border6pt, Color.blue}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border6pt, Color.red}, {border6pt, Color.red}, {border6pt, Color.magenta}, {border6pt, Color.magenta}},
-{{border6pt, Color.blue}, {border6pt, Color.blue}, {border6pt, Color.yellow}, {border6pt, Color.yellow}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}},
-{{border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}, {border8pt, Color.black}}
+            {{border0pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.magenta}},
+            {{border6pt, Color.blue}, {border6pt, Color.yellow}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.magenta}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.blue}},
+            {{border6pt, Color.magenta}, {border6pt, Color.blue}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.yellow}},
+            {{border6pt, Color.magenta}, {border6pt, Color.yellow}},
+            {{border6pt, Color.blue}, {border6pt, Color.yellow}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border6pt, Color.red}},
+            {{border6pt, Color.magenta}, {border6pt, Color.blue}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.magenta}},
+            {{border6pt, Color.yellow}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.blue}},
+            {{border6pt, Color.yellow}, {border6pt, Color.magenta}},
+            {{border6pt, Color.blue}, {border6pt, Color.yellow}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border6pt, Color.red}, {border6pt, Color.magenta}},
+            {{border6pt, Color.blue}, {border6pt, Color.yellow}},
+            {{border8pt, Color.black}, {border8pt, Color.black}},
+            {{border8pt, Color.black}, {border8pt, Color.black}}
     };
 
     /**
@@ -142,13 +142,13 @@
 
             String errorMsge = baseErrorMsge + "border-before";
             checkBorder(errorMsge, gu.borderBefore.nonLeadingTrailing, 8000, Color.black);
-            checkBorder(errorMsge, gu.borderBefore.leadingTrailing, resolvedBorders[tableNum][0]);
-            checkBorder(errorMsge, gu.borderBefore.rest, resolvedBorders[tableNum][1]);
+            checkBorder(errorMsge, gu.borderBefore.leadingTrailing, 8000, Color.black);
+            checkBorder(errorMsge, gu.borderBefore.rest, resolvedBorders[tableNum][0]);
 
             errorMsge = baseErrorMsge + "border-after";
             checkBorder(errorMsge, gu.borderAfter.nonLeadingTrailing, 8000, Color.black);
-            checkBorder(errorMsge, gu.borderAfter.leadingTrailing, resolvedBorders[tableNum][2]);
-            checkBorder(errorMsge, gu.borderAfter.rest, resolvedBorders[tableNum][3]);
+            checkBorder(errorMsge, gu.borderAfter.leadingTrailing, 8000, Color.black);
+            checkBorder(errorMsge, gu.borderAfter.rest, resolvedBorders[tableNum][1]);
 
             tableNum++;
         } while (tableIterator.hasNext());

Modified: xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java (original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java Wed Jan 23 07:22:05 2008
@@ -36,6 +36,7 @@
 import org.apache.commons.io.filefilter.SuffixFileFilter;
 import org.apache.commons.io.filefilter.TrueFileFilter;
 import org.apache.fop.DebugHelper;
+import org.apache.fop.fo.flow.table.CollapsedConditionalBorderTestCase;
 import org.apache.fop.fo.flow.table.IllegalRowSpanTestCase;
 import org.apache.fop.fo.flow.table.RowGroupBuilderTestCase;
 import org.apache.fop.fo.flow.table.TableColumnColumnNumberTestCase;
@@ -115,6 +116,7 @@
         suite.addTestSuite(IllegalRowSpanTestCase.class);
         suite.addTestSuite(RowGroupBuilderTestCase.class);
         suite.addTestSuite(TableColumnColumnNumberTestCase.class);
+        suite.addTestSuite(CollapsedConditionalBorderTestCase.class);
     }
 
     private static class FOTreeTestCase extends TestCase {

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_block_break-after.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_block_break-after.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_block_break-after.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_block_break-after.xml Wed Jan 23 07:22:05 2008
@@ -66,14 +66,14 @@
     <eval expected="3" xpath="count(//pageViewport[@nr=1]//flow/block[1]/block[1]/block)"/>
     <eval expected="67000" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@ipd"/>
     <eval expected="75000" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@ipda"/>
-    <eval expected="71200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@bpd"/>
-    <eval expected="79200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@bpda"/>
+    <eval expected="69200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@bpd"/>
+    <eval expected="73200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[1]/@bpda"/>
     <!-- 2 blocks in the second cell -->
     <eval expected="2" xpath="count(//pageViewport[@nr=1]//flow/block[1]/block[2]/block)"/>
     <eval expected="63000" xpath="//pageViewport[@nr=1]//flow/block[1]/block[2]/@ipd"/>
     <eval expected="75000" xpath="//pageViewport[@nr=1]//flow/block[1]/block[2]/@ipda"/>
     <eval expected="67200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[2]/@bpd"/>
-    <eval expected="79200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[2]/@bpda"/>
+    <eval expected="73200" xpath="//pageViewport[@nr=1]//flow/block[1]/block[2]/@bpda"/>
     <!-- 3 lines in the second block of the second cell -->
     <eval expected="3" xpath="count(//pageViewport[@nr=1]//flow/block[1]/block[2]/block[2]//lineArea)"/>
 
@@ -82,8 +82,8 @@
     <eval expected="0" xpath="count(//pageViewport[@nr=2]//flow/block[1]/block[1]/block)"/>
     <eval expected="67000" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@ipd"/>
     <eval expected="75000" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@ipda"/>
-    <eval expected="20800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@bpd"/>
-    <eval expected="28800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@bpda"/>
+    <eval expected="18800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@bpd"/>
+    <eval expected="22800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[1]/@bpda"/>
     <!-- One block expected in the second cell -->
     <eval expected="1" xpath="count(//pageViewport[@nr=2]//flow/block[1]/block[2]/block)"/>
     <!-- One line in the block -->
@@ -91,6 +91,6 @@
     <eval expected="63000" xpath="//pageViewport[@nr=2]//flow/block[1]/block[2]/@ipd"/>
     <eval expected="75000" xpath="//pageViewport[@nr=2]//flow/block[1]/block[2]/@ipda"/>
     <eval expected="16800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[2]/@bpd"/>
-    <eval expected="28800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[2]/@bpda"/>
+    <eval expected="22800" xpath="//pageViewport[@nr=2]//flow/block[1]/block[2]/@bpda"/>
   </checks>
 </testcase>

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_span-combinations.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_span-combinations.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_span-combinations.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-cell_span-combinations.xml Wed Jan 23 07:22:05 2008
@@ -53,6 +53,9 @@
                 <fo:table-cell id="cell4" number-columns-spanned="2" number-rows-spanned="2" border="solid 0.5pt"  background-color="lightgray">
                   <fo:block>cell4</fo:block>
                 </fo:table-cell>
+                <fo:table-cell>
+                  <fo:block> </fo:block>
+                </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                 <fo:table-cell id="cell5" border="solid 0.5pt">
@@ -78,7 +81,7 @@
     <eval expected="1" xpath="count(//block[@prod-id = 'cell4'])"/>
     <eval expected="1" xpath="count(//block[@prod-id = 'cell5'])"/>
     <eval expected="1" xpath="count(//block[@prod-id = 'cell6'])"/>
-    <eval expected="45200" xpath="//block[@prod-id = 'cell2']/@bpd"/>
-    <eval expected="29800" xpath="//block[@prod-id = 'cell4']/@bpd"/>
+    <eval expected="44200" xpath="//block[@prod-id = 'cell2']/@bpd"/>
+    <eval expected="28800" xpath="//block[@prod-id = 'cell4']/@bpd"/>
   </checks>
 </testcase>

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-row_break-before_break-after_2.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-row_break-before_break-after_2.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-row_break-before_break-after_2.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table-row_break-before_break-after_2.xml Wed Jan 23 07:22:05 2008
@@ -32,16 +32,15 @@
       <fo:page-sequence master-reference="normal" white-space-collapse="true">
         <fo:flow flow-name="xsl-region-body">
           <fo:block>before the table</fo:block>
-          <fo:table table-layout="fixed" width="100%">
-            <fo:table-column/>
-            <fo:table-column/>
+          <fo:table table-layout="fixed" width="100%" border-collapse="separate" border="4pt solid black">
+            <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
             <fo:table-body>
               <fo:table-row break-before="odd-page" break-after="odd-page">
-                <fo:table-cell background-color="orange">
-                  <fo:block>cell3</fo:block>
+                <fo:table-cell border="2pt solid blue" background-color="orange">
+                  <fo:block>cell1</fo:block>
                 </fo:table-cell>
-                <fo:table-cell>
-                  <fo:block>cell4</fo:block>
+                <fo:table-cell border="2pt solid red">
+                  <fo:block>cell2</fo:block>
                 </fo:table-cell>
               </fo:table-row>
             </fo:table-body>
@@ -53,5 +52,22 @@
   </fo>
   <checks>
     <eval expected="5" xpath="count(//pageViewport)"/>
+    <!-- table -->
+    <eval expected="18400" xpath="//pageViewport[@nr=3]//flow/block[1]/@bpd"/>
+    <!--
+    <eval expected="26400" xpath="//pageViewport[@nr=3]//flow/block[1]/@bpda"/>
+    <eval expected="(solid,#000000,4000)" xpath="//pageViewport[@nr=3]//flow/block[1]/@border-before"/>
+    <eval expected="(solid,#000000,4000)" xpath="//pageViewport[@nr=3]//flow/block[1]/@border-after"/>
+    -->
+    <!-- cell 1 -->
+    <eval expected="14400" xpath="//pageViewport[@nr=3]//flow/block[1]/block[1]/@bpd"/>
+    <eval expected="18400" xpath="//pageViewport[@nr=3]//flow/block[1]/block[1]/@bpda"/>
+    <eval expected="(solid,#0000ff,2000)" xpath="//pageViewport[@nr=3]//flow/block[1]/block[1]/@border-before"/>
+    <eval expected="(solid,#0000ff,2000)" xpath="//pageViewport[@nr=3]//flow/block[1]/block[1]/@border-after"/>
+    <!-- cell 2 -->
+    <eval expected="14400" xpath="//pageViewport[@nr=3]//flow/block[1]/block[2]/@bpd"/>
+    <eval expected="18400" xpath="//pageViewport[@nr=3]//flow/block[1]/block[2]/@bpda"/>
+    <eval expected="(solid,#ff0000,2000)" xpath="//pageViewport[@nr=3]//flow/block[1]/block[2]/@border-before"/>
+    <eval expected="(solid,#ff0000,2000)" xpath="//pageViewport[@nr=3]//flow/block[1]/block[2]/@border-after"/>
   </checks>
 </testcase>

Added: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml?rev=614566&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml (added)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml Wed Jan 23 07:22:05 2008
@@ -0,0 +1,177 @@
+<?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 conditional paddings and borders on table-cells are handled correctly.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="page" page-height="5cm" page-width="15cm" margin="1cm">
+          <fo:region-body background-color="#F0F0F0"/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="page" font-family="serif" font-size="8pt" line-height="10pt">
+        <fo:flow flow-name="xsl-region-body">
+
+          <!-- table 1 -->
+          <fo:block
+            space-after.minimum="30pt"
+            space-after.optimum="40pt"
+            space-after.maximum="50pt"
+            >Before the table</fo:block>
+          <fo:table width="100%" table-layout="fixed" border="6pt solid black">
+            <fo:table-column column-width="proportional-column-width(1)" number-columns-repeated="2"/>
+            <fo:table-body>
+              <fo:table-row border="5pt solid red">
+                <fo:table-cell border="7pt solid blue" padding="2pt">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 1.1</fo:block>
+                    <fo:block>Cell 1.1</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+                <fo:table-cell number-rows-spanned="2"
+                  border="4pt solid blue" padding="2pt"
+                  border-before-width.length="4pt"
+                  border-before-width.conditionality="retain"
+                  padding-after.length="7pt"
+                  padding-after.conditionality="retain">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 1.2</fo:block>
+                    <fo:block>Cell 1.2</fo:block>
+                    <fo:block>Cell 1.2</fo:block>
+                    <fo:block>Cell 1.2</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="5pt solid purple"
+                border-before-width.length="5pt"
+                border-before-width.conditionality="retain">
+                <fo:table-cell border="4pt solid green" padding="2pt">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 2.1</fo:block>
+                    <fo:block>Cell 2.1</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+
+          <!-- table 2 -->
+          <fo:block break-before="page"
+            space-after.minimum="30pt"
+            space-after.optimum="40pt"
+            space-after.maximum="50pt"
+            >Before the table</fo:block>
+          <fo:table width="100%" table-layout="fixed" border="6pt solid black">
+            <fo:table-column column-width="proportional-column-width(1)" number-columns-repeated="2"/>
+            <fo:table-body>
+              <fo:table-row border="5pt solid red">
+                <fo:table-cell border="7pt solid blue" padding="2pt">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 1.1</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+                <fo:table-cell number-rows-spanned="3"
+                  border="4pt solid blue" padding="2pt"
+                  border-before-width.length="4pt"
+                  border-before-width.conditionality="retain"
+                  padding-after.length="7pt"
+                  padding-after.conditionality="retain">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 1.2</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="5pt solid purple"
+                border-before-width.length="5pt"
+                border-before-width.conditionality="retain">
+                <fo:table-cell border="4pt solid green" padding="2pt">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 2.1</fo:block>
+                    <fo:block>Cell 2.1</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="5pt solid purple"
+                border-before-width.length="5pt"
+                border-before-width.conditionality="retain">
+                <fo:table-cell border="4pt solid green" padding="2pt">
+                  <fo:block background-color="yellow">
+                    <fo:block>Cell 3.1</fo:block>
+                    <fo:block>Cell 3.1</fo:block>
+                  </fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+
+    <!-- before break -->
+    <eval expected="31000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/@bpd"/>
+    <!-- cell 1.1 -->
+    <eval expected="20000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@bpd"/>
+    <eval expected="38000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@bpda"/>
+    <eval expected="-3500"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@top-offset"/>
+    <eval expected="(solid,#0000ff,7000,collapse-outer)" xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@border-before"/>
+    <eval expected="2000"                                xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@padding-before"/>
+    <eval expected="2000"                                xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@padding-after"/>
+    <eval expected="(solid,#0000ff,7000,collapse-outer)" xpath="//pageViewport[@nr='1']//flow/block[2]/block[1]/@border-after"/>
+    <!-- cell 1.2 -->
+    <eval expected="28000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[2]/@bpd"/>
+    <eval expected="34000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[2]/@bpda"/>
+    <eval expected="-3000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[2]/@top-offset"/>
+    <eval expected="(solid,#000000,6000,collapse-outer)" xpath="//pageViewport[@nr='1']//flow/block[2]/block[2]/@border-before"/>
+    <eval expected=""                                    xpath="//pageViewport[@nr='1']//flow/block[2]/block[2]/@border-after"/>
+    <eval expected="19000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[3]/@bpd"/>
+    <eval expected="28000"                               xpath="//pageViewport[@nr='1']//flow/block[2]/block[3]/@bpda"/>
+    <eval expected="3000"                                xpath="//pageViewport[@nr='1']//flow/block[2]/block[3]/@top-offset"/>
+    <eval expected="2000"                                xpath="//pageViewport[@nr='1']//flow/block[2]/block[3]/@padding-before"/>
+    <eval expected="7000"                                xpath="//pageViewport[@nr='1']//flow/block[2]/block[3]/@padding-after"/>
+    <!-- after break -->
+    <eval expected="42500"                               xpath="//pageViewport[@nr='2']//flow/block[1]/@bpd"/>
+    <!-- cell 1.1 -->
+    <eval expected="33000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@bpd"/>
+    <eval expected="48000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@bpda"/>
+    <eval expected="-2500"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@top-offset"/>
+    <eval expected="(solid,#800080,5000,collapse-outer)" xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@border-before"/>
+    <eval expected="2000"                                xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@padding-before"/>
+    <eval expected="2000"                                xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@padding-after"/>
+    <eval expected="(solid,#000000,6000,collapse-outer)" xpath="//pageViewport[@nr='2']//flow/block[1]/block[1]/@border-after"/>
+    <!-- cell 1.2 -->
+    <eval expected="37000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[2]/@bpd"/>
+    <eval expected="48000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[2]/@bpda"/>
+    <eval expected="-2500"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[2]/@top-offset"/>
+    <eval expected="(solid,#800080,5000,collapse-outer)" xpath="//pageViewport[@nr='2']//flow/block[1]/block[2]/@border-before"/>
+    <eval expected="(solid,#000000,6000,collapse-outer)" xpath="//pageViewport[@nr='2']//flow/block[1]/block[2]/@border-after"/>
+    <eval expected="30000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[3]/@bpd"/>
+    <eval expected="37000"                               xpath="//pageViewport[@nr='2']//flow/block[1]/block[3]/@bpda"/>
+    <eval expected="2500"                                xpath="//pageViewport[@nr='2']//flow/block[1]/block[3]/@top-offset"/>
+    <eval expected=""                                    xpath="//pageViewport[@nr='2']//flow/block[1]/block[3]/@padding-before"/>
+    <eval expected="7000"                                xpath="//pageViewport[@nr='2']//flow/block[1]/block[3]/@padding-after"/>
+
+  </checks>
+</testcase>

Propchange: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_conditionals.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_spans_1.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_spans_1.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_spans_1.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_collapse_spans_1.xml Wed Jan 23 07:22:05 2008
@@ -208,6 +208,7 @@
     <eval expected="6000" xpath="//flow/block[2]/block[2]/@left-offset"/>
     <eval expected="-8000" xpath="//flow/block[2]/block[2]/@top-offset"/>
     <eval expected="(solid,#000000,16000,collapse-outer)" xpath="//flow/block[2]/block[2]/@border-before"/>
+    <eval expected=""                                     xpath="//flow/block[2]/block[2]/@border-after"/>
     <eval expected="(solid,#ff0000,12000,collapse-outer)" xpath="//flow/block[2]/block[2]/@border-start"/>
     <eval expected="(solid,#800080,10000,collapse-inner)" xpath="//flow/block[2]/block[2]/@border-end"/>
     <eval expected="92000" xpath="//flow/block[2]/block[3]/@ipd"/>
@@ -216,6 +217,7 @@
     <eval expected="41800" xpath="//flow/block[2]/block[3]/@bpda"/>
     <eval expected="6000" xpath="//flow/block[2]/block[3]/@left-offset"/>
     <eval expected="21400" xpath="//flow/block[2]/block[3]/@top-offset"/>
+    <eval expected=""                                     xpath="//flow/block[2]/block[3]/@border-before"/>
     <eval expected="(solid,#0000ff,10000,collapse-outer)" xpath="//flow/block[2]/block[3]/@border-after"/>
     <eval expected="(solid,#ff0000,12000,collapse-outer)" xpath="//flow/block[2]/block[3]/@border-start"/>
     <eval expected="(solid,#008080,4000,collapse-inner)" xpath="//flow/block[2]/block[3]/@border-end"/>
@@ -270,6 +272,7 @@
     <eval expected="102000" xpath="//flow/block[4]/block[3]/@left-offset"/>
     <eval expected="-2000" xpath="//flow/block[4]/block[3]/@top-offset"/>
     <eval expected="(solid,#c0c0c0,4000,collapse-outer)" xpath="//flow/block[4]/block[3]/@border-before"/>
+    <eval expected=""                                    xpath="//flow/block[4]/block[3]/@border-after"/>
     <eval expected="(solid,#800080,4000,collapse-inner)" xpath="//flow/block[4]/block[3]/@border-start"/>
     <eval expected="(solid,#808000,10000,collapse-outer)" xpath="//flow/block[4]/block[3]/@border-end"/>
     <eval expected="87000" xpath="//flow/block[4]/block[4]/@ipd"/>
@@ -278,6 +281,7 @@
     <eval expected="71600" xpath="//flow/block[4]/block[4]/@bpda"/>
     <eval expected="108000" xpath="//flow/block[4]/block[4]/@left-offset"/>
     <eval expected="26400" xpath="//flow/block[4]/block[4]/@top-offset"/>
+    <eval expected=""                                    xpath="//flow/block[4]/block[4]/@border-before"/>
     <eval expected="(solid,#800080,4000,collapse-outer)" xpath="//flow/block[4]/block[4]/@border-after"/>
     <eval expected="(solid,#808000,16000,collapse-inner)" xpath="//flow/block[4]/block[4]/@border-start"/>
     <eval expected="(solid,#808000,10000,collapse-outer)" xpath="//flow/block[4]/block[4]/@border-end"/>
@@ -301,6 +305,7 @@
     <eval expected="(solid,#000000,2000,collapse-outer)" xpath="//flow/block[6]/block[1]/@border-before"/>
     <eval expected="(solid,#0000ff,4000,collapse-inner)" xpath="//flow/block[6]/block[1]/@border-after"/>
     <eval expected="(solid,#ff0000,2000,collapse-outer)" xpath="//flow/block[6]/block[1]/@border-start"/>
+    <eval expected=""                                    xpath="//flow/block[6]/block[6]/@border-end"/>
     <eval expected="99000" xpath="//flow/block[6]/block[2]/@ipd"/>
     <eval expected="101000" xpath="//flow/block[6]/block[2]/@ipda"/>
     <eval expected="23400" xpath="//flow/block[6]/block[2]/@bpd"/>
@@ -309,6 +314,7 @@
     <eval expected="-1000" xpath="//flow/block[6]/block[2]/@top-offset"/>
     <eval expected="(solid,#000000,2000,collapse-outer)" xpath="//flow/block[6]/block[2]/@border-before"/>
     <eval expected="(solid,#000000,10000,collapse-inner)" xpath="//flow/block[6]/block[2]/@border-after"/>
+    <eval expected=""                                    xpath="//flow/block[6]/block[2]/@border-start"/>
     <eval expected="(solid,#008080,2000,collapse-outer)" xpath="//flow/block[6]/block[2]/@border-end"/>
     <eval expected="185000" xpath="//flow/block[6]/block[3]/@ipd"/>
     <eval expected="198000" xpath="//flow/block[6]/block[3]/@ipda"/>
@@ -374,6 +380,7 @@
     <eval expected="(solid,#c0c0c0,15000,collapse-inner)" xpath="//flow/block[8]/block[3]/@border-before"/>
     <eval expected="(solid,#000080,6000,collapse-outer)" xpath="//flow/block[8]/block[3]/@border-after"/>
     <eval expected="(solid,#800080,6000,collapse-outer)" xpath="//flow/block[8]/block[3]/@border-start"/>
+    <eval expected=""                                     xpath="//flow/block[8]/block[3]/@border-end"/>
     <eval expected="97000" xpath="//flow/block[8]/block[4]/@ipd"/>
     <eval expected="103000" xpath="//flow/block[8]/block[4]/@ipda"/>
     <eval expected="39400" xpath="//flow/block[8]/block[4]/@bpd"/>
@@ -382,6 +389,7 @@
     <eval expected="34800" xpath="//flow/block[8]/block[4]/@top-offset"/>
     <eval expected="(solid,#c0c0c0,15000,collapse-inner)" xpath="//flow/block[8]/block[4]/@border-before"/>
     <eval expected="(solid,#000080,6000,collapse-outer)" xpath="//flow/block[8]/block[4]/@border-after"/>
+    <eval expected=""                                     xpath="//flow/block[8]/block[4]/@border-start"/>
     <eval expected="(solid,#808000,6000,collapse-outer)" xpath="//flow/block[8]/block[4]/@border-end"/>
     <eval expected="144000" xpath="//flow/block[8]/block[5]/@ipd"/>
     <eval expected="194000" xpath="//flow/block[8]/block[5]/@ipda"/>

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_separate_border-spacing_2.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_separate_border-spacing_2.xml?rev=614566&r1=614565&r2=614566&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_separate_border-spacing_2.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/table_border-collapse_separate_border-spacing_2.xml Wed Jan 23 07:22:05 2008
@@ -134,17 +134,19 @@
       <box w="0"/>
       <penalty w="0" p="INF"/>
       <glue w="7500"/>
-      <box w="15000"/>
-      <penalty w="0"/>
-      <box w="5000"/>
-      <penalty w="5000"/>
-      <box w="0"/>
-      <penalty w="10000"/>
-      <box w="15000"/>
+      <box w="2500"/>
+      <penalty w="10000" p="900"/>
+      <box w="12500"/>
       <penalty w="0"/>
+      <box w="7500"/>
+      <penalty w="0" p="900"/>
       <box w="0"/>
       <penalty w="5000"/>
-      <box w="15000"/>
+      <box w="12500"/>
+      <penalty w="0"/>
+      <box w="2500"/>
+      <penalty w="0" p="900"/>
+      <box w="12500"/>
       <penalty w="0" p="INF"/>
       <glue w="7500"/>
 
@@ -154,17 +156,19 @@
       <box w="0"/>
       <penalty w="0" p="INF"/>
       <glue w="7500"/>
-      <box w="15000"/>
-      <penalty w="0"/>
-      <box w="5000"/>
-      <penalty w="5000"/>
-      <box w="0"/>
-      <penalty w="10000"/>
-      <box w="15000"/>
+      <box w="2500"/>
+      <penalty w="10000" p="900"/>
+      <box w="12500"/>
       <penalty w="0"/>
+      <box w="7500"/>
+      <penalty w="0" p="900"/>
       <box w="0"/>
       <penalty w="5000"/>
-      <box w="15000"/>
+      <box w="12500"/>
+      <penalty w="0"/>
+      <box w="2500"/>
+      <penalty w="0" p="900"/>
+      <box w="12500"/>
       <box w="0"/> <!-- with SpaceHandlingPosition -->
       <penalty w="0" p="INF"/>
       <glue w="7500"/>



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org