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]