Author: vhennebert
Date: Wed Apr 30 18:40:55 2014
New Revision: 1591443

URL: http://svn.apache.org/r1591443
Log:
FOP-2293: extension to the layout engine for managing white space at the bottom 
of a page
Content may have several variants of different sizes, from which the first that 
fits on the remaining space will be selected.

Merged the branch Temp_WhitespaceManagement into trunk.
This work was carried out by Seifeddine Dridi

Added:
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/MultiCaseLayoutManager.java
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiCaseLayoutManager.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/MultiSwitchLayoutManager.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/src/java/org/apache/fop/layoutmgr/WhitespaceManagementPenalty.java
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_basic.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_basic.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_forced-page-break.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_forced-page-break.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_middle-page.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_middle-page.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_multiple-variants.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_multiple-variants.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_padding.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_padding.xml
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_several-multi-switch.xml
      - copied unchanged from r1591437, 
xmlgraphics/fop/branches/Temp_WhitespaceManagement/test/layoutengine/standard-testcases/multi-switch_select-first-fitting_several-multi-switch.xml
Modified:
    xmlgraphics/fop/trunk/   (props changed)
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiCase.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiSwitch.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiToggle.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ElementListUtils.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutContext.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/KnuthAlgorithmTestCase.java

Propchange: xmlgraphics/fop/trunk/
------------------------------------------------------------------------------
  Merged /xmlgraphics/fop/branches/Temp_WhitespaceManagement:r1518682-1591437

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java Wed Apr 30 
18:40:55 2014
@@ -819,8 +819,11 @@ public interface Constants {
     /** For specifying PDF optional content group (layer) binding. */
     int PR_X_LAYER = 291;
 
+    /** Property constant */
+    int PR_X_AUTO_TOGGLE = 292;
+
     /** Number of property constants defined */
-    int PROPERTY_COUNT = 291;
+    int PROPERTY_COUNT = 292;
 
     // compound property constants
 
@@ -1260,6 +1263,8 @@ public interface Constants {
     int EN_TB_LR = 205; // for top-to-bottom, left-to-right writing mode
     /** Enumeration constant -- for fo:retrieve-table-marker */
     int EN_FIRST_INCLUDING_CARRYOVER = 206;
+    /** Enumeration constant -- for auto-toggle */
+    int EN_SELECT_FIRST_FITTING = 207;
     /** Number of enumeration constants defined */
-    int ENUM_COUNT = 206;
+    int ENUM_COUNT = 207;
 }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java Wed 
Apr 30 18:40:55 2014
@@ -581,6 +581,7 @@ public final class FOPropertyMapping imp
 
         // background-color
         m  = new ColorProperty.Maker(PR_BACKGROUND_COLOR) {
+            @Override
             protected Property convertPropertyDatatype(
                     Property p, PropertyList propertyList, FObj fo) throws 
PropertyException {
                 String nameval = p.getNCname();
@@ -1620,6 +1621,7 @@ public final class FOPropertyMapping imp
 
         // text-align TODO: make it a StringProperty with enums.
         m  = new EnumProperty.Maker(PR_TEXT_ALIGN) {
+            @Override
             public Property get(int subpropId, PropertyList propertyList,
                     boolean bTryInherit, boolean bTryDefault) throws 
PropertyException {
                 Property p = super.get(subpropId, propertyList, bTryInherit, 
bTryDefault);
@@ -1649,6 +1651,7 @@ public final class FOPropertyMapping imp
 
         // text-align-last
         m  = new EnumProperty.Maker(PR_TEXT_ALIGN_LAST) {
+            @Override
             public Property get(int subpropId, PropertyList propertyList,
                     boolean bTryInherit, boolean bTryDefault) throws 
PropertyException {
                 Property p = super.get(subpropId, propertyList, bTryInherit, 
bTryDefault);
@@ -2125,7 +2128,7 @@ public final class FOPropertyMapping imp
         addPropertyMaker("starting-state", m);
 
         // switch-to
-        m  = new ToBeImplementedProperty.Maker(PR_SWITCH_TO);
+        m  = new StringProperty.Maker(PR_SWITCH_TO);
         m.setInherited(false);
         m.setDefault("xsl-any");
         addPropertyMaker("switch-to", m);
@@ -2614,6 +2617,12 @@ public final class FOPropertyMapping imp
         m.setDefault("");
         addPropertyMaker("fox:alt-text", m);
 
+        // fox:auto-toggle, used only in fo:multi-switch
+        m = new EnumProperty.Maker(PR_X_AUTO_TOGGLE);
+        m.setInherited(false);
+        m.addEnum("select-first-fitting", 
getEnumProperty(EN_SELECT_FIRST_FITTING, "SELECT_FIRST_FITTING"));
+        m.setDefault("select-first-fitting");
+        addPropertyMaker("fox:auto-toggle", m);
 
         // fox:border-*-radius-*
         m = new CondLengthProperty.Maker(PR_X_BORDER_BEFORE_RADIUS_START);

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
 Wed Apr 30 18:40:55 2014
@@ -49,6 +49,7 @@ public class ExtensionElementMapping ext
         PROPERTY_ATTRIBUTES.add("orphan-content-limit");
         PROPERTY_ATTRIBUTES.add("internal-destination");
         PROPERTY_ATTRIBUTES.add("disable-column-balancing");
+        PROPERTY_ATTRIBUTES.add("auto-toggle");
         //These are FOP's extension properties for accessibility
         PROPERTY_ATTRIBUTES.add("alt-text");
         PROPERTY_ATTRIBUTES.add("header");
@@ -80,6 +81,7 @@ public class ExtensionElementMapping ext
     /**
      * Initialize the data structures.
      */
+    @Override
     protected void initialize() {
         if (foObjs == null) {
             foObjs = new HashMap<String, Maker>();
@@ -91,23 +93,27 @@ public class ExtensionElementMapping ext
     }
 
     static class DestinationMaker extends ElementMapping.Maker {
+        @Override
         public FONode make(FONode parent) {
             return new Destination(parent);
         }
     }
 
     static class ExternalDocumentMaker extends ElementMapping.Maker {
+        @Override
         public FONode make(FONode parent) {
             return new ExternalDocument(parent);
         }
     }
 
     /** {@inheritDoc} */
+    @Override
     public String getStandardPrefix() {
         return STANDARD_PREFIX;
     }
 
     /** {@inheritDoc} */
+    @Override
     public boolean isAttributeProperty(QName attributeName) {
         if (!URI.equals(attributeName.getNamespaceURI())) {
             throw new IllegalArgumentException("The namespace URIs don't 
match");

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiCase.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiCase.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiCase.java Wed 
Apr 30 18:40:55 2014
@@ -19,10 +19,13 @@
 
 package org.apache.fop.fo.flow;
 
+import org.xml.sax.Locator;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.PropertyList;
+import org.apache.fop.fo.ValidationException;
 
 /**
  * Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_multi-case";>
@@ -30,16 +33,15 @@ import org.apache.fop.fo.PropertyList;
  * TODO implement validateChildNode()
  */
 public class MultiCase extends FObj {
-    // The value of properties relevant for fo:multi-case.
+
+    // FO multi-case properties
     private int startingState;
-    // private ToBeImplementedProperty caseName;
-    // private ToBeImplementedProperty caseTitle;
+    private String caseName;
+    private String caseTitle;
     // Unused but valid items, commented out for performance:
     //     private CommonAccessibility commonAccessibility;
     // End of property values
 
-    private static boolean notImplementedWarningGiven = false;
-
     /**
      * Base constructor
      *
@@ -47,20 +49,38 @@ public class MultiCase extends FObj {
      */
     public MultiCase(FONode parent) {
         super(parent);
-
-        if (!notImplementedWarningGiven) {
-            getFOValidationEventProducer().unimplementedFeature(this, 
getName(),
-                    getName(), getLocator());
-            notImplementedWarningGiven = true;
-        }
     }
 
-    /** {@inheritDoc} */
+    @Override
     public void bind(PropertyList pList) throws FOPException {
         super.bind(pList);
         startingState = pList.get(PR_STARTING_STATE).getEnum();
-        // caseName = pList.get(PR_CASE_NAME);
-        // caseTitle = pList.get(PR_CASE_TITLE);
+        caseName = pList.get(PR_CASE_NAME).getString();
+        caseTitle = pList.get(PR_CASE_TITLE).getString();
+    }
+
+    /**
+     * Content Model: (#PCDATA|%inline;|%block)*
+     */
+    @Override
+    protected void validateChildNode(Locator loc, String nsURI, String 
localName)
+            throws ValidationException {
+        if (FO_URI.equals(nsURI)) {
+            if (!isBlockOrInlineItem(nsURI, localName) || 
"marker".equals(localName)) {
+                invalidChildError(loc, nsURI, localName);
+            }
+            if (!"multi-toggle".equals(localName)) {
+                // Validate against parent of fo:multi-switch
+                FONode.validateChildNode(getParent().getParent(), loc, nsURI, 
localName);
+            }
+        }
+    }
+
+    @Override
+    public void endOfNode() throws FOPException {
+        if (firstChild == null) {
+            missingChildElementError("(#PCDATA|%inline;|%block)*");
+        }
     }
 
     /** @return the "starting-state" property */
@@ -68,7 +88,7 @@ public class MultiCase extends FObj {
         return startingState;
     }
 
-    /** {@inheritDoc} */
+    @Override
     public String getLocalName() {
         return "multi-case";
     }
@@ -77,7 +97,17 @@ public class MultiCase extends FObj {
      * {@inheritDoc}
      * @return {@link org.apache.fop.fo.Constants#FO_MULTI_CASE}
      */
+    @Override
     public int getNameId() {
         return FO_MULTI_CASE;
     }
+
+    public String getCaseName() {
+        return caseName;
+    }
+
+    public String getCaseTitle() {
+        return caseTitle;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiSwitch.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiSwitch.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiSwitch.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiSwitch.java Wed 
Apr 30 18:40:55 2014
@@ -19,7 +19,6 @@
 
 package org.apache.fop.fo.flow;
 
-// XML
 import org.xml.sax.Locator;
 
 import org.apache.fop.apps.FOPException;
@@ -39,7 +38,7 @@ public class MultiSwitch extends FObj {
     //     private CommonAccessibility commonAccessibility;
     // End of property values
 
-    private static boolean notImplementedWarningGiven = false;
+    private int autoToggle;
 
     /**
      * Base constructor
@@ -48,32 +47,30 @@ public class MultiSwitch extends FObj {
      */
     public MultiSwitch(FONode parent) {
         super(parent);
-
-        if (!notImplementedWarningGiven) {
-            getFOValidationEventProducer().unimplementedFeature(this, 
getName(),
-                    getName(), getLocator());
-            notImplementedWarningGiven = true;
-        }
     }
 
     /** {@inheritDoc} */
+    @Override
     public void bind(PropertyList pList) throws FOPException {
         super.bind(pList);
+        autoToggle = pList.get(PR_X_AUTO_TOGGLE).getEnum();
         // autoRestore = pList.get(PR_AUTO_RESTORE);
     }
 
-
     /** {@inheritDoc} */
+    @Override
     public void endOfNode() throws FOPException {
         if (firstChild == null) {
             missingChildElementError("(multi-case+)");
         }
+        super.endOfNode();
     }
 
     /**
      * {@inheritDoc}
      * <br>XSL Content Model: (multi-case+)
      */
+    @Override
     protected void validateChildNode(Locator loc, String nsURI, String 
localName)
                 throws ValidationException {
         if (FO_URI.equals(nsURI)) {
@@ -84,6 +81,7 @@ public class MultiSwitch extends FObj {
     }
 
     /** {@inheritDoc} */
+    @Override
     public String getLocalName() {
         return "multi-switch";
     }
@@ -92,7 +90,13 @@ public class MultiSwitch extends FObj {
      * {@inheritDoc}
      * @return {@link org.apache.fop.fo.Constants#FO_MULTI_SWITCH}
      */
+    @Override
     public int getNameId() {
         return FO_MULTI_SWITCH;
     }
+
+    public int getAutoToggle() {
+        return autoToggle;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiToggle.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiToggle.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiToggle.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/flow/MultiToggle.java Wed 
Apr 30 18:40:55 2014
@@ -19,7 +19,6 @@
 
 package org.apache.fop.fo.flow;
 
-// FOP
 import org.xml.sax.Locator;
 
 import org.apache.fop.apps.FOPException;
@@ -27,6 +26,7 @@ import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.ValidationException;
+import org.apache.fop.fo.properties.StringProperty;
 
 
 /**
@@ -36,7 +36,7 @@ import org.apache.fop.fo.ValidationExcep
 public class MultiToggle extends FObj {
     // The value of properties relevant for fo:multi-toggle (commented out for 
performance).
     //     private CommonAccessibility commonAccessibility;
-    // public ToBeImplementedProperty prSwitchTo;
+     public StringProperty prSwitchTo;
     // End of property values
 
     private static boolean notImplementedWarningGiven = false;
@@ -57,15 +57,17 @@ public class MultiToggle extends FObj {
     }
 
     /** {@inheritDoc} */
+    @Override
     public void bind(PropertyList pList) throws FOPException {
-        // prSwitchTo = pList.get(PR_SWITCH_TO);
-
+        super.bind(pList);
+        prSwitchTo = (StringProperty) pList.get(PR_SWITCH_TO);
     }
 
     /**
      * {@inheritDoc}
      * <br>XSL Content Model: (#PCDATA|%inline;|%block;)*
      */
+    @Override
     protected void validateChildNode(Locator loc, String nsURI, String 
localName)
                 throws ValidationException {
         if (FO_URI.equals(nsURI)) {
@@ -76,6 +78,7 @@ public class MultiToggle extends FObj {
     }
 
     /** {@inheritDoc} */
+    @Override
     public String getLocalName() {
         return "multi-toggle";
     }
@@ -84,7 +87,9 @@ public class MultiToggle extends FObj {
      * {@inheritDoc}
      * @return {@link org.apache.fop.fo.Constants#FO_MULTI_TOGGLE}
      */
+    @Override
     public int getNameId() {
         return FO_MULTI_TOGGLE;
     }
+
 }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java 
(original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java 
Wed Apr 30 18:40:55 2014
@@ -107,9 +107,9 @@ public abstract class AbstractBreaker {
          * of previous BlockSequence?), EN_COLUMN, EN_ODD_PAGE,
          * EN_EVEN_PAGE.
          */
-        private int startOn;
+        private final int startOn;
 
-        private int displayAlign;
+        private final int displayAlign;
 
         /**
          * Creates a new BlockSequence.
@@ -142,6 +142,7 @@ public abstract class AbstractBreaker {
          * Finalizes a Knuth sequence.
          * @return a finalized sequence.
          */
+        @Override
         public KnuthSequence endSequence() {
             return endSequence(null);
         }
@@ -611,7 +612,6 @@ public abstract class AbstractBreaker {
                 // Handle SpaceHandling(Break)Positions, see SpaceResolver!
                 SpaceResolver.performConditionalsNotification(effectiveList,
                         startElementIndex, notificationEndElementIndex, 
lastBreak);
-
                 // Add areas now!
                 addAreas(new KnuthPossPosIter(effectiveList,
                         startElementIndex, endElementIndex + 1), childLC);

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java 
(original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java 
Wed Apr 30 18:40:55 2014
@@ -319,12 +319,12 @@ public abstract class BreakingAlgorithm 
     protected class BestRecords {
         private static final double INFINITE_DEMERITS = 
Double.POSITIVE_INFINITY;
 
-        private double[] bestDemerits = new double[4];
-        private KnuthNode[] bestNode = new KnuthNode[4];
-        private double[] bestAdjust = new double[4];
-        private int[] bestDifference = new int[4];
-        private int[] bestAvailableShrink = new int[4];
-        private int[] bestAvailableStretch = new int[4];
+        private final double[] bestDemerits = new double[4];
+        private final KnuthNode[] bestNode = new KnuthNode[4];
+        private final double[] bestAdjust = new double[4];
+        private final int[] bestDifference = new int[4];
+        private final int[] bestAvailableShrink = new int[4];
+        private final int[] bestAvailableStretch = new int[4];
         /** Points to the fitness class which currently leads to the best 
demerits. */
         private int bestIndex = -1;
 
@@ -988,7 +988,7 @@ public abstract class BreakingAlgorithm 
      * @param node  the node
      * @param line  the line number
      * @param elementIdx    the position index of the element
-     * @param difference    the difference between content-length and 
avaialable width
+     * @param difference    the difference between content-length and 
available width
      * @param r     the adjustment ratio
      * @param demerits  demerits produced by the node
      * @param fitnessClass  the fitness class

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ElementListUtils.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ElementListUtils.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ElementListUtils.java 
(original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ElementListUtils.java 
Wed Apr 30 18:40:55 2014
@@ -201,7 +201,7 @@ public final class ElementListUtils {
         if (last.isPenalty() && ((KnuthPenalty)last).getPenalty() < 
KnuthElement.INFINITE) {
             return true;
         } else if (last instanceof BreakElement
-                        && ((BreakElement)last).getPenaltyValue() < 
KnuthElement.INFINITE) {
+                && ((BreakElement)last).getPenaltyValue() < 
KnuthElement.INFINITE) {
             return true;
         }
         return false;

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java 
(original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java 
Wed Apr 30 18:40:55 2014
@@ -48,7 +48,7 @@ public class FlowLayoutManager extends B
     private static Log log = LogFactory.getLog(FlowLayoutManager.class);
 
     /** Array of areas currently being filled stored by area class */
-    private BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX];
+    private final BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX];
 
     /**
      * This is the top level layout manager.

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutContext.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutContext.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutContext.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutContext.java 
Wed Apr 30 18:40:55 2014
@@ -644,26 +644,27 @@ public final class LayoutContext {
     }
 
     /** {@inheritDoc} */
+    @Override
     public String toString() {
         return "Layout Context:"
-        + "\nStack Limit BPD: \t"
-            + (getStackLimitBP() == null ? "null" : 
getStackLimitBP().toString())
-        + "\nTrailing Space: \t"
-            + (getTrailingSpace() == null ? "null" : 
getTrailingSpace().toString())
-        + "\nLeading Space: \t"
-            + (getLeadingSpace() == null ? "null" : 
getLeadingSpace().toString())
-        + "\nReference IPD: \t" + getRefIPD()
-        + "\nSpace Adjust: \t" + getSpaceAdjust()
-        + "\nIPD Adjust: \t" + getIPDAdjust()
-        + "\nResolve Leading Space: \t" + resolveLeadingSpace()
-        + "\nSuppress Break Before: \t" + suppressBreakBefore()
-        + "\nIs First Area: \t" + isFirstArea()
-        + "\nStarts New Area: \t" + startsNewArea()
-        + "\nIs Last Area: \t" + isLastArea()
-        + "\nKeeps: \t[keep-with-next=" + getKeepWithNextPending()
+                + "\nStack Limit BPD: \t"
+                + (getStackLimitBP() == null ? "null" : 
getStackLimitBP().toString())
+                + "\nTrailing Space: \t"
+                + (getTrailingSpace() == null ? "null" : 
getTrailingSpace().toString())
+                + "\nLeading Space: \t"
+                + (getLeadingSpace() == null ? "null" : 
getLeadingSpace().toString())
+                + "\nReference IPD: \t" + getRefIPD()
+                + "\nSpace Adjust: \t" + getSpaceAdjust()
+                + "\nIPD Adjust: \t" + getIPDAdjust()
+                + "\nResolve Leading Space: \t" + resolveLeadingSpace()
+                + "\nSuppress Break Before: \t" + suppressBreakBefore()
+                + "\nIs First Area: \t" + isFirstArea()
+                + "\nStarts New Area: \t" + startsNewArea()
+                + "\nIs Last Area: \t" + isLastArea()
+                + "\nKeeps: \t[keep-with-next=" + getKeepWithNextPending()
                 + "][keep-with-previous=" + getKeepWithPreviousPending() + "] 
pending"
-        + "\nBreaks: \tforced [" + (breakBefore != Constants.EN_AUTO ? 
"break-before" : "") + "]["
-        + (breakAfter != Constants.EN_AUTO ? "break-after" : "") + "]";
+                + "\nBreaks: \tforced [" + (breakBefore != Constants.EN_AUTO ? 
"break-before" : "") + "]["
+                + (breakAfter != Constants.EN_AUTO ? "break-after" : "") + "]";
     }
 
     /**

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 Wed Apr 30 18:40:55 2014
@@ -49,6 +49,8 @@ import org.apache.fop.fo.flow.InstreamFo
 import org.apache.fop.fo.flow.Leader;
 import org.apache.fop.fo.flow.ListBlock;
 import org.apache.fop.fo.flow.ListItem;
+import org.apache.fop.fo.flow.MultiCase;
+import org.apache.fop.fo.flow.MultiSwitch;
 import org.apache.fop.fo.flow.PageNumber;
 import org.apache.fop.fo.flow.PageNumberCitation;
 import org.apache.fop.fo.flow.PageNumberCitationLast;
@@ -96,7 +98,7 @@ public class LayoutManagerMapping implem
     private static final Log LOG = 
LogFactory.getLog(LayoutManagerMapping.class);
 
     /** The map of LayoutManagerMakers */
-    private Map makers = new HashMap();
+    private final Map makers = new HashMap();
 
     /** default constructor */
     public LayoutManagerMapping() {
@@ -142,6 +144,8 @@ public class LayoutManagerMapping implem
         registerMaker(TableHeader.class, new Maker());
         registerMaker(Wrapper.class, new WrapperLayoutManagerMaker());
         registerMaker(Title.class, new InlineLayoutManagerMaker());
+        registerMaker(MultiCase.class, new MultiCaseLayoutManagerMaker());
+        registerMaker(MultiSwitch.class, new MultiSwitchLayoutManagerMaker());
     }
 
     /**
@@ -443,4 +447,20 @@ public class LayoutManagerMapping implem
         }
     }
 
+    public class MultiSwitchLayoutManagerMaker extends Maker {
+
+        @Override
+        public void make(FONode node, List lms) {
+            lms.add(new MultiSwitchLayoutManager((MultiSwitch) node));
+        }
+    }
+
+    public class MultiCaseLayoutManagerMaker extends Maker {
+
+        @Override
+        public void make(FONode node, List lms) {
+            lms.add(new MultiCaseLayoutManager((MultiCase) node));
+        }
+    }
+
 }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 Wed Apr 30 18:40:55 2014
@@ -30,6 +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.WhitespaceManagementPenalty.Variant;
 import org.apache.fop.traits.MinOptMax;
 import org.apache.fop.util.ListUtil;
 
@@ -38,9 +39,9 @@ class PageBreakingAlgorithm extends Brea
     /** the logger for the class */
     private static Log log = LogFactory.getLog(PageBreakingAlgorithm.class);
 
-    private LayoutManager topLevelLM;
-    private PageProvider pageProvider;
-    private PageBreakingLayoutListener layoutListener;
+    private final LayoutManager topLevelLM;
+    private final PageProvider pageProvider;
+    private final PageBreakingLayoutListener layoutListener;
     /** List of PageBreakPosition elements. */
     private LinkedList<PageBreakPosition> pageBreaks = null;
 
@@ -73,9 +74,9 @@ class PageBreakingAlgorithm extends Brea
     private int footnoteElementIndex = -1;
 
     // demerits for a page break that splits a footnote
-    private int splitFootnoteDemerits = 5000;
+    private final int splitFootnoteDemerits = 5000;
     // demerits for a page break that defers a whole footnote to the following 
page
-    private int deferredFootnoteDemerits = 10000;
+    private final int deferredFootnoteDemerits = 10000;
     private MinOptMax footnoteSeparatorLength = null;
 
     // the method noBreakBetween(int, int) uses these variables
@@ -152,6 +153,14 @@ class PageBreakingAlgorithm extends Brea
         /** Index of the last inserted element of the last inserted footnote. 
*/
         public int footnoteElementIndex;
 
+        /**
+         * 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,
                              int totalWidth, int totalStretch, int totalShrink,
@@ -169,6 +178,11 @@ class PageBreakingAlgorithm extends Brea
             this.footnoteElementIndex = footnoteElementIndex;
         }
 
+        public void addVariant(Variant variant) {
+            pendingVariants.add(variant);
+            totalVariantsWidth += variant.width;
+        }
+
     }
 
     /**
@@ -177,11 +191,12 @@ class PageBreakingAlgorithm extends Brea
      */
     protected class BestPageRecords extends BestRecords {
 
-        private int[] bestInsertedFootnotesLength = new int[4];
-        private int[] bestTotalFootnotesLength = new int[4];
-        private int[] bestFootnoteListIndex = new int[4];
-        private int[] bestFootnoteElementIndex = new int[4];
+        private final int[] bestInsertedFootnotesLength = new int[4];
+        private final int[] bestTotalFootnotesLength = new int[4];
+        private final int[] bestFootnoteListIndex = new int[4];
+        private final int[] bestFootnoteElementIndex = new int[4];
 
+        @Override
         public void addRecord(double demerits, KnuthNode node, double adjust,
                               int availableShrink, int availableStretch,
                               int difference, int fitness) {
@@ -209,6 +224,8 @@ class PageBreakingAlgorithm extends Brea
         public int getFootnoteElementIndex(int fitness) {
             return bestFootnoteElementIndex[fitness];
         }
+
+
     }
 
     /** {@inheritDoc} */
@@ -406,6 +423,7 @@ class PageBreakingAlgorithm extends Brea
     /** {@inheritDoc} */
     @Override
     protected int restartFrom(KnuthNode restartingNode, int currentIndex) {
+
         int returnValue = super.restartFrom(restartingNode, currentIndex);
         newFootnotes = false;
         if (footnotesPending) {
@@ -509,7 +527,11 @@ class PageBreakingAlgorithm extends Brea
         int actualWidth = totalWidth - pageNode.totalWidth;
         int footnoteSplit;
         boolean canDeferOldFN;
-        if (element.isPenalty()) {
+        actualWidth += pageNode.totalVariantsWidth;
+        if (element instanceof WhitespaceManagementPenalty) {
+            actualWidth += handleWhitespaceManagementPenalty(pageNode,
+                    (WhitespaceManagementPenalty) element, elementIndex);
+        } else if (element.isPenalty()) {
             actualWidth += element.getWidth();
         }
         if (footnotesPending) {
@@ -571,6 +593,24 @@ class PageBreakingAlgorithm extends Brea
     }
 
     /**
+     * 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.getPenalty(), 
elementIndex);
+            double r = computeAdjustmentRatio(activeNode, difference);
+            if (r >= -1.0) {
+                activeNode.addVariant(var);
+                return var.width;
+            }
+        }
+        return 0;
+    }
+
+    /**
      * Checks whether footnotes from preceding pages may be deferred to the 
page after
      * the given element.
      * @param node active node for the preceding page break
@@ -982,6 +1022,17 @@ class PageBreakingAlgorithm extends Brea
                             int total) {
         //int difference = (bestActiveNode.line < total)
         //      ? bestActiveNode.difference : bestActiveNode.difference + 
fillerMinWidth;
+        // Check if the given node has an attached variant of a dynamic content
+        KnuthPageNode pageNode = (KnuthPageNode) bestActiveNode;
+        KnuthPageNode previousPageNode = ((KnuthPageNode) pageNode.previous);
+        for (Variant var : previousPageNode.pendingVariants) {
+            WhitespaceManagementPenalty penalty = 
var.getWhitespaceManagementPenalty();
+            // A WMPenalty should not be activated more than once. The reason 
is simply
+            // because a dynamic content cannot occupy multiple pages at the 
same time.
+            if (!penalty.hasActiveVariant()) {
+                penalty.setActiveVariant(var);
+            }
+        }
         int difference = bestActiveNode.difference;
         if (difference + bestActiveNode.availableShrink < 0) {
             if (!autoHeight) {

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/KnuthAlgorithmTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/KnuthAlgorithmTestCase.java?rev=1591443&r1=1591442&r2=1591443&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/KnuthAlgorithmTestCase.java 
(original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/KnuthAlgorithmTestCase.java 
Wed Apr 30 18:40:55 2014
@@ -89,7 +89,7 @@ public class KnuthAlgorithmTestCase {
 
     private class MyBreakingAlgorithm extends BreakingAlgorithm {
 
-        private List parts = new java.util.ArrayList();
+        private final List<Part> parts = new java.util.ArrayList<Part>();
 
         public MyBreakingAlgorithm(int align, int alignLast, boolean first,
                     boolean partOverflowRecovery, int maxFlagCount) {
@@ -97,13 +97,15 @@ public class KnuthAlgorithmTestCase {
         }
 
         public Part[] getParts() {
-            return (Part[])parts.toArray(new Part[parts.size()]);
+            return parts.toArray(new Part[parts.size()]);
         }
 
+        @Override
         public void updateData1(int total, double demerits) {
             //nop
         }
 
+        @Override
         public void updateData2(KnuthNode bestActiveNode, KnuthSequence 
sequence, int total) {
             int difference = bestActiveNode.difference;
             // it is always allowed to adjust space, so the ratio must be set 
regardless of
@@ -137,6 +139,7 @@ public class KnuthAlgorithmTestCase {
             parts.add(0, part);
         }
 
+        @Override
         protected int filterActiveNodes() {
             //nop
             return 0;



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

Reply via email to