Author: vhennebert
Date: Tue Apr  8 19:30:37 2014
New Revision: 1585822

URL: http://svn.apache.org/r1585822
Log:
Added support for multiple multi-switch appearing on the same page.
Modified MultiSwitchLM to have its standard behaviour by default.
Moved BestFitLayoutUtils into MultiSwitchLM.
Code clean-up and javadoc.

Patch by Seifeddine Dridi, applied with some modifications.

Added:
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java
      - copied, changed from r1582469, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitPenalty.java
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
   (with props)
Removed:
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitLayoutUtils.java
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitPenalty.java
Modified:
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/fo/flow/MultiSwitch.java
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
    
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java

Modified: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/fo/flow/MultiSwitch.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/fo/flow/MultiSwitch.java?rev=1585822&r1=1585821&r2=1585822&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/fo/flow/MultiSwitch.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/fo/flow/MultiSwitch.java
 Tue Apr  8 19:30:37 2014
@@ -38,9 +38,7 @@ public class MultiSwitch extends FObj {
     //     private CommonAccessibility commonAccessibility;
     // End of property values
 
-    private FONode currentlyVisibleMultiCase;
     private String autoToggle;
-    private String fittingStrategy;
 
     /**
      * Base constructor
@@ -97,18 +95,6 @@ public class MultiSwitch extends FObj {
         return FO_MULTI_SWITCH;
     }
 
-    public void setCurrentlyVisibleNode(FONode node) {
-        currentlyVisibleMultiCase = node;
-    }
-
-    public FONode getCurrentlyVisibleNode() {
-        return currentlyVisibleMultiCase;
-    }
-
-    public String getFittingStrategy() {
-        return fittingStrategy;
-    }
-
     public String getAutoToggle() {
         return autoToggle;
     }

Modified: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java?rev=1585822&r1=1585821&r2=1585822&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 Tue Apr  8 19:30:37 2014
@@ -451,18 +451,8 @@ public class LayoutManagerMapping implem
 
         @Override
         public void make(FONode node, List lms) {
-            MultiSwitch multiSwitch = (MultiSwitch) node;
-            MultiSwitchLayoutManager mslm = new 
MultiSwitchLayoutManager(multiSwitch);
-            FONode multiCase = multiSwitch.getCurrentlyVisibleNode();
-            if (multiCase != null) {
-                FONodeIterator childIter = multiCase.getChildNodes();
-                while (childIter.hasNext()) {
-                    FONode child = (FONode) childIter.next();
-                    makeLayoutManagers(child, lms);
-                }
-            } else {
-                lms.add(mslm);
-            }
+            MultiSwitchLayoutManager mslm = new 
MultiSwitchLayoutManager((MultiSwitch) node);
+            lms.add(mslm);
         }
     }
 

Modified: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java?rev=1585822&r1=1585821&r2=1585822&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
 Tue Apr  8 19:30:37 2014
@@ -17,38 +17,123 @@
 
 package org.apache.fop.layoutmgr;
 
-import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.fop.area.Area;
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.flow.MultiSwitch;
 
 public class MultiSwitchLayoutManager extends BlockStackingLayoutManager {
 
+    static class WhitespaceManagementPosition extends Position {
+
+        private List<ListElement> knuthList;
+
+        public WhitespaceManagementPosition(LayoutManager lm) {
+            super(lm);
+        }
+
+        public List<Position> getPositionList() {
+            List<Position> positions = new LinkedList<Position>();
+            if (knuthList != null && !knuthList.isEmpty()) {
+                SpaceResolver.performConditionalsNotification(knuthList, 0, 
knuthList.size() - 1, -1);
+                for (ListElement el : knuthList) {
+                    if (el.getPosition() != null) {
+                        positions.add(el.getPosition());
+                    }
+                }
+            }
+            return positions;
+        }
+
+        public void setKnuthList(List<ListElement> knuthList) {
+            this.knuthList = knuthList;
+        }
+
+        public List<ListElement> getKnuthList() {
+            return knuthList;
+        }
+
+    }
+
+    private interface KnuthElementsGenerator {
+        List<ListElement> getKnuthElement(LayoutContext context, int 
alignment);
+    }
+
+    private class DefaultKnuthListGenerator implements KnuthElementsGenerator {
+
+        public List<ListElement> getKnuthElement(LayoutContext context, int 
alignment) {
+
+            List<ListElement> knuthList = new LinkedList<ListElement>();
+            LayoutManager childLM;
+            while ((childLM = getChildLM()) != null) {
+                if (!childLM.isFinished()) {
+                    LayoutContext childLC = makeChildLayoutContext(context);
+                    List childElements = childLM.getNextKnuthElements(childLC, 
alignment);
+                    if (childElements != null) {
+                        List<ListElement> newList = new 
LinkedList<ListElement>();
+                        wrapPositionElements(childElements, newList);
+                        knuthList.addAll(newList);
+                    }
+                }
+            }
+            return knuthList;
+        }
+
+    }
+
+    private class WhitespaceManagement implements KnuthElementsGenerator {
+
+        public List<ListElement> getKnuthElement(LayoutContext context, int 
alignment) {
+
+            MultiSwitchLayoutManager mslm = MultiSwitchLayoutManager.this;
+            List<ListElement> knuthList = new LinkedList<ListElement>();
+            WhitespaceManagementPenalty penalty = new 
WhitespaceManagementPenalty(
+                    new WhitespaceManagementPosition(mslm));
+            LayoutManager childLM;
+            while ((childLM = getChildLM()) != null) {
+                if (!childLM.isFinished()) {
+                    LayoutContext childLC = makeChildLayoutContext(context);
+                    List childElements = childLM.getNextKnuthElements(childLC, 
alignment);
+                    if (childElements != null) {
+                        List<ListElement> newList = new 
LinkedList<ListElement>();
+                        wrapPositionElements(childElements, newList);
+                        // TODO Doing space resolution here is wrong.
+                        SpaceResolver.resolveElementList(newList);
+                        int contentLength = 
ElementListUtils.calcContentLength(newList);
+                        penalty.addVariant(penalty.new Variant(newList, 
contentLength));
+                    }
+                }
+            }
+            // Prevent the penalty from being ignored if it is at the 
beginning of the content
+            knuthList.add(new KnuthBox(0, new Position(mslm), false));
+            knuthList.add(penalty);
+            // Prevent the penalty from being ignored if it is at the end of 
the content
+            knuthList.add(new KnuthBox(0, new Position(mslm), false));
+            return knuthList;
+        }
+
+    }
+
+    private KnuthElementsGenerator knuthGen;
+
     public MultiSwitchLayoutManager(FObj node) {
         super(node);
+        MultiSwitch multiSwitchNode = (MultiSwitch) node;
+        if (multiSwitchNode.getAutoToggle().equals("best-fit")) {
+            knuthGen = new WhitespaceManagement();
+        } else {
+            knuthGen = new DefaultKnuthListGenerator();
+        }
     }
 
     @Override
     public List<ListElement> getNextKnuthElements(LayoutContext context, int 
alignment) {
-
         referenceIPD = context.getRefIPD();
-        List<List<ListElement>> childrenLists = new 
ArrayList<List<ListElement>>();
-        LayoutManager childLM;
-        while ((childLM = getChildLM()) != null) {
-            if (!childLM.isFinished()) {
-                LayoutContext childLC = makeChildLayoutContext(context);
-                List childElements = childLM.getNextKnuthElements(childLC, 
alignment);
-                if (childElements != null) {
-                    List<ListElement> newList = new LinkedList<ListElement>();
-                    wrapPositionElements(childElements, newList);
-                    childrenLists.add(newList);
-                }
-            }
-        }
+        List<ListElement> knuthList = knuthGen.getKnuthElement(context, 
alignment);
         setFinished(true);
-        return BestFitLayoutUtils.getKnuthList(this, childrenLists);
+        return knuthList;
     }
 
     @Override
@@ -63,11 +148,16 @@ public class MultiSwitchLayoutManager ex
 
     @Override
     public void addAreas(PositionIterator posIter, LayoutContext context) {
-
-        List<Position> positionList = BestFitLayoutUtils.getPositionList(this, 
posIter);
-        PositionIterator newPosIter = new PositionIterator(
-                positionList.listIterator());
-
+        LinkedList<Position> positionList = new LinkedList<Position>();
+        while (posIter.hasNext()) {
+            Position pos = posIter.next();
+            if (pos instanceof WhitespaceManagementPosition) {
+                positionList.addAll(((WhitespaceManagementPosition) 
pos).getPositionList());
+            } else {
+                positionList.add(pos);
+            }
+        }
+        PositionIterator newPosIter = new 
PositionIterator(positionList.listIterator());
         AreaAdditionUtil.addAreas(this, newPosIter, context);
         flush();
     }

Modified: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java?rev=1585822&r1=1585821&r2=1585822&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 Tue Apr  8 19:30:37 2014
@@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFac
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.layoutmgr.AbstractBreaker.PageBreakPosition;
-import org.apache.fop.layoutmgr.BestFitPenalty.Variant;
+import org.apache.fop.layoutmgr.WhitespaceManagementPenalty.Variant;
 import org.apache.fop.traits.MinOptMax;
 import org.apache.fop.util.ListUtil;
 
@@ -153,10 +153,13 @@ class PageBreakingAlgorithm extends Brea
         /** Index of the last inserted element of the last inserted footnote. 
*/
         public int footnoteElementIndex;
 
-        /** Current active variant attached to this node */
-        public final Variant variant;
-        /** Pending variant to be assigned to all descending nodes */
-        public Variant pendingVariant;
+        /**
+         * Pending variants of dynamic contents that were evaluated WRT this 
node.
+         * When computing page difference for a break element, the total width 
of these variants
+         * will be added to 'actualWidth'.
+         */
+        private final List<Variant> pendingVariants = new ArrayList<Variant>();
+        private int totalVariantsWidth;
 
         public KnuthPageNode(int position,
                              int line, int fitness,
@@ -164,7 +167,7 @@ class PageBreakingAlgorithm extends Brea
                              int insertedFootnotes, int totalFootnotes,
                              int footnoteListIndex, int footnoteElementIndex,
                              double adjustRatio, int availableShrink, int 
availableStretch,
-                             int difference, double totalDemerits, KnuthNode 
previous, Variant variant) {
+                             int difference, double totalDemerits, KnuthNode 
previous) {
             super(position, line, fitness,
                   totalWidth, totalStretch, totalShrink,
                   adjustRatio, availableShrink, availableStretch,
@@ -173,7 +176,11 @@ class PageBreakingAlgorithm extends Brea
             this.insertedFootnotes = insertedFootnotes;
             this.footnoteListIndex = footnoteListIndex;
             this.footnoteElementIndex = footnoteElementIndex;
-            this.variant = variant;
+        }
+
+        public void addVariant(Variant variant) {
+            pendingVariants.add(variant);
+            totalVariantsWidth += variant.width;
         }
 
     }
@@ -188,7 +195,6 @@ class PageBreakingAlgorithm extends Brea
         private final int[] bestTotalFootnotesLength = new int[4];
         private final int[] bestFootnoteListIndex = new int[4];
         private final int[] bestFootnoteElementIndex = new int[4];
-        private final Variant[] bestVariant = new Variant[4];
 
         @Override
         public void addRecord(double demerits, KnuthNode node, double adjust,
@@ -201,7 +207,6 @@ class PageBreakingAlgorithm extends Brea
             bestTotalFootnotesLength[fitness] = totalFootnotesLength;
             bestFootnoteListIndex[fitness] = footnoteListIndex;
             bestFootnoteElementIndex[fitness] = footnoteElementIndex;
-            bestVariant[fitness] = ((KnuthPageNode) node).pendingVariant;
         }
 
         public int getInsertedFootnotesLength(int fitness) {
@@ -220,9 +225,6 @@ class PageBreakingAlgorithm extends Brea
             return bestFootnoteElementIndex[fitness];
         }
 
-        public Variant getVariant(int fitness) {
-            return bestVariant[fitness];
-        }
 
     }
 
@@ -316,8 +318,7 @@ class PageBreakingAlgorithm extends Brea
                                  insertedFootnotesLength, totalFootnotesLength,
                                  footnoteListIndex, footnoteElementIndex,
                                  adjustRatio, availableShrink, 
availableStretch,
-                                 difference, totalDemerits, previous,
-                                 (previous != null) ? 
((KnuthPageNode)previous).pendingVariant : null);
+                                 difference, totalDemerits, previous);
     }
 
     /** {@inheritDoc} */
@@ -332,8 +333,7 @@ class PageBreakingAlgorithm extends Brea
                                  ((BestPageRecords) 
best).getFootnoteElementIndex(fitness),
                                  best.getAdjust(fitness), 
best.getAvailableShrink(fitness),
                                  best.getAvailableStretch(fitness), 
best.getDifference(fitness),
-                                 best.getDemerits(fitness), 
best.getNode(fitness),
-                                 ((BestPageRecords) best).getVariant(fitness));
+                                 best.getDemerits(fitness), 
best.getNode(fitness));
     }
 
     /**
@@ -527,15 +527,12 @@ class PageBreakingAlgorithm extends Brea
         int actualWidth = totalWidth - pageNode.totalWidth;
         int footnoteSplit;
         boolean canDeferOldFN;
-        if (element.isPenalty()) {
-            if (element instanceof BestFitPenalty) {
-                actualWidth += handleBestFitPenalty(pageNode, (BestFitPenalty) 
element, elementIndex);
-            } else {
-                actualWidth += element.getWidth();
-                if (pageNode.pendingVariant != null) {
-                    actualWidth += ((KnuthPageNode) 
activeNode).pendingVariant.width;
-                }
-            }
+        actualWidth += pageNode.totalVariantsWidth;
+        if (element instanceof WhitespaceManagementPenalty) {
+            actualWidth += handleWhitespaceManagementPenalty(pageNode,
+                    (WhitespaceManagementPenalty) element, elementIndex);
+        } else if (element.isPenalty()) {
+            actualWidth += element.getWidth();
         }
         if (footnotesPending) {
             // compute the total length of the footnotes not yet inserted
@@ -595,13 +592,18 @@ class PageBreakingAlgorithm extends Brea
         }
     }
 
-    private int handleBestFitPenalty(KnuthPageNode activeNode, BestFitPenalty 
penalty, int elementIndex) {
+    /**
+     * Evaluates the variants corresponding to the given penalty until one that
+     * leads to an acceptable adjustment ratio is found. That variant will
+     * be added to the list of pending variants in the given active node.
+     */
+    private int handleWhitespaceManagementPenalty(KnuthPageNode activeNode,
+            WhitespaceManagementPenalty penalty, int elementIndex) {
         for (Variant var : penalty.getVariants()) {
             int difference = computeDifference(activeNode, var.toPenalty(), 
elementIndex);
             double r = computeAdjustmentRatio(activeNode, difference);
             if (r >= -1.0) {
-                var.penaltyIndex = elementIndex;
-                activeNode.pendingVariant = var;
+                activeNode.addVariant(var);
                 return var.width;
             }
         }
@@ -1022,9 +1024,14 @@ class PageBreakingAlgorithm extends Brea
         //      ? bestActiveNode.difference : bestActiveNode.difference + 
fillerMinWidth;
         // Check if the given node has an attached variant of a dynamic content
         KnuthPageNode pageNode = (KnuthPageNode) bestActiveNode;
-        if (pageNode.variant != null) {
-            BestFitPenalty penalty = (BestFitPenalty) 
par.get(pageNode.variant.penaltyIndex);
-            penalty.setActiveVariant(pageNode.variant);
+        KnuthPageNode previousPageNode = ((KnuthPageNode) pageNode.previous);
+        for (Variant var : previousPageNode.pendingVariants) {
+            WhitespaceManagementPenalty penalty = var.getBestFitPenalty();
+            int penaltyIndex = this.par.indexOf(penalty);
+            // Make sure penalty is inside the range of the current page node
+            if (penaltyIndex <= pageNode.position) {
+                penalty.setActiveVariant(var);
+            }
         }
         int difference = bestActiveNode.difference;
         if (difference + bestActiveNode.availableShrink < 0) {

Copied: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java
 (from r1582469, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitPenalty.java)
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java?p2=xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java&p1=xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitPenalty.java&r1=1582469&r2=1585822&rev=1585822&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/BestFitPenalty.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java
 Tue Apr  8 19:30:37 2014
@@ -22,39 +22,42 @@ package org.apache.fop.layoutmgr;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.fop.layoutmgr.BestFitLayoutUtils.BestFitPosition;
+import 
org.apache.fop.layoutmgr.MultiSwitchLayoutManager.WhitespaceManagementPosition;
 
 /**
- * A type of penalty used to specify a set of alternatives for the layout 
engine
- * to choose from. The chosen alternative must have an occupied size
- * less than the remaining BPD on the active page.
+ * A special penalty used to specify content having multiple variants. At most
+ * only one variant will be inserted into the final document. If none of the
+ * variants fit into the remaining space on the current page, the dynamic
+ * content will be completely ignored.
  */
-public class BestFitPenalty extends KnuthPenalty {
+public class WhitespaceManagementPenalty extends KnuthPenalty {
 
-    public static class Variant {
+    public class Variant {
 
         public final List<ListElement> knuthList;
         public final int width;
-        public int penaltyIndex;
 
         public Variant(List<ListElement> knuthList, int width) {
             this.knuthList = knuthList;
             this.width = width;
-            this.penaltyIndex = -1;
         }
 
         public KnuthElement toPenalty() {
             return new KnuthPenalty(width, 0, false, null, false);
         }
 
+        public WhitespaceManagementPenalty getBestFitPenalty() {
+            return WhitespaceManagementPenalty.this;
+        }
+
     }
 
-    private final BestFitPosition bestFitPosition;
+    private final WhitespaceManagementPosition whitespaceManagementPosition;
     private final List<Variant> variantList;
 
-    public BestFitPenalty(BestFitPosition pos) {
+    public WhitespaceManagementPenalty(WhitespaceManagementPosition pos) {
         super(0, 0, false, pos, false);
-        this.bestFitPosition = pos;
+        this.whitespaceManagementPosition = pos;
         variantList = new ArrayList<Variant>();
     }
 
@@ -63,7 +66,11 @@ public class BestFitPenalty extends Knut
     }
 
     public void setActiveVariant(Variant bestVariant) {
-        bestFitPosition.setKnuthList(bestVariant.knuthList);
+        whitespaceManagementPosition.setKnuthList(bestVariant.knuthList);
+    }
+
+    public boolean isActivated() {
+        return whitespaceManagementPosition.getKnuthList() != null;
     }
 
     public List<Variant> getVariants() {

Added: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml?rev=1585822&view=auto
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
 (added)
+++ 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
 Tue Apr  8 19:30:37 2014
@@ -0,0 +1,98 @@
+<?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.
+-->
+<testcase>
+  <info>
+    <p>
+      Test that multiple whitespace managment elements on the same page are 
handled nicely.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"; 
+      xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"; font-size="8pt" 
line-height="10pt">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="page"
+          page-height="70pt" page-width="220pt" margin="10pt">
+          <fo:region-body background-color="#F0F0F0"/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="page">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block>MS 1 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block>MS 2 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block>MS 3 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+        </fo:flow>
+      </fo:page-sequence>
+
+      <fo:page-sequence master-reference="page">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block line-height="70pt">MS 1 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block>MS 2 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block line-height="50pt">MS 3 Variant 1</fo:block>
+            </fo:multi-case>
+            <fo:multi-case>
+              <fo:block>MS 3 Variant 2</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+          <fo:multi-switch fox:auto-toggle="best-fit">
+            <fo:multi-case>
+              <fo:block>MS 4 Variant 1</fo:block>
+            </fo:multi-case>
+          </fo:multi-switch>
+        </fo:flow>
+      </fo:page-sequence>
+
+    </fo:root>
+  </fo>
+  <checks>
+    <!-- 1. 3 multi-switch on the same page -->
+    <eval expected="1"        xpath="count(//pageSequence[1]/pageViewport)"/>
+    <eval expected="3"        
xpath="count(//pageSequence[1]/pageViewport[1]//flow/block)"/>
+    <eval expected="MS 1 Variant 1" 
xpath="//pageSequence[1]/pageViewport[1]//flow/block[1]"/>
+    <eval expected="MS 2 Variant 1" 
xpath="//pageSequence[1]/pageViewport[1]//flow/block[2]"/>
+    <eval expected="MS 3 Variant 1" 
xpath="//pageSequence[1]/pageViewport[1]//flow/block[3]"/>
+
+    <!-- 2. 4 multi-switch, one cannot fit, one uses the 2nd variant  -->
+    <eval expected="1"        xpath="count(//pageSequence[2]/pageViewport)"/>
+    <eval expected="3"        
xpath="count(//pageSequence[2]/pageViewport[1]//flow/block)"/>
+    <eval expected="MS 2 Variant 1" 
xpath="//pageSequence[2]/pageViewport[1]//flow/block[1]"/>
+    <eval expected="MS 3 Variant 2" 
xpath="//pageSequence[2]/pageViewport[1]//flow/block[2]"/>
+    <eval expected="MS 4 Variant 1" 
xpath="//pageSequence[2]/pageViewport[1]//flow/block[3]"/>
+  </checks>
+</testcase>

Propchange: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_best-fit_multiple_dynamic_contents.xml
------------------------------------------------------------------------------
    svn:keywords = Revision Id



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to