aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop
diff options
context:
space:
mode:
authorFinn Bock <bckfnn@apache.org>2005-08-31 20:29:33 +0000
committerFinn Bock <bckfnn@apache.org>2005-08-31 20:29:33 +0000
commite194fdd5cfe3f1bc823d93c57420db87eb7efed0 (patch)
treee4e195d6e88bd85e02c48bffac90176543aba0cc /src/java/org/apache/fop
parent0c4637012c7a394bb3ae1b621ca89c7742b0612d (diff)
downloadxmlgraphics-fop-e194fdd5cfe3f1bc823d93c57420db87eb7efed0.tar.gz
xmlgraphics-fop-e194fdd5cfe3f1bc823d93c57420db87eb7efed0.zip
Bugzilla #36379:
Revised percentage resolution system. Submitted by: Manuel Mall <mm.at.arcus.com.au> Slightly modified to avoid early evaluation of getValue(). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@265577 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop')
-rw-r--r--src/java/org/apache/fop/area/Page.java41
-rw-r--r--src/java/org/apache/fop/datatypes/Length.java8
-rw-r--r--src/java/org/apache/fop/datatypes/LengthBase.java105
-rw-r--r--src/java/org/apache/fop/datatypes/Numeric.java15
-rw-r--r--src/java/org/apache/fop/datatypes/PercentBase.java15
-rw-r--r--src/java/org/apache/fop/datatypes/PercentBaseContext.java40
-rw-r--r--src/java/org/apache/fop/datatypes/SimplePercentBaseContext.java51
-rw-r--r--src/java/org/apache/fop/fo/Constants.java535
-rw-r--r--src/java/org/apache/fop/fo/FOPropertyMapping.java53
-rw-r--r--src/java/org/apache/fop/fo/InlineCharIterator.java4
-rw-r--r--src/java/org/apache/fop/fo/expr/LabelEndFunction.java2
-rwxr-xr-xsrc/java/org/apache/fop/fo/expr/NumericOp.java55
-rw-r--r--src/java/org/apache/fop/fo/expr/NumericProperty.java18
-rw-r--r--src/java/org/apache/fop/fo/expr/PropertyInfo.java11
-rw-r--r--src/java/org/apache/fop/fo/expr/PropertyParser.java11
-rw-r--r--src/java/org/apache/fop/fo/expr/RGBColorFunction.java5
-rwxr-xr-xsrc/java/org/apache/fop/fo/expr/RelativeNumericProperty.java47
-rw-r--r--src/java/org/apache/fop/fo/flow/ExternalGraphic.java13
-rw-r--r--src/java/org/apache/fop/fo/flow/InstreamForeignObject.java11
-rw-r--r--src/java/org/apache/fop/fo/flow/Table.java4
-rw-r--r--src/java/org/apache/fop/fo/flow/TableCell.java180
-rw-r--r--src/java/org/apache/fop/fo/pagination/Region.java8
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionAfter.java23
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionBA.java8
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionBefore.java23
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionBody.java25
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionEnd.java28
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionSE.java8
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionStart.java23
-rwxr-xr-xsrc/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java56
-rwxr-xr-xsrc/java/org/apache/fop/fo/properties/CommonFont.java5
-rw-r--r--src/java/org/apache/fop/fo/properties/CommonMarginBlock.java1
-rw-r--r--src/java/org/apache/fop/fo/properties/CondLengthProperty.java9
-rwxr-xr-xsrc/java/org/apache/fop/fo/properties/EnumLength.java23
-rw-r--r--src/java/org/apache/fop/fo/properties/FixedLength.java22
-rw-r--r--src/java/org/apache/fop/fo/properties/FontSizePropertyMaker.java4
-rw-r--r--src/java/org/apache/fop/fo/properties/LengthRangeProperty.java39
-rw-r--r--src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java10
-rw-r--r--src/java/org/apache/fop/fo/properties/NumberProperty.java21
-rw-r--r--src/java/org/apache/fop/fo/properties/PercentLength.java24
-rw-r--r--src/java/org/apache/fop/fo/properties/PropertyMaker.java2
-rw-r--r--src/java/org/apache/fop/fo/properties/SpaceProperty.java6
-rw-r--r--src/java/org/apache/fop/fo/properties/TableColLength.java20
-rw-r--r--src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java265
-rw-r--r--src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java22
-rw-r--r--src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java114
-rw-r--r--src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java128
-rw-r--r--src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java113
-rw-r--r--src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java20
-rw-r--r--src/java/org/apache/fop/layoutmgr/LayoutManager.java47
-rw-r--r--src/java/org/apache/fop/layoutmgr/MinOptMaxUtil.java39
-rw-r--r--src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java1
-rw-r--r--src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java45
-rw-r--r--src/java/org/apache/fop/layoutmgr/TraitSetter.java116
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/BidiLayoutManager.java3
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java8
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java54
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java83
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/FootnoteLayoutManager.java6
-rwxr-xr-xsrc/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java33
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java84
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java54
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java40
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java5
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java5
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java7
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java111
-rw-r--r--src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java25
-rw-r--r--src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java26
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java6
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/GridUnit.java3
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/PrimaryGridUnit.java5
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java85
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java68
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java77
-rw-r--r--src/java/org/apache/fop/layoutmgr/table/TableStepper.java8
-rw-r--r--src/java/org/apache/fop/render/rtf/TableAttributesConverter.java12
-rw-r--r--src/java/org/apache/fop/render/rtf/TextAttributesConverter.java4
-rw-r--r--src/java/org/apache/fop/traits/SpaceVal.java20
79 files changed, 2517 insertions, 837 deletions
diff --git a/src/java/org/apache/fop/area/Page.java b/src/java/org/apache/fop/area/Page.java
index 2f327b55a..e36e3338f 100644
--- a/src/java/org/apache/fop/area/Page.java
+++ b/src/java/org/apache/fop/area/Page.java
@@ -25,7 +25,9 @@ import java.util.HashMap;
import java.util.Iterator;
import org.apache.fop.datatypes.FODimension;
-import org.apache.fop.datatypes.PercentBase;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.pagination.Region;
import org.apache.fop.fo.pagination.RegionBody;
@@ -70,22 +72,35 @@ public class Page implements Serializable, Cloneable {
* page-reference-area
*/
public Page(SimplePageMaster spm) {
- int pageWidth = spm.getPageWidth().getValue();
- int pageHeight = spm.getPageHeight().getValue();
+ // Width and Height of the page view port
+ FODimension pageViewPortDims = new FODimension(spm.getPageWidth().getValue()
+ , spm.getPageHeight().getValue());
// Get absolute margin properties (top, left, bottom, right)
CommonMarginBlock mProps = spm.getCommonMarginBlock();
-
+
/*
* Create the page reference area rectangle (0,0 is at top left
* of the "page media" and y increases
* when moving towards the bottom of the page.
* The media rectangle itself is (0,0,pageWidth,pageHeight).
*/
+ /* Special rules apply to resolving margins in the page context.
+ * Contrary to normal margins in this case top and bottom margin
+ * are resolved relative to the height. In the property subsystem
+ * all margin properties are configured to using BLOCK_WIDTH.
+ * That's why we 'cheat' here and setup a context for the height but
+ * use the LengthBase.BLOCK_WIDTH.
+ */
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortDims.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortDims.bpd);
+
Rectangle pageRefRect =
- new Rectangle(mProps.marginLeft.getValue(), mProps.marginTop.getValue(),
- pageWidth - mProps.marginLeft.getValue() - mProps.marginRight.getValue(),
- pageHeight - mProps.marginTop.getValue() - mProps.marginBottom.getValue());
+ new Rectangle(mProps.marginLeft.getValue(pageWidthContext), mProps.marginTop.getValue(pageHeightContext),
+ pageViewPortDims.ipd - mProps.marginLeft.getValue(pageWidthContext) - mProps.marginRight.getValue(pageWidthContext),
+ pageViewPortDims.bpd - mProps.marginTop.getValue(pageHeightContext) - mProps.marginBottom.getValue(pageHeightContext));
// Set up the CTM on the page reference area based on writing-mode
// and reference-orientation
@@ -98,9 +113,7 @@ public class Page implements Serializable, Cloneable {
for (Iterator regenum = spm.getRegions().values().iterator();
regenum.hasNext();) {
Region r = (Region)regenum.next();
- RegionViewport rvp = makeRegionViewport(r, reldims, pageCTM);
- r.setLayoutDimension(PercentBase.BLOCK_IPD, rvp.getIPD());
- r.setLayoutDimension(PercentBase.BLOCK_BPD, rvp.getBPD());
+ RegionViewport rvp = makeRegionViewport(r, reldims, pageCTM, pageViewPortDims);
if (r.getNameId() == Constants.FO_REGION_BODY) {
rr = new BodyRegion((RegionBody) r, rvp);
} else {
@@ -125,15 +138,16 @@ public class Page implements Serializable, Cloneable {
* @param pageCTM page coordinate transformation matrix
* @return the new region viewport
*/
- private RegionViewport makeRegionViewport(Region r, FODimension reldims, CTM pageCTM) {
- Rectangle2D relRegionRect = r.getViewportRectangle(reldims);
+ private RegionViewport makeRegionViewport(Region r, FODimension reldims, CTM pageCTM,
+ FODimension pageViewPortDims) {
+ Rectangle2D relRegionRect = r.getViewportRectangle(reldims, pageViewPortDims);
Rectangle2D absRegionRect = pageCTM.transform(relRegionRect);
// Get the region viewport rectangle in absolute coords by
// transforming it using the page CTM
RegionViewport rv = new RegionViewport(absRegionRect);
rv.setBPD((int)relRegionRect.getHeight());
rv.setIPD((int)relRegionRect.getWidth());
- TraitSetter.addBackground(rv, r.getCommonBorderPaddingBackground());
+ TraitSetter.addBackground(rv, r.getCommonBorderPaddingBackground(), null);
rv.setClip(r.getOverflow() == Constants.EN_HIDDEN
|| r.getOverflow() == Constants.EN_ERROR_IF_OVERFLOW);
return rv;
@@ -263,5 +277,6 @@ public class Page implements Serializable, Cloneable {
public HashMap getUnresolvedReferences() {
return unresolved;
}
+
}
diff --git a/src/java/org/apache/fop/datatypes/Length.java b/src/java/org/apache/fop/datatypes/Length.java
index d64b2172d..13f7cf5da 100644
--- a/src/java/org/apache/fop/datatypes/Length.java
+++ b/src/java/org/apache/fop/datatypes/Length.java
@@ -27,4 +27,12 @@ public interface Length extends Numeric {
* @return the length in millipoints
*/
public int getValue();
+
+ /**
+ * Returns the length in 1/1000ths of a point (millipoints)
+ * @param context The context for the length calculation (for percentage based lengths)
+ * @return the length in millipoints
+ */
+ public int getValue(PercentBaseContext context);
+
}
diff --git a/src/java/org/apache/fop/datatypes/LengthBase.java b/src/java/org/apache/fop/datatypes/LengthBase.java
index 21e15a86f..eceaf6139 100644
--- a/src/java/org/apache/fop/datatypes/LengthBase.java
+++ b/src/java/org/apache/fop/datatypes/LengthBase.java
@@ -36,67 +36,59 @@ public class LengthBase implements PercentBase {
/** constant for an inh font-size percent-based length */
public static final int INH_FONTSIZE = 2;
/** constant for a containing box percent-based length */
- public static final int CONTAINING_BOX = 3;
+ public static final int PARENT_AREA_WIDTH = 3;
/** constant for a containing refarea percent-based length */
- public static final int CONTAINING_REFAREA = 4;
+ public static final int CONTAINING_REFAREA_WIDTH = 4;
/** constant for a containing block percent-based length */
- public static final int BLOCK_WIDTH = 5;
+ public static final int CONTAINING_BLOCK_WIDTH = 5;
/** constant for a containing block percent-based length */
- public static final int BLOCK_HEIGHT = 6;
+ public static final int CONTAINING_BLOCK_HEIGHT = 6;
/** constant for a image intrinsic percent-based length */
public static final int IMAGE_INTRINSIC_WIDTH = 7;
/** constant for a image intrinsic percent-based length */
public static final int IMAGE_INTRINSIC_HEIGHT = 8;
+ /** constant for a image background position horizontal percent-based length */
+ public static final int IMAGE_BACKGROUND_POSITION_HORIZONTAL = 9;
+ /** constant for a image background position vertical percent-based length */
+ public static final int IMAGE_BACKGROUND_POSITION_VERTICAL = 10;
/** array of valid percent-based length types */
public static final int[] PERCENT_BASED_LENGTH_TYPES
- = {CUSTOM_BASE, FONTSIZE, INH_FONTSIZE, CONTAINING_BOX,
- CONTAINING_REFAREA,
- IMAGE_INTRINSIC_WIDTH, IMAGE_INTRINSIC_HEIGHT};
+ = {CUSTOM_BASE, FONTSIZE, INH_FONTSIZE, PARENT_AREA_WIDTH,
+ CONTAINING_REFAREA_WIDTH,
+ IMAGE_INTRINSIC_WIDTH, IMAGE_INTRINSIC_HEIGHT,
+ IMAGE_BACKGROUND_POSITION_HORIZONTAL, IMAGE_BACKGROUND_POSITION_VERTICAL
+ };
/**
- * FO parent of the FO for which this property is to be calculated.
+ * The FO for which this property is to be calculated.
*/
- protected /* final */ FObj parentFO;
-
- /**
- * PropertyList for the FO where this property is calculated.
- */
- private /* final */ PropertyList propertyList;
+ protected /* final */ FObj fobj;
/**
* One of the defined types of LengthBase
*/
private /* final */ int iBaseType;
+ private Length fontSize;
+
/**
* Constructor
* @param parentFO parent FO for this
* @param plist property list for this
* @param iBaseType a member of {@link #PERCENT_BASED_LENGTH_TYPES}
*/
- public LengthBase(FObj parentFO, PropertyList plist, int iBaseType) {
- this.parentFO = parentFO;
- this.propertyList = plist;
+ public LengthBase(FObj parentFO, PropertyList plist, int iBaseType) throws PropertyException {
+ this.fobj = plist.getFObj();
this.iBaseType = iBaseType;
- }
-
- /**
- * Accessor for parentFO object from subclasses which define
- * custom kinds of LengthBase calculations.
- * @return this object's parent FO
- */
- protected FObj getParentFO() {
- return parentFO;
- }
-
- /**
- * Accessor for propertyList object from subclasses which define
- * custom kinds of LengthBase calculations.
- * @return this object's PropertyList
- */
- protected PropertyList getPropertyList() {
- return propertyList;
+ switch (iBaseType) {
+ case FONTSIZE:
+ this.fontSize = plist.get(Constants.PR_FONT_SIZE).getLength();
+ break;
+ case INH_FONTSIZE:
+ this.fontSize = plist.getInherited(Constants.PR_FONT_SIZE).getLength();
+ break;
+ }
}
/**
@@ -114,42 +106,17 @@ public class LengthBase implements PercentBase {
}
/** @see org.apache.fop.datatypes.PercentBase#getBaseLength() */
- public int getBaseLength() throws PropertyException {
- //TODO Don't use propertyList here
- //See http://nagoya.apache.org/eyebrowse/ReadMsg?listName=fop-dev@xml.apache.org&msgNo=10342
- switch (iBaseType) {
- case FONTSIZE:
- return propertyList.get(Constants.PR_FONT_SIZE).getLength().getValue();
- case INH_FONTSIZE:
- return propertyList.getInherited(Constants.PR_FONT_SIZE).getLength().getValue();
- case BLOCK_WIDTH:
- return parentFO.getLayoutDimension(PercentBase.BLOCK_IPD).intValue();
- case BLOCK_HEIGHT:
- return parentFO.getLayoutDimension(PercentBase.BLOCK_BPD).intValue();
- case CONTAINING_REFAREA: // example: start-indent, end-indent
- FObj fo;
- fo = parentFO;
- while (fo != null && !fo.generatesReferenceAreas()) {
- fo = fo.findNearestAncestorFObj();
- }
- if (fo != null && fo instanceof FObj) {
- return fo.getLayoutDimension(PercentBase.BLOCK_IPD).intValue();
- } else {
- return 0;
+ public int getBaseLength(PercentBaseContext context) throws PropertyException {
+ int baseLength = 0;
+ if (context != null) {
+ if (iBaseType == FONTSIZE || iBaseType == INH_FONTSIZE) {
+ return fontSize.getValue(context);
}
- case IMAGE_INTRINSIC_WIDTH:
- return propertyList.getFObj()
- .getLayoutDimension(PercentBase.IMAGE_INTRINSIC_WIDTH).intValue();
- case IMAGE_INTRINSIC_HEIGHT:
- return propertyList.getFObj()
- .getLayoutDimension(PercentBase.IMAGE_INTRINSIC_HEIGHT).intValue();
- case CUSTOM_BASE:
- //log.debug("!!! LengthBase.getBaseLength() called on CUSTOM_BASE type !!!");
- return 0;
- default:
- parentFO.getLogger().error("Unknown base type for LengthBase.");
- return 0;
+ baseLength = context.getBaseLength(iBaseType, fobj);
+ } else {
+ fobj.getLogger().error("getBaseLength called without context");
}
+ return baseLength;
}
}
diff --git a/src/java/org/apache/fop/datatypes/Numeric.java b/src/java/org/apache/fop/datatypes/Numeric.java
index 85a41e862..c8b9af75c 100644
--- a/src/java/org/apache/fop/datatypes/Numeric.java
+++ b/src/java/org/apache/fop/datatypes/Numeric.java
@@ -41,6 +41,14 @@ public interface Numeric {
double getNumericValue() throws PropertyException;
/**
+ * Return the value of this Numeric
+ * @param context The context for the length calculation (for percentage based lengths)
+ * @return the computed value.
+ * @throws PropertyException
+ */
+ double getNumericValue(PercentBaseContext context) throws PropertyException;
+
+ /**
* Return the dimension of this numeric. Plain numbers has a dimension of
* 0 and length has a dimension of 1. Other dimension can occur as a result
* of multiplications and divisions.
@@ -62,6 +70,13 @@ public interface Numeric {
public int getValue();
/**
+ * Returns the value of this numeric as an int.
+ * @param conext The context for the length calculation (for percentage based lengths)
+ * @return the value as an integer.
+ */
+ public int getValue(PercentBaseContext context);
+
+ /**
* Return the resolved value. This method will becalled during evaluation
* of the expression tree and relative numerics can then return a
* resolved absolute Numeric. Absolute numerics can just return themself.
diff --git a/src/java/org/apache/fop/datatypes/PercentBase.java b/src/java/org/apache/fop/datatypes/PercentBase.java
index 7011c774e..a166725b1 100644
--- a/src/java/org/apache/fop/datatypes/PercentBase.java
+++ b/src/java/org/apache/fop/datatypes/PercentBase.java
@@ -30,18 +30,6 @@ public interface PercentBase {
/** table units */
LayoutDimension TABLE_UNITS = new LayoutDimension("table-units");
- /** Block IPD */
- LayoutDimension BLOCK_IPD = new LayoutDimension("block-ipd");
- /** Block BPD */
- LayoutDimension BLOCK_BPD = new LayoutDimension("block-bpd");
- /** Reference Area IPD */
- LayoutDimension REFERENCE_AREA_IPD = new LayoutDimension("reference-area-ipd");
- /** Reference Area BPD */
- LayoutDimension REFERENCE_AREA_BPD = new LayoutDimension("reference-area-bpd");
- /** Intrinsic width of an image or foreign-object */
- LayoutDimension IMAGE_INTRINSIC_WIDTH = new LayoutDimension("image-intrinsic-width");
- /** Intrinsic height of an image or foreign-object */
- LayoutDimension IMAGE_INTRINSIC_HEIGHT = new LayoutDimension("image-intrinsic-heigth");
/**
* Determines whether a numeric property is created or one with a percentage
@@ -53,13 +41,14 @@ public interface PercentBase {
double getBaseValue();
/**
+ * @param context The context for percentage evaluation
* @return the integer size in millipoints of the object (this will be used
* as the base to which a percentage will be applied to compute the length
* of the referencing item)
* @throws PropertyException if a problem occurs during evaluation of this
* value.
*/
- int getBaseLength() throws PropertyException;
+ int getBaseLength(PercentBaseContext context) throws PropertyException;
/** Enum class for dimension types. */
public class LayoutDimension {
diff --git a/src/java/org/apache/fop/datatypes/PercentBaseContext.java b/src/java/org/apache/fop/datatypes/PercentBaseContext.java
new file mode 100644
index 000000000..6ba943ea3
--- /dev/null
+++ b/src/java/org/apache/fop/datatypes/PercentBaseContext.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id $ */
+
+package org.apache.fop.datatypes;
+
+import org.apache.fop.fo.FObj;
+
+/**
+ * This interface is used by the layout managers to provide relevant information
+ * back to the property percentage resolution logic, that is
+ * the percentages based property getValue() functions expect an object implementing
+ * this interface as an argument.
+ */
+public interface PercentBaseContext {
+
+ /**
+ * Returns the base length for the given length base.
+ * Length base should be one of the constants defined in {@link LengthBase}.
+ * @param lengthBase Indicates which type of the base length value is to be returned
+ * @param fobj The FO object against which the percentage should be evaluated
+ * @return The base length value of the given kind
+ */
+ public int getBaseLength(int lengthBase, FObj fobj);
+
+}
diff --git a/src/java/org/apache/fop/datatypes/SimplePercentBaseContext.java b/src/java/org/apache/fop/datatypes/SimplePercentBaseContext.java
new file mode 100644
index 000000000..acb4de6a2
--- /dev/null
+++ b/src/java/org/apache/fop/datatypes/SimplePercentBaseContext.java
@@ -0,0 +1,51 @@
+/*
+ * SimplePercentBaseContext.java
+ *
+ * Created on 29 August 2005, 17:02
+ *
+ * To change this template, choose Tools | Options and locate the template under
+ * the Source Creation and Management node. Right-click the template and choose
+ * Open. You can then make changes to the template in the Source Editor.
+ */
+
+package org.apache.fop.datatypes;
+
+import org.apache.fop.fo.FObj;
+
+/**
+ * Class to implement a simple lookup context for a single percent base value.
+ */
+public class SimplePercentBaseContext implements PercentBaseContext {
+
+ private PercentBaseContext parentContext;
+ private int lengthBase;
+ private int lengthBaseValue;
+
+ /**
+ * @param parentContext the context to be used for all percentages other than lengthBase
+ * @param lengthBase the particular percentage length base for which this context provides a value
+ * @param lengthBaseValue the value to be returned for requests to the given lengthBase
+ */
+ public SimplePercentBaseContext(PercentBaseContext parentContext,
+ int lengthBase,
+ int lengthBaseValue) {
+ this.parentContext = parentContext;
+ this.lengthBase = lengthBase;
+ this.lengthBaseValue = lengthBaseValue;
+ }
+
+ /**
+ * Returns the value for the given lengthBase.
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, fobj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ // if its for us return our value otherwise delegate to parent context
+ if (lengthBase == this.lengthBase) {
+ return lengthBaseValue;
+ } else if (parentContext != null) {
+ return parentContext.getBaseLength(lengthBase, fobj);
+ }
+ return -1;
+ }
+
+}
diff --git a/src/java/org/apache/fop/fo/Constants.java b/src/java/org/apache/fop/fo/Constants.java
index 833105498..a7674100f 100644
--- a/src/java/org/apache/fop/fo/Constants.java
+++ b/src/java/org/apache/fop/fo/Constants.java
@@ -16,9 +16,18 @@
/* $Id$ */
-
package org.apache.fop.fo;
+/**
+ * Definition of constants used throughout FOP.
+ * There are sets of constants describing:
+ * <ul>
+ * <li>Input and output formats</li>
+ * <li>Formatting objects</li>
+ * <li>Formatting properties</li>
+ * <li>Enumerated values used in formatting properties</li>
+ * </ul>
+ */
public interface Constants {
/* These constants are used by apps.CommandLineOptions and
@@ -27,6 +36,7 @@ public interface Constants {
/** render constants for bounds checking */
int RENDER_MIN_CONST = 1;
+ /** render constants for bounds checking */
int RENDER_MAX_CONST = 12;
/** input / output not set */
int NOT_SET = 0;
@@ -60,505 +70,1006 @@ public interface Constants {
int RENDER_PNG = 12;
// element constants
- int FO_UNKNOWN_NODE = 0; // FObj base class
+ /** FObj base class */
+ int FO_UNKNOWN_NODE = 0;
+ /** FO element constant */
int FO_BASIC_LINK = 1;
+ /** FO element constant */
int FO_BIDI_OVERRIDE = 2;
+ /** FO element constant */
int FO_BLOCK = 3;
+ /** FO element constant */
int FO_BLOCK_CONTAINER = 4;
+ /** FO element constant */
int FO_CHARACTER = 5;
+ /** FO element constant */
int FO_COLOR_PROFILE = 6;
+ /** FO element constant */
int FO_CONDITIONAL_PAGE_MASTER_REFERENCE = 7;
+ /** FO element constant */
int FO_DECLARATIONS = 8;
+ /** FO element constant */
int FO_EXTERNAL_GRAPHIC = 9;
+ /** FO element constant */
int FO_FLOAT = 10;
+ /** FO element constant */
int FO_FLOW = 11;
+ /** FO element constant */
int FO_FOOTNOTE = 12;
+ /** FO element constant */
int FO_FOOTNOTE_BODY = 13;
+ /** FO element constant */
int FO_INITIAL_PROPERTY_SET = 14;
+ /** FO element constant */
int FO_INLINE = 15;
+ /** FO element constant */
int FO_INLINE_CONTAINER = 16;
+ /** FO element constant */
int FO_INSTREAM_FOREIGN_OBJECT = 17;
+ /** FO element constant */
int FO_LAYOUT_MASTER_SET = 18;
+ /** FO element constant */
int FO_LEADER = 19;
+ /** FO element constant */
int FO_LIST_BLOCK = 20;
+ /** FO element constant */
int FO_LIST_ITEM = 21;
+ /** FO element constant */
int FO_LIST_ITEM_BODY = 22;
+ /** FO element constant */
int FO_LIST_ITEM_LABEL = 23;
+ /** FO element constant */
int FO_MARKER = 24;
+ /** FO element constant */
int FO_MULTI_CASE = 25;
+ /** FO element constant */
int FO_MULTI_PROPERTIES = 26;
+ /** FO element constant */
int FO_MULTI_PROPERTY_SET = 27;
+ /** FO element constant */
int FO_MULTI_SWITCH = 28;
+ /** FO element constant */
int FO_MULTI_TOGGLE = 29;
+ /** FO element constant */
int FO_PAGE_NUMBER = 30;
+ /** FO element constant */
int FO_PAGE_NUMBER_CITATION = 31;
+ /** FO element constant */
int FO_PAGE_SEQUENCE = 32;
+ /** FO element constant */
int FO_PAGE_SEQUENCE_MASTER = 33;
+ /** FO element constant */
int FO_REGION_AFTER = 34;
+ /** FO element constant */
int FO_REGION_BEFORE = 35;
+ /** FO element constant */
int FO_REGION_BODY = 36;
+ /** FO element constant */
int FO_REGION_END = 37;
+ /** FO element constant */
int FO_REGION_START = 38;
+ /** FO element constant */
int FO_REPEATABLE_PAGE_MASTER_ALTERNATIVES = 39;
+ /** FO element constant */
int FO_REPEATABLE_PAGE_MASTER_REFERENCE = 40;
+ /** FO element constant */
int FO_RETRIEVE_MARKER = 41;
+ /** FO element constant */
int FO_ROOT = 42;
+ /** FO element constant */
int FO_SIMPLE_PAGE_MASTER = 43;
+ /** FO element constant */
int FO_SINGLE_PAGE_MASTER_REFERENCE = 44;
+ /** FO element constant */
int FO_STATIC_CONTENT = 45;
+ /** FO element constant */
int FO_TABLE = 46;
+ /** FO element constant */
int FO_TABLE_AND_CAPTION = 47;
+ /** FO element constant */
int FO_TABLE_BODY = 48;
+ /** FO element constant */
int FO_TABLE_CAPTION = 49;
+ /** FO element constant */
int FO_TABLE_CELL = 50;
+ /** FO element constant */
int FO_TABLE_COLUMN = 51;
+ /** FO element constant */
int FO_TABLE_FOOTER = 52;
+ /** FO element constant */
int FO_TABLE_HEADER = 53;
+ /** FO element constant */
int FO_TABLE_ROW = 54;
+ /** FO element constant */
int FO_TITLE = 55;
+ /** FO element constant */
int FO_WRAPPER = 56;
- int FO_BOOKMARK_TREE = 57; // XSL 1.1
- int FO_BOOKMARK = 58; // XSL 1.1
- int FO_BOOKMARK_TITLE = 59; // XSL 1.1
- int FO_PAGE_SEQUENCE_WRAPPER = 60; // XSL 1.1
+ /** FO element constant - XSL 1.1 */
+ int FO_BOOKMARK_TREE = 57;
+ /** FO element constant - XSL 1.1 */
+ int FO_BOOKMARK = 58;
+ /** FO element constant - XSL 1.1 */
+ int FO_BOOKMARK_TITLE = 59;
+ /** FO element constant - XSL 1.1 */
+ int FO_PAGE_SEQUENCE_WRAPPER = 60;
+ /** Number of FO element constants defined */
int FRM_OBJ_COUNT = 60;
// Masks
+ /**
+ * For compound properties the property constant value is shifted by this amount.
+ * The low order bits hold the constant for the component property.
+ */
int COMPOUND_SHIFT = 9;
- int PROPERTY_MASK = (1 << COMPOUND_SHIFT)-1;
+ /**
+ * Mask that when applied to a compound property returns the constant of
+ * the component property.
+ */
+ int PROPERTY_MASK = (1 << COMPOUND_SHIFT) - 1;
+ /**
+ * Mask that when applied to a compound property returns the constant of
+ * the compound property.
+ */
int COMPOUND_MASK = ~PROPERTY_MASK;
+ /** Number of compund properties defined */
int COMPOUND_COUNT = 11;
// property constants
+ /** Property constant */
int PR_ABSOLUTE_POSITION = 1;
+ /** Property constant */
int PR_ACTIVE_STATE = 2;
+ /** Property constant */
int PR_ALIGNMENT_ADJUST = 3;
+ /** Property constant */
int PR_ALIGNMENT_BASELINE = 4;
+ /** Property constant */
int PR_AUTO_RESTORE = 5;
+ /** Property constant */
int PR_AZIMUTH = 6;
+ /** Property constant */
int PR_BACKGROUND = 7;
+ /** Property constant */
int PR_BACKGROUND_ATTACHMENT = 8;
+ /** Property constant */
int PR_BACKGROUND_COLOR = 9;
+ /** Property constant */
int PR_BACKGROUND_IMAGE = 10;
+ /** Property constant */
int PR_BACKGROUND_POSITION = 11;
+ /** Property constant */
int PR_BACKGROUND_POSITION_HORIZONTAL = 12;
+ /** Property constant */
int PR_BACKGROUND_POSITION_VERTICAL = 13;
+ /** Property constant */
int PR_BACKGROUND_REPEAT = 14;
+ /** Property constant */
int PR_BASELINE_SHIFT = 15;
+ /** Property constant */
int PR_BLANK_OR_NOT_BLANK = 16;
+ /** Property constant */
int PR_BLOCK_PROGRESSION_DIMENSION = 17;
+ /** Property constant */
int PR_BORDER = 18;
+ /** Property constant */
int PR_BORDER_AFTER_COLOR = 19;
+ /** Property constant */
int PR_BORDER_AFTER_PRECEDENCE = 20;
+ /** Property constant */
int PR_BORDER_AFTER_STYLE = 21;
+ /** Property constant */
int PR_BORDER_AFTER_WIDTH = 22;
+ /** Property constant */
int PR_BORDER_BEFORE_COLOR = 23;
+ /** Property constant */
int PR_BORDER_BEFORE_PRECEDENCE = 24;
+ /** Property constant */
int PR_BORDER_BEFORE_STYLE = 25;
+ /** Property constant */
int PR_BORDER_BEFORE_WIDTH = 26;
+ /** Property constant */
int PR_BORDER_BOTTOM = 27;
+ /** Property constant */
int PR_BORDER_BOTTOM_COLOR = 28;
+ /** Property constant */
int PR_BORDER_BOTTOM_STYLE = 29;
+ /** Property constant */
int PR_BORDER_BOTTOM_WIDTH = 30;
+ /** Property constant */
int PR_BORDER_COLLAPSE = 31;
+ /** Property constant */
int PR_BORDER_COLOR = 32;
+ /** Property constant */
int PR_BORDER_END_COLOR = 33;
+ /** Property constant */
int PR_BORDER_END_PRECEDENCE = 34;
+ /** Property constant */
int PR_BORDER_END_STYLE = 35;
+ /** Property constant */
int PR_BORDER_END_WIDTH = 36;
+ /** Property constant */
int PR_BORDER_LEFT = 37;
+ /** Property constant */
int PR_BORDER_LEFT_COLOR = 38;
+ /** Property constant */
int PR_BORDER_LEFT_STYLE = 39;
+ /** Property constant */
int PR_BORDER_LEFT_WIDTH = 40;
+ /** Property constant */
int PR_BORDER_RIGHT = 41;
+ /** Property constant */
int PR_BORDER_RIGHT_COLOR = 42;
+ /** Property constant */
int PR_BORDER_RIGHT_STYLE = 43;
+ /** Property constant */
int PR_BORDER_RIGHT_WIDTH = 44;
+ /** Property constant */
int PR_BORDER_SEPARATION = 45;
+ /** Property constant */
int PR_BORDER_SPACING = 46;
+ /** Property constant */
int PR_BORDER_START_COLOR = 47;
+ /** Property constant */
int PR_BORDER_START_PRECEDENCE = 48;
+ /** Property constant */
int PR_BORDER_START_STYLE = 49;
+ /** Property constant */
int PR_BORDER_START_WIDTH = 50;
+ /** Property constant */
int PR_BORDER_STYLE = 51;
+ /** Property constant */
int PR_BORDER_TOP = 52;
+ /** Property constant */
int PR_BORDER_TOP_COLOR = 53;
+ /** Property constant */
int PR_BORDER_TOP_STYLE = 54;
+ /** Property constant */
int PR_BORDER_TOP_WIDTH = 55;
+ /** Property constant */
int PR_BORDER_WIDTH = 56;
+ /** Property constant */
int PR_BOTTOM = 57;
+ /** Property constant */
int PR_BREAK_AFTER = 58;
+ /** Property constant */
int PR_BREAK_BEFORE = 59;
+ /** Property constant */
int PR_CAPTION_SIDE = 60;
+ /** Property constant */
int PR_CASE_NAME = 61;
+ /** Property constant */
int PR_CASE_TITLE = 62;
+ /** Property constant */
int PR_CHARACTER = 63;
+ /** Property constant */
int PR_CLEAR = 64;
+ /** Property constant */
int PR_CLIP = 65;
+ /** Property constant */
int PR_COLOR = 66;
+ /** Property constant */
int PR_COLOR_PROFILE_NAME = 67;
+ /** Property constant */
int PR_COLUMN_COUNT = 68;
+ /** Property constant */
int PR_COLUMN_GAP = 69;
+ /** Property constant */
int PR_COLUMN_NUMBER = 70;
+ /** Property constant */
int PR_COLUMN_WIDTH = 71;
+ /** Property constant */
int PR_CONTENT_HEIGHT = 72;
+ /** Property constant */
int PR_CONTENT_TYPE = 73;
+ /** Property constant */
int PR_CONTENT_WIDTH = 74;
+ /** Property constant */
int PR_COUNTRY = 75;
+ /** Property constant */
int PR_CUE = 76;
+ /** Property constant */
int PR_CUE_AFTER = 77;
+ /** Property constant */
int PR_CUE_BEFORE = 78;
+ /** Property constant */
int PR_DESTINATION_PLACEMENT_OFFSET = 79;
+ /** Property constant */
int PR_DIRECTION = 80;
+ /** Property constant */
int PR_DISPLAY_ALIGN = 81;
+ /** Property constant */
int PR_DOMINANT_BASELINE = 82;
+ /** Property constant */
int PR_ELEVATION = 83;
+ /** Property constant */
int PR_EMPTY_CELLS = 84;
+ /** Property constant */
int PR_END_INDENT = 85;
+ /** Property constant */
int PR_ENDS_ROW = 86;
+ /** Property constant */
int PR_EXTENT = 87;
+ /** Property constant */
int PR_EXTERNAL_DESTINATION = 88;
+ /** Property constant */
int PR_FLOAT = 89;
+ /** Property constant */
int PR_FLOW_NAME = 90;
+ /** Property constant */
int PR_FONT = 91;
+ /** Property constant */
int PR_FONT_FAMILY = 92;
+ /** Property constant */
int PR_FONT_SELECTION_STRATEGY = 93;
+ /** Property constant */
int PR_FONT_SIZE = 94;
+ /** Property constant */
int PR_FONT_SIZE_ADJUST = 95;
+ /** Property constant */
int PR_FONT_STRETCH = 96;
+ /** Property constant */
int PR_FONT_STYLE = 97;
+ /** Property constant */
int PR_FONT_VARIANT = 98;
+ /** Property constant */
int PR_FONT_WEIGHT = 99;
+ /** Property constant */
int PR_FORCE_PAGE_COUNT = 100;
+ /** Property constant */
int PR_FORMAT = 101;
+ /** Property constant */
int PR_GLYPH_ORIENTATION_HORIZONTAL = 102;
+ /** Property constant */
int PR_GLYPH_ORIENTATION_VERTICAL = 103;
+ /** Property constant */
int PR_GROUPING_SEPARATOR = 104;
+ /** Property constant */
int PR_GROUPING_SIZE = 105;
+ /** Property constant */
int PR_HEIGHT = 106;
+ /** Property constant */
int PR_HYPHENATE = 107;
+ /** Property constant */
int PR_HYPHENATION_CHARACTER = 108;
+ /** Property constant */
int PR_HYPHENATION_KEEP = 109;
+ /** Property constant */
int PR_HYPHENATION_LADDER_COUNT = 110;
+ /** Property constant */
int PR_HYPHENATION_PUSH_CHARACTER_COUNT = 111;
+ /** Property constant */
int PR_HYPHENATION_REMAIN_CHARACTER_COUNT = 112;
+ /** Property constant */
int PR_ID = 113;
+ /** Property constant */
int PR_INDICATE_DESTINATION = 114;
+ /** Property constant */
int PR_INITIAL_PAGE_NUMBER = 115;
+ /** Property constant */
int PR_INLINE_PROGRESSION_DIMENSION = 116;
+ /** Property constant */
int PR_INTERNAL_DESTINATION = 117;
+ /** Property constant */
int PR_KEEP_TOGETHER = 118;
+ /** Property constant */
int PR_KEEP_WITH_NEXT = 119;
+ /** Property constant */
int PR_KEEP_WITH_PREVIOUS = 120;
+ /** Property constant */
int PR_LANGUAGE = 121;
+ /** Property constant */
int PR_LAST_LINE_END_INDENT = 122;
+ /** Property constant */
int PR_LEADER_ALIGNMENT = 123;
+ /** Property constant */
int PR_LEADER_LENGTH = 124;
+ /** Property constant */
int PR_LEADER_PATTERN = 125;
+ /** Property constant */
int PR_LEADER_PATTERN_WIDTH = 126;
+ /** Property constant */
int PR_LEFT = 127;
+ /** Property constant */
int PR_LETTER_SPACING = 128;
+ /** Property constant */
int PR_LETTER_VALUE = 129;
+ /** Property constant */
int PR_LINEFEED_TREATMENT = 130;
+ /** Property constant */
int PR_LINE_HEIGHT = 131;
+ /** Property constant */
int PR_LINE_HEIGHT_SHIFT_ADJUSTMENT = 132;
+ /** Property constant */
int PR_LINE_STACKING_STRATEGY = 133;
+ /** Property constant */
int PR_MARGIN = 134;
+ /** Property constant */
int PR_MARGIN_BOTTOM = 135;
+ /** Property constant */
int PR_MARGIN_LEFT = 136;
+ /** Property constant */
int PR_MARGIN_RIGHT = 137;
+ /** Property constant */
int PR_MARGIN_TOP = 138;
+ /** Property constant */
int PR_MARKER_CLASS_NAME = 139;
+ /** Property constant */
int PR_MASTER_NAME = 140;
+ /** Property constant */
int PR_MASTER_REFERENCE = 141;
+ /** Property constant */
int PR_MAX_HEIGHT = 142;
+ /** Property constant */
int PR_MAXIMUM_REPEATS = 143;
+ /** Property constant */
int PR_MAX_WIDTH = 144;
+ /** Property constant */
int PR_MEDIA_USAGE = 145;
+ /** Property constant */
int PR_MIN_HEIGHT = 146;
+ /** Property constant */
int PR_MIN_WIDTH = 147;
+ /** Property constant */
int PR_NUMBER_COLUMNS_REPEATED = 148;
+ /** Property constant */
int PR_NUMBER_COLUMNS_SPANNED = 149;
+ /** Property constant */
int PR_NUMBER_ROWS_SPANNED = 150;
+ /** Property constant */
int PR_ODD_OR_EVEN = 151;
+ /** Property constant */
int PR_ORPHANS = 152;
+ /** Property constant */
int PR_OVERFLOW = 153;
+ /** Property constant */
int PR_PADDING = 154;
+ /** Property constant */
int PR_PADDING_AFTER = 155;
+ /** Property constant */
int PR_PADDING_BEFORE = 156;
+ /** Property constant */
int PR_PADDING_BOTTOM = 157;
+ /** Property constant */
int PR_PADDING_END = 158;
+ /** Property constant */
int PR_PADDING_LEFT = 159;
+ /** Property constant */
int PR_PADDING_RIGHT = 160;
+ /** Property constant */
int PR_PADDING_START = 161;
+ /** Property constant */
int PR_PADDING_TOP = 162;
+ /** Property constant */
int PR_PAGE_BREAK_AFTER = 163;
+ /** Property constant */
int PR_PAGE_BREAK_BEFORE = 164;
+ /** Property constant */
int PR_PAGE_BREAK_INSIDE = 165;
+ /** Property constant */
int PR_PAGE_HEIGHT = 166;
+ /** Property constant */
int PR_PAGE_POSITION = 167;
+ /** Property constant */
int PR_PAGE_WIDTH = 168;
+ /** Property constant */
int PR_PAUSE = 169;
+ /** Property constant */
int PR_PAUSE_AFTER = 170;
+ /** Property constant */
int PR_PAUSE_BEFORE = 171;
+ /** Property constant */
int PR_PITCH = 172;
+ /** Property constant */
int PR_PITCH_RANGE = 173;
+ /** Property constant */
int PR_PLAY_DURING = 174;
+ /** Property constant */
int PR_POSITION = 175;
+ /** Property constant */
int PR_PRECEDENCE = 176;
+ /** Property constant */
int PR_PROVISIONAL_DISTANCE_BETWEEN_STARTS = 177;
+ /** Property constant */
int PR_PROVISIONAL_LABEL_SEPARATION = 178;
+ /** Property constant */
int PR_REFERENCE_ORIENTATION = 179;
+ /** Property constant */
int PR_REF_ID = 180;
+ /** Property constant */
int PR_REGION_NAME = 181;
+ /** Property constant */
int PR_RELATIVE_ALIGN = 182;
+ /** Property constant */
int PR_RELATIVE_POSITION = 183;
+ /** Property constant */
int PR_RENDERING_INTENT = 184;
+ /** Property constant */
int PR_RETRIEVE_BOUNDARY = 185;
+ /** Property constant */
int PR_RETRIEVE_CLASS_NAME = 186;
+ /** Property constant */
int PR_RETRIEVE_POSITION = 187;
+ /** Property constant */
int PR_RICHNESS = 188;
+ /** Property constant */
int PR_RIGHT = 189;
+ /** Property constant */
int PR_ROLE = 190;
+ /** Property constant */
int PR_RULE_STYLE = 191;
+ /** Property constant */
int PR_RULE_THICKNESS = 192;
+ /** Property constant */
int PR_SCALING = 193;
+ /** Property constant */
int PR_SCALING_METHOD = 194;
+ /** Property constant */
int PR_SCORE_SPACES = 195;
+ /** Property constant */
int PR_SCRIPT = 196;
+ /** Property constant */
int PR_SHOW_DESTINATION = 197;
+ /** Property constant */
int PR_SIZE = 198;
+ /** Property constant */
int PR_SOURCE_DOCUMENT = 199;
+ /** Property constant */
int PR_SPACE_AFTER = 200;
+ /** Property constant */
int PR_SPACE_BEFORE = 201;
+ /** Property constant */
int PR_SPACE_END = 202;
+ /** Property constant */
int PR_SPACE_START = 203;
+ /** Property constant */
int PR_SPAN = 204;
+ /** Property constant */
int PR_SPEAK = 205;
+ /** Property constant */
int PR_SPEAK_HEADER = 206;
+ /** Property constant */
int PR_SPEAK_NUMERAL = 207;
+ /** Property constant */
int PR_SPEAK_PUNCTUATION = 208;
+ /** Property constant */
int PR_SPEECH_RATE = 209;
+ /** Property constant */
int PR_SRC = 210;
+ /** Property constant */
int PR_START_INDENT = 211;
+ /** Property constant */
int PR_STARTING_STATE = 212;
+ /** Property constant */
int PR_STARTS_ROW = 213;
+ /** Property constant */
int PR_STRESS = 214;
+ /** Property constant */
int PR_SUPPRESS_AT_LINE_BREAK = 215;
+ /** Property constant */
int PR_SWITCH_TO = 216;
+ /** Property constant */
int PR_TABLE_LAYOUT = 217;
+ /** Property constant */
int PR_TABLE_OMIT_FOOTER_AT_BREAK = 218;
+ /** Property constant */
int PR_TABLE_OMIT_HEADER_AT_BREAK = 219;
+ /** Property constant */
int PR_TARGET_PRESENTATION_CONTEXT = 220;
+ /** Property constant */
int PR_TARGET_PROCESSING_CONTEXT = 221;
+ /** Property constant */
int PR_TARGET_STYLESHEET = 222;
+ /** Property constant */
int PR_TEXT_ALIGN = 223;
+ /** Property constant */
int PR_TEXT_ALIGN_LAST = 224;
+ /** Property constant */
int PR_TEXT_ALTITUDE = 225;
+ /** Property constant */
int PR_TEXT_DECORATION = 226;
+ /** Property constant */
int PR_TEXT_DEPTH = 227;
+ /** Property constant */
int PR_TEXT_INDENT = 228;
+ /** Property constant */
int PR_TEXT_SHADOW = 229;
+ /** Property constant */
int PR_TEXT_TRANSFORM = 230;
+ /** Property constant */
int PR_TOP = 231;
+ /** Property constant */
int PR_TREAT_AS_WORD_SPACE = 232;
+ /** Property constant */
int PR_UNICODE_BIDI = 233;
+ /** Property constant */
int PR_VERTICAL_ALIGN = 234;
+ /** Property constant */
int PR_VISIBILITY = 235;
+ /** Property constant */
int PR_VOICE_FAMILY = 236;
+ /** Property constant */
int PR_VOLUME = 237;
+ /** Property constant */
int PR_WHITE_SPACE_COLLAPSE = 238;
+ /** Property constant */
int PR_WHITE_SPACE_TREATMENT = 239;
+ /** Property constant */
int PR_WIDOWS = 240;
+ /** Property constant */
int PR_WIDTH = 241;
+ /** Property constant */
int PR_WORD_SPACING = 242;
+ /** Property constant */
int PR_WRAP_OPTION = 243;
+ /** Property constant */
int PR_WRITING_MODE = 244;
+ /** Property constant */
int PR_XML_LANG = 245;
+ /** Property constant */
int PR_Z_INDEX = 246;
+ /** Property constant */
int PR_INTRUSION_DISPLACE = 247;
- int PR_INDEX_CLASS = 248; // XSL 1.1
- int PR_INDEX_KEY = 249; // XSL 1.1
- int PR_X_BLOCK_PROGRESSION_UNIT = 250; //Custom extension
+ /** Property constant - XSL 1.1 */
+ int PR_INDEX_CLASS = 248;
+ /** Property constant - XSL 1.1 */
+ int PR_INDEX_KEY = 249;
+ /** Property constant - Custom extension */
+ int PR_X_BLOCK_PROGRESSION_UNIT = 250;
+ /** Number of property constants defined */
int PROPERTY_COUNT = 250;
// compound property constants
+ /** Property constant for compund property */
int CP_BLOCK_PROGRESSION_DIRECTION = 1 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_CONDITIONALITY = 2 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_INLINE_PROGRESSION_DIRECTION = 3 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_LENGTH = 4 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_MAXIMUM = 5 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_MINIMUM = 6 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_OPTIMUM = 7 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_PRECEDENCE = 8 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_WITHIN_COLUMN = 9 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_WITHIN_LINE = 10 << COMPOUND_SHIFT;
+ /** Property constant for compund property */
int CP_WITHIN_PAGE = 11 << COMPOUND_SHIFT;
// Enumeration constants
+ /** Enumeration constant */
int EN_ABSOLUTE = 1;
+ /** Enumeration constant */
int EN_ABSOLUTE_COLORMETRIC = 2;
+ /** Enumeration constant */
int EN_AFTER = 3;
+ /** Enumeration constant */
int EN_AFTER_EDGE = 4;
+ /** Enumeration constant */
int EN_ALL = 5;
+ /** Enumeration constant */
int EN_ALPHABETIC = 6;
+ /** Enumeration constant */
int EN_ALWAYS = 7;
+ /** Enumeration constant */
int EN_ANY = 8;
+ /** Enumeration constant */
int EN_AUTO = 9;
+ /** Enumeration constant */
int EN_AUTO_EVEN = 10;
+ /** Enumeration constant */
int EN_AUTO_ODD = 11;
+ /** Enumeration constant */
int EN_BASELINE = 12;
+ /** Enumeration constant */
int EN_BEFORE = 13;
+ /** Enumeration constant */
int EN_BEFORE_EDGE = 14;
+ /** Enumeration constant */
int EN_BIDI_OVERRIDE = 15;
+ /** Enumeration constant */
int EN_BLANK = 16;
+ /** Enumeration constant */
int EN_BLINK = 17;
+ /** Enumeration constant */
int EN_BLOCK = 18;
+ /** Enumeration constant */
int EN_BOTH = 19;
+ /** Enumeration constant */
int EN_BOTTOM = 20;
+ /** Enumeration constant */
int EN_BOUNDED_IN_ONE_DIMENSION = 21;
+ /** Enumeration constant */
int EN_CAPITALIZE = 22;
+ /** Enumeration constant */
int EN_CENTER = 23;
+ /** Enumeration constant */
int EN_CENTRAL = 24;
+ /** Enumeration constant */
int EN_CHARACTER_BY_CHARACTER = 25;
+ /** Enumeration constant */
int EN_COLLAPSE = 26;
+ /** Enumeration constant */
int EN_COLLAPSE_WITH_PRECEDENCE = 27;
+ /** Enumeration constant */
int EN_COLUMN = 28;
+ /** Enumeration constant */
int EN_CONDENSED = 29;
+ /** Enumeration constant */
int EN_CONSIDER_SHIFTS = 30;
+ /** Enumeration constant */
int EN_DASHED = 31;
+ /** Enumeration constant */
int EN_DISCARD = 32;
+ /** Enumeration constant */
int EN_DISREGARD_SHIFTS = 33;
+ /** Enumeration constant */
int EN_DOCUMENT = 34;
+ /** Enumeration constant */
int EN_DOTS = 35;
+ /** Enumeration constant */
int EN_DOTTED = 36;
+ /** Enumeration constant */
int EN_DOUBLE = 37;
+ /** Enumeration constant */
int EN_EMBED = 38;
+ /** Enumeration constant */
int EN_END = 39;
+ /** Enumeration constant */
int EN_END_ON_EVEN = 40;
+ /** Enumeration constant */
int EN_END_ON_ODD = 41;
+ /** Enumeration constant */
int EN_ERROR_IF_OVERFLOW = 42;
+ /** Enumeration constant */
int EN_EVEN = 43;
+ /** Enumeration constant */
int EN_EVEN_PAGE = 44;
+ /** Enumeration constant */
int EN_EXPANDED = 45;
+ /** Enumeration constant */
int EN_EXTRA_CONDENSED = 46;
+ /** Enumeration constant */
int EN_EXTRA_EXPANDED = 47;
+ /** Enumeration constant */
int EN_FALSE = 48;
+ /** Enumeration constant */
int EN_FIC = 49;
+ /** Enumeration constant */
int EN_FIRST = 50;
+ /** Enumeration constant */
int EN_FIXED = 51;
+ /** Enumeration constant */
int EN_FONT_HEIGHT = 52;
+ /** Enumeration constant */
int EN_FORCE = 53;
+ /** Enumeration constant */
int EN_FSWP = 54;
+ /** Enumeration constant */
int EN_GROOVE = 55;
+ /** Enumeration constant */
int EN_HANGING = 56;
+ /** Enumeration constant */
int EN_HIDDEN = 57;
+ /** Enumeration constant */
int EN_HIDE = 58;
+ /** Enumeration constant */
int EN_IDEOGRAPHIC = 59;
+ /** Enumeration constant */
int EN_IGNORE = 60;
+ /** Enumeration constant */
int EN_IGNORE_IF_AFTER_LINEFEED = 61;
+ /** Enumeration constant */
int EN_IGNORE_IF_BEFORE_LINEFEED = 62;
+ /** Enumeration constant */
int EN_IGNORE_IF_SURROUNDING_LINEFEED = 63;
+ /** Enumeration constant */
int EN_INDEFINITE = 64;
+ /** Enumeration constant */
int EN_INDENT = 65;
+ /** Enumeration constant */
int EN_INHERIT = 66;
+ /** Enumeration constant */
int EN_INSET = 67;
+ /** Enumeration constant */
int EN_INSIDE = 68;
+ /** Enumeration constant */
int EN_INTEGER_PIXELS = 69;
+ /** Enumeration constant */
int EN_JUSTIFY = 70;
+ /** Enumeration constant */
int EN_LARGER = 71;
+ /** Enumeration constant */
int EN_LAST = 72;
+ /** Enumeration constant */
int EN_LEFT = 73;
+ /** Enumeration constant */
int EN_LEWP = 74;
+ /** Enumeration constant */
int EN_LINE = 75;
+ /** Enumeration constant */
int EN_LINE_HEIGHT = 76;
+ /** Enumeration constant */
int EN_LINE_THROUGH = 77;
+ /** Enumeration constant */
int EN_LOWERCASE = 78;
+ /** Enumeration constant */
int EN_LR_TB = 79;
+ /** Enumeration constant */
int EN_LTR = 80;
+ /** Enumeration constant */
int EN_LSWP = 81;
+ /** Enumeration constant */
int EN_MATHEMATICAL = 82;
+ /** Enumeration constant */
int EN_MAX_HEIGHT = 83;
+ /** Enumeration constant */
int EN_MIDDLE = 84;
+ /** Enumeration constant */
int EN_NARROWER = 85;
+ /** Enumeration constant */
int EN_NO_BLINK = 86;
+ /** Enumeration constant */
int EN_NO_CHANGE = 87;
+ /** Enumeration constant */
int EN_NO_FORCE = 88;
+ /** Enumeration constant */
int EN_NO_LIMIT = 89;
+ /** Enumeration constant */
int EN_NO_LINE_THROUGH = 90;
+ /** Enumeration constant */
int EN_NO_OVERLINE = 91;
+ /** Enumeration constant */
int EN_NO_UNDERLINE = 92;
+ /** Enumeration constant */
int EN_NO_WRAP = 93;
+ /** Enumeration constant */
int EN_NON_UNIFORM = 94;
+ /** Enumeration constant */
int EN_NONE = 95;
+ /** Enumeration constant */
int EN_NOREPEAT = 96;
+ /** Enumeration constant */
int EN_NORMAL = 97;
+ /** Enumeration constant */
int EN_NOT_BLANK = 98;
+ /** Enumeration constant */
int EN_ODD = 99;
+ /** Enumeration constant */
int EN_ODD_PAGE = 100;
+ /** Enumeration constant */
int EN_OUTSET = 101;
+ /** Enumeration constant */
int EN_OUTSIDE = 102;
+ /** Enumeration constant */
int EN_OVERLINE = 103;
+ /** Enumeration constant */
int EN_PAGE = 104;
+ /** Enumeration constant */
int EN_PAGE_SEQUENCE = 105;
+ /** Enumeration constant */
int EN_PAGINATE = 106;
+ /** Enumeration constant */
int EN_PERCEPTUAL = 107;
+ /** Enumeration constant */
int EN_PRESERVE = 108;
+ /** Enumeration constant */
int EN_REFERENCE_AREA = 109;
+ /** Enumeration constant */
int EN_RELATIVE = 110;
+ /** Enumeration constant */
int EN_RELATIVE_COLOMETRIC = 111;
+ /** Enumeration constant */
int EN_REPEAT = 112;
+ /** Enumeration constant */
int EN_REPEATX = 113;
+ /** Enumeration constant */
int EN_REPEATY = 114;
+ /** Enumeration constant */
int EN_RESAMPLE_ANY_METHOD = 115;
+ /** Enumeration constant */
int EN_RESET_SIZE = 116;
+ /** Enumeration constant */
int EN_REST = 117;
+ /** Enumeration constant */
int EN_RETAIN = 118;
+ /** Enumeration constant */
int EN_RIDGE = 119;
+ /** Enumeration constant */
int EN_RIGHT = 120;
+ /** Enumeration constant */
int EN_RL_TB = 121;
+ /** Enumeration constant */
int EN_RTL = 122;
+ /** Enumeration constant */
int EN_RULE = 123;
+ /** Enumeration constant */
int EN_SATURATION = 124;
+ /** Enumeration constant */
int EN_SCALE_TO_FIT = 125;
+ /** Enumeration constant */
int EN_SCROLL = 126;
+ /** Enumeration constant */
int EN_SEMI_CONDENSED = 127;
+ /** Enumeration constant */
int EN_SEMI_EXPANDED = 128;
+ /** Enumeration constant */
int EN_SEPARATE = 129;
+ /** Enumeration constant */
int EN_SHOW = 130;
+ /** Enumeration constant */
int EN_SMALL_CAPS = 131;
+ /** Enumeration constant */
int EN_SMALLER = 132;
+ /** Enumeration constant */
int EN_SOLID = 133;
+ /** Enumeration constant */
int EN_SPACE = 134;
+ /** Enumeration constant */
int EN_START = 135;
+ /** Enumeration constant */
int EN_STATIC = 136;
+ /** Enumeration constant */
int EN_SUB = 137;
+ /** Enumeration constant */
int EN_SUPER = 138;
+ /** Enumeration constant */
int EN_SUPPRESS = 139;
+ /** Enumeration constant */
int EN_TB_RL = 140;
+ /** Enumeration constant */
int EN_TEXT_AFTER_EDGE = 141;
+ /** Enumeration constant */
int EN_TEXT_BEFORE_EDGE = 142;
+ /** Enumeration constant */
int EN_TEXT_BOTTOM = 143;
+ /** Enumeration constant */
int EN_TEXT_TOP = 144;
+ /** Enumeration constant */
int EN_TOP = 145;
+ /** Enumeration constant */
int EN_TRADITIONAL = 146;
+ /** Enumeration constant */
int EN_TREAT_AS_SPACE = 147;
+ /** Enumeration constant */
int EN_TREAT_AS_ZERO_WIDTH_SPACE = 148;
+ /** Enumeration constant */
int EN_TRUE = 149;
+ /** Enumeration constant */
int EN_ULTRA_CONDENSED = 150;
+ /** Enumeration constant */
int EN_ULTRA_EXPANDED = 151;
+ /** Enumeration constant */
int EN_UNBOUNDED = 152;
+ /** Enumeration constant */
int EN_UNDERLINE = 153;
+ /** Enumeration constant */
int EN_UNIFORM = 154;
+ /** Enumeration constant */
int EN_UPPERCASE = 155;
+ /** Enumeration constant */
int EN_USE_FONT_METRICS = 156;
+ /** Enumeration constant */
int EN_USE_SCRIPT = 157;
+ /** Enumeration constant */
int EN_USECONTENT = 158;
+ /** Enumeration constant */
int EN_VISIBLE = 159;
+ /** Enumeration constant */
int EN_WIDER = 160;
+ /** Enumeration constant */
int EN_WRAP = 161;
- int EN_X_FILL = 162; //non-standard for display-align
- int EN_X_DISTRIBUTE = 163; //non-standard for display-align
+ /** Enumeration constant - non-standard for display-align */
+ int EN_X_FILL = 162;
+ /** Enumeration constant - non-standard for display-align */
+ int EN_X_DISTRIBUTE = 163;
+ /** Number of enumeration constants defined */
int ENUM_COUNT = 163;
}
diff --git a/src/java/org/apache/fop/fo/FOPropertyMapping.java b/src/java/org/apache/fop/fo/FOPropertyMapping.java
index f49d4d94e..7ff94a888 100644
--- a/src/java/org/apache/fop/fo/FOPropertyMapping.java
+++ b/src/java/org/apache/fop/fo/FOPropertyMapping.java
@@ -280,12 +280,13 @@ public class FOPropertyMapping implements Constants {
genericCondPadding.useGeneric(genericCondLength);
genericCondPadding.setInherited(false);
genericCondPadding.getSubpropMaker(CP_LENGTH).setDefault("0pt");
+ genericCondPadding.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
// GenericPadding
genericPadding = new LengthProperty.Maker(0);
genericPadding.setInherited(false);
genericPadding.setDefault("0pt");
- genericPadding.setPercentBase(LengthBase.BLOCK_WIDTH);
+ genericPadding.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
genericPadding.addShorthand(s_generics[PR_PADDING]);
// GenericCondBorderWidth
@@ -716,7 +717,7 @@ public class FOPropertyMapping implements Constants {
m.addKeyword("left", "0%");
m.addKeyword("center", "50%");
m.addKeyword("right", "100%");
- m.setPercentBase(LengthBase.CONTAINING_BOX);
+ m.setPercentBase(LengthBase.IMAGE_BACKGROUND_POSITION_HORIZONTAL);
addPropertyMaker("background-position-horizontal", m);
// background-position-vertical
@@ -726,7 +727,7 @@ public class FOPropertyMapping implements Constants {
m.addKeyword("top", "0%");
m.addKeyword("center", "50%");
m.addKeyword("bottom", "100%");
- m.setPercentBase(LengthBase.CONTAINING_BOX);
+ m.setPercentBase(LengthBase.IMAGE_BACKGROUND_POSITION_VERTICAL);
addPropertyMaker("background-position-vertical", m);
// border-before-color
@@ -1202,7 +1203,7 @@ public class FOPropertyMapping implements Constants {
m.setInherited(false);
m.setDefault("0pt");
m.addShorthand(s_generics[PR_MARGIN]);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("margin-top", m);
// margin-bottom
@@ -1210,7 +1211,7 @@ public class FOPropertyMapping implements Constants {
m.setInherited(false);
m.setDefault("0pt");
m.addShorthand(s_generics[PR_MARGIN]);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("margin-bottom", m);
// margin-left
@@ -1218,7 +1219,7 @@ public class FOPropertyMapping implements Constants {
m.setInherited(false);
m.setDefault("0pt");
m.addShorthand(s_generics[PR_MARGIN]);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("margin-left", m);
// margin-right
@@ -1226,7 +1227,7 @@ public class FOPropertyMapping implements Constants {
m.setInherited(false);
m.setDefault("0pt");
m.addShorthand(s_generics[PR_MARGIN]);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("margin-right", m);
// space-before
@@ -1407,26 +1408,26 @@ public class FOPropertyMapping implements Constants {
// block-progression-dimension
m = new LengthRangeProperty.Maker(PR_BLOCK_PROGRESSION_DIMENSION);
m.setInherited(false);
- m.setPercentBase(LengthBase.BLOCK_HEIGHT);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_HEIGHT);
l = new LengthProperty.Maker(CP_MINIMUM);
l.setDefault("auto");
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_HEIGHT);
l.setByShorthand(true);
m.addSubpropMaker(l);
l = new LengthProperty.Maker(CP_OPTIMUM);
l.setDefault("auto");
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_HEIGHT);
l.setByShorthand(true);
m.addSubpropMaker(l);
l = new LengthProperty.Maker(CP_MAXIMUM);
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
l.setDefault("auto");
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_HEIGHT);
l.setByShorthand(true);
m.addSubpropMaker(l);
@@ -1462,33 +1463,33 @@ public class FOPropertyMapping implements Constants {
l = new LengthProperty.Maker(PR_HEIGHT);
l.setInherited(false);
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.BLOCK_HEIGHT);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_HEIGHT);
l.setDefault("auto");
addPropertyMaker("height", l);
// inline-progression-dimension
m = new LengthRangeProperty.Maker(PR_INLINE_PROGRESSION_DIMENSION);
m.setInherited(false);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
l = new LengthProperty.Maker(CP_MINIMUM);
l.setDefault("auto");
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
l.setByShorthand(true);
m.addSubpropMaker(l);
l = new LengthProperty.Maker(CP_OPTIMUM);
l.setDefault("auto");
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
l.setByShorthand(true);
m.addSubpropMaker(l);
l = new LengthProperty.Maker(CP_MAXIMUM);
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
l.setDefault("auto");
- l.setPercentBase(LengthBase.CONTAINING_BOX);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
l.setByShorthand(true);
m.addSubpropMaker(l);
@@ -1547,7 +1548,7 @@ public class FOPropertyMapping implements Constants {
l = new LengthProperty.Maker(PR_WIDTH);
l.setInherited(false);
l.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO"));
- l.setPercentBase(LengthBase.BLOCK_WIDTH);
+ l.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
l.setDefault("auto");
addPropertyMaker("width", l);
@@ -1679,7 +1680,7 @@ public class FOPropertyMapping implements Constants {
m = new LengthProperty.Maker(PR_TEXT_INDENT);
m.setInherited(true);
m.setDefault("0pt");
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("text-indent", m);
// white-space-collapse
@@ -1957,29 +1958,29 @@ public class FOPropertyMapping implements Constants {
m.setInherited(true);
m.setDefault("use-font-metrics", true);
m.addKeyword("use-font-metrics", "0pt");
- m.setPercentBase(LengthBase.CONTAINING_BOX);
+ m.setPercentBase(LengthBase.PARENT_AREA_WIDTH);
addPropertyMaker("leader-pattern-width", m);
// leader-length
m = new LengthRangeProperty.Maker(PR_LEADER_LENGTH);
m.setInherited(true);
- m.setPercentBase(LengthBase.CONTAINING_BOX);
+ m.setPercentBase(LengthBase.PARENT_AREA_WIDTH);
sub = new LengthProperty.Maker(CP_MINIMUM);
sub.setDefault("0pt");
- sub.setPercentBase(LengthBase.BLOCK_WIDTH);
+ sub.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
sub.setByShorthand(true);
m.addSubpropMaker(sub);
sub = new LengthProperty.Maker(CP_OPTIMUM);
sub.setDefault("12.0pt");
- sub.setPercentBase(LengthBase.BLOCK_WIDTH);
+ sub.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
sub.setByShorthand(true);
m.addSubpropMaker(sub);
sub = new LengthProperty.Maker(CP_MAXIMUM);
sub.setDefault("100%", true);
- sub.setPercentBase(LengthBase.BLOCK_WIDTH);
+ sub.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
sub.setByShorthand(true);
m.addSubpropMaker(sub);
addPropertyMaker("leader-length", m);
@@ -2190,6 +2191,7 @@ public class FOPropertyMapping implements Constants {
m = new LengthProperty.Maker(PR_EXTENT);
m.setInherited(true);
m.setDefault("0pt");
+ m.setPercentBase(LengthBase.CUSTOM_BASE);
addPropertyMaker("extent", m);
// flow-name
@@ -2376,7 +2378,7 @@ public class FOPropertyMapping implements Constants {
m = new LengthProperty.Maker(PR_COLUMN_WIDTH);
m.setInherited(false);
m.setDefault("proportional-column-width(1)", true);
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("column-width", m);
// empty-cells
@@ -2651,13 +2653,14 @@ public class FOPropertyMapping implements Constants {
m.setInherited(false);
m.setDefault("");
m.setDatatypeParser(new BoxPropShorthandParser());
- m.setPercentBase(LengthBase.BLOCK_WIDTH);
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("margin", m);
// padding
m = new ListProperty.Maker(PR_PADDING);
m.setInherited(false);
m.setDatatypeParser(new BoxPropShorthandParser());
+ m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH);
addPropertyMaker("padding", m);
// page-break-after
diff --git a/src/java/org/apache/fop/fo/InlineCharIterator.java b/src/java/org/apache/fop/fo/InlineCharIterator.java
index 02ef5f341..ed90d50c0 100644
--- a/src/java/org/apache/fop/fo/InlineCharIterator.java
+++ b/src/java/org/apache/fop/fo/InlineCharIterator.java
@@ -40,9 +40,9 @@ public class InlineCharIterator extends RecursiveCharIterator {
private void checkBoundaries(CommonBorderPaddingBackground bpb) {
bStartBoundary = (bpb.getBorderStartWidth(false) > 0
- || bpb.getPaddingStart(false) > 0);
+ || bpb.getPaddingStart(false, null) > 0); // TODO do we need context here?
bEndBoundary = (bpb.getBorderEndWidth(false) > 0
- || bpb.getPaddingEnd(false) > 0);
+ || bpb.getPaddingEnd(false, null) > 0); // TODO do we need context here?
}
/**
diff --git a/src/java/org/apache/fop/fo/expr/LabelEndFunction.java b/src/java/org/apache/fop/fo/expr/LabelEndFunction.java
index d014662b3..4682272b5 100644
--- a/src/java/org/apache/fop/fo/expr/LabelEndFunction.java
+++ b/src/java/org/apache/fop/fo/expr/LabelEndFunction.java
@@ -66,7 +66,7 @@ public class LabelEndFunction extends FunctionBase {
Length startIndent = pList.get(Constants.PR_START_INDENT).getLength();
LengthBase base = new LengthBase(pList.getFObj(), pInfo.getPropertyList(),
- LengthBase.CONTAINING_REFAREA);
+ LengthBase.CONTAINING_REFAREA_WIDTH);
PercentLength refWidth = new PercentLength(1.0, base);
Numeric labelEnd = distance;
diff --git a/src/java/org/apache/fop/fo/expr/NumericOp.java b/src/java/org/apache/fop/fo/expr/NumericOp.java
index 34aa29d00..3edc41196 100755
--- a/src/java/org/apache/fop/fo/expr/NumericOp.java
+++ b/src/java/org/apache/fop/fo/expr/NumericOp.java
@@ -18,6 +18,7 @@
package org.apache.fop.fo.expr;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.Numeric;
/**
@@ -39,17 +40,17 @@ public class NumericOp {
*/
public static Numeric addition(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return addition2(op1, op2);
+ return addition2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.ADDITION, op1, op2);
}
}
- public static Numeric addition2(Numeric op1, Numeric op2) throws PropertyException {
+ public static Numeric addition2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
if (op1.getDimension() != op2.getDimension()) {
throw new PropertyException("Can't subtract Numerics of different dimensions");
}
- return numeric(op1.getNumericValue() + op2.getNumericValue(), op1.getDimension());
+ return numeric(op1.getNumericValue(context) + op2.getNumericValue(context), op1.getDimension());
}
/**
@@ -63,17 +64,17 @@ public class NumericOp {
*/
public static Numeric subtraction(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return subtraction2(op1, op2);
+ return subtraction2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.SUBTRACTION, op1, op2);
}
}
- public static Numeric subtraction2(Numeric op1, Numeric op2) throws PropertyException {
+ public static Numeric subtraction2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
if (op1.getDimension() != op2.getDimension()) {
throw new PropertyException("Can't subtract Numerics of different dimensions");
}
- return numeric(op1.getNumericValue() - op2.getNumericValue(), op1.getDimension());
+ return numeric(op1.getNumericValue(context) - op2.getNumericValue(context), op1.getDimension());
}
/**
@@ -87,14 +88,14 @@ public class NumericOp {
*/
public static Numeric multiply(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return multiply2(op1, op2);
+ return multiply2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.MULTIPLY, op1, op2);
}
}
- public static Numeric multiply2(Numeric op1, Numeric op2) throws PropertyException {
- return numeric(op1.getNumericValue() * op2.getNumericValue(),
+ public static Numeric multiply2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
+ return numeric(op1.getNumericValue(context) * op2.getNumericValue(context),
op1.getDimension() + op2.getDimension());
}
@@ -110,14 +111,14 @@ public class NumericOp {
*/
public static Numeric divide(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return divide2(op1, op2);
+ return divide2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.DIVIDE, op1, op2);
}
}
- public static Numeric divide2(Numeric op1, Numeric op2) throws PropertyException {
- return numeric(op1.getNumericValue() / op2.getNumericValue(),
+ public static Numeric divide2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
+ return numeric(op1.getNumericValue(context) / op2.getNumericValue(context),
op1.getDimension() - op2.getDimension());
}
@@ -129,14 +130,14 @@ public class NumericOp {
*/
public static Numeric modulo(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return modulo2(op1, op2);
+ return modulo2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.MODULO, op1, op2);
}
}
- public static Numeric modulo2(Numeric op1, Numeric op2) throws PropertyException {
- return numeric(op1.getNumericValue() % op2.getNumericValue(), op1.getDimension());
+ public static Numeric modulo2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
+ return numeric(op1.getNumericValue(context) % op2.getNumericValue(context), op1.getDimension());
}
/**
@@ -146,14 +147,14 @@ public class NumericOp {
*/
public static Numeric abs(Numeric op) throws PropertyException {
if (op.isAbsolute()) {
- return abs2(op);
+ return abs2(op, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.ABS, op);
}
}
- public static Numeric abs2(Numeric op) throws PropertyException {
- return numeric(Math.abs(op.getNumericValue()), op.getDimension());
+ public static Numeric abs2(Numeric op, PercentBaseContext context) throws PropertyException {
+ return numeric(Math.abs(op.getNumericValue(context)), op.getDimension());
}
/**
@@ -163,14 +164,14 @@ public class NumericOp {
*/
public static Numeric negate(Numeric op) throws PropertyException {
if (op.isAbsolute()) {
- return negate2(op);
+ return negate2(op, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.NEGATE, op);
}
}
- public static Numeric negate2(Numeric op) throws PropertyException {
- return numeric(- op.getNumericValue(), op.getDimension());
+ public static Numeric negate2(Numeric op, PercentBaseContext context) throws PropertyException {
+ return numeric(- op.getNumericValue(context), op.getDimension());
}
/**
@@ -182,17 +183,17 @@ public class NumericOp {
*/
public static Numeric max(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return max2(op1, op2);
+ return max2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.MAX, op1, op2);
}
}
- public static Numeric max2(Numeric op1, Numeric op2) throws PropertyException {
+ public static Numeric max2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
if (op1.getDimension() != op2.getDimension()) {
throw new PropertyException("Arguments to max() must have same dimensions");
}
- return op1.getNumericValue() > op2.getNumericValue() ? op1 : op2;
+ return op1.getNumericValue(context) > op2.getNumericValue(context) ? op1 : op2;
}
/**
@@ -204,17 +205,17 @@ public class NumericOp {
*/
public static Numeric min(Numeric op1, Numeric op2) throws PropertyException {
if (op1.isAbsolute() && op2.isAbsolute()) {
- return min2(op1, op2);
+ return min2(op1, op2, null);
} else {
return new RelativeNumericProperty(RelativeNumericProperty.MIN, op1, op2);
}
}
- public static Numeric min2(Numeric op1, Numeric op2) throws PropertyException {
+ public static Numeric min2(Numeric op1, Numeric op2, PercentBaseContext context) throws PropertyException {
if (op1.getDimension() != op2.getDimension()) {
throw new PropertyException("Arguments to min() must have same dimensions");
}
- return op1.getNumericValue() <= op2.getNumericValue() ? op1 : op2;
+ return op1.getNumericValue(context) <= op2.getNumericValue(context) ? op1 : op2;
}
/**
diff --git a/src/java/org/apache/fop/fo/expr/NumericProperty.java b/src/java/org/apache/fop/fo/expr/NumericProperty.java
index 72de27750..dd146ce7f 100644
--- a/src/java/org/apache/fop/fo/expr/NumericProperty.java
+++ b/src/java/org/apache/fop/fo/expr/NumericProperty.java
@@ -19,6 +19,7 @@
package org.apache.fop.fo.expr;
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.Numeric;
import org.apache.fop.fo.properties.ColorTypeProperty;
import org.apache.fop.fo.properties.Property;
@@ -60,6 +61,15 @@ public class NumericProperty extends Property implements Numeric, Length {
}
/**
+ * Return the value.
+ * @param Evaluation context
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) {
+ return value;
+ }
+
+ /**
* Return true of the numeric is absolute.
* @see Numeric#isAbsolute()
*/
@@ -89,6 +99,14 @@ public class NumericProperty extends Property implements Numeric, Length {
}
/**
+ * Return the value of this numeric as a length in millipoints.
+ * @param Evaluation context
+ */
+ public int getValue(PercentBaseContext context) {
+ return (int) value;
+ }
+
+ /**
* Cast this as a length. That is only possible when the dimension is
* one.
*/
diff --git a/src/java/org/apache/fop/fo/expr/PropertyInfo.java b/src/java/org/apache/fop/fo/expr/PropertyInfo.java
index fb59332de..9cd5e714e 100644
--- a/src/java/org/apache/fop/fo/expr/PropertyInfo.java
+++ b/src/java/org/apache/fop/fo/expr/PropertyInfo.java
@@ -20,11 +20,12 @@ package org.apache.fop.fo.expr;
import java.util.Stack;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.Constants;
-import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.properties.PropertyMaker;
-import org.apache.fop.datatypes.PercentBase;
/**
@@ -57,7 +58,7 @@ public class PropertyInfo {
* Propagates to the Maker.
* @return The PercentBase object or null if percentLengthOK()=false.
*/
- public PercentBase getPercentBase() {
+ public PercentBase getPercentBase() throws PropertyException {
PercentBase pcbase = getFunctionPercentBase();
return (pcbase != null) ? pcbase : maker.getPercentBase(fo, plist);
}
@@ -65,8 +66,8 @@ public class PropertyInfo {
/**
* @return the current font-size value as base units (milli-points).
*/
- public int currentFontSize() throws PropertyException {
- return plist.get(Constants.PR_FONT_SIZE).getLength().getValue();
+ public Length currentFontSize() throws PropertyException {
+ return plist.get(Constants.PR_FONT_SIZE).getLength();
}
/**
diff --git a/src/java/org/apache/fop/fo/expr/PropertyParser.java b/src/java/org/apache/fop/fo/expr/PropertyParser.java
index 7d77d7f9b..4ab7e7249 100644
--- a/src/java/org/apache/fop/fo/expr/PropertyParser.java
+++ b/src/java/org/apache/fop/fo/expr/PropertyParser.java
@@ -285,18 +285,11 @@ public class PropertyParser extends PropertyTokenizer {
String unitPart = currentTokenValue.substring(numLen);
Double numPart = new Double(currentTokenValue.substring(0,
numLen));
- LengthProperty length = null;
if (unitPart.equals(RELUNIT)) {
- length = new FixedLength(numPart.doubleValue(),
+ prop = (Property) NumericOp.multiply(new NumberProperty(numPart.doubleValue()),
propInfo.currentFontSize());
} else {
- length = new FixedLength(numPart.doubleValue(), unitPart);
- }
- if (length == null) {
- throw new PropertyException("unrecognized unit name: "
- + currentTokenValue);
- } else {
- prop = length;
+ prop = new FixedLength(numPart.doubleValue(), unitPart);
}
break;
diff --git a/src/java/org/apache/fop/fo/expr/RGBColorFunction.java b/src/java/org/apache/fop/fo/expr/RGBColorFunction.java
index ee1e28daa..4e050bd08 100644
--- a/src/java/org/apache/fop/fo/expr/RGBColorFunction.java
+++ b/src/java/org/apache/fop/fo/expr/RGBColorFunction.java
@@ -19,9 +19,10 @@
package org.apache.fop.fo.expr;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.properties.ColorTypeProperty;
import org.apache.fop.fo.properties.Property;
-import org.apache.fop.datatypes.PercentBase;
class RGBColorFunction extends FunctionBase {
public int nbArgs() {
@@ -68,7 +69,7 @@ class RGBColorFunction extends FunctionBase {
return 255f;
}
- public int getBaseLength() {
+ public int getBaseLength(PercentBaseContext context) {
return 0;
}
diff --git a/src/java/org/apache/fop/fo/expr/RelativeNumericProperty.java b/src/java/org/apache/fop/fo/expr/RelativeNumericProperty.java
index 97e940d0b..15017440d 100755
--- a/src/java/org/apache/fop/fo/expr/RelativeNumericProperty.java
+++ b/src/java/org/apache/fop/fo/expr/RelativeNumericProperty.java
@@ -18,6 +18,8 @@
package org.apache.fop.fo.expr;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.Numeric;
import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.properties.Property;
@@ -96,29 +98,30 @@ public class RelativeNumericProperty extends Property implements Numeric, Length
/**
* Return a resolved (calculated) Numeric with the value of the expression.
+ * @param context Evaluation context
* @throws PropertyException when an exception occur during evaluation.
*/
- private Numeric getResolved() throws PropertyException {
+ private Numeric getResolved(PercentBaseContext context) throws PropertyException {
Numeric n;
switch (operation) {
case ADDITION:
- return NumericOp.addition2(op1, op2);
+ return NumericOp.addition2(op1, op2, context);
case SUBTRACTION:
- return NumericOp.subtraction2(op1, op2);
+ return NumericOp.subtraction2(op1, op2, context);
case MULTIPLY:
- return NumericOp.multiply2(op1, op2);
+ return NumericOp.multiply2(op1, op2, context);
case DIVIDE:
- return NumericOp.divide2(op1, op2);
+ return NumericOp.divide2(op1, op2, context);
case MODULO:
- return NumericOp.modulo2(op1, op2);
+ return NumericOp.modulo2(op1, op2, context);
case NEGATE:
- return NumericOp.negate2(op1);
+ return NumericOp.negate2(op1, context);
case ABS:
- return NumericOp.abs2(op1);
+ return NumericOp.abs2(op1, context);
case MAX:
- return NumericOp.max2(op1, op2);
+ return NumericOp.max2(op1, op2, context);
case MIN:
- return NumericOp.min2(op1, op2);
+ return NumericOp.min2(op1, op2, context);
default:
throw new PropertyException("Unknown expr operation " + operation);
}
@@ -129,7 +132,16 @@ public class RelativeNumericProperty extends Property implements Numeric, Length
* @see Numeric#getNumericValue()
*/
public double getNumericValue() throws PropertyException {
- return getResolved().getNumericValue();
+ return getResolved(null).getNumericValue(null);
+ }
+
+ /**
+ * Return the value.
+ * @param Evaluation context
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) throws PropertyException {
+ return getResolved(context).getNumericValue(context);
}
/**
@@ -175,6 +187,19 @@ public class RelativeNumericProperty extends Property implements Numeric, Length
}
/**
+ * Return the value of this numeric as a length in millipoints.
+ * @param Evaluation context
+ */
+ public int getValue(PercentBaseContext context) {
+ try {
+ return (int) getNumericValue(context);
+ } catch (PropertyException exc) {
+ log.error(exc);
+ }
+ return 0;
+ }
+
+ /**
* Return a string represention of the expression. Only used for debugging.
*/
public String toString() {
diff --git a/src/java/org/apache/fop/fo/flow/ExternalGraphic.java b/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
index eeaa5080a..5dbc1606c 100644
--- a/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
+++ b/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
@@ -280,19 +280,6 @@ public class ExternalGraphic extends FObj {
}
/**
- * @see org.apache.fop.fo.FObj#getLayoutDimension(org.apache.fop.datatypes.PercentBase.LayoutDimension)
- */
- public Number getLayoutDimension(PercentBase.LayoutDimension key) {
- if (key == PercentBase.IMAGE_INTRINSIC_WIDTH) {
- return new Integer(getIntrinsicWidth());
- } else if (key == PercentBase.IMAGE_INTRINSIC_HEIGHT) {
- return new Integer(getIntrinsicHeight());
- } else {
- return super.getLayoutDimension(key);
- }
- }
-
- /**
* @see org.apache.fop.fo.IntrinsicSizeAccess#getIntrinsicWidth()
*/
public int getIntrinsicWidth() {
diff --git a/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java b/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
index 5c67135ef..070162ed0 100644
--- a/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
+++ b/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
@@ -285,17 +285,6 @@ public class InstreamForeignObject extends FObj {
return FO_INSTREAM_FOREIGN_OBJECT;
}
- /** @see org.apache.fop.fo.FObj */
- public Number getLayoutDimension(PercentBase.LayoutDimension key) {
- if (key == PercentBase.IMAGE_INTRINSIC_WIDTH) {
- return new Integer(getIntrinsicWidth());
- } else if (key == PercentBase.IMAGE_INTRINSIC_HEIGHT) {
- return new Integer(getIntrinsicHeight());
- } else {
- return super.getLayoutDimension(key);
- }
- }
-
/**
* Preloads the image so the intrinsic size is available.
*/
diff --git a/src/java/org/apache/fop/fo/flow/Table.java b/src/java/org/apache/fop/fo/flow/Table.java
index bb9f126e2..4b0dd7a7c 100644
--- a/src/java/org/apache/fop/fo/flow/Table.java
+++ b/src/java/org/apache/fop/fo/flow/Table.java
@@ -132,11 +132,13 @@ public class Table extends FObj {
PropertyList colPList = new StaticPropertyList(defaultColumn, pList);
colPList.setWritingMode();
defaultColumn.bind(colPList);
-
+
+ /* TODO hasPadding requires context for evaluation - need to move this to layout
if (borderCollapse != EN_SEPARATE && commonBorderPaddingBackground.hasPadding()) {
//See "17.6.2 The collapsing border model" in CSS2
getLogger().error("Table may not have padding when using the collapsing border model.");
}
+ */
if (borderCollapse != EN_SEPARATE) {
getLogger().warn("The collapsing border model on an fo:table "
+ "is currently not supported by FOP");
diff --git a/src/java/org/apache/fop/fo/flow/TableCell.java b/src/java/org/apache/fop/fo/flow/TableCell.java
index 3951c3515..b3583d37f 100644
--- a/src/java/org/apache/fop/fo/flow/TableCell.java
+++ b/src/java/org/apache/fop/fo/flow/TableCell.java
@@ -188,95 +188,97 @@ public class TableCell extends FObj {
* Calculate cell border and padding, including offset of content
* rectangle from the theoretical grid position.
*/
- private void calcBorders(CommonBorderPaddingBackground bp) {
- if (this.borderCollapse == EN_SEPARATE) {
- /*
- * Easy case.
- * Cell border is the property specified directly on cell.
- * Offset content rect by half the border-separation value,
- * in addition to the border and padding values. Note:
- * border-separate should only be specified on the table object,
- * but it inherits.
- */
- int iSep = borderSeparation.getIPD().getLength().getValue();
- this.startAdjust = iSep / 2 + bp.getBorderStartWidth(false)
- + bp.getPaddingStart(false);
-
- this.widthAdjust = startAdjust + iSep - iSep / 2
- + bp.getBorderEndWidth(false)
- + bp.getPaddingEnd(false);
-
- // Offset of content rectangle in the block-progression direction
- int bSep = borderSeparation.getBPD().getLength().getValue();
- this.beforeOffset = bSep / 2
- + bp.getBorderBeforeWidth(false)
- + bp.getPaddingBefore(false);
-
- } else {
- // System.err.println("Collapse borders");
- /*
- * Hard case.
- * Cell border is combination of other cell borders, or table
- * border for edge cells. Also seems to border values specified
- * on row and column FO in the table (if I read CR correclty.)
- */
-
- // Set up before and after borders, taking into account row
- // and table border properties.
- // ??? What about table-body, header,footer
-
- /*
- * We can't calculate before and after because we aren't sure
- * whether this row will be the first or last in its area, due
- * to redoing break decisions (at least in the "new" architecture.)
- * So in the general case, we will calculate two possible values:
- * the first/last one and the "middle" one.
- * Example: border-before
- * 1. If the cell is in the first row in the first table body, it
- * will combine with the last row of the header, or with the
- * top (before) table border if there is no header.
- * 2. Otherwise there are two cases:
- * a. the row is first in its (non-first) Area.
- * The border can combine with either:
- * i. the last row of table-header and its cells, or
- * ii. the table before border (no table-header or it is
- * omitted on non-first Areas).
- * b. the row isn't first in its Area.
- * The border combines with the border of the previous
- * row and the cells which end in that row.
- */
-
- /*
- * if-first
- * Calculate the effective border of the cell before-border,
- * it's parent row before-border, the last header row after-border,
- * the after border of the cell(s) which end in the last header
- * row.
- */
- /*
- * if-not-first
- * Calculate the effective border of the cell before-border,
- * it's parent row before-border, the previous row after-border,
- * the after border of the cell(s) which end in the previous
- * row.
- */
-
-
- /* ivan demakov */
- int borderStart = bp.getBorderStartWidth(false);
- int borderEnd = bp.getBorderEndWidth(false);
- int borderBefore = bp.getBorderBeforeWidth(false);
- int borderAfter = bp.getBorderAfterWidth(false);
-
- this.startAdjust = borderStart / 2 + bp.getPaddingStart(false);
-
- this.widthAdjust = startAdjust + borderEnd / 2
- + bp.getPaddingEnd(false);
- this.beforeOffset = borderBefore / 2 + bp.getPaddingBefore(false);
- // Half border height to fix overestimate of area size!
- this.borderHeight = (borderBefore + borderAfter) / 2;
- }
- }
+// TODO This whole method is not used it refers to padding which requires layout
+// context to evaluate
+// private void calcBorders(CommonBorderPaddingBackground bp) {
+// if (this.borderCollapse == EN_SEPARATE) {
+// /*
+// * Easy case.
+// * Cell border is the property specified directly on cell.
+// * Offset content rect by half the border-separation value,
+// * in addition to the border and padding values. Note:
+// * border-separate should only be specified on the table object,
+// * but it inherits.
+// */
+// int iSep = borderSeparation.getIPD().getLength().getValue();
+// this.startAdjust = iSep / 2 + bp.getBorderStartWidth(false)
+// + bp.getPaddingStart(false);
+//
+// this.widthAdjust = startAdjust + iSep - iSep / 2
+// + bp.getBorderEndWidth(false)
+// + bp.getPaddingEnd(false);
+//
+// // Offset of content rectangle in the block-progression direction
+// int bSep = borderSeparation.getBPD().getLength().getValue();
+// this.beforeOffset = bSep / 2
+// + bp.getBorderBeforeWidth(false)
+// + bp.getPaddingBefore(false);
+//
+// } else {
+// // System.err.println("Collapse borders");
+// /*
+// * Hard case.
+// * Cell border is combination of other cell borders, or table
+// * border for edge cells. Also seems to border values specified
+// * on row and column FO in the table (if I read CR correclty.)
+// */
+//
+// // Set up before and after borders, taking into account row
+// // and table border properties.
+// // ??? What about table-body, header,footer
+//
+// /*
+// * We can't calculate before and after because we aren't sure
+// * whether this row will be the first or last in its area, due
+// * to redoing break decisions (at least in the "new" architecture.)
+// * So in the general case, we will calculate two possible values:
+// * the first/last one and the "middle" one.
+// * Example: border-before
+// * 1. If the cell is in the first row in the first table body, it
+// * will combine with the last row of the header, or with the
+// * top (before) table border if there is no header.
+// * 2. Otherwise there are two cases:
+// * a. the row is first in its (non-first) Area.
+// * The border can combine with either:
+// * i. the last row of table-header and its cells, or
+// * ii. the table before border (no table-header or it is
+// * omitted on non-first Areas).
+// * b. the row isn't first in its Area.
+// * The border combines with the border of the previous
+// * row and the cells which end in that row.
+// */
+//
+// /*
+// * if-first
+// * Calculate the effective border of the cell before-border,
+// * it's parent row before-border, the last header row after-border,
+// * the after border of the cell(s) which end in the last header
+// * row.
+// */
+// /*
+// * if-not-first
+// * Calculate the effective border of the cell before-border,
+// * it's parent row before-border, the previous row after-border,
+// * the after border of the cell(s) which end in the previous
+// * row.
+// */
+//
+//
+// /* ivan demakov */
+// int borderStart = bp.getBorderStartWidth(false);
+// int borderEnd = bp.getBorderEndWidth(false);
+// int borderBefore = bp.getBorderBeforeWidth(false);
+// int borderAfter = bp.getBorderAfterWidth(false);
+//
+// this.startAdjust = borderStart / 2 + bp.getPaddingStart(false);
+//
+// this.widthAdjust = startAdjust + borderEnd / 2
+// + bp.getPaddingEnd(false);
+// this.beforeOffset = borderBefore / 2 + bp.getPaddingBefore(false);
+// // Half border height to fix overestimate of area size!
+// this.borderHeight = (borderBefore + borderAfter) / 2;
+// }
+// }
/**
* @return the Common Border, Padding, and Background Properties.
diff --git a/src/java/org/apache/fop/fo/pagination/Region.java b/src/java/org/apache/fop/fo/pagination/Region.java
index 0d3aa6991..4980d057e 100644
--- a/src/java/org/apache/fop/fo/pagination/Region.java
+++ b/src/java/org/apache/fop/fo/pagination/Region.java
@@ -81,8 +81,8 @@ public abstract class Region extends FObj {
}
}
- if (getCommonBorderPaddingBackground().getBPPaddingAndBorder(false) != 0
- || getCommonBorderPaddingBackground().getIPPaddingAndBorder(false) != 0) {
+ if (getCommonBorderPaddingBackground().getBPPaddingAndBorder(false, null) != 0 //TODO do we need context here?
+ || getCommonBorderPaddingBackground().getIPPaddingAndBorder(false, null) != 0) { //TODO do we need context here?
throw new PropertyException("Border and padding for a region "
+ "must be '0' (See 6.4.13 in XSL 1.0).");
}
@@ -99,9 +99,11 @@ public abstract class Region extends FObj {
/**
* @param pageRefRect reference dimension of the page area.
+ * @param pageViewRectRect page view port dimensions.
* @return the rectangle for the viewport area
*/
- public abstract Rectangle getViewportRectangle(FODimension pageRefRect);
+ public abstract Rectangle getViewportRectangle(FODimension pageRefRect
+ , FODimension pageViewPortRect);
/**
* Returns the default region name (xsl-region-before, xsl-region-start,
diff --git a/src/java/org/apache/fop/fo/pagination/RegionAfter.java b/src/java/org/apache/fop/fo/pagination/RegionAfter.java
index dc8fafd36..68d6d066d 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionAfter.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionAfter.java
@@ -24,6 +24,8 @@ import java.awt.Rectangle;
// FOP
import org.apache.fop.fo.FONode;
import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
/**
* The fo:region-after element.
@@ -40,16 +42,29 @@ public class RegionAfter extends RegionBA {
/**
* @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
*/
- public Rectangle getViewportRectangle (FODimension reldims) {
+ public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
// Depends on extent, precedence ans writing mode
+ /* Special rules apply to resolving extent.
+ * In the property subsystem the extent property is configured to
+ * using BLOCK_WIDTH as its percent base.
+ * However, depending on the writing mode extent import resolved either
+ * against the page width or the page height.
+ */
Rectangle vpRect;
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext neighbourContext;
if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
- vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(), reldims.ipd, getExtent().getValue());
+ neighbourContext = pageWidthContext;
+ vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageHeightContext), reldims.ipd, getExtent().getValue(pageHeightContext));
} else {
- vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(), getExtent().getValue(), reldims.ipd);
+ neighbourContext = pageHeightContext;
+ vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageWidthContext), getExtent().getValue(pageWidthContext), reldims.ipd);
}
if (getPrecedence() == EN_FALSE) {
- adjustIPD(vpRect, getWritingMode());
+ adjustIPD(vpRect, getWritingMode(), neighbourContext);
}
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionBA.java b/src/java/org/apache/fop/fo/pagination/RegionBA.java
index 6d35dae20..f732c721f 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionBA.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionBA.java
@@ -22,6 +22,7 @@ package org.apache.fop.fo.pagination;
import java.awt.Rectangle;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
@@ -63,17 +64,18 @@ public abstract class RegionBA extends SideRegion {
* and end regions if they are present.
* @param vpRefRect viewport reference rectangle
* @param wm writing mode
+ * @param siblingContext the context to use to resolve extent on siblings
*/
- protected void adjustIPD(Rectangle vpRefRect, int wm) {
+ protected void adjustIPD(Rectangle vpRefRect, int wm, PercentBaseContext siblingContext) {
int offset = 0;
RegionStart start = (RegionStart) getSiblingRegion(FO_REGION_START);
if (start != null) {
- offset = start.getExtent().getValue();
+ offset = start.getExtent().getValue(siblingContext);
vpRefRect.translate(offset, 0); // move (x, y) units
}
RegionEnd end = (RegionEnd) getSiblingRegion(FO_REGION_END);
if (end != null) {
- offset += end.getExtent().getValue();
+ offset += end.getExtent().getValue(siblingContext);
}
if (offset > 0) {
if (wm == EN_LR_TB || wm == EN_RL_TB) {
diff --git a/src/java/org/apache/fop/fo/pagination/RegionBefore.java b/src/java/org/apache/fop/fo/pagination/RegionBefore.java
index 19607f9b1..c1f683c05 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionBefore.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionBefore.java
@@ -23,6 +23,8 @@ import java.awt.Rectangle;
// FOP
import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
import org.apache.fop.fo.FONode;
/**
@@ -46,21 +48,34 @@ public class RegionBefore extends RegionBA {
/**
* @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
*/
- public Rectangle getViewportRectangle (FODimension reldims) {
+ public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
// Depends on extent, precedence and writing mode
// This should return rectangle in writing-mode coordinates relative
// to the page-reference area rectangle
// This means the origin is (start, before) and the dimensions are (ipd,bpd)
// Before is always 0, start depends on extent
// ipd depends on precedence, bpd=extent
+ /* Special rules apply to resolving extent.
+ * In the property subsystem the extent property is configured to
+ * using BLOCK_WIDTH as its percent base.
+ * However, depending on the writing mode extent import resolved either
+ * against the page width or the page height.
+ */
Rectangle vpRect;
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext neighbourContext;
if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
- vpRect = new Rectangle(0, 0, reldims.ipd, getExtent().getValue());
+ neighbourContext = pageWidthContext;
+ vpRect = new Rectangle(0, 0, reldims.ipd, getExtent().getValue(pageHeightContext));
} else {
- vpRect = new Rectangle(0, 0, getExtent().getValue(), reldims.ipd);
+ neighbourContext = pageHeightContext;
+ vpRect = new Rectangle(0, 0, getExtent().getValue(pageWidthContext), reldims.ipd);
}
if (getPrecedence() == EN_FALSE) {
- adjustIPD(vpRect, getWritingMode());
+ adjustIPD(vpRect, getWritingMode(), neighbourContext);
}
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionBody.java b/src/java/org/apache/fop/fo/pagination/RegionBody.java
index 00acca4da..835802469 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionBody.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionBody.java
@@ -24,7 +24,9 @@ import java.awt.Rectangle;
import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.FODimension;
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.Numeric;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.properties.CommonMarginBlock;
@@ -90,11 +92,24 @@ public class RegionBody extends Region {
/**
* @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
*/
- public Rectangle getViewportRectangle (FODimension reldims) {
- int left = commonMarginBlock.marginLeft.getValue();
- int right = commonMarginBlock.marginRight.getValue();
- int top = commonMarginBlock.marginTop.getValue();
- int bottom = commonMarginBlock.marginBottom.getValue();
+ public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
+ /* Special rules apply to resolving margins in the page context.
+ * Contrary to normal margins in this case top and bottom margin
+ * are resolved relative to the height. In the property subsystem
+ * all margin properties are configured to using BLOCK_WIDTH.
+ * That's why we 'cheat' here and setup a context for the height but
+ * use the LengthBase.BLOCK_WIDTH.
+ * Also the values are resolved relative to the page size.
+ */
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortRect.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortRect.bpd);
+
+ int left = commonMarginBlock.marginLeft.getValue(pageWidthContext);
+ int right = commonMarginBlock.marginRight.getValue(pageWidthContext);
+ int top = commonMarginBlock.marginTop.getValue(pageHeightContext);
+ int bottom = commonMarginBlock.marginBottom.getValue(pageHeightContext);
return new Rectangle(left, top,
reldims.ipd - left - right,
reldims.bpd - top - bottom);
diff --git a/src/java/org/apache/fop/fo/pagination/RegionEnd.java b/src/java/org/apache/fop/fo/pagination/RegionEnd.java
index e4aff17e6..a097ec375 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionEnd.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionEnd.java
@@ -24,6 +24,8 @@ import java.awt.Rectangle;
// FOP
import org.apache.fop.fo.FONode;
import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
/**
* The fo:region-end element.
@@ -39,19 +41,31 @@ public class RegionEnd extends RegionSE {
/**
* @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
*/
- public Rectangle getViewportRectangle (FODimension reldims) {
+ public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
// Depends on extent, precedence and writing mode
+ /* Special rules apply to resolving extent.
+ * In the property subsystem the extent property is configured to
+ * using BLOCK_WIDTH as its percent base.
+ * However, depending on the writing mode extent import resolved either
+ * against the page width or the page height.
+ */
Rectangle vpRect;
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext neighbourContext;
if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
- // Rectangle: x , y (of top left point), width, height
- vpRect = new Rectangle(reldims.ipd - getExtent().getValue(), 0,
- getExtent().getValue(), reldims.bpd);
+ neighbourContext = pageHeightContext;
+ vpRect = new Rectangle(reldims.ipd - getExtent().getValue(pageWidthContext), 0,
+ getExtent().getValue(pageWidthContext), reldims.bpd);
} else {
// Rectangle: x , y (of top left point), width, height
- vpRect = new Rectangle(reldims.ipd - getExtent().getValue(), 0,
- reldims.bpd, getExtent().getValue());
+ neighbourContext = pageWidthContext;
+ vpRect = new Rectangle(reldims.ipd - getExtent().getValue(pageHeightContext), 0,
+ reldims.bpd, getExtent().getValue(pageHeightContext));
}
- adjustIPD(vpRect, getWritingMode());
+ adjustIPD(vpRect, getWritingMode(), neighbourContext);
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionSE.java b/src/java/org/apache/fop/fo/pagination/RegionSE.java
index 9100c0981..4ab2ebd05 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionSE.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionSE.java
@@ -22,6 +22,7 @@ package org.apache.fop.fo.pagination;
import java.awt.Rectangle;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
@@ -55,17 +56,18 @@ public abstract class RegionSE extends SideRegion {
* diminish by extend of start and end if present.
* @param vpRefRect viewport reference rectangle
* @param wm writing mode
+ * @param siblingContext the context to use to resolve extent on siblings
*/
- protected void adjustIPD(Rectangle vpRefRect, int wm) {
+ protected void adjustIPD(Rectangle vpRefRect, int wm, PercentBaseContext siblingContext) {
int offset = 0;
RegionBefore before = (RegionBefore) getSiblingRegion(FO_REGION_BEFORE);
if (before != null && before.getPrecedence() == EN_TRUE) {
- offset = before.getExtent().getValue();
+ offset = before.getExtent().getValue(siblingContext);
vpRefRect.translate(0, offset);
}
RegionAfter after = (RegionAfter) getSiblingRegion(FO_REGION_AFTER);
if (after != null && after.getPrecedence() == EN_TRUE) {
- offset += after.getExtent().getValue();
+ offset += after.getExtent().getValue(siblingContext);
}
if (offset > 0) {
if (wm == EN_LR_TB || wm == EN_RL_TB) {
diff --git a/src/java/org/apache/fop/fo/pagination/RegionStart.java b/src/java/org/apache/fop/fo/pagination/RegionStart.java
index 9668dceeb..2de7cc68f 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionStart.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionStart.java
@@ -24,6 +24,8 @@ import java.awt.Rectangle;
// FOP
import org.apache.fop.fo.FONode;
import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
/**
* The fo:region-start element.
@@ -39,17 +41,30 @@ public class RegionStart extends RegionSE {
/**
* @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
*/
- public Rectangle getViewportRectangle (FODimension reldims) {
+ public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
// Depends on extent, precedence and writing mode
// This is the rectangle relative to the page-reference area in
// writing-mode relative coordinates
+ /* Special rules apply to resolving extent.
+ * In the property subsystem the extent property is configured to
+ * using BLOCK_WIDTH as its percent base.
+ * However, depending on the writing mode extent import resolved either
+ * against the page width or the page height.
+ */
Rectangle vpRect;
+ SimplePercentBaseContext pageWidthContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
+ SimplePercentBaseContext pageHeightContext
+ = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext neighbourContext;
if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
- vpRect = new Rectangle(0, 0, getExtent().getValue(), reldims.bpd);
+ neighbourContext = pageHeightContext;
+ vpRect = new Rectangle(0, 0, getExtent().getValue(pageWidthContext), reldims.bpd);
} else {
- vpRect = new Rectangle(0, 0, reldims.bpd, getExtent().getValue());
+ neighbourContext = pageWidthContext;
+ vpRect = new Rectangle(0, 0, reldims.bpd, getExtent().getValue(pageHeightContext));
}
- adjustIPD(vpRect, getWritingMode());
+ adjustIPD(vpRect, getWritingMode(), neighbourContext);
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java b/src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java
index f60b37bca..ecdec78c8 100755
--- a/src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java
+++ b/src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java
@@ -20,6 +20,7 @@ package org.apache.fop.fo.properties;
import org.apache.fop.datatypes.ColorType;
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
@@ -224,6 +225,14 @@ public class CommonBorderPaddingBackground implements Cloneable {
}
/**
+ * Set padding.
+ * @param source the padding info to copy from
+ */
+ public void setPadding(CommonBorderPaddingBackground source) {
+ this.padding = source.padding;
+ }
+
+ /**
* @return the background image as a preloaded FopImage, null if there is
* no background image.
*/
@@ -247,20 +256,20 @@ public class CommonBorderPaddingBackground implements Cloneable {
return getBorderWidth(AFTER, bDiscard);
}
- public int getPaddingStart(boolean bDiscard) {
- return getPadding(START, bDiscard);
+ public int getPaddingStart(boolean bDiscard, PercentBaseContext context) {
+ return getPadding(START, bDiscard, context);
}
- public int getPaddingEnd(boolean bDiscard) {
- return getPadding(END, bDiscard);
+ public int getPaddingEnd(boolean bDiscard, PercentBaseContext context) {
+ return getPadding(END, bDiscard, context);
}
- public int getPaddingBefore(boolean bDiscard) {
- return getPadding(BEFORE, bDiscard);
+ public int getPaddingBefore(boolean bDiscard, PercentBaseContext context) {
+ return getPadding(BEFORE, bDiscard, context);
}
- public int getPaddingAfter(boolean bDiscard) {
- return getPadding(AFTER, bDiscard);
+ public int getPaddingAfter(boolean bDiscard, PercentBaseContext context) {
+ return getPadding(AFTER, bDiscard, context);
}
public int getBorderWidth(int side, boolean bDiscard) {
@@ -290,11 +299,11 @@ public class CommonBorderPaddingBackground implements Cloneable {
}
}
- public int getPadding(int side, boolean bDiscard) {
+ public int getPadding(int side, boolean bDiscard, PercentBaseContext context) {
if ((padding[side] == null) || (bDiscard && padding[side].isDiscard())) {
return 0;
} else {
- return padding[side].getLengthValue();
+ return padding[side].getLengthValue(context);
}
}
@@ -302,11 +311,12 @@ public class CommonBorderPaddingBackground implements Cloneable {
* Return all the border and padding width in the inline progression
* dimension.
* @param bDiscard the discard flag.
+ * @param context for percentage evaluation.
* @return all the padding and border width.
*/
- public int getIPPaddingAndBorder(boolean bDiscard) {
- return getPaddingStart(bDiscard)
- + getPaddingEnd(bDiscard)
+ public int getIPPaddingAndBorder(boolean bDiscard, PercentBaseContext context) {
+ return getPaddingStart(bDiscard, context)
+ + getPaddingEnd(bDiscard, context)
+ getBorderStartWidth(bDiscard)
+ getBorderEndWidth(bDiscard);
}
@@ -315,10 +325,11 @@ public class CommonBorderPaddingBackground implements Cloneable {
* Return all the border and padding height in the block progression
* dimension.
* @param bDiscard the discard flag.
+ * @param context for percentage evaluation
* @return all the padding and border height.
*/
- public int getBPPaddingAndBorder(boolean bDiscard) {
- return getPaddingBefore(bDiscard) + getPaddingAfter(bDiscard) +
+ public int getBPPaddingAndBorder(boolean bDiscard, PercentBaseContext context) {
+ return getPaddingBefore(bDiscard, context) + getPaddingAfter(bDiscard, context) +
getBorderBeforeWidth(bDiscard) + getBorderAfterWidth(bDiscard);
}
@@ -328,8 +339,8 @@ public class CommonBorderPaddingBackground implements Cloneable {
getBorderStartWidth(false) + ", " + getBorderEndWidth(false) + ")\n" +
"Border Colors: (" + getBorderColor(BEFORE) + ", " + getBorderColor(AFTER) + ", " +
getBorderColor(START) + ", " + getBorderColor(END) + ")\n" +
- "Padding: (" + getPaddingBefore(false) + ", " + getPaddingAfter(false) + ", " +
- getPaddingStart(false) + ", " + getPaddingEnd(false) + ")\n";
+ "Padding: (" + getPaddingBefore(false, null) + ", " + getPaddingAfter(false, null) + ", " +
+ getPaddingStart(false, null) + ", " + getPaddingEnd(false, null) + ")\n";
}
/**
@@ -345,9 +356,12 @@ public class CommonBorderPaddingBackground implements Cloneable {
+ getBorderStartWidth(false) + getBorderEndWidth(false)) > 0);
}
- /** @return true if padding is non-zero. */
- public boolean hasPadding() {
- return ((getPaddingBefore(false) + getPaddingAfter(false)
- + getPaddingStart(false) + getPaddingEnd(false)) > 0);
+ /**
+ * @param context for percentage based evaluation.
+ * @return true if padding is non-zero.
+ */
+ public boolean hasPadding(PercentBaseContext context) {
+ return ((getPaddingBefore(false, context) + getPaddingAfter(false, context)
+ + getPaddingStart(false, context) + getPaddingEnd(false, context)) > 0);
}
}
diff --git a/src/java/org/apache/fop/fo/properties/CommonFont.java b/src/java/org/apache/fop/fo/properties/CommonFont.java
index 77fbe53c1..c24c0c941 100755
--- a/src/java/org/apache/fop/fo/properties/CommonFont.java
+++ b/src/java/org/apache/fop/fo/properties/CommonFont.java
@@ -21,6 +21,7 @@ package org.apache.fop.fo.properties;
// FOP
import org.apache.fop.datatypes.Length;
import org.apache.fop.datatypes.Numeric;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
@@ -96,7 +97,7 @@ public class CommonFont {
* @param fontInfo
* @return a Font object.
*/
- public Font getFontState(FontInfo fontInfo) {
+ public Font getFontState(FontInfo fontInfo, PercentBaseContext context) {
if (fontState == null) {
/**@todo this is ugly. need to improve. */
@@ -124,7 +125,7 @@ public class CommonFont {
String fname = fontInfo.fontLookup(fontFamily, fontStyle,
font_weight);
FontMetrics metrics = fontInfo.getMetricsFor(fname);
- fontState = new Font(fname, metrics, fontSize.getValue());
+ fontState = new Font(fname, metrics, fontSize.getValue(context));
}
return fontState;
}
diff --git a/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java b/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java
index d049d275a..8875de051 100644
--- a/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java
+++ b/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java
@@ -22,6 +22,7 @@ import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
+import org.apache.fop.fo.expr.RelativeNumericProperty;
/**
* Store all common margin properties for blocks.
diff --git a/src/java/org/apache/fop/fo/properties/CondLengthProperty.java b/src/java/org/apache/fop/fo/properties/CondLengthProperty.java
index b14f12df3..0253e8a81 100644
--- a/src/java/org/apache/fop/fo/properties/CondLengthProperty.java
+++ b/src/java/org/apache/fop/fo/properties/CondLengthProperty.java
@@ -20,6 +20,7 @@ package org.apache.fop.fo.properties;
import org.apache.fop.datatypes.CompoundDatatype;
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
@@ -122,6 +123,14 @@ public class CondLengthProperty extends Property implements CompoundDatatype {
return this.length.getLength().getValue();
}
+ /**
+ * Returns the computed length value.
+ * @return the length in millipoints
+ */
+ public int getLengthValue(PercentBaseContext context) {
+ return this.length.getLength().getValue(context);
+ }
+
public String toString() {
return "CondLength[" + (isDiscard() ? "discard, " : "") +
length.getObject().toString() + "]";
diff --git a/src/java/org/apache/fop/fo/properties/EnumLength.java b/src/java/org/apache/fop/fo/properties/EnumLength.java
index 2d45a1966..04efebaa6 100755
--- a/src/java/org/apache/fop/fo/properties/EnumLength.java
+++ b/src/java/org/apache/fop/fo/properties/EnumLength.java
@@ -18,6 +18,8 @@
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.PercentBaseContext;
+
/**
* A length quantity in XSL which is specified as an enum, such as "auto"
*/
@@ -38,6 +40,7 @@ public class EnumLength extends LengthProperty {
public boolean isAbsolute() {
return false;
}
+
/**
* Returns the length in 1/1000ths of a point (millipoints)
* @return the length in millipoints
@@ -48,6 +51,16 @@ public class EnumLength extends LengthProperty {
}
/**
+ * Returns the length in 1/1000ths of a point (millipoints)
+ * @param Evaluation context
+ * @return the length in millipoints
+ */
+ public int getValue(PercentBaseContext context) {
+ log.error("getValue() called on " + enumProperty + " length");
+ return 0;
+ }
+
+ /**
* Returns the value as numeric.
* @return the length in millipoints
*/
@@ -57,6 +70,16 @@ public class EnumLength extends LengthProperty {
}
/**
+ * Returns the value as numeric.
+ * @param context Evaluation context
+ * @return the length in millipoints
+ */
+ public double getNumericValue(PercentBaseContext context) {
+ log.error("getNumericValue() called on " + enumProperty + " number");
+ return 0;
+ }
+
+ /**
* @see org.apache.fop.fo.properties.Property#getString()
*/
public String getString() {
diff --git a/src/java/org/apache/fop/fo/properties/FixedLength.java b/src/java/org/apache/fop/fo/properties/FixedLength.java
index cba009e57..347051990 100644
--- a/src/java/org/apache/fop/fo/properties/FixedLength.java
+++ b/src/java/org/apache/fop/fo/properties/FixedLength.java
@@ -18,6 +18,8 @@
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.PercentBaseContext;
+
/**
* An absolute length quantity in XSL
*/
@@ -99,14 +101,34 @@ public class FixedLength extends LengthProperty {
}
/**
+ * Returns the length in 1/1000ths of a point (millipoints)
+ * @param Evaluation context
+ * @return the length in millipoints
+ */
+ public int getValue(PercentBaseContext context) {
+ return millipoints;
+ }
+
+ /**
* Returns the value as numeric.
* @return the length in millipoints
+ * @see Numeric#getNumericValue()
*/
public double getNumericValue() {
return millipoints;
}
/**
+ * Return the value of this Numeric.
+ * @param context Evaluation context
+ * @return the length in millipoints
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) {
+ return millipoints;
+ }
+
+ /**
* Return true since FixedLength are always absolute.
* @see org.apache.fop.datatypes.Numeric#isAbsolute()
*/
diff --git a/src/java/org/apache/fop/fo/properties/FontSizePropertyMaker.java b/src/java/org/apache/fop/fo/properties/FontSizePropertyMaker.java
index 83379dfa4..3719c72d4 100644
--- a/src/java/org/apache/fop/fo/properties/FontSizePropertyMaker.java
+++ b/src/java/org/apache/fop/fo/properties/FontSizePropertyMaker.java
@@ -17,10 +17,14 @@
/* $Id: $ */
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
+import org.apache.fop.fo.expr.RelativeNumericProperty;
/**
* This subclass of LengthProperty.Maker handles the special treatment of
diff --git a/src/java/org/apache/fop/fo/properties/LengthRangeProperty.java b/src/java/org/apache/fop/fo/properties/LengthRangeProperty.java
index 732f99e14..37e40028b 100644
--- a/src/java/org/apache/fop/fo/properties/LengthRangeProperty.java
+++ b/src/java/org/apache/fop/fo/properties/LengthRangeProperty.java
@@ -19,6 +19,7 @@
package org.apache.fop.fo.properties;
import org.apache.fop.datatypes.CompoundDatatype;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
@@ -90,11 +91,11 @@ public class LengthRangeProperty extends Property implements CompoundDatatype {
*/
public Property getComponent(int cmpId) {
if (cmpId == CP_MINIMUM) {
- return getMinimum();
+ return getMinimum(null);
} else if (cmpId == CP_OPTIMUM) {
- return getOptimum();
+ return getOptimum(null);
} else if (cmpId == CP_MAXIMUM) {
- return getMaximum();
+ return getMaximum(null);
} else {
return null; // SHOULDN'T HAPPEN
}
@@ -146,15 +147,18 @@ public class LengthRangeProperty extends Property implements CompoundDatatype {
}
// Minimum is prioritaire, if explicit
- private void checkConsistency() {
+ private void checkConsistency(PercentBaseContext context) {
if (consistent) {
return;
}
+ if (context == null) {
+ return;
+ }
// Make sure max >= min
// Must also control if have any allowed enum values!
if (!minimum.isAuto() && !maximum.isAuto()
- && minimum.getLength().getValue() > maximum.getLength().getValue()) {
+ && minimum.getLength().getValue(context) > maximum.getLength().getValue(context)) {
if ((bfSet & MINSET) != 0) {
// if minimum is explicit, force max to min
if ((bfSet & MAXSET) != 0) {
@@ -168,7 +172,7 @@ public class LengthRangeProperty extends Property implements CompoundDatatype {
}
// Now make sure opt <= max and opt >= min
if (!optimum.isAuto() && !maximum.isAuto()
- && optimum.getLength().getValue() > maximum.getLength().getValue()) {
+ && optimum.getLength().getValue(context) > maximum.getLength().getValue(context)) {
if ((bfSet & OPTSET) != 0) {
if ((bfSet & MAXSET) != 0) {
// Warning: opt > max, resetting opt to max
@@ -182,7 +186,7 @@ public class LengthRangeProperty extends Property implements CompoundDatatype {
optimum = maximum;
}
} else if (!optimum.isAuto() && !minimum.isAuto() &&
- optimum.getLength().getValue() < minimum.getLength().getValue()) {
+ optimum.getLength().getValue(context) < minimum.getLength().getValue(context)) {
if ((bfSet & MINSET) != 0) {
// if minimum is explicit, force opt to min
if ((bfSet & OPTSET) != 0) {
@@ -198,34 +202,37 @@ public class LengthRangeProperty extends Property implements CompoundDatatype {
}
/**
+ * @param context Percentage evaluation context
* @return minimum length
*/
- public Property getMinimum() {
- checkConsistency();
+ public Property getMinimum(PercentBaseContext context) {
+ checkConsistency(context);
return this.minimum;
}
/**
+ * @param context Percentage evaluation context
* @return maximum length
*/
- public Property getMaximum() {
- checkConsistency();
+ public Property getMaximum(PercentBaseContext context) {
+ checkConsistency(context);
return this.maximum;
}
/**
+ * @param context Percentage evaluation context
* @return optimum length
*/
- public Property getOptimum() {
- checkConsistency();
+ public Property getOptimum(PercentBaseContext context) {
+ checkConsistency(context);
return this.optimum;
}
public String toString() {
return "LengthRange[" +
- "min:" + getMinimum().getObject() +
- ", max:" + getMaximum().getObject() +
- ", opt:" + getOptimum().getObject() + "]";
+ "min:" + getMinimum(null).getObject() +
+ ", max:" + getMaximum(null).getObject() +
+ ", opt:" + getOptimum(null).getObject() + "]";
}
/**
diff --git a/src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java b/src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java
index e1fa1215a..5c4507ae5 100644
--- a/src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java
+++ b/src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java
@@ -17,11 +17,14 @@
/* $Id$ */
package org.apache.fop.fo.properties;
-
+import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.Numeric;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
+import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.PropertyException;
+import org.apache.fop.fo.expr.RelativeNumericProperty;
/**
* A maker which calculates the line-height property.
@@ -60,10 +63,13 @@ public class LineHeightPropertyMaker extends SpaceProperty.Maker {
return null;
}
+ /**
+ * @see SpaceProperty#convertProperty(Property, PropertyList, FObj)
+ */
public Property convertProperty(Property p,
PropertyList propertyList,
FObj fo) throws PropertyException {
- Numeric numval = p.getNumeric();
+ Numeric numval = p.getNumeric();
if (numval != null && numval.getDimension() == 0) {
p = new PercentLength(numval.getNumericValue(), getPercentBase(fo,propertyList));
Property spaceProp = super.convertProperty(p, propertyList, fo);
diff --git a/src/java/org/apache/fop/fo/properties/NumberProperty.java b/src/java/org/apache/fop/fo/properties/NumberProperty.java
index a93e68b55..268066c57 100644
--- a/src/java/org/apache/fop/fo/properties/NumberProperty.java
+++ b/src/java/org/apache/fop/fo/properties/NumberProperty.java
@@ -18,6 +18,7 @@
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.Numeric;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
@@ -104,11 +105,31 @@ public class NumberProperty extends Property implements Numeric {
return number.doubleValue();
}
+ /**
+ * Return the value of this Numeric.
+ * @param context Evaluation context
+ * @return The value as a double.
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) {
+ return getNumericValue();
+ }
+
public int getValue() {
return number.intValue();
}
/**
+ * Return the value
+ * @param context Evaluation context
+ * @return The value as an int.
+ * @see Numeric#getValue(Object)
+ */
+ public int getValue(PercentBaseContext context) {
+ return getValue();
+ }
+
+ /**
* Return true because all numbers are absolute.
* @return true.
* @see Numeric#isAbsolute()
diff --git a/src/java/org/apache/fop/fo/properties/PercentLength.java b/src/java/org/apache/fop/fo/properties/PercentLength.java
index 82c52adaf..ccad91d79 100644
--- a/src/java/org/apache/fop/fo/properties/PercentLength.java
+++ b/src/java/org/apache/fop/fo/properties/PercentLength.java
@@ -18,6 +18,7 @@
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.expr.PropertyException;
@@ -37,6 +38,8 @@ public class PercentLength extends LengthProperty {
* {@link #factor} should be applied to compute the actual length
*/
private PercentBase lbase = null;
+
+ private double resolvedValue;
/**
* Main constructor. Construct an object based on a factor (the percent,
@@ -80,8 +83,19 @@ public class PercentLength extends LengthProperty {
* @see org.apache.fop.datatypes.Numeric#getNumericValue()
*/
public double getNumericValue() {
+ return getNumericValue(null);
+ }
+
+ /**
+ * Return the value of this Numeric.
+ * @param context Evaluation context
+ * @return the length in millipoints
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) {
try {
- return factor * lbase.getBaseLength();
+ resolvedValue = factor * lbase.getBaseLength(context);
+ return resolvedValue;
} catch (PropertyException exc) {
log.error(exc);
return 0;
@@ -97,6 +111,14 @@ public class PercentLength extends LengthProperty {
}
/**
+ * Return the value of this numeric as a length in millipoints.
+ * @param Evaluation context
+ */
+ public int getValue(PercentBaseContext context) {
+ return (int) getNumericValue(context);
+ }
+
+ /**
* @return the String equivalent of this
*/
public String toString() {
diff --git a/src/java/org/apache/fop/fo/properties/PropertyMaker.java b/src/java/org/apache/fop/fo/properties/PropertyMaker.java
index 51116fbaf..6f0d86bfb 100644
--- a/src/java/org/apache/fop/fo/properties/PropertyMaker.java
+++ b/src/java/org/apache/fop/fo/properties/PropertyMaker.java
@@ -308,7 +308,7 @@ public class PropertyMaker implements Cloneable {
* what this is used for, or remove it from the signature.)
* @return an object implementing the PercentBase interface.
*/
- public PercentBase getPercentBase(FObj fo, PropertyList pl) {
+ public PercentBase getPercentBase(FObj fo, PropertyList pl) throws PropertyException {
if (percentBase == -1)
return null;
return new LengthBase(fo, pl, percentBase);
diff --git a/src/java/org/apache/fop/fo/properties/SpaceProperty.java b/src/java/org/apache/fop/fo/properties/SpaceProperty.java
index 2ef52a48f..45dce11a9 100644
--- a/src/java/org/apache/fop/fo/properties/SpaceProperty.java
+++ b/src/java/org/apache/fop/fo/properties/SpaceProperty.java
@@ -137,9 +137,9 @@ public class SpaceProperty extends LengthRangeProperty {
public String toString() {
return "Space[" +
- "min:" + getMinimum().getObject() +
- ", max:" + getMaximum().getObject() +
- ", opt:" + getOptimum().getObject() +
+ "min:" + getMinimum(null).getObject() +
+ ", max:" + getMaximum(null).getObject() +
+ ", opt:" + getOptimum(null).getObject() +
", precedence:" + precedence.getObject() +
", conditionality:" + conditionality.getObject() + "]";
}
diff --git a/src/java/org/apache/fop/fo/properties/TableColLength.java b/src/java/org/apache/fop/fo/properties/TableColLength.java
index 78e2eac5f..a8cb201d3 100644
--- a/src/java/org/apache/fop/fo/properties/TableColLength.java
+++ b/src/java/org/apache/fop/fo/properties/TableColLength.java
@@ -18,6 +18,7 @@
package org.apache.fop.fo.properties;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.FObj;
@@ -77,6 +78,16 @@ public class TableColLength extends LengthProperty {
}
/**
+ * Return the value of this Numeric.
+ * @param context Evaluation context
+ * @return the value
+ * @see Numeric#getNumericValue(Object)
+ */
+ public double getNumericValue(PercentBaseContext context) {
+ return getNumericValue();
+ }
+
+ /**
* Return the value as a length.
* @see org.apache.fop.datatypes.Length#getValue()
*/
@@ -85,6 +96,15 @@ public class TableColLength extends LengthProperty {
}
/**
+ * Returns the length in 1/1000ths of a point (millipoints)
+ * @param Evaluation context
+ * @return the length in millipoints
+ */
+ public int getValue(PercentBaseContext context) {
+ return getValue();
+ }
+
+ /**
* Convert this to a String
* @return the string representation of this
*/
diff --git a/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java
new file mode 100644
index 000000000..ea8dab3e7
--- /dev/null
+++ b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.fo.FObj;
+
+/**
+ * The base class for nearly all LayoutManagers.
+ * Provides the functionality for merging the {@link LayoutManager}
+ * and the {@link org.apache.fop.datatypes.PercentBaseContext} interfaces
+ * into a common base calls for all higher LayoutManagers.
+ */
+public abstract class AbstractBaseLayoutManager
+ implements LayoutManager, PercentBaseContext {
+
+ protected boolean generatesReferenceArea = false;
+ protected boolean generatesBlockArea = false;
+
+ protected FObj fobj = null;
+
+ /**
+ * logging instance
+ */
+ protected static Log log = LogFactory.getLog(LayoutManager.class);
+
+ /**
+ * Abstract base layout manager.
+ */
+ public AbstractBaseLayoutManager() {
+ }
+
+ /**
+ * Abstract base layout manager.
+ *
+ * @param fo the formatting object for this layout manager
+ */
+ public AbstractBaseLayoutManager(FObj fo) {
+ fobj = fo;
+ setGeneratesReferenceArea(fo.generatesReferenceAreas());
+ if (getGeneratesReferenceArea()) {
+ setGeneratesBlockArea(true);
+ }
+ }
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ if (fobj == getFObj()) {
+ switch (lengthBase) {
+ case LengthBase.CONTAINING_BLOCK_WIDTH:
+ return getAncestorBlockAreaIPD();
+ case LengthBase.CONTAINING_BLOCK_HEIGHT:
+ return getAncestorBlockAreaBPD();
+ case LengthBase.PARENT_AREA_WIDTH:
+ return getParentAreaIPD();
+ case LengthBase.CONTAINING_REFAREA_WIDTH:
+ return getReferenceAreaIPD();
+ default:
+ log.error("Unknown base type for LengthBase:" + lengthBase);
+ new Exception().printStackTrace();
+ return 0;
+ }
+ } else {
+ LayoutManager lm = getParent();
+ while (lm != null && fobj != lm.getFObj()) {
+ lm = lm.getParent();
+ }
+ if (lm != null) {
+ return lm.getBaseLength(lengthBase, fobj);
+ }
+ }
+ log.error("Cannot find LM to handle given FO for LengthBase.");
+ return 0;
+ }
+
+ /**
+ * Find the first ancestor area that is a block area
+ * and returns its IPD.
+ * @return the ipd of the ancestor block area
+ */
+ protected int getAncestorBlockAreaIPD() {
+ LayoutManager lm = getParent();
+ while (lm != null) {
+ if (lm.getGeneratesBlockArea() && !lm.getGeneratesLineArea()) {
+ return lm.getContentAreaIPD();
+ }
+ lm = lm.getParent();
+ }
+ if (lm == null) {
+ log.error("No parent LM found");
+ }
+ return 0;
+ }
+
+ /**
+ * Find the first ancestor area that is a block area
+ * and returns its BPD.
+ * @return the bpd of the ancestor block area
+ */
+ protected int getAncestorBlockAreaBPD() {
+ LayoutManager lm = getParent();
+ while (lm != null) {
+ if (lm.getGeneratesBlockArea() && !lm.getGeneratesLineArea()) {
+ return lm.getContentAreaBPD();
+ }
+ lm = lm.getParent();
+ }
+ if (lm == null) {
+ log.error("No parent LM found");
+ }
+ return 0;
+ }
+
+ /**
+ * Find the parent area and returns its IPD.
+ * @return the ipd of the parent area
+ */
+ protected int getParentAreaIPD() {
+ LayoutManager lm = getParent();
+ if (lm != null) {
+ return lm.getContentAreaIPD();
+ }
+ log.error("No parent LM found");
+ return 0;
+ }
+
+ /**
+ * Find the parent area and returns its BPD.
+ * @return the bpd of the parent area
+ */
+ protected int getParentAreaBPD() {
+ LayoutManager lm = getParent();
+ if (lm != null) {
+ return lm.getContentAreaBPD();
+ }
+ log.error("No parent LM found");
+ return 0;
+ }
+
+ /**
+ * Find the first ancestor area that is a reference area
+ * and returns its IPD.
+ * @return the ipd of the ancestor reference area
+ */
+ public int getReferenceAreaIPD() {
+ LayoutManager lm = getParent();
+ while (lm != null) {
+ if (lm.getGeneratesReferenceArea()) {
+ return lm.getContentAreaIPD();
+ }
+ lm = lm.getParent();
+ }
+ if (lm == null) {
+ log.error("No parent LM found");
+ }
+ return 0;
+ }
+
+ /**
+ * Find the first ancestor area that is a reference area
+ * and returns its BPD.
+ * @return the bpd of the ancestor reference area
+ */
+ protected int getReferenceAreaBPD() {
+ LayoutManager lm = getParent();
+ while (lm != null) {
+ if (lm.getGeneratesReferenceArea()) {
+ return lm.getContentAreaBPD();
+ }
+ lm = lm.getParent();
+ }
+ if (lm == null) {
+ log.error("No parent LM found");
+ }
+ return 0;
+ }
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ * @see LayoutManager#getContentAreaIPD
+ */
+ public int getContentAreaIPD() {
+ log.error("getContentAreaIPD called when it should have been overwritten");
+ return 0;
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ * @see LayoutManager#getContentAreaBPD
+ */
+ public int getContentAreaBPD() {
+ log.error("getContentAreaBPD called when it should have been overwritten");
+ return 0;
+ }
+
+ /**
+ * @see LayoutManager#getGeneratesReferenceArea
+ */
+ public boolean getGeneratesReferenceArea() {
+ return generatesReferenceArea;
+ }
+
+ /**
+ * Lets implementing LM set the flag indicating if they
+ * generate reference areas.
+ * @param generatesReferenceArea if true the areas generates by this LM are
+ * reference areas.
+ */
+ protected void setGeneratesReferenceArea(boolean generatesReferenceArea) {
+ this.generatesReferenceArea = generatesReferenceArea;
+ }
+
+ /**
+ * @see LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return generatesBlockArea;
+ }
+
+ /**
+ * Lets implementing LM set the flag indicating if they
+ * generate block areas.
+ * @param generatesBlockArea if true the areas generates by this LM are block areas.
+ */
+ protected void setGeneratesBlockArea(boolean generatesBlockArea) {
+ this.generatesBlockArea = generatesBlockArea;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesLineArea
+ */
+ public boolean getGeneratesLineArea() {
+ return false;
+ }
+
+ public FObj getFObj() {
+ return fobj;
+ }
+
+}
diff --git a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
index cb33e9b0c..1ad147f53 100644
--- a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
@@ -22,6 +22,8 @@ import org.apache.fop.fo.FObj;
import org.apache.fop.fo.FONode;
import org.apache.fop.area.Area;
import org.apache.fop.area.PageViewport;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.flow.RetrieveMarker;
@@ -37,7 +39,8 @@ import java.util.Map;
/**
* The base class for most LayoutManagers.
*/
-public abstract class AbstractLayoutManager implements LayoutManager, Constants {
+public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager
+ implements Constants {
protected LayoutManager parentLM = null;
protected List childLMs = null;
protected ListIterator fobjIter = null;
@@ -49,12 +52,7 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
/** child LM and child LM iterator during getNextBreakPoss phase */
protected LayoutManager curChildLM = null;
protected ListIterator childLMiter = null;
-
- /**
- * logging instance
- */
- protected static Log log = LogFactory.getLog(LayoutManager.class);
-
+
/**
* Abstract layout manager.
*/
@@ -67,6 +65,7 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
* @param fo the formatting object for this layout manager
*/
public AbstractLayoutManager(FObj fo) {
+ super(fo);
if (fo == null) {
throw new IllegalStateException("Null formatting object found.");
}
@@ -83,6 +82,10 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
return this.parentLM;
}
+ public void initialize() {
+ // Empty
+ }
+
/**
* Return currently active child LayoutManager or null if
* all children have finished layout.
@@ -95,6 +98,7 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
}
while (childLMiter.hasNext()) {
curChildLM = (LayoutManager) childLMiter.next();
+ curChildLM.initialize();
return curChildLM;
}
return null;
@@ -157,6 +161,9 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
public void addAreas(PositionIterator posIter, LayoutContext context) {
}
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
+ */
public LinkedList getNextKnuthElements(LayoutContext context,
int alignment) {
log.warn("null implementation of getNextKnuthElements() called!");
@@ -283,4 +290,5 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
addChildLM(lm);
}
}
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
index a183732a3..2fe1c2d38 100644
--- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
@@ -74,45 +74,48 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
*/
public BlockContainerLayoutManager(BlockContainer node) {
super(node);
- initialize();
}
- private void initialize() {
+ public void initialize() {
abProps = getBlockContainerFO().getCommonAbsolutePosition();
foBlockSpaceBefore = new SpaceVal(getBlockContainerFO().getCommonMarginBlock()
- .spaceBefore).getSpace();
+ .spaceBefore, this).getSpace();
foBlockSpaceAfter = new SpaceVal(getBlockContainerFO().getCommonMarginBlock()
- .spaceAfter).getSpace();
+ .spaceAfter, this).getSpace();
boolean rotated = (getBlockContainerFO().getReferenceOrientation() % 180 != 0);
if (rotated) {
- height = getBlockContainerFO().getInlineProgressionDimension().getOptimum().getLength();
- width = getBlockContainerFO().getBlockProgressionDimension().getOptimum().getLength();
+ height = getBlockContainerFO().getInlineProgressionDimension()
+ .getOptimum(this).getLength();
+ width = getBlockContainerFO().getBlockProgressionDimension()
+ .getOptimum(this).getLength();
} else {
- height = getBlockContainerFO().getBlockProgressionDimension().getOptimum().getLength();
- width = getBlockContainerFO().getInlineProgressionDimension().getOptimum().getLength();
+ height = getBlockContainerFO().getBlockProgressionDimension()
+ .getOptimum(this).getLength();
+ width = getBlockContainerFO().getInlineProgressionDimension()
+ .getOptimum(this).getLength();
}
bpUnit = 0; //layoutProps.blockProgressionUnit;
if (bpUnit == 0) {
// use optimum space values
adjustedSpaceBefore = getBlockContainerFO().getCommonMarginBlock()
- .spaceBefore.getSpace().getOptimum().getLength().getValue();
+ .spaceBefore.getSpace().getOptimum(this).getLength().getValue(this);
adjustedSpaceAfter = getBlockContainerFO().getCommonMarginBlock()
- .spaceAfter.getSpace().getOptimum().getLength().getValue();
+ .spaceAfter.getSpace().getOptimum(this).getLength().getValue(this);
} else {
// use minimum space values
adjustedSpaceBefore = getBlockContainerFO().getCommonMarginBlock()
- .spaceBefore.getSpace().getMinimum().getLength().getValue();
+ .spaceBefore.getSpace().getMinimum(this).getLength().getValue(this);
adjustedSpaceAfter = getBlockContainerFO().getCommonMarginBlock()
- .spaceAfter.getSpace().getMinimum().getLength().getValue();
+ .spaceAfter.getSpace().getMinimum(this).getLength().getValue(this);
}
}
/** @return the content IPD */
protected int getRotatedIPD() {
return getBlockContainerFO().getInlineProgressionDimension()
- .getOptimum().getLength().getValue();
+ .getOptimum(this).getLength().getValue(this);
}
private int getSpaceBefore() {
@@ -122,18 +125,18 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
private int getBPIndents() {
int indents = 0;
indents += getBlockContainerFO().getCommonMarginBlock()
- .spaceBefore.getOptimum().getLength().getValue();
+ .spaceBefore.getOptimum(this).getLength().getValue(this);
indents += getBlockContainerFO().getCommonMarginBlock()
- .spaceAfter.getOptimum().getLength().getValue();
+ .spaceAfter.getOptimum(this).getLength().getValue(this);
indents += getBlockContainerFO().getCommonBorderPaddingBackground()
- .getBPPaddingAndBorder(false);
+ .getBPPaddingAndBorder(false, this);
return indents;
}
private int getIPIndents() {
int iIndents = 0;
- iIndents += getBlockContainerFO().getCommonMarginBlock().startIndent.getValue();
- iIndents += getBlockContainerFO().getCommonMarginBlock().endIndent.getValue();
+ iIndents += getBlockContainerFO().getCommonMarginBlock().startIndent.getValue(this);
+ iIndents += getBlockContainerFO().getCommonMarginBlock().endIndent.getValue(this);
return iIndents;
}
@@ -158,14 +161,14 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
int maxbpd = context.getStackLimit().opt;
int allocBPD, allocIPD;
if (height.getEnum() != EN_AUTO) {
- allocBPD = height.getValue(); //this is the content-height
+ allocBPD = height.getValue(this); //this is the content-height
allocBPD += getBPIndents();
} else {
allocBPD = maxbpd;
autoHeight = true;
}
if (width.getEnum() != EN_AUTO) {
- allocIPD = width.getValue(); //this is the content-width
+ allocIPD = width.getValue(this); //this is the content-width
allocIPD += getIPIndents();
} else {
allocIPD = referenceIPD;
@@ -173,14 +176,15 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
vpContentBPD = allocBPD - getBPIndents();
vpContentIPD = allocIPD - getIPIndents();
-
+ setContentAreaIPD(vpContentIPD);
double contentRectOffsetX = 0;
- contentRectOffsetX += getBlockContainerFO().getCommonMarginBlock().startIndent.getValue();
+ contentRectOffsetX += getBlockContainerFO()
+ .getCommonMarginBlock().startIndent.getValue(this);
double contentRectOffsetY = 0;
contentRectOffsetY += getBlockContainerFO()
.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
contentRectOffsetY += getBlockContainerFO()
- .getCommonBorderPaddingBackground().getPaddingBefore(false);
+ .getCommonBorderPaddingBackground().getPaddingBefore(false, this);
Rectangle2D rect = new Rectangle2D.Double(
contentRectOffsetX, contentRectOffsetY,
@@ -337,7 +341,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
Point offset = getAbsOffset();
int allocBPD, allocIPD;
if (height.getEnum() != EN_AUTO) {
- allocBPD = height.getValue(); //this is the content-height
+ allocBPD = height.getValue(this); //this is the content-height
allocBPD += getBPIndents();
} else {
allocBPD = 0;
@@ -351,12 +355,12 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
allocBPD = availHeight;
allocBPD -= offset.y;
if (abProps.bottom.getEnum() != EN_AUTO) {
- allocBPD -= abProps.bottom.getValue();
+ allocBPD -= abProps.bottom.getValue(this);
if (allocBPD < 0) {
log.error("The current combination of top and bottom properties results"
+ " in a negative extent for the block-container. 'bottom' may be"
- + " at most " + (allocBPD + abProps.bottom.getValue()) + " mpt,"
- + " but was actually " + abProps.bottom.getValue() + " mpt."
+ + " at most " + (allocBPD + abProps.bottom.getValue(this)) + " mpt,"
+ + " but was actually " + abProps.bottom.getValue(this) + " mpt."
+ " The nominal available height is " + availHeight + " mpt.");
allocBPD = 0;
}
@@ -375,7 +379,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
}
}
if (width.getEnum() != EN_AUTO) {
- allocIPD = width.getValue(); //this is the content-width
+ allocIPD = width.getValue(this); //this is the content-width
allocIPD += getIPIndents();
} else {
int availWidth;
@@ -386,15 +390,15 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
}
allocIPD = availWidth;
if (abProps.left.getEnum() != EN_AUTO) {
- allocIPD -= abProps.left.getValue();
+ allocIPD -= abProps.left.getValue(this);
}
if (abProps.right.getEnum() != EN_AUTO) {
- allocIPD -= abProps.right.getValue();
+ allocIPD -= abProps.right.getValue(this);
if (allocIPD < 0) {
log.error("The current combination of left and right properties results"
+ " in a negative extent for the block-container. 'right' may be"
- + " at most " + (allocIPD + abProps.right.getValue()) + " mpt,"
- + " but was actually " + abProps.right.getValue() + " mpt."
+ + " at most " + (allocIPD + abProps.right.getValue(this)) + " mpt,"
+ + " but was actually " + abProps.right.getValue(this) + " mpt."
+ " The nominal available width is " + availWidth + " mpt.");
allocIPD = 0;
}
@@ -403,7 +407,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
log.error("The current combination of left and right properties results"
+ " in a negative extent for the block-container. 'left' may be"
+ " at most " + allocIPD + " mpt,"
- + " but was actually " + abProps.left.getValue() + " mpt."
+ + " but was actually " + abProps.left.getValue(this) + " mpt."
+ " The nominal available width is " + availWidth + " mpt.");
allocIPD = 0;
}
@@ -414,13 +418,14 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
vpContentIPD = allocIPD - getIPIndents();
double contentRectOffsetX = offset.getX();
- contentRectOffsetX += getBlockContainerFO().getCommonMarginBlock().startIndent.getValue();
+ contentRectOffsetX += getBlockContainerFO()
+ .getCommonMarginBlock().startIndent.getValue(this);
double contentRectOffsetY = offset.getY();
contentRectOffsetY += getSpaceBefore();
contentRectOffsetY += getBlockContainerFO()
.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
contentRectOffsetY += getBlockContainerFO()
- .getCommonBorderPaddingBackground().getPaddingBefore(false);
+ .getCommonBorderPaddingBackground().getPaddingBefore(false, this);
Rectangle2D rect = new Rectangle2D.Double(
contentRectOffsetX, contentRectOffsetY,
@@ -589,10 +594,10 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
int x = 0;
int y = 0;
if (abProps.left.getEnum() != EN_AUTO) {
- x = abProps.left.getValue();
+ x = abProps.left.getValue(this);
}
if (abProps.top.getEnum() != EN_AUTO) {
- y = abProps.top.getValue();
+ y = abProps.top.getValue(this);
}
return new Point(x, y);
}
@@ -730,9 +735,9 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
// to reach a multiple of bpUnit
if (bSpaceBefore && bSpaceAfter) {
foBlockSpaceBefore = new SpaceVal(getBlockContainerFO()
- .getCommonMarginBlock().spaceBefore).getSpace();
+ .getCommonMarginBlock().spaceBefore, this).getSpace();
foBlockSpaceAfter = new SpaceVal(getBlockContainerFO()
- .getCommonMarginBlock().spaceAfter).getSpace();
+ .getCommonMarginBlock().spaceAfter, this).getSpace();
adjustedSpaceBefore = (neededUnits(splitLength
+ foBlockSpaceBefore.min
+ foBlockSpaceAfter.min)
@@ -818,12 +823,14 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
TraitSetter.setProducerID(viewportBlockArea, getBlockContainerFO().getId());
TraitSetter.addBorders(viewportBlockArea,
- getBlockContainerFO().getCommonBorderPaddingBackground());
- TraitSetter.addBackground(viewportBlockArea,
- getBlockContainerFO().getCommonBorderPaddingBackground());
+ getBlockContainerFO().getCommonBorderPaddingBackground(), this);
+ // TraitSetter.addBackground(viewportBlockArea,
+ // getBlockContainerFO().getCommonBorderPaddingBackground(),
+ // this);
TraitSetter.addMargins(viewportBlockArea,
getBlockContainerFO().getCommonBorderPaddingBackground(),
- getBlockContainerFO().getCommonMarginBlock());
+ getBlockContainerFO().getCommonMarginBlock(),
+ this);
viewportBlockArea.setCTM(absoluteCTM);
viewportBlockArea.setClip(clip);
@@ -892,6 +899,10 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
protected void flush() {
viewportBlockArea.addBlock(referenceArea, autoHeight);
+ TraitSetter.addBackground(viewportBlockArea,
+ getBlockContainerFO().getCommonBorderPaddingBackground(),
+ this);
+
// Fake a 0 height for absolute positioned blocks.
int saveBPD = viewportBlockArea.getBPD();
if (viewportBlockArea.getPositioning() == Block.ABSOLUTE) {
@@ -952,5 +963,22 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
protected BlockContainer getBlockContainerFO() {
return (BlockContainer) fobj;
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesReferenceArea
+ */
+ public boolean getGeneratesReferenceArea() {
+ return true;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return true;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
index 46f2f68e4..0b9b2cd6c 100644
--- a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
@@ -19,17 +19,18 @@
package org.apache.fop.layoutmgr;
import java.util.LinkedList;
-import java.util.ListIterator;
import java.util.List;
+import java.util.ListIterator;
-import org.apache.fop.fonts.Font;
-import org.apache.fop.layoutmgr.inline.InlineLevelLayoutManager;
-import org.apache.fop.layoutmgr.inline.LineLayoutManager;
import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.area.LineArea;
-import org.apache.fop.traits.SpaceVal;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.fonts.Font;
+import org.apache.fop.layoutmgr.inline.InlineLevelLayoutManager;
+import org.apache.fop.layoutmgr.inline.LineLayoutManager;
import org.apache.fop.traits.MinOptMax;
+import org.apache.fop.traits.SpaceVal;
/**
* LayoutManager for a block FO.
@@ -42,7 +43,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
protected ListIterator proxyLMiter;
private int lead = 12000;
- private int lineHeight = 14000;
+ private Length lineHeight;
private int follow = 2000;
private int middleShift = 0;
@@ -56,29 +57,33 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
public BlockLayoutManager(org.apache.fop.fo.flow.Block inBlock) {
super(inBlock);
proxyLMiter = new ProxyLMiter();
+ }
+ public void initialize() {
Font fs = getBlockFO().getCommonFont().getFontState(
- getBlockFO().getFOEventHandler().getFontInfo());
+ getBlockFO().getFOEventHandler().getFontInfo(), this);
lead = fs.getAscender();
follow = -fs.getDescender();
middleShift = -fs.getXHeight() / 2;
- lineHeight = getBlockFO().getLineHeight().getOptimum().getLength().getValue();
- initialize();
- }
-
- private void initialize() {
- foSpaceBefore = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceBefore).getSpace();
- foSpaceAfter = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceAfter).getSpace();
+ lineHeight = getBlockFO().getLineHeight().getOptimum(this).getLength();
+ foSpaceBefore = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceBefore, this)
+ .getSpace();
+ foSpaceAfter = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceAfter, this)
+ .getSpace();
bpUnit = 0; // non-standard extension
if (bpUnit == 0) {
// use optimum space values
- adjustedSpaceBefore = getBlockFO().getCommonMarginBlock().spaceBefore.getSpace().getOptimum().getLength().getValue();
- adjustedSpaceAfter = getBlockFO().getCommonMarginBlock().spaceAfter.getSpace().getOptimum().getLength().getValue();
+ adjustedSpaceBefore = getBlockFO().getCommonMarginBlock().spaceBefore.getSpace()
+ .getOptimum(this).getLength().getValue(this);
+ adjustedSpaceAfter = getBlockFO().getCommonMarginBlock().spaceAfter.getSpace()
+ .getOptimum(this).getLength().getValue(this);
} else {
// use minimum space values
- adjustedSpaceBefore = getBlockFO().getCommonMarginBlock().spaceBefore.getSpace().getMinimum().getLength().getValue();
- adjustedSpaceAfter = getBlockFO().getCommonMarginBlock().spaceAfter.getSpace().getMinimum().getLength().getValue();
+ adjustedSpaceBefore = getBlockFO().getCommonMarginBlock().spaceBefore.getSpace()
+ .getMinimum(this).getLength().getValue(this);
+ adjustedSpaceAfter = getBlockFO().getCommonMarginBlock().spaceAfter.getSpace()
+ .getMinimum(this).getLength().getValue(this);
}
}
@@ -92,15 +97,24 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
*/
protected class ProxyLMiter extends LMiter {
+ /*
+ * Constructs a proxy iterator for Block LM.
+ */
public ProxyLMiter() {
super(BlockLayoutManager.this);
listLMs = new java.util.ArrayList(10);
}
+ /**
+ * @return true if there are more child lms
+ */
public boolean hasNext() {
return (curPos < listLMs.size()) ? true : createNextChildLMs(curPos);
}
+ /**
+ * @return true if new child lms were added
+ */
protected boolean createNextChildLMs(int pos) {
List newLMs = createChildLMs(pos + 1 - listLMs.size());
if (newLMs != null) {
@@ -156,8 +170,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
private int getIPIndents() {
int iIndents = 0;
- iIndents += getBlockFO().getCommonMarginBlock().startIndent.getValue();
- iIndents += getBlockFO().getCommonMarginBlock().endIndent.getValue();
+ iIndents += getBlockFO().getCommonMarginBlock().startIndent.getValue(this);
+ iIndents += getBlockFO().getCommonMarginBlock().endIndent.getValue(this);
return iIndents;
}
@@ -190,6 +204,9 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
|| !getBlockFO().getKeepWithNext().getWithinColumn().isAuto();
}
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#addAreas(org.apache.fop.layoutmgr.PositionIterator, org.apache.fop.layoutmgr.LayoutContext)
+ */
public void addAreas(PositionIterator parentIter,
LayoutContext layoutContext) {
//System.out.println(" BLM.addAreas>");
@@ -315,8 +332,10 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
// add space before and / or after the paragraph
// to reach a multiple of bpUnit
if (bSpaceBefore && bSpaceAfter) {
- foSpaceBefore = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceBefore).getSpace();
- foSpaceAfter = new SpaceVal(getBlockFO().getCommonMarginBlock().spaceAfter).getSpace();
+ foSpaceBefore = new SpaceVal(getBlockFO()
+ .getCommonMarginBlock().spaceBefore, this).getSpace();
+ foSpaceAfter = new SpaceVal(getBlockFO()
+ .getCommonMarginBlock().spaceAfter, this).getSpace();
adjustedSpaceBefore = (neededUnits(splitLength
+ foSpaceBefore.min
+ foSpaceAfter.min)
@@ -359,7 +378,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
childLM.addAreas(childPosIter, lc);
}
- //int bIndents = getBlockFO().getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
+ //int bIndents = getBlockFO().getCommonBorderPaddingBackground()
+ // .getBPPaddingAndBorder(false);
if (markers != null) {
getCurrentPV().addMarkers(markers, false, isFirst(firstPos), isLast(lastPos));
@@ -386,11 +406,16 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
* its own area. This includes setting the content IPD and the maximum
* BPD.
* @param childArea area to get the parent area for
+ * @return the parent area
*/
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
curBlockArea = new Block();
+ int contentIPD = referenceIPD - getIPIndents();
+
+ curBlockArea.setIPD(contentIPD/*parentwidth*/);
+
TraitSetter.addBreaks(curBlockArea,
getBlockFO().getBreakBefore(), getBlockFO().getBreakAfter());
@@ -401,10 +426,11 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
// set traits
TraitSetter.setProducerID(curBlockArea, getBlockFO().getId());
TraitSetter.addBorders(curBlockArea,
- getBlockFO().getCommonBorderPaddingBackground());
+ getBlockFO().getCommonBorderPaddingBackground(), this);
TraitSetter.addMargins(curBlockArea,
getBlockFO().getCommonBorderPaddingBackground(),
- getBlockFO().getCommonMarginBlock());
+ getBlockFO().getCommonMarginBlock(),
+ this);
// Set up dimensions
// Get reference IPD from parentArea
@@ -424,11 +450,6 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
parentwidth -= getIPIndents();
*/
- int contentIPD = referenceIPD - getIPIndents();
-
- curBlockArea.setIPD(contentIPD/*parentwidth*/);
- TraitSetter.addBackground(curBlockArea,
- getBlockFO().getCommonBorderPaddingBackground());
setCurrentArea(curBlockArea); // ??? for generic operations
}
return curBlockArea;
@@ -448,6 +469,19 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
}
/**
+ * Force current area to be added to parent area.
+ * @see org.apache.fop.layoutmgr.BlockStackingLayoutManager#flush()
+ */
+ protected void flush() {
+ if (curBlockArea != null) {
+ TraitSetter.addBackground(curBlockArea,
+ getBlockFO().getCommonBorderPaddingBackground(),
+ this);
+ super.flush();
+ }
+ }
+
+ /**
* @see org.apache.fop.layoutmgr.LayoutManager#resetPosition(org.apache.fop.layoutmgr.Position)
*/
public void resetPosition(Position resetPos) {
@@ -462,9 +496,43 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
/**
* convenience method that returns the Block node
+ * @return the block node
*/
protected org.apache.fop.fo.flow.Block getBlockFO() {
return (org.apache.fop.fo.flow.Block) fobj;
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ if (curBlockArea != null) {
+ return curBlockArea.getIPD();
+ }
+ return super.getContentAreaIPD();
+ }
+
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ if (curBlockArea != null) {
+ return curBlockArea.getBPD();
+ }
+ return -1;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return true;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
index feec2f783..822974e7b 100644
--- a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java
@@ -62,29 +62,37 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
protected boolean bSpaceBeforeServed = false;
/** Reference IPD available */
protected int referenceIPD = 0;
-
- /* holds the (one-time use) fo:block space-before
- and -after properties. Large fo:blocks are split
- into multiple Area.Blocks to accomodate the subsequent
- regions (pages) they are placed on. space-before
- is applied at the beginning of the first
- Block and space-after at the end of the last Block
- used in rendering the fo:block.
- */
+ /**
+ * Holds the (one-time use) fo:block space-before
+ * and -after properties. Large fo:blocks are split
+ * into multiple Area. Blocks to accomodate the subsequent
+ * regions (pages) they are placed on. space-before
+ * is applied at the beginning of the first
+ * Block and space-after at the end of the last Block
+ * used in rendering the fo:block.
+ */
protected MinOptMax foSpaceBefore = null;
+ /** see foSpaceBefore */
protected MinOptMax foSpaceAfter = null;
private int lastGeneratedPosition = -1;
private int smallestPosNumberChecked = Integer.MAX_VALUE;
private Position auxiliaryPosition;
+
+ private int contentAreaIPD = 0;
+ /**
+ * @param the fo this LM deals with
+ */
public BlockStackingLayoutManager(FObj node) {
super(node);
+ setGeneratesBlockArea(true);
fobj = node;
}
- /** return current area being filled
+ /**
+ * @return current area being filled
*/
protected BlockParent getCurrentArea() {
return this.parentArea;
@@ -93,6 +101,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Set the current area being filled.
+ * @param parentArea the current area to be filled
*/
protected void setCurrentArea(BlockParent parentArea) {
this.parentArea = parentArea;
@@ -240,6 +249,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
return (int) Math.ceil((float)len / bpUnit);
}
+ /**
+ * @see LayoutManager#getNextKnuthElements(LayoutContext, int)
+ */
public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
/* LF *///System.err.println("BLM.getNextKnuthElements> keep-together = "
// + layoutProps.keepTogether.getType());
@@ -251,21 +263,21 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
BlockLevelLayoutManager prevLM = null; // previously active LM
referenceIPD = context.getRefIPD();
+
int iIndents = 0;
int bIndents = 0;
if (fobj instanceof org.apache.fop.fo.flow.Block) {
org.apache.fop.fo.flow.Block block = (org.apache.fop.fo.flow.Block)fobj;
- iIndents = block.getCommonMarginBlock().startIndent.getValue()
- + block.getCommonMarginBlock().endIndent.getValue();
- bIndents = block.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
+ iIndents = block.getCommonMarginBlock().startIndent.getValue(this)
+ + block.getCommonMarginBlock().endIndent.getValue(this);
+ bIndents = block.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false, this);
}
int ipd = referenceIPD - iIndents;
MinOptMax stackSize = new MinOptMax();
// Set context for percentage property values.
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, ipd);
- fobj.setLayoutDimension(PercentBase.BLOCK_BPD, -1);
+ setContentAreaIPD(ipd);
LinkedList returnedList = null;
LinkedList contentList = new LinkedList();
@@ -437,6 +449,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
return returnList;
}
+ /**
+ * @see org.apache.fop.layoutmgr.BlockLevelLayoutManager#negotiateBPDAdjustment(int, org.apache.fop.layoutmgr.KnuthElement)
+ */
public int negotiateBPDAdjustment(int adj, KnuthElement lastElement) {
/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> " + adj);
/*LF*/ //System.out.println(" lastElement e' " + (lastElement.isPenalty()
@@ -517,6 +532,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
}
}
+ /**
+ * @see BlockLevelLayoutManager#discardSpace(KnuthGlue)
+ */
public void discardSpace(KnuthGlue spaceGlue) {
//System.out.println(" BLM.discardSpace> " + spaceGlue.getPosition().getClass().getName());
Position innerPosition = ((NonLeafPosition) spaceGlue.getPosition()).getPosition();
@@ -544,6 +562,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
}
}
+ /**
+ * @see LayoutManager#getChangedKnuthElements(List, int)
+ */
public LinkedList getChangedKnuthElements(List oldList, int alignment) {
/*LF*/ //System.out.println("");
/*LF*/ //System.out.println(" BLM.getChangedKnuthElements> inizio: oldList.size() = "
@@ -775,7 +796,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for before border padding and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
*/
protected void addKnuthElementsForBorderPaddingBefore(LinkedList returnList/*,
Position returnPosition*/) {
@@ -791,7 +811,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
if (borderAndPadding != null) {
//TODO Handle conditionality
int bpBefore = borderAndPadding.getBorderBeforeWidth(false)
- + borderAndPadding.getPaddingBefore(false);
+ + borderAndPadding.getPaddingBefore(false, this);
if (bpBefore > 0) {
returnList.add(new KnuthBox(bpBefore, getAuxiliaryPosition(), true));
}
@@ -801,7 +821,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for after border padding and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
*/
protected void addKnuthElementsForBorderPaddingAfter(LinkedList returnList/*,
Position returnPosition*/) {
@@ -817,7 +836,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
if (borderAndPadding != null) {
//TODO Handle conditionality
int bpAfter = borderAndPadding.getBorderAfterWidth(false)
- + borderAndPadding.getPaddingAfter(false);
+ + borderAndPadding.getPaddingAfter(false, this);
if (bpAfter > 0) {
returnList.add(new KnuthBox(bpAfter, getAuxiliaryPosition(), true));
}
@@ -827,7 +846,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for break-before and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
* @return true if an element has been added due to a break-before.
*/
protected boolean addKnuthElementsForBreakBefore(LinkedList returnList/*,
@@ -856,7 +874,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for break-after and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
* @return true if an element has been added due to a break-after.
*/
protected boolean addKnuthElementsForBreakAfter(LinkedList returnList/*,
@@ -885,7 +902,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for space-before and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
* @param alignment vertical alignment
*/
protected void addKnuthElementsForSpaceBefore(LinkedList returnList/*,
@@ -907,8 +923,8 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
// append elements representing space-before
if (bpUnit > 0
|| spaceBefore != null
- && !(spaceBefore.getMinimum().getLength().getValue() == 0
- && spaceBefore.getMaximum().getLength().getValue() == 0)) {
+ && !(spaceBefore.getMinimum(this).getLength().getValue(this) == 0
+ && spaceBefore.getMaximum(this).getLength().getValue(this) == 0)) {
if (spaceBefore != null && !spaceBefore.getSpace().isDiscard()) {
// add elements to prevent the glue to be discarded
returnList.add(new KnuthBox(0, getAuxiliaryPosition(), false));
@@ -921,16 +937,16 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
getAuxiliaryPosition(), true));
} else /*if (alignment == EN_JUSTIFY)*/ {
returnList.add(new KnuthGlue(
- spaceBefore.getOptimum().getLength().getValue(),
- spaceBefore.getMaximum().getLength().getValue()
- - spaceBefore.getOptimum().getLength().getValue(),
- spaceBefore.getOptimum().getLength().getValue()
- - spaceBefore.getMinimum().getLength().getValue(),
+ spaceBefore.getOptimum(this).getLength().getValue(this),
+ spaceBefore.getMaximum(this).getLength().getValue(this)
+ - spaceBefore.getOptimum(this).getLength().getValue(this),
+ spaceBefore.getOptimum(this).getLength().getValue(this)
+ - spaceBefore.getMinimum(this).getLength().getValue(this),
BlockLevelLayoutManager.SPACE_BEFORE_ADJUSTMENT,
getAuxiliaryPosition(), true));
} /*else {
returnList.add(new KnuthGlue(
- spaceBefore.getOptimum().getLength().getValue(),
+ spaceBefore.getOptimum().getLength().getValue(this),
0, 0, BlockLevelLayoutManager.SPACE_BEFORE_ADJUSTMENT,
returnPosition, true));
}*/
@@ -940,7 +956,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
/**
* Creates Knuth elements for space-after and adds them to the return list.
* @param returnList return list to add the additional elements to
- * @param returnPosition applicable return position
* @param alignment vertical alignment
*/
protected void addKnuthElementsForSpaceAfter(LinkedList returnList/*, Position returnPosition*/,
@@ -962,8 +977,8 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
// append elements representing space-after
if (bpUnit > 0
|| spaceAfter != null
- && !(spaceAfter.getMinimum().getLength().getValue() == 0
- && spaceAfter.getMaximum().getLength().getValue() == 0)) {
+ && !(spaceAfter.getMinimum(this).getLength().getValue(this) == 0
+ && spaceAfter.getMaximum(this).getLength().getValue(this) == 0)) {
if (spaceAfter != null && !spaceAfter.getSpace().isDiscard()) {
returnList.add(new KnuthPenalty(0, KnuthElement.INFINITE,
false, getAuxiliaryPosition(), false));
@@ -974,16 +989,16 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
getAuxiliaryPosition(), true));
} else /*if (alignment == EN_JUSTIFY)*/ {
returnList.add(new KnuthGlue(
- spaceAfter.getOptimum().getLength().getValue(),
- spaceAfter.getMaximum().getLength().getValue()
- - spaceAfter.getOptimum().getLength().getValue(),
- spaceAfter.getOptimum().getLength().getValue()
- - spaceAfter.getMinimum().getLength().getValue(),
+ spaceAfter.getOptimum(this).getLength().getValue(this),
+ spaceAfter.getMaximum(this).getLength().getValue(this)
+ - spaceAfter.getOptimum(this).getLength().getValue(this),
+ spaceAfter.getOptimum(this).getLength().getValue(this)
+ - spaceAfter.getMinimum(this).getLength().getValue(this),
BlockLevelLayoutManager.SPACE_AFTER_ADJUSTMENT, getAuxiliaryPosition(),
(!spaceAfter.getSpace().isDiscard()) ? false : true));
} /*else {
returnList.add(new KnuthGlue(
- spaceAfter.getOptimum().getLength().getValue(), 0, 0,
+ spaceAfter.getOptimum().getLength().getValue(this), 0, 0,
BlockLevelLayoutManager.SPACE_AFTER_ADJUSTMENT, returnPosition,
(!spaceAfter.getSpace().isDiscard()) ? false : true));
}*/
@@ -1378,5 +1393,25 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager
}
}
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return contentAreaIPD;
+ }
+
+ protected void setContentAreaIPD(int contentAreaIPD) {
+ this.contentAreaIPD = contentAreaIPD;
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ return -1;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
index a400078c2..70f481532 100644
--- a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
@@ -62,10 +62,6 @@ public class FlowLayoutManager extends BlockStackingLayoutManager
// set layout dimensions
int flowIPD = getCurrentPV().getCurrentSpan().getColumnWidth();
int flowBPD = (int) getCurrentPV().getBodyRegion().getBPD();
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, flowIPD);
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, flowBPD);
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, context.getRefIPD());
- fobj.setLayoutDimension(PercentBase.BLOCK_BPD, context.getStackLimit().opt);
// currently active LM
BlockLevelLayoutManager curLM;
@@ -338,5 +334,21 @@ public class FlowLayoutManager extends BlockStackingLayoutManager
reset(null);
}
}
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return getCurrentPV().getCurrentSpan().getColumnWidth();
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ return (int) getCurrentPV().getBodyRegion().getBPD();
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/LayoutManager.java b/src/java/org/apache/fop/layoutmgr/LayoutManager.java
index 3d6053248..33250110f 100644
--- a/src/java/org/apache/fop/layoutmgr/LayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/LayoutManager.java
@@ -22,11 +22,13 @@ import java.util.LinkedList;
import java.util.List;
import org.apache.fop.area.Area;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.fo.FObj;
/**
* The interface for all LayoutManagers.
*/
-public interface LayoutManager {
+public interface LayoutManager extends PercentBaseContext {
/**
* Set the parent layout manager.
@@ -43,6 +45,12 @@ public interface LayoutManager {
LayoutManager getParent();
/**
+ * initialize the layout manager. Allows each layout manager
+ * to calculate often used values.
+ */
+ public void initialize();
+
+ /**
* Get the active PageSequenceLayoutManager instance for this
* layout process.
* @return the PageSequenceLayoutManager
@@ -143,11 +151,46 @@ public interface LayoutManager {
* of the node assigned to the LM, after changes have been applied
*
* @param oldList the elements to replace
- * @param flaggedPenalty the penalty value for hyphenated lines
* @param alignment the desired text alignment
* @return the updated list of KnuthElements
*/
LinkedList getChangedKnuthElements(List oldList, /*int flaggedPenalty,*/
int alignment);
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ int getContentAreaIPD();
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ int getContentAreaBPD();
+
+ /**
+ * Returns an indication if the layout manager generates a reference area.
+ * @return True if the layout manager generates a reference area
+ */
+ boolean getGeneratesReferenceArea();
+
+ /**
+ * Returns an indication if the layout manager generates a block area.
+ * @return True if the layout manager generates a block area
+ */
+ boolean getGeneratesBlockArea();
+
+ /**
+ * Returns an indication if the layout manager generates a line area.
+ * @return True if the layout manager generates a line area
+ */
+ boolean getGeneratesLineArea();
+
+ /**
+ * Returns the fo this layout manager is associated with.
+ * @return The fo for this layout manager or null.
+ */
+ FObj getFObj();
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/MinOptMaxUtil.java b/src/java/org/apache/fop/layoutmgr/MinOptMaxUtil.java
index a17748e24..e99ec6853 100644
--- a/src/java/org/apache/fop/layoutmgr/MinOptMaxUtil.java
+++ b/src/java/org/apache/fop/layoutmgr/MinOptMaxUtil.java
@@ -18,6 +18,7 @@
package org.apache.fop.layoutmgr;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.properties.LengthRangeProperty;
import org.apache.fop.traits.MinOptMax;
@@ -31,18 +32,20 @@ public class MinOptMaxUtil {
* Restricts a MinOptMax using the values from a LengthRangeProperty.
* @param mom MinOptMax to restrict
* @param lr restricting source
+ * @param context Percentage evaluation context
*/
- public static void restrict(MinOptMax mom, LengthRangeProperty lr) {
+ public static void restrict(MinOptMax mom, LengthRangeProperty lr,
+ PercentBaseContext context) {
if (lr.getEnum() != Constants.EN_AUTO) {
- if (lr.getMinimum().getEnum() != Constants.EN_AUTO) {
- int min = lr.getMinimum().getLength().getValue();
+ if (lr.getMinimum(context).getEnum() != Constants.EN_AUTO) {
+ int min = lr.getMinimum(context).getLength().getValue(context);
if (min > mom.min) {
mom.min = min;
fixAfterMinChanged(mom);
}
}
- if (lr.getMaximum().getEnum() != Constants.EN_AUTO) {
- int max = lr.getMaximum().getLength().getValue();
+ if (lr.getMaximum(context).getEnum() != Constants.EN_AUTO) {
+ int max = lr.getMaximum(context).getLength().getValue(context);
if (max < mom.max) {
mom.max = max;
if (mom.max < mom.opt) {
@@ -51,8 +54,8 @@ public class MinOptMaxUtil {
}
}
}
- if (lr.getOptimum().getEnum() != Constants.EN_AUTO) {
- int opt = lr.getOptimum().getLength().getValue();
+ if (lr.getOptimum(context).getEnum() != Constants.EN_AUTO) {
+ int opt = lr.getOptimum(context).getLength().getValue(context);
if (opt > mom.min) {
mom.opt = opt;
if (mom.opt > mom.max) {
@@ -63,6 +66,13 @@ public class MinOptMaxUtil {
}
}
+ /**
+ * Extend the minimum length to the given length.
+ * @param mom the min/opt/max trait
+ * @param len the new minimum length
+ * @param optToLen if set adjusts the optimum length to be the smaller of the
+ * minimum length and the given length
+ */
public static void extendMinimum(MinOptMax mom, int len, boolean optToLen) {
if (mom.min < len) {
mom.min = len;
@@ -91,17 +101,18 @@ public class MinOptMaxUtil {
/**
* Converts a LengthRangeProperty to a MinOptMax.
* @param prop LengthRangeProperty
+ * @param context Percentage evaluation context
* @return the requested MinOptMax instance
*/
- public static MinOptMax toMinOptMax(LengthRangeProperty prop) {
+ public static MinOptMax toMinOptMax(LengthRangeProperty prop, PercentBaseContext context) {
MinOptMax mom = new MinOptMax(
- (prop.getMinimum().isAuto()
- ? 0 : prop.getMinimum().getLength().getValue()),
- (prop.getOptimum().isAuto()
- ? 0 : prop.getOptimum().getLength().getValue()),
- (prop.getMinimum().isAuto()
+ (prop.getMinimum(context).isAuto()
+ ? 0 : prop.getMinimum(context).getLength().getValue(context)),
+ (prop.getOptimum(context).isAuto()
+ ? 0 : prop.getOptimum(context).getLength().getValue(context)),
+ (prop.getMinimum(context).isAuto()
? Integer.MAX_VALUE
- : prop.getMaximum().getLength().getValue()));
+ : prop.getMaximum(context).getLength().getValue(context)));
return mom;
}
diff --git a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
index c052bf94e..57ceb82a0 100644
--- a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
@@ -243,6 +243,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
FootnoteBodyLayoutManager fblm
= (FootnoteBodyLayoutManager) footnoteBodyIterator.next();
fblm.setParent(childFLM);
+ fblm.initialize();
((KnuthBlockBox) element).addElementList(
fblm.getNextKnuthElements(footnoteContext, alignment));
}
diff --git a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java
index 5412d80fc..37ab04395 100644
--- a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java
@@ -42,6 +42,9 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager {
private Block targetBlock;
private SideRegion regionFO;
+ private int contentAreaIPD = 0;
+ private int contentAreaBPD = -1;
+
/**
* Creates a new StaticContentLayoutManager.
* @param pslm PageSequenceLayoutManager this layout manager belongs to
@@ -53,9 +56,15 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager {
super(node);
setParent(pslm);
regionFO = reg;
- targetRegion = getCurrentPV().getRegionReference(regionFO.getNameId());
+ targetRegion = getCurrentPV().getRegionReference(regionFO.getNameId());
}
+ /**
+ * Creates a new StaticContentLayoutManager.
+ * @param pslm PageSequenceLayoutManager this layout manager belongs to
+ * @param node static-content FO
+ * @param block the block to layout into
+ */
public StaticContentLayoutManager(PageSequenceLayoutManager pslm,
StaticContent node, Block block) {
super(node);
@@ -68,8 +77,8 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager {
*/
public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
// set layout dimensions
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, context.getRefIPD());
- fobj.setLayoutDimension(PercentBase.BLOCK_BPD, context.getStackLimit().opt);
+ setContentAreaIPD(context.getRefIPD());
+ setContentAreaBPD(context.getStackLimit().opt);
//TODO Copied from elsewhere. May be worthwhile to factor out the common parts.
// currently active LM
@@ -218,7 +227,8 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager {
}
/**
- * convenience method that returns the Static Content node
+ * Convenience method that returns the Static Content node.
+ * @return the static content node
*/
protected StaticContent getStaticContentFO() {
return (StaticContent) fobj;
@@ -307,6 +317,31 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager {
protected LayoutManager getCurrentChildLM() {
return null; //TODO NYI
}
- }
+ }
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return contentAreaIPD;
+ }
+
+ private void setContentAreaIPD(int contentAreaIPD) {
+ this.contentAreaIPD = contentAreaIPD;
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ return contentAreaBPD;
+ }
+
+ private void setContentAreaBPD(int contentAreaBPD) {
+ this.contentAreaBPD = contentAreaBPD;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/TraitSetter.java b/src/java/org/apache/fop/layoutmgr/TraitSetter.java
index c1322d570..8e2c72a0f 100644
--- a/src/java/org/apache/fop/layoutmgr/TraitSetter.java
+++ b/src/java/org/apache/fop/layoutmgr/TraitSetter.java
@@ -23,6 +23,9 @@ import org.apache.commons.logging.LogFactory;
import org.apache.fop.traits.BorderProps;
import org.apache.fop.area.Area;
import org.apache.fop.area.Trait;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.PercentBaseContext;
+import org.apache.fop.datatypes.SimplePercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.properties.CommonMarginBlock;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
@@ -43,23 +46,25 @@ public class TraitSetter {
* @param bpProps border and padding properties
* @param bNotFirst True if the area is not the first area
* @param bNotLast True if the area is not the last area
+ * @param context Property evaluation context
*/
public static void setBorderPaddingTraits(Area area,
- CommonBorderPaddingBackground bpProps, boolean bNotFirst, boolean bNotLast) {
+ CommonBorderPaddingBackground bpProps, boolean bNotFirst, boolean bNotLast,
+ PercentBaseContext context) {
int iBP;
- iBP = bpProps.getPadding(CommonBorderPaddingBackground.START, bNotFirst);
+ iBP = bpProps.getPadding(CommonBorderPaddingBackground.START, bNotFirst, context);
if (iBP > 0) {
area.addTrait(Trait.PADDING_START, new Integer(iBP));
}
- iBP = bpProps.getPadding(CommonBorderPaddingBackground.END, bNotLast);
+ iBP = bpProps.getPadding(CommonBorderPaddingBackground.END, bNotLast, context);
if (iBP > 0) {
area.addTrait(Trait.PADDING_END, new Integer(iBP));
}
- iBP = bpProps.getPadding(CommonBorderPaddingBackground.BEFORE, false);
+ iBP = bpProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, context);
if (iBP > 0) {
area.addTrait(Trait.PADDING_BEFORE, new Integer(iBP));
}
- iBP = bpProps.getPadding(CommonBorderPaddingBackground.AFTER, false);
+ iBP = bpProps.getPadding(CommonBorderPaddingBackground.AFTER, false, context);
if (iBP > 0) {
area.addTrait(Trait.PADDING_AFTER, new Integer(iBP));
}
@@ -106,8 +111,10 @@ public class TraitSetter {
* add the borders to the area.
* @param area the area to set the traits on.
* @param bordProps border properties
+ * @param context Property evaluation context
*/
- public static void addBorders(Area area, CommonBorderPaddingBackground bordProps) {
+ public static void addBorders(Area area, CommonBorderPaddingBackground bordProps,
+ PercentBaseContext context) {
BorderProps bps = getBorderProps(bordProps, CommonBorderPaddingBackground.BEFORE);
if (bps != null) {
area.addTrait(Trait.BORDER_BEFORE, bps);
@@ -125,7 +132,7 @@ public class TraitSetter {
area.addTrait(Trait.BORDER_END, bps);
}
- addPadding(area, bordProps);
+ addPadding(area, bordProps, context);
}
/**
@@ -136,10 +143,12 @@ public class TraitSetter {
* @param bordProps border properties
* @param outer 4 boolean values indicating if the side represents the
* table's outer border. Order: before, after, start, end
+ * @param context Property evaluation context
*/
public static void addCollapsingBorders(Area area,
CommonBorderPaddingBackground bordProps,
- boolean[] outer) {
+ boolean[] outer,
+ PercentBaseContext context) {
BorderProps bps = getCollapsingBorderProps(bordProps,
CommonBorderPaddingBackground.BEFORE, outer[0]);
if (bps != null) {
@@ -161,26 +170,27 @@ public class TraitSetter {
area.addTrait(Trait.BORDER_END, bps);
}
- addPadding(area, bordProps);
+ addPadding(area, bordProps, context);
}
- private static void addPadding(Area area, CommonBorderPaddingBackground bordProps) {
- int padding = bordProps.getPadding(CommonBorderPaddingBackground.START, false);
+ private static void addPadding(Area area, CommonBorderPaddingBackground bordProps,
+ PercentBaseContext context) {
+ int padding = bordProps.getPadding(CommonBorderPaddingBackground.START, false, context);
if (padding != 0) {
area.addTrait(Trait.PADDING_START, new java.lang.Integer(padding));
}
- padding = bordProps.getPadding(CommonBorderPaddingBackground.END, false);
+ padding = bordProps.getPadding(CommonBorderPaddingBackground.END, false, context);
if (padding != 0) {
area.addTrait(Trait.PADDING_END, new java.lang.Integer(padding));
}
- padding = bordProps.getPadding(CommonBorderPaddingBackground.BEFORE, false);
+ padding = bordProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, context);
if (padding != 0) {
area.addTrait(Trait.PADDING_BEFORE, new java.lang.Integer(padding));
}
- padding = bordProps.getPadding(CommonBorderPaddingBackground.AFTER, false);
+ padding = bordProps.getPadding(CommonBorderPaddingBackground.AFTER, false, context);
if (padding != 0) {
area.addTrait(Trait.PADDING_AFTER, new java.lang.Integer(padding));
}
@@ -221,8 +231,11 @@ public class TraitSetter {
* Note: The area's IPD and BPD must be set before calling this method.
* @param area the area to set the traits on
* @param backProps the background properties
+ * @param context Property evaluation context
*/
- public static void addBackground(Area area, CommonBorderPaddingBackground backProps) {
+ public static void addBackground(Area area,
+ CommonBorderPaddingBackground backProps,
+ PercentBaseContext context) {
if (!backProps.hasBackground()) {
return;
}
@@ -236,43 +249,42 @@ public class TraitSetter {
if (backProps.backgroundPositionHorizontal != null) {
if (back.getRepeat() == Constants.EN_NOREPEAT
|| back.getRepeat() == Constants.EN_REPEATY) {
- if (backProps.backgroundPositionHorizontal instanceof PercentLength) {
- if (area.getIPD() > 0) {
- int width = area.getIPD();
- width += backProps.getPaddingStart(false);
- width += backProps.getPaddingEnd(false);
- back.setHoriz((int)((width - back.getFopImage().getIntrinsicWidth())
- * ((PercentLength)backProps.backgroundPositionHorizontal).value()));
- } else {
- //TODO Area IPD has to be set for this to work
- log.warn("Horizontal background image positioning ignored"
- + " because the IPD was not set on the area."
- + " (Yes, it's a bug in FOP)");
- }
+ if (area.getIPD() > 0) {
+ int width = area.getIPD();
+ width += backProps.getPaddingStart(false, context);
+ width += backProps.getPaddingEnd(false, context);
+ back.setHoriz(backProps.backgroundPositionHorizontal.getValue(
+ new SimplePercentBaseContext(context,
+ LengthBase.IMAGE_BACKGROUND_POSITION_HORIZONTAL,
+ (width - back.getFopImage().getIntrinsicWidth())
+ )
+ ));
} else {
- back.setHoriz(backProps.backgroundPositionHorizontal.getValue());
+ //TODO Area IPD has to be set for this to work
+ log.warn("Horizontal background image positioning ignored"
+ + " because the IPD was not set on the area."
+ + " (Yes, it's a bug in FOP)");
}
}
}
if (backProps.backgroundPositionVertical != null) {
if (back.getRepeat() == Constants.EN_NOREPEAT
|| back.getRepeat() == Constants.EN_REPEATX) {
- if (backProps.backgroundPositionVertical instanceof PercentLength) {
- if (area.getBPD() > 0) {
- int height = area.getBPD();
- height += backProps.getPaddingBefore(false);
- height += backProps.getPaddingAfter(false);
- back.setVertical(
- (int)((height - back.getFopImage().getIntrinsicHeight())
- * ((PercentLength)backProps.backgroundPositionVertical).value()));
- } else {
- //TODO Area BPD has to be set for this to work
- log.warn("Vertical background image positioning ignored"
- + " because the BPD was not set on the area."
- + " (Yes, it's a bug in FOP)");
- }
+ if (area.getBPD() > 0) {
+ int height = area.getBPD();
+ height += backProps.getPaddingBefore(false, context);
+ height += backProps.getPaddingAfter(false, context);
+ back.setVertical(backProps.backgroundPositionVertical.getValue(
+ new SimplePercentBaseContext(context,
+ LengthBase.IMAGE_BACKGROUND_POSITION_VERTICAL,
+ (height - back.getFopImage().getIntrinsicHeight())
+ )
+ ));
} else {
- back.setVertical(backProps.backgroundPositionVertical.getValue());
+ //TODO Area BPD has to be set for this to work
+ log.warn("Vertical background image positioning ignored"
+ + " because the BPD was not set on the area."
+ + " (Yes, it's a bug in FOP)");
}
}
}
@@ -288,29 +300,31 @@ public class TraitSetter {
* @param area the area to set the traits on.
* @param bpProps the border, padding and background properties
* @param marginProps the margin properties.
+ * @param context the context for evaluation of percentages
*/
public static void addMargins(Area area,
CommonBorderPaddingBackground bpProps,
- CommonMarginBlock marginProps) {
- int startIndent = marginProps.startIndent.getValue();
+ CommonMarginBlock marginProps,
+ PercentBaseContext context) {
+ int startIndent = marginProps.startIndent.getValue(context);
if (startIndent != 0) {
area.addTrait(Trait.START_INDENT, new Integer(startIndent));
}
- int spaceStart = marginProps.startIndent.getValue()
+ int spaceStart = marginProps.startIndent.getValue(context)
- bpProps.getBorderStartWidth(false)
- - bpProps.getPaddingStart(false);
+ - bpProps.getPaddingStart(false, context);
if (spaceStart != 0) {
area.addTrait(Trait.SPACE_START, new Integer(spaceStart));
}
- int endIndent = marginProps.endIndent.getValue();
+ int endIndent = marginProps.endIndent.getValue(context);
if (endIndent != 0) {
area.addTrait(Trait.END_INDENT, new Integer(endIndent));
}
- int spaceEnd = marginProps.endIndent.getValue()
+ int spaceEnd = marginProps.endIndent.getValue(context)
- bpProps.getBorderEndWidth(false)
- - bpProps.getPaddingEnd(false);
+ - bpProps.getPaddingEnd(false, context);
if (spaceEnd != 0) {
area.addTrait(Trait.SPACE_END, new Integer(spaceEnd));
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/BidiLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/BidiLayoutManager.java
index 6a60f4205..bc6a0d44a 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/BidiLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/BidiLayoutManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,6 +36,7 @@ public class BidiLayoutManager extends LeafNodeLayoutManager {
public BidiLayoutManager(BidiOverride node, InlineLayoutManager cLM) {
super(node);
+ setParent(cLM);
children = new ArrayList();
/*
for (int count = cLM.size() - 1; count >= 0; count--) {
diff --git a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
index b278c0f2b..c15ee02c4 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
@@ -54,10 +54,14 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager {
public CharacterLayoutManager(Character node) {
super(node);
fobj = node;
- InlineArea inline = getCharacterInlineArea(node);
+ }
+
+ public void initialize() {
+ InlineArea inline = getCharacterInlineArea(fobj);
setCurrentArea(inline);
+
setAlignment(fobj.getVerticalAlign());
- fs = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo());
+ fs = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo(), this);
SpaceVal ls = SpaceVal.makeLetterSpacing(fobj.getLetterSpacing());
letterSpaceIPD = ls.getSpace();
diff --git a/src/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java
index d55208a20..6c094f6a3 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java
@@ -21,6 +21,7 @@ package org.apache.fop.layoutmgr.inline;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.pagination.Title;
+import org.apache.fop.layoutmgr.AbstractBaseLayoutManager;
import org.apache.fop.layoutmgr.KnuthElement;
import org.apache.fop.layoutmgr.KnuthPossPosIter;
import org.apache.fop.layoutmgr.LayoutContext;
@@ -41,13 +42,15 @@ import org.apache.fop.traits.MinOptMax;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.fop.area.Block;
/**
* Content Layout Manager.
* For use with objects that contain inline areas such as
* leader use-content and title.
*/
-public class ContentLayoutManager implements InlineLevelLayoutManager {
+public class ContentLayoutManager extends AbstractBaseLayoutManager
+ implements InlineLevelLayoutManager {
private FOUserAgent userAgent;
private Area holder;
private int stackSize;
@@ -55,11 +58,6 @@ public class ContentLayoutManager implements InlineLevelLayoutManager {
private InlineLevelLayoutManager childLM = null;
/**
- * logging instance
- */
- protected static Log log = LogFactory.getLog(LayoutManager.class);
-
- /**
* Constructs a new ContentLayoutManager
*
* @param area The parent area
@@ -88,6 +86,10 @@ public class ContentLayoutManager implements InlineLevelLayoutManager {
fillArea(lm);
}
+ public void initialize() {
+ // Empty
+ }
+
public void fillArea(LayoutManager curLM) {
int ipd = 1000000;
@@ -311,5 +313,45 @@ public class ContentLayoutManager implements InlineLevelLayoutManager {
public PageSequenceLayoutManager getPSLM() {
return parentLM.getPSLM();
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return holder.getIPD();
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ return holder.getBPD();
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesReferenceArea
+ */
+ public boolean getGeneratesReferenceArea() {
+ return false;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return getGeneratesLineArea() || holder instanceof Block;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesLineArea
+ */
+ public boolean getGeneratesLineArea() {
+ return holder instanceof LineArea;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
index cc5dd8ca7..b31b5ea04 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
@@ -20,14 +20,18 @@ package org.apache.fop.layoutmgr.inline;
// Java
import java.awt.geom.Rectangle2D;
+import java.util.LinkedList;
// FOP
import org.apache.fop.area.inline.Image;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.Viewport;
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.ExternalGraphic;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.layoutmgr.LayoutContext;
import org.apache.fop.layoutmgr.TraitSetter;
/**
@@ -57,11 +61,6 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
public ExternalGraphicLayoutManager(ExternalGraphic node) {
super(node);
fobj = node;
- setup();
- InlineArea area = getExternalGraphicInlineArea();
- setCurrentArea(area);
- setAlignment(fobj.getVerticalAlign());
- setLead(viewHeight);
}
/**
@@ -71,22 +70,22 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
*/
private void setup() {
// assume lr-tb for now and just use the .optimum value of the range
- Length ipd = fobj.getInlineProgressionDimension().getOptimum().getLength();
+ Length ipd = fobj.getInlineProgressionDimension().getOptimum(this).getLength();
if (ipd.getEnum() != EN_AUTO) {
- viewWidth = ipd.getValue();
+ viewWidth = ipd.getValue(this);
} else {
ipd = fobj.getWidth();
if (ipd.getEnum() != EN_AUTO) {
- viewWidth = ipd.getValue();
+ viewWidth = ipd.getValue(this);
}
}
- Length bpd = fobj.getBlockProgressionDimension().getOptimum().getLength();
+ Length bpd = fobj.getBlockProgressionDimension().getOptimum(this).getLength();
if (bpd.getEnum() != EN_AUTO) {
- viewHeight = bpd.getValue();
+ viewHeight = bpd.getValue(this);
} else {
bpd = fobj.getHeight();
if (bpd.getEnum() != EN_AUTO) {
- viewHeight = bpd.getValue();
+ viewHeight = bpd.getValue(this);
}
}
@@ -99,7 +98,7 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
cheight = viewHeight;
}
} else {
- cheight = ch.getValue();
+ cheight = ch.getValue(this);
}
}
Length cw = fobj.getContentWidth();
@@ -109,7 +108,7 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
cwidth = viewWidth;
}
} else {
- cwidth = cw.getValue();
+ cwidth = cw.getValue(this);
}
}
@@ -189,10 +188,10 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
CommonBorderPaddingBackground borderProps = fobj.getCommonBorderPaddingBackground();
//Determine extra BPD from borders etc.
- int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false);
+ int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
beforeBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
false);
- int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false);
+ int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
afterBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
yoffset += beforeBPD;
@@ -201,10 +200,10 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
//Determine extra IPD from borders etc.
int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/);
+ false/*bNotFirst*/, this);
startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
false/*bNotFirst*/);
- int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/);
+ int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/, this);
endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false/*bNotLast*/);
xoffset += startIPD;
@@ -214,6 +213,19 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
placement = new Rectangle2D.Float(xoffset, yoffset, cwidth, cheight);
}
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
+ */
+ public LinkedList getNextKnuthElements(LayoutContext context,
+ int alignment) {
+ setup();
+ InlineArea area = getExternalGraphicInlineArea();
+ setCurrentArea(area);
+ setAlignment(fobj.getVerticalAlign());
+ setLead(viewHeight);
+ return super.getNextKnuthElements(context, alignment);
+ }
+
/**
* Get the inline area for this external grpahic.
* This creates the image area and puts it inside a viewport.
@@ -232,8 +244,8 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
vp.setOffset(0);
// Common Border, Padding, and Background Properties
- TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground());
- TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground(), this);
+ TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground(), this);
return vp;
}
@@ -242,5 +254,38 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
protected void addId() {
getPSLM().addIDToPage(fobj.getId());
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ switch (lengthBase) {
+ case LengthBase.IMAGE_INTRINSIC_WIDTH:
+ return getIntrinsicWidth();
+ case LengthBase.IMAGE_INTRINSIC_HEIGHT:
+ return getIntrinsicHeight();
+ default: // Delegate to super class
+ return super.getBaseLength(lengthBase, fobj);
+ }
+ }
+
+ /**
+ * Returns the intrinsic width of the e-g.
+ * @return the width of the element
+ */
+ protected int getIntrinsicWidth() {
+ return fobj.getIntrinsicWidth();
+ }
+
+ /**
+ * Returns the intrinsic height of the e-g.
+ * @return the height of the element
+ */
+ protected int getIntrinsicHeight() {
+ return fobj.getIntrinsicHeight();
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/FootnoteLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/FootnoteLayoutManager.java
index 21267f7c5..44d8fc8ed 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/FootnoteLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/FootnoteLayoutManager.java
@@ -44,7 +44,9 @@ public class FootnoteLayoutManager extends AbstractLayoutManager
public FootnoteLayoutManager(Footnote node) {
super(node);
footnote = node;
-
+ }
+
+ public void initialize() {
// create an InlineStackingLM handling the fo:inline child of fo:footnote
citationLM = new InlineLayoutManager(footnote.getFootnoteCitation());
@@ -61,7 +63,9 @@ public class FootnoteLayoutManager extends AbstractLayoutManager
// set the citationLM parent to be this LM's parent
citationLM.setParent(getParent());
+ citationLM.initialize();
bodyLM.setParent(this);
+ bodyLM.initialize();
// get Knuth elements representing the footnote citation
LinkedList returnedList = new LinkedList();
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
index 72b8c7bad..3463e3883 100755
--- a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
@@ -67,31 +67,30 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
public InlineLayoutManager(InlineLevel node) {
super(node);
fobj = node;
- initialize();
}
private Inline getInlineFO() {
return (Inline)fobj;
}
- private void initialize() {
+ public void initialize() {
inlineProps = fobj.getCommonMarginInline();
borderProps = fobj.getCommonBorderPaddingBackground();
- int iPad = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false);
+ int iPad = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
iPad += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
false);
- iPad += borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false);
+ iPad += borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
iPad += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
extraBPD = new MinOptMax(iPad);
}
protected MinOptMax getExtraIPD(boolean bNotFirst, boolean bNotLast) {
int iBP = borderProps.getPadding(CommonBorderPaddingBackground.START,
- bNotFirst);
+ bNotFirst, this);
iBP += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
bNotFirst);
- iBP += borderProps.getPadding(CommonBorderPaddingBackground.END, bNotLast);
+ iBP += borderProps.getPadding(CommonBorderPaddingBackground.END, bNotLast, this);
iBP += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, bNotLast);
return new MinOptMax(iBP);
}
@@ -99,14 +98,14 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
protected boolean hasLeadingFence(boolean bNotFirst) {
int iBP = borderProps.getPadding(CommonBorderPaddingBackground.START,
- bNotFirst);
+ bNotFirst, this);
iBP += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
bNotFirst);
return (iBP > 0);
}
protected boolean hasTrailingFence(boolean bNotLast) {
- int iBP = borderProps.getPadding(CommonBorderPaddingBackground.END, bNotLast);
+ int iBP = borderProps.getPadding(CommonBorderPaddingBackground.END, bNotLast, this);
iBP += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, bNotLast);
return (iBP > 0);
}
@@ -138,11 +137,11 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
// Add border and padding to current area and set flags (FIRST, LAST ...)
TraitSetter.setBorderPaddingTraits(getCurrentArea(),
- borderProps, bNotFirst, bNotLast);
+ borderProps, bNotFirst, bNotLast, this);
if (borderProps != null) {
- TraitSetter.addBorders(getCurrentArea(), borderProps);
- TraitSetter.addBackground(getCurrentArea(), borderProps);
+ TraitSetter.addBorders(getCurrentArea(), borderProps, this);
+ TraitSetter.addBackground(getCurrentArea(), borderProps, this);
}
}
@@ -166,7 +165,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
// not be the first area created by this inline
childLC = new LayoutContext(lc);
if (getSpaceStart() != null) {
- lc.getLeadingSpace().addSpace(new SpaceVal(getSpaceStart()));
+ lc.getLeadingSpace().addSpace(new SpaceVal(getSpaceStart(), this));
}
// Check for "fence"
@@ -308,8 +307,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
*
* @param parentIter Iterator over Position information returned
* by this LayoutManager.
- * @param dSpaceAdjust Factor controlling how much extra space to add
- * in order to justify the line.
+ * @param context layout context.
*/
public void addAreas(PositionIterator parentIter,
LayoutContext context) {
@@ -331,7 +329,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
}
if (getSpaceStart() != null) {
- context.getLeadingSpace().addSpace(new SpaceVal(getSpaceStart()));
+ context.getLeadingSpace().addSpace(new SpaceVal(getSpaceStart(), this));
}
// "unwrap" the NonLeafPositions stored in parentIter
@@ -391,11 +389,12 @@ public class InlineLayoutManager extends InlineStackingLayoutManager
}
// Add own trailing space to parent context (or set on area?)
if (context.getTrailingSpace() != null && getSpaceEnd() != null) {
- context.getTrailingSpace().addSpace(new SpaceVal(getSpaceEnd()));
+ context.getTrailingSpace().addSpace(new SpaceVal(getSpaceEnd(), this));
}
- setTraits(bAreaCreated, !bIsLast);
parentLM.addChildArea(getCurrentArea());
+ setTraits(bAreaCreated, !bIsLast);
+
context.setFlags(LayoutContext.LAST_AREA, bIsLast);
bAreaCreated = true;
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java b/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
index e0d06dcb5..c7dea09c8 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
@@ -20,15 +20,19 @@ package org.apache.fop.layoutmgr.inline;
// Java
import java.awt.geom.Rectangle2D;
+import java.util.LinkedList;
// FOP
import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.fo.XMLObj;
import org.apache.fop.fo.flow.InstreamForeignObject;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.TraitSetter;
import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.area.inline.Viewport;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.layoutmgr.LayoutContext;
/**
* LayoutManager for the fo:instream-foreign-object formatting object
@@ -40,14 +44,11 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
/**
* Constructor
* @param node the formatting object that creates this area
+ * @param parent the parent layout manager
*/
public InstreamForeignObjectLM(InstreamForeignObject node) {
super(node);
fobj = node;
- Viewport areaCurrent = getInlineArea();
- setCurrentArea(areaCurrent);
- setAlignment(node.getVerticalAlign());
- setLead(areaCurrent.getBPD());
}
/**
@@ -73,29 +74,29 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
int ipd = -1;
boolean bpdauto = false;
if (hasLH) {
- bpd = fobj.getLineHeight().getValue();
+ bpd = fobj.getLineHeight().getValue(this);
} else {
// this property does not apply when the line-height applies
// isn't the block-progression-dimension always in the same
// direction as the line height?
- len = fobj.getBlockProgressionDimension().getOptimum().getLength();
+ len = fobj.getBlockProgressionDimension().getOptimum(this).getLength();
if (len.getEnum() != EN_AUTO) {
- bpd = len.getValue();
+ bpd = len.getValue(this);
} else {
len = fobj.getHeight();
if (len.getEnum() != EN_AUTO) {
- bpd = len.getValue();
+ bpd = len.getValue(this);
}
}
}
- len = fobj.getInlineProgressionDimension().getOptimum().getLength();
+ len = fobj.getInlineProgressionDimension().getOptimum(this).getLength();
if (len.getEnum() != EN_AUTO) {
- ipd = len.getValue();
+ ipd = len.getValue(this);
} else {
len = fobj.getWidth();
if (len.getEnum() != EN_AUTO) {
- ipd = len.getValue();
+ ipd = len.getValue(this);
}
}
@@ -110,7 +111,7 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
cwidth = ipd;
}
} else {
- cwidth = len.getValue();
+ cwidth = len.getValue(this);
}
}
len = fobj.getContentHeight();
@@ -120,7 +121,7 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
cwidth = bpd;
}
} else {
- cheight = len.getValue();
+ cheight = len.getValue(this);
}
}
@@ -172,10 +173,10 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
CommonBorderPaddingBackground borderProps = fobj.getCommonBorderPaddingBackground();
//Determine extra BPD from borders etc.
- int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false);
+ int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
beforeBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
false);
- int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false);
+ int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
afterBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
yoffset += beforeBPD;
@@ -184,10 +185,10 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
//Determine extra IPD from borders etc.
int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/);
+ false/*bNotFirst*/, this);
startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
false/*bNotFirst*/);
- int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/);
+ int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/, this);
endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false/*bNotLast*/);
xoffset += startIPD;
@@ -212,17 +213,62 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
vp.setOffset(0);
// Common Border, Padding, and Background Properties
- TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground());
- TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground(), this);
+ TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground(), this);
return vp;
}
/**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
+ */
+ public LinkedList getNextKnuthElements(LayoutContext context,
+ int alignment) {
+ Viewport areaCurrent = getInlineArea();
+ setCurrentArea(areaCurrent);
+ setAlignment(fobj.getVerticalAlign());
+ setLead(areaCurrent.getBPD());
+ return super.getNextKnuthElements(context, alignment);
+ }
+
+ /**
* @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId()
*/
protected void addId() {
getPSLM().addIDToPage(fobj.getId());
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ switch (lengthBase) {
+ case LengthBase.IMAGE_INTRINSIC_WIDTH:
+ return getIntrinsicWidth();
+ case LengthBase.IMAGE_INTRINSIC_HEIGHT:
+ return getIntrinsicHeight();
+ default: // Delegate to super class
+ return super.getBaseLength(lengthBase, fobj);
+ }
+ }
+
+ /**
+ * Returns the intrinsic width of the e-g.
+ * @return the width of the element
+ */
+ protected int getIntrinsicWidth() {
+ return fobj.getIntrinsicWidth();
+ }
+
+ /**
+ * Returns the intrinsic height of the e-g.
+ * @return the height of the element
+ */
+ protected int getIntrinsicHeight() {
+ return fobj.getIntrinsicHeight();
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java
index 7d87ea8fd..26a58bf68 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java
@@ -23,7 +23,6 @@ import org.apache.fop.area.inline.FilledArea;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.Space;
import org.apache.fop.area.inline.TextArea;
-import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.flow.Leader;
import org.apache.fop.fonts.Font;
import org.apache.fop.layoutmgr.KnuthElement;
@@ -40,6 +39,8 @@ import org.apache.fop.traits.MinOptMax;
import java.util.List;
import java.util.LinkedList;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager.AreaInfo;
/**
* LayoutManager for the fo:leader formatting object
@@ -50,6 +51,8 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
private LinkedList contentList = null;
private ContentLayoutManager clm = null;
+
+ private int contentAreaIPD = 0;
/**
* Constructor
@@ -60,7 +63,10 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
public LeaderLayoutManager(Leader node) {
super(node);
fobj = node;
- font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo());
+ }
+
+ public void initialize() {
+ font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo(), this);
// the property leader-alignment does not affect vertical positioning
// (see section 7.21.1 in the XSL Recommendation)
// setAlignment(node.getLeaderAlignment());
@@ -77,10 +83,10 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
private MinOptMax getLeaderAllocIPD(int ipd) {
// length of the leader
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, ipd);
- int opt = fobj.getLeaderLength().getOptimum().getLength().getValue();
- int min = fobj.getLeaderLength().getMinimum().getLength().getValue();
- int max = fobj.getLeaderLength().getMaximum().getLength().getValue();
+ setContentAreaIPD(ipd);
+ int opt = fobj.getLeaderLength().getOptimum(this).getLength().getValue(this);
+ int min = fobj.getLeaderLength().getMinimum(this).getLength().getValue(this);
+ int max = fobj.getLeaderLength().getMaximum(this).getLength().getValue(this);
return new MinOptMax(min, opt, max);
}
@@ -91,10 +97,12 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
org.apache.fop.area.inline.Leader leader =
new org.apache.fop.area.inline.Leader();
leader.setRuleStyle(fobj.getRuleStyle());
- leader.setRuleThickness(fobj.getRuleThickness().getValue());
+ leader.setRuleThickness(fobj.getRuleThickness().getValue(this));
+ leader.setBPD(fobj.getRuleThickness().getValue(this));
leaderArea = leader;
} else if (fobj.getLeaderPattern() == EN_SPACE) {
leaderArea = new Space();
+ leaderArea.setBPD(font.getAscender());
} else if (fobj.getLeaderPattern() == EN_DOTS) {
TextArea t = new TextArea();
char dot = '.'; // userAgent.getLeaderDotCharacter();
@@ -105,10 +113,10 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
t.addTrait(Trait.FONT_SIZE, new Integer(font.getFontSize()));
int width = font.getCharWidth(dot);
Space spacer = null;
- if (fobj.getLeaderPatternWidth().getValue() > width) {
+ if (fobj.getLeaderPatternWidth().getValue(this) > width) {
spacer = new Space();
- spacer.setIPD(fobj.getLeaderPatternWidth().getValue() - width);
- width = fobj.getLeaderPatternWidth().getValue();
+ spacer.setIPD(fobj.getLeaderPatternWidth().getValue(this) - width);
+ width = fobj.getLeaderPatternWidth().getValue(this);
}
FilledArea fa = new FilledArea();
fa.setUnitWidth(width);
@@ -142,10 +150,10 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
contentList = clm.getNextKnuthElements(new LayoutContext(0), 0);
int width = clm.getStackingSize();
Space spacer = null;
- if (fobj.getLeaderPatternWidth().getValue() > width) {
+ if (fobj.getLeaderPatternWidth().getValue(this) > width) {
spacer = new Space();
- spacer.setIPD(fobj.getLeaderPatternWidth().getValue() - width);
- width = fobj.getLeaderPatternWidth().getValue();
+ spacer.setIPD(fobj.getLeaderPatternWidth().getValue(this) - width);
+ width = fobj.getLeaderPatternWidth().getValue(this);
}
fa.setUnitWidth(width);
if (spacer != null) {
@@ -334,4 +342,24 @@ public class LeaderLayoutManager extends LeafNodeLayoutManager {
protected void addId() {
getPSLM().addIDToPage(fobj.getId());
}
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ return getParent().getBaseLength(lengthBase, getParent().getFObj());
+ }
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return contentAreaIPD;
+ }
+
+ private void setContentAreaIPD(int contentAreaIPD) {
+ this.contentAreaIPD = contentAreaIPD;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
index eb669be69..c58d9ce7c 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
@@ -68,7 +68,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
private Block fobj;
- private void initialize() {
+ public void initialize() {
bTextAlignment = fobj.getTextAlign();
bTextAlignmentLast = fobj.getTextAlignLast();
textIndent = fobj.getTextIndent();
@@ -139,7 +139,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
private CommonHyphenation hyphProps;
//private LayoutProps layoutProps;
- private int lineHeight;
+ private Length lineHeight;
private int lead;
private int follow;
// offset of the middle baseline with respect to the main baseline
@@ -222,8 +222,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager
// add the element representing text indentation
// at the beginning of the first paragraph
if (knuthParagraphs.size() == 0
- && fobj.getTextIndent().getValue() != 0) {
- this.add(new KnuthInlineBox(fobj.getTextIndent().getValue(), 0, 0, 0,
+ && fobj.getTextIndent().getValue(layoutManager) != 0) {
+ this.add(new KnuthInlineBox(fobj.getTextIndent().getValue(layoutManager), 0, 0, 0,
null, false));
ignoreAtStart ++;
}
@@ -575,7 +575,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
* @param l the default lead, from top to baseline
* @param f the default follow, from baseline to bottom
*/
- public LineLayoutManager(Block block, int lh, int l, int f, int ms) {
+ public LineLayoutManager(Block block, Length lh, int l, int f, int ms) {
super(block);
fobj = block;
// the child FObj are owned by the parent BlockLM
@@ -585,7 +585,6 @@ public class LineLayoutManager extends InlineStackingLayoutManager
lead = l;
follow = f;
middleShift = ms;
- initialize(); // Normally done when started by parent!
}
/** @see org.apache.fop.layoutmgr.LayoutManager */
@@ -601,7 +600,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
int iPrevLineEnd = vecInlineBreaks.size();
if (iPrevLineEnd == 0 && bTextAlignment == EN_START) {
- availIPD.subtract(new MinOptMax(textIndent.getValue()));
+ availIPD.subtract(new MinOptMax(textIndent.getValue(this)));
}
//PHASE 1: Create Knuth elements
@@ -741,7 +740,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
if (lastPar == null) {
lastPar = new Paragraph(this,
bTextAlignment, bTextAlignmentLast,
- textIndent.getValue());
+ textIndent.getValue(this));
lastPar.startParagraph(availIPD.opt);
if (log.isTraceEnabled()) {
trace.append(" [");
@@ -881,7 +880,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
? difference / 2
: (textAlign == EN_END) ? difference : 0;
indent += (line == 1 && knuthParagraphs.indexOf(par) == 0)
- ? textIndent.getValue() : 0;
+ ? textIndent.getValue(this) : 0;
double ratio = (textAlign == EN_JUSTIFY)
? knuthPara.getAdjustRatio(i) : 0;
@@ -1012,8 +1011,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager
int iBPcount = 0;
LineBreakingAlgorithm alg = new LineBreakingAlgorithm(alignment,
bTextAlignment, bTextAlignmentLast,
- textIndent.getValue(), currPar.lineFiller.opt,
- lineHeight, lead, follow, middleShift,
+ textIndent.getValue(this), currPar.lineFiller.opt,
+ lineHeight.getValue(this), lead, follow, middleShift,
(knuthParagraphs.indexOf(currPar) == 0),
this);
@@ -1324,6 +1323,9 @@ public class LineLayoutManager extends InlineStackingLayoutManager
return false;
}
+ /**
+ * @see org.apache.fop.layoutmgr.BlockLevelLayoutManager#negotiateBPDAdjustment(int, org.apache.fop.layoutmgr.KnuthElement)
+ */
public int negotiateBPDAdjustment(int adj, KnuthElement lastElement) {
LeafPosition pos = (LeafPosition)lastElement.getPosition();
int totalAdj = adj;
@@ -1774,5 +1776,21 @@ public class LineLayoutManager extends InlineStackingLayoutManager
}
}
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return true;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesLineArea
+ */
+ public boolean getGeneratesLineArea() {
+ return true;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java
index bd075f45d..7ed3cf8f7 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/PageNumberCitationLayoutManager.java
@@ -51,7 +51,10 @@ public class PageNumberCitationLayoutManager extends LeafNodeLayoutManager {
public PageNumberCitationLayoutManager(PageNumberCitation node) {
super(node);
fobj = node;
- font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo());
+ }
+
+ public void initialize() {
+ font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo(), this);
}
public InlineArea get(LayoutContext context) {
diff --git a/src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java
index 17c40aece..2a89d4ab5 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/PageNumberLayoutManager.java
@@ -43,7 +43,10 @@ public class PageNumberLayoutManager extends LeafNodeLayoutManager {
public PageNumberLayoutManager(PageNumber node) {
super(node);
fobj = node;
- font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo());
+ }
+
+ public void initialize() {
+ font = fobj.getCommonFont().getFontState(fobj.getFOEventHandler().getFontInfo(), this);
}
public InlineArea get(LayoutContext context) {
diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
index 77d560df1..adf4514d8 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
@@ -132,7 +132,6 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
private int total = 0;
private int middle = 0;
private int verticalAlignment = EN_BASELINE;
-
/**
* Create a Text layout manager.
*
@@ -147,8 +146,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
node.endIndex - node.startIndex);
vecAreaInfo = new java.util.ArrayList();
-
- fs = foText.getCommonFont().getFontState(foText.getFOEventHandler().getFontInfo());
+ }
+
+ public void initialize() {
+ fs = foText.getCommonFont().getFontState(foText.getFOEventHandler().getFontInfo(), this);
// With CID fonts, space isn't neccesary currentFontState.width(32)
spaceCharIPD = fs.getCharWidth(' ');
diff --git a/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java
index fedc04f2e..f3f37d6e3 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java
@@ -1,55 +1,56 @@
-/*
- * Copyright 2005 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* $Id$ */
-
-package org.apache.fop.layoutmgr.inline;
-
-import org.apache.fop.area.inline.InlineArea;
-import org.apache.fop.fo.flow.Wrapper;
-import org.apache.fop.layoutmgr.LayoutContext;
-
-/**
- * This is the layout manager for the fo:wrapper formatting object.
- */
-public class WrapperLayoutManager extends LeafNodeLayoutManager {
-
- private Wrapper fobj;
-
- /**
- * Creates a new LM for fo:wrapper.
- * @param node the fo:wrapper
- */
- public WrapperLayoutManager(Wrapper node) {
- super(node);
- fobj = node;
- }
-
- /** @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager */
- public InlineArea get(LayoutContext context) {
- //Create a zero-width, zero-height dummy area so this node can
- //participate in the ID handling. Otherwise, addId() wouldn't
- //be called.
- InlineArea area = new InlineArea();
- return area;
- }
-
- /** @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId() */
- protected void addId() {
- getPSLM().addIDToPage(fobj.getId());
- }
-
-}
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr.inline;
+
+import org.apache.fop.area.inline.InlineArea;
+import org.apache.fop.fo.flow.Wrapper;
+import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.LayoutManager;
+
+/**
+ * This is the layout manager for the fo:wrapper formatting object.
+ */
+public class WrapperLayoutManager extends LeafNodeLayoutManager {
+
+ private Wrapper fobj;
+
+ /**
+ * Creates a new LM for fo:wrapper.
+ * @param node the fo:wrapper
+ */
+ public WrapperLayoutManager(Wrapper node) {
+ super(node);
+ fobj = node;
+ }
+
+ /** @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager */
+ public InlineArea get(LayoutContext context) {
+ //Create a zero-width, zero-height dummy area so this node can
+ //participate in the ID handling. Otherwise, addId() wouldn't
+ //be called.
+ InlineArea area = new InlineArea();
+ return area;
+ }
+
+ /** @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId() */
+ protected void addId() {
+ getPSLM().addIDToPage(fobj.getId());
+ }
+
+}
diff --git a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java
index 4c1048241..f21275acf 100644
--- a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java
@@ -42,6 +42,7 @@ import java.util.List;
* the list block area..
*/
public class ListBlockLayoutManager extends BlockStackingLayoutManager {
+
private Block curBlockArea;
//TODO space-before|after: handle space-resolution rules
@@ -72,10 +73,10 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager {
/**
* Create a new list block layout manager.
* @param node list-block to create the layout manager for
+ * @param parent the parent layout manager
*/
public ListBlockLayoutManager(ListBlock node) {
super(node);
- initialize();
}
/**
@@ -86,15 +87,15 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager {
return (ListBlock)fobj;
}
- private void initialize() {
- foSpaceBefore = new SpaceVal(getListBlockFO().getCommonMarginBlock().spaceBefore).getSpace();
- foSpaceAfter = new SpaceVal(getListBlockFO().getCommonMarginBlock().spaceAfter).getSpace();
+ public void initialize() {
+ foSpaceBefore = new SpaceVal(getListBlockFO().getCommonMarginBlock().spaceBefore, this).getSpace();
+ foSpaceAfter = new SpaceVal(getListBlockFO().getCommonMarginBlock().spaceAfter, this).getSpace();
}
private int getIPIndents() {
int iIndents = 0;
- iIndents += getListBlockFO().getCommonMarginBlock().startIndent.getValue();
- iIndents += getListBlockFO().getCommonMarginBlock().endIndent.getValue();
+ iIndents += getListBlockFO().getCommonMarginBlock().startIndent.getValue(this);
+ iIndents += getListBlockFO().getCommonMarginBlock().endIndent.getValue(this);
return iIndents;
}
@@ -180,6 +181,11 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager {
getCurrentPV().addMarkers(markers, false, isFirst(firstPos), isLast(lastPos));
}
+ // We are done with this area add the background
+ TraitSetter.addBackground(curBlockArea,
+ getListBlockFO().getCommonBorderPaddingBackground(),
+ this);
+
flush();
// if adjusted space after
@@ -212,18 +218,17 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager {
// set traits
TraitSetter.setProducerID(curBlockArea, getListBlockFO().getId());
TraitSetter.addBorders(curBlockArea,
- getListBlockFO().getCommonBorderPaddingBackground());
+ getListBlockFO().getCommonBorderPaddingBackground(), this);
TraitSetter.addMargins(curBlockArea,
getListBlockFO().getCommonBorderPaddingBackground(),
- getListBlockFO().getCommonMarginBlock());
+ getListBlockFO().getCommonMarginBlock(),
+ this);
TraitSetter.addBreaks(curBlockArea,
getListBlockFO().getBreakBefore(),
getListBlockFO().getBreakAfter());
int contentIPD = referenceIPD - getIPIndents();
curBlockArea.setIPD(contentIPD);
- TraitSetter.addBackground(curBlockArea,
- getListBlockFO().getCommonBorderPaddingBackground());
setCurrentArea(curBlockArea);
}
diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
index e0ea656dd..f8408807a 100644
--- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
@@ -57,7 +57,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
private LinkedList bodyList = null;
private int listItemHeight;
-
+
//TODO space-before|after: handle space-resolution rules
private boolean keepWithNextPendingOnLabel;
@@ -122,7 +122,6 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
super(node);
setLabel(node.getLabel());
setBody(node.getBody());
- initialize();
}
/**
@@ -151,15 +150,15 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
body.setParent(this);
}
- private void initialize() {
- foSpaceBefore = new SpaceVal(getListItemFO().getCommonMarginBlock().spaceBefore).getSpace();
- foSpaceAfter = new SpaceVal(getListItemFO().getCommonMarginBlock().spaceAfter).getSpace();
+ public void initialize() {
+ foSpaceBefore = new SpaceVal(getListItemFO().getCommonMarginBlock().spaceBefore, this).getSpace();
+ foSpaceAfter = new SpaceVal(getListItemFO().getCommonMarginBlock().spaceAfter, this).getSpace();
}
private int getIPIndents() {
int iIndents = 0;
- iIndents += getListItemFO().getCommonMarginBlock().startIndent.getValue();
- iIndents += getListItemFO().getCommonMarginBlock().endIndent.getValue();
+ iIndents += getListItemFO().getCommonMarginBlock().startIndent.getValue(this);
+ iIndents += getListItemFO().getCommonMarginBlock().endIndent.getValue(this);
return iIndents;
}
@@ -178,6 +177,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
// label
childLC = new LayoutContext(0);
childLC.setRefIPD(context.getRefIPD());
+ label.initialize();
labelList = label.getNextKnuthElements(childLC, alignment);
if (childLC.isKeepWithPreviousPending()) {
context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING);
@@ -187,6 +187,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
// body
childLC = new LayoutContext(0);
childLC.setRefIPD(context.getRefIPD());
+ body.initialize();
bodyList = body.getNextKnuthElements(childLC, alignment);
if (childLC.isKeepWithPreviousPending()) {
context.setFlags(LayoutContext.KEEP_WITH_PREVIOUS_PENDING);
@@ -504,6 +505,11 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
getCurrentPV().addMarkers(markers, false, isFirst(firstPos), isLast(lastPos));
}
+ // We are done with this area add the background
+ TraitSetter.addBackground(curBlockArea,
+ getListItemFO().getCommonBorderPaddingBackground(),
+ this);
+
flush();
// if adjusted space after
@@ -545,12 +551,10 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager {
// set traits
TraitSetter.setProducerID(curBlockArea, getListItemFO().getId());
TraitSetter.addBorders(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground());
- TraitSetter.addBackground(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground());
+ getListItemFO().getCommonBorderPaddingBackground(), this);
TraitSetter.addMargins(curBlockArea,
getListItemFO().getCommonBorderPaddingBackground(),
- getListItemFO().getCommonMarginBlock());
+ getListItemFO().getCommonMarginBlock(), this);
TraitSetter.addBreaks(curBlockArea,
getListItemFO().getBreakBefore(),
getListItemFO().getBreakAfter());
diff --git a/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java b/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java
index c732763e7..188b9f6ab 100644
--- a/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java
+++ b/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java
@@ -24,6 +24,7 @@ import java.util.ListIterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.flow.Table;
import org.apache.fop.fo.flow.TableColumn;
@@ -127,12 +128,13 @@ public class ColumnSetup {
/**
* @param col column index (1 is first column)
+ * @param context the context for percentage based calculations
* @return the X offset of the requested column
*/
- public int getXOffset(int col) {
+ public int getXOffset(int col, PercentBaseContext context) {
int xoffset = 0;
for (int i = 1; i < col; i++) {
- xoffset += getColumn(i).getColumnWidth().getValue();
+ xoffset += getColumn(i).getColumnWidth().getValue(context);
}
return xoffset;
}
diff --git a/src/java/org/apache/fop/layoutmgr/table/GridUnit.java b/src/java/org/apache/fop/layoutmgr/table/GridUnit.java
index db381bf87..48aeeae17 100644
--- a/src/java/org/apache/fop/layoutmgr/table/GridUnit.java
+++ b/src/java/org/apache/fop/layoutmgr/table/GridUnit.java
@@ -245,6 +245,9 @@ public class GridUnit {
this.effBorders.setBorderInfo(
borderModel.determineWinner(this, other,
side, resFlags), side);
+ if (cell != null) {
+ this.effBorders.setPadding(this.cell.getCommonBorderPaddingBackground());
+ }
}
/**
diff --git a/src/java/org/apache/fop/layoutmgr/table/PrimaryGridUnit.java b/src/java/org/apache/fop/layoutmgr/table/PrimaryGridUnit.java
index 21d042b8e..9caba174d 100644
--- a/src/java/org/apache/fop/layoutmgr/table/PrimaryGridUnit.java
+++ b/src/java/org/apache/fop/layoutmgr/table/PrimaryGridUnit.java
@@ -23,6 +23,7 @@ import java.util.List;
import org.apache.fop.fo.flow.TableCell;
import org.apache.fop.fo.flow.TableColumn;
+import org.apache.fop.layoutmgr.LayoutManager;
/**
* This class represents a primary grid unit of a spanned cell.
@@ -131,11 +132,11 @@ public class PrimaryGridUnit extends GridUnit {
/** @return true if cell/row has an explicit BPD/height */
public boolean hasBPD() {
- if (!getCell().getBlockProgressionDimension().getOptimum().isAuto()) {
+ if (!getCell().getBlockProgressionDimension().getOptimum(null).isAuto()) {
return true;
}
if (getRow() != null
- && !getRow().getBlockProgressionDimension().getOptimum().isAuto()) {
+ && !getRow().getBlockProgressionDimension().getOptimum(null).isAuto()) {
return true;
}
return false;
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
index a304a0dd4..4fda7ab98 100644
--- a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
@@ -37,6 +37,7 @@ import org.apache.fop.layoutmgr.TraitSetter;
import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.area.Trait;
+import org.apache.fop.layoutmgr.LayoutManager;
import org.apache.fop.traits.MinOptMax;
/**
@@ -71,11 +72,10 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
super(node);
fobj = node;
this.gridUnit = pgu;
- initialize();
}
/** @return the table-cell FO */
- public TableCell getFObj() {
+ public TableCell getTableCell() {
return this.fobj;
}
@@ -83,15 +83,15 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
return fobj.isSeparateBorderModel();
}
- private void initialize() {
+ public void initialize() {
borderAndPaddingBPD = 0;
borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getBorderAfterWidth(false);
if (!isSeparateBorderModel()) {
borderAndPaddingBPD /= 2;
}
- borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getPaddingBefore(false);
- borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getPaddingAfter(false);
+ borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getPaddingBefore(false, this);
+ borderAndPaddingBPD += fobj.getCommonBorderPaddingBackground().getPaddingAfter(false, this);
}
/**
@@ -116,8 +116,8 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
if (!isSeparateBorderModel()) {
iIndents /= 2;
}
- iIndents += fobj.getCommonBorderPaddingBackground().getPaddingStart(false);
- iIndents += fobj.getCommonBorderPaddingBackground().getPaddingEnd(false);
+ iIndents += fobj.getCommonBorderPaddingBackground().getPaddingStart(false, this);
+ iIndents += fobj.getCommonBorderPaddingBackground().getPaddingEnd(false, this);
return iIndents;
}
@@ -132,7 +132,7 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
cellIPD -= getIPIndents();
if (isSeparateBorderModel()) {
int borderSep = fobj.getBorderSeparation().getLengthPair()
- .getIPD().getLength().getValue();
+ .getIPD().getLength().getValue(this);
cellIPD -= borderSep;
}
@@ -298,8 +298,8 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
}
CommonBorderPaddingBackground cbpb
= gu.getCell().getCommonBorderPaddingBackground();
- bpd -= cbpb.getPaddingBefore(false);
- bpd -= cbpb.getPaddingAfter(false);
+ bpd -= cbpb.getPaddingBefore(false, this);
+ bpd -= cbpb.getPaddingAfter(false, this);
return bpd;
}
@@ -317,7 +317,11 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
getPSLM().addIDToPage(fobj.getId());
- if (!isSeparateBorderModel()) {
+ if (isSeparateBorderModel()) {
+ if (!emptyCell || fobj.showEmptyCells()) {
+ TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground(), this);
+ }
+ } else {
boolean[] outer = new boolean[] {
gridUnit.getFlag(GridUnit.FIRST_IN_TABLE),
gridUnit.getFlag(GridUnit.LAST_IN_TABLE),
@@ -326,7 +330,7 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
if (!gridUnit.hasSpanning()) {
//Can set the borders directly if there's no span
TraitSetter.addCollapsingBorders(curBlockArea,
- gridUnit.getBorders(), outer);
+ gridUnit.getBorders(), outer, this);
} else {
int dy = yoffset;
for (int y = 0; y < gridUnit.getRows().size(); y++) {
@@ -356,7 +360,7 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
}
block.setBPD(bpd);
lastRowHeight = rowHeight;
- int ipd = gu.getColumn().getColumnWidth().getValue();
+ int ipd = gu.getColumn().getColumnWidth().getValue(this);
int borderStartWidth = gu.getBorders().getBorderStartWidth(false) / 2;
ipd -= borderStartWidth;
ipd -= gu.getBorders().getBorderEndWidth(false) / 2;
@@ -368,9 +372,9 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
+= gu.getBorders().getBorderBeforeWidth(false) / 2;
}
block.setYOffset(dy - halfCollapsingBorderHeight);
- TraitSetter.addCollapsingBorders(block, gu.getBorders(), outer);
+ TraitSetter.addCollapsingBorders(block, gu.getBorders(), outer, this);
parentLM.addChildArea(block);
- dx += gu.getColumn().getColumnWidth().getValue();
+ dx += gu.getColumn().getColumnWidth().getValue(this);
}
dy += lastRowHeight;
}
@@ -396,13 +400,17 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
curBlockArea.setBPD(contentBPD);
+ // Add background after we know the BPD
if (isSeparateBorderModel()) {
if (!emptyCell || fobj.showEmptyCells()) {
- TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground());
- TraitSetter.addBackground(curBlockArea, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBackground(curBlockArea,
+ fobj.getCommonBorderPaddingBackground(),
+ this);
}
} else {
- TraitSetter.addBackground(curBlockArea, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBackground(curBlockArea,
+ fobj.getCommonBorderPaddingBackground(),
+ this);
}
flush();
@@ -434,12 +442,12 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
if (!isSeparateBorderModel()) {
indent /= 2;
}
- indent += fobj.getCommonBorderPaddingBackground().getPaddingStart(false);
+ indent += fobj.getCommonBorderPaddingBackground().getPaddingStart(false, this);
// set position
int halfBorderSep = 0;
if (isSeparateBorderModel()) {
halfBorderSep = fobj.getBorderSeparation().getLengthPair()
- .getIPD().getLength().getValue() / 2;
+ .getIPD().getLength().getValue(this) / 2;
}
int borderAdjust = 0;
if (!isSeparateBorderModel()) {
@@ -534,6 +542,43 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager implement
|| !fobj.getKeepWithNext().getWithinColumn().isAuto();
*/
}
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return cellIPD;
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ if (curBlockArea != null) {
+ return curBlockArea.getBPD();
+ } else {
+ log.error("getContentAreaBPD called on unknown BPD");
+ return -1;
+ }
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesReferenceArea
+ */
+ public boolean getGeneratesReferenceArea() {
+ return true;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getGeneratesBlockArea
+ */
+ public boolean getGeneratesBlockArea() {
+ return true;
+ }
}
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
index df32b143b..529ec8e41 100644
--- a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
@@ -28,7 +28,9 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.area.Block;
import org.apache.fop.area.Trait;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
+import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.Table;
import org.apache.fop.fo.flow.TableBody;
import org.apache.fop.fo.flow.TableRow;
@@ -51,7 +53,7 @@ import org.apache.fop.traits.MinOptMax;
/**
* Layout manager for table contents, particularly managing the creation of combined element lists.
*/
-public class TableContentLayoutManager {
+public class TableContentLayoutManager implements PercentBaseContext {
/** Logger **/
private static Log log = LogFactory.getLog(TableContentLayoutManager.class);
@@ -415,7 +417,7 @@ public class TableContentLayoutManager {
PrimaryGridUnit primary = gu.getPrimary();
if (gu.isPrimary()) {
- primary.getCellLM().setParent(tableLM);
+ primary.getCellLM().setParent(getTableLM());
//Determine the table-row if any
if (tableRow == null && primary.getRow() != null) {
@@ -423,11 +425,11 @@ public class TableContentLayoutManager {
//Check for bpd on row, see CSS21, 17.5.3 Table height algorithms
LengthRangeProperty bpd = tableRow.getBlockProgressionDimension();
- if (!bpd.getMinimum().isAuto()) {
+ if (!bpd.getMinimum(getTableLM()).isAuto()) {
minContentHeight = Math.max(minContentHeight,
- bpd.getMinimum().getLength().getValue());
+ bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()));
}
- MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
+ MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd, getTableLM());
}
@@ -438,7 +440,7 @@ public class TableContentLayoutManager {
+ primary.getCell().getNumberColumnsSpanned();
i++) {
spanWidth += getTableLM().getColumns().getColumn(i + 1)
- .getColumnWidth().getValue();
+ .getColumnWidth().getValue(getTableLM());
}
LayoutContext childLC = new LayoutContext(0);
childLC.setStackLimit(context.getStackLimit()); //necessary?
@@ -487,17 +489,17 @@ public class TableContentLayoutManager {
if (gu.isLastGridUnitRowSpan()) {
int effCellContentHeight = minContentHeight;
LengthRangeProperty bpd = primary.getCell().getBlockProgressionDimension();
- if (!bpd.getMinimum().isAuto()) {
+ if (!bpd.getMinimum(getTableLM()).isAuto()) {
effCellContentHeight = Math.max(effCellContentHeight,
- bpd.getMinimum().getLength().getValue());
+ bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()));
}
- if (!bpd.getOptimum().isAuto()) {
+ if (!bpd.getOptimum(getTableLM()).isAuto()) {
effCellContentHeight = Math.max(effCellContentHeight,
- bpd.getOptimum().getLength().getValue());
+ bpd.getOptimum(getTableLM()).getLength().getValue(getTableLM()));
}
if (gu.getRowSpanIndex() == 0) {
//TODO ATM only non-row-spanned cells are taken for this
- MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
+ MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd, tableLM);
}
effCellContentHeight = Math.max(effCellContentHeight,
primary.getContentLength());
@@ -514,8 +516,8 @@ public class TableContentLayoutManager {
effCellContentHeight);
CommonBorderPaddingBackground cbpb
= primary.getCell().getCommonBorderPaddingBackground();
- padding += cbpb.getPaddingBefore(false);
- padding += cbpb.getPaddingAfter(false);
+ padding += cbpb.getPaddingBefore(false, primary.getCellLM());
+ padding += cbpb.getPaddingAfter(false, primary.getCellLM());
int effRowHeight = effCellContentHeight + padding + borderWidths;
for (int previous = 0; previous < gu.getRowSpanIndex(); previous++) {
effRowHeight -= rowHeights[rgi - previous - 1].opt;
@@ -566,7 +568,7 @@ public class TableContentLayoutManager {
*/
protected int getXOffsetOfGridUnit(GridUnit gu) {
int col = gu.getStartCol();
- return startXOffset + getTableLM().getColumns().getXOffset(col + 1);
+ return startXOffset + getTableLM().getColumns().getXOffset(col + 1, getTableLM());
}
/**
@@ -792,36 +794,41 @@ public class TableContentLayoutManager {
gridUnits[i].getElements(), start[i], end[i]);
partLength[i] = len;
log.debug("len of part: " + len);
+
if (start[i] == 0) {
LengthRangeProperty bpd = gridUnits[i].getCell()
.getBlockProgressionDimension();
- if (!bpd.getMinimum().isAuto()) {
- if (bpd.getMinimum().getLength().getValue() > 0) {
- len = Math.max(len, bpd.getMinimum().getLength().getValue());
+ if (!bpd.getMinimum(getTableLM()).isAuto()) {
+ if (bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()) > 0) {
+ len = Math.max(len, bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()));
}
}
- if (!bpd.getOptimum().isAuto()) {
- if (bpd.getOptimum().getLength().getValue() > 0) {
- len = Math.max(len, bpd.getOptimum().getLength().getValue());
+ if (!bpd.getOptimum(getTableLM()).isAuto()) {
+ if (bpd.getOptimum(getTableLM()).getLength().getValue(getTableLM()) > 0) {
+ len = Math.max(len, bpd.getOptimum(getTableLM()).getLength().getValue(getTableLM()));
}
}
if (gridUnits[i].getRow() != null) {
bpd = gridUnits[i].getRow().getBlockProgressionDimension();
- if (!bpd.getMinimum().isAuto()) {
- if (bpd.getMinimum().getLength().getValue() > 0) {
- len = Math.max(len, bpd.getMinimum().getLength().getValue());
+ if (!bpd.getMinimum(getTableLM()).isAuto()) {
+ if (bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()) > 0) {
+ len = Math.max(len, bpd.getMinimum(getTableLM()).getLength().getValue(getTableLM()));
}
}
}
}
+ // Add the padding if any
+ len += gridUnits[i].getBorders()
+ .getPaddingBefore(false, gridUnits[i].getCellLM());
+ len += gridUnits[i].getBorders()
+ .getPaddingAfter(false, gridUnits[i].getCellLM());
+
//Now add the borders to the contentLength
if (isSeparateBorderModel()) {
len += gridUnits[i].getBorders().getBorderBeforeWidth(false);
len += gridUnits[i].getBorders().getBorderAfterWidth(false);
}
- len += gridUnits[i].getBorders().getPaddingBefore(false);
- len += gridUnits[i].getBorders().getPaddingAfter(false);
int startRow = Math.max(gridUnits[i].getStartRow(), firstRow[bt]);
Integer storedOffset = (Integer)rowOffsets[bt].get(new Integer(startRow));
int effYOffset;
@@ -906,7 +913,6 @@ public class TableContentLayoutManager {
Block block = new Block();
block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
block.setPositioning(Block.ABSOLUTE);
- TraitSetter.addBackground(block, row.getCommonBorderPaddingBackground());
return block;
}
}
@@ -927,6 +933,7 @@ public class TableContentLayoutManager {
rowBackground.setXOffset(this.startXOffset);
rowBackground.setYOffset(yoffset);
getTableLM().addChildArea(rowBackground);
+ TraitSetter.addBackground(rowBackground, row.getCommonBorderPaddingBackground(), getTableLM());
}
}
@@ -1125,4 +1132,13 @@ public class TableContentLayoutManager {
}
}
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, fobj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ return tableLM.getBaseLength(lengthBase, fobj);
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
index ee3a5bdba..713d0179a 100644
--- a/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
@@ -39,6 +39,8 @@ import org.apache.fop.traits.SpaceVal;
import java.util.Iterator;
import java.util.LinkedList;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.fo.FObj;
/**
* LayoutManager for a table FO.
@@ -58,13 +60,13 @@ public class TableLayoutManager extends BlockStackingLayoutManager
private Block curBlockArea;
private int referenceIPD;
+ private int referenceBPD;
private boolean autoLayout = true;
//TODO space-before|after: handle space-resolution rules
private MinOptMax spaceBefore;
private MinOptMax spaceAfter;
-
/**
* Create a new table layout manager.
* @param node the table FO
@@ -73,7 +75,6 @@ public class TableLayoutManager extends BlockStackingLayoutManager
super(node);
fobj = node;
this.columns = new ColumnSetup(node);
- initialize();
}
/** @return the table FO */
@@ -88,20 +89,20 @@ public class TableLayoutManager extends BlockStackingLayoutManager
return this.columns;
}
- private void initialize() {
- spaceBefore = new SpaceVal(fobj.getCommonMarginBlock().spaceBefore).getSpace();
- spaceAfter = new SpaceVal(fobj.getCommonMarginBlock().spaceAfter).getSpace();
+ public void initialize() {
+ spaceBefore = new SpaceVal(fobj.getCommonMarginBlock().spaceBefore, this).getSpace();
+ spaceAfter = new SpaceVal(fobj.getCommonMarginBlock().spaceAfter, this).getSpace();
if (!fobj.isAutoLayout()
- && fobj.getInlineProgressionDimension().getOptimum().getEnum() != EN_AUTO) {
+ && fobj.getInlineProgressionDimension().getOptimum(this).getEnum() != EN_AUTO) {
autoLayout = false;
}
}
private int getIPIndents() {
int iIndents = 0;
- iIndents += fobj.getCommonMarginBlock().startIndent.getValue();
- iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
+ iIndents += fobj.getCommonMarginBlock().startIndent.getValue(this);
+ iIndents += fobj.getCommonMarginBlock().endIndent.getValue(this);
return iIndents;
}
@@ -120,9 +121,11 @@ public class TableLayoutManager extends BlockStackingLayoutManager
}
}
+ referenceBPD = context.getStackLimit().opt;
referenceIPD = context.getRefIPD();
- if (fobj.getInlineProgressionDimension().getOptimum().getEnum() != EN_AUTO) {
- referenceIPD = fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
+
+ if (fobj.getInlineProgressionDimension().getOptimum(this).getEnum() != EN_AUTO) {
+ referenceIPD = fobj.getInlineProgressionDimension().getOptimum(this).getLength().getValue(this);
} else if( !fobj.isAutoLayout() ) {
log.info("table-layout=\"fixed\" and width=\"auto\", but auto-layout not supported " +
"=> assuming width=\"100%\"");
@@ -141,11 +144,6 @@ public class TableLayoutManager extends BlockStackingLayoutManager
stackSize.add(spaceBefore);
}
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, referenceIPD);
- fobj.setLayoutDimension(PercentBase.BLOCK_BPD, context.getStackLimit().opt);
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, referenceIPD);
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, context.getStackLimit().opt);
-
// either works out table of column widths or if proportional-column-width function
// is used works out total factor, so that value of single unit can be computed.
int sumCols = 0;
@@ -153,7 +151,7 @@ public class TableLayoutManager extends BlockStackingLayoutManager
for (Iterator i = columns.iterator(); i.hasNext(); ) {
TableColumn column = (TableColumn) i.next();
Length width = column.getColumnWidth();
- sumCols += width.getValue();
+ sumCols += width.getValue(this);
if (width instanceof TableColLength) {
factors += ((TableColLength) width).getTableUnits();
}
@@ -284,7 +282,7 @@ public class TableLayoutManager extends BlockStackingLayoutManager
addBlockSpacing(adjust, spaceBefore);
spaceBefore = null;
- int startXOffset = fobj.getCommonMarginBlock().startIndent.getValue();
+ int startXOffset = fobj.getCommonMarginBlock().startIndent.getValue(this);
// add column, body then row areas
@@ -301,12 +299,15 @@ public class TableLayoutManager extends BlockStackingLayoutManager
curBlockArea.setBPD(tableHeight);
if (fobj.isSeparateBorderModel()) {
- TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground(), this);
}
- TraitSetter.addBackground(curBlockArea, fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addBackground(curBlockArea,
+ fobj.getCommonBorderPaddingBackground(),
+ this);
TraitSetter.addMargins(curBlockArea,
fobj.getCommonBorderPaddingBackground(),
- fobj.getCommonMarginBlock());
+ fobj.getCommonMarginBlock(),
+ this);
TraitSetter.addBreaks(curBlockArea,
fobj.getBreakBefore(), fobj.getBreakAfter());
@@ -413,5 +414,41 @@ public class TableLayoutManager extends BlockStackingLayoutManager
|| !fobj.getKeepWithNext().getWithinColumn().isAuto();
}
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ // Special handler for TableColumn width specifications
+ if (fobj instanceof TableColumn && fobj.getParent() == getFObj()) {
+ switch (lengthBase) {
+ case LengthBase.CONTAINING_BLOCK_WIDTH:
+ return getContentAreaIPD();
+ default:
+ log.error("Unknown base type for LengthBase.");
+ return 0;
+ }
+ } else {
+ return super.getBaseLength(lengthBase, fobj);
+ }
+ }
+
+ /**
+ * Returns the IPD of the content area
+ * @return the IPD of the content area
+ */
+ public int getContentAreaIPD() {
+ return referenceIPD;
+ }
+
+ /**
+ * Returns the BPD of the content area
+ * @return the BPD of the content area
+ */
+ public int getContentAreaBPD() {
+ return referenceBPD;
+ }
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java
index 272afdf18..f7a381a3e 100644
--- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java
+++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java
@@ -202,8 +202,8 @@ public class TableStepper {
} else {
borderBefore[column] = pgu.getBorders().getBorderBeforeWidth(false) / 2;
}
- paddingBefore[column] = pgu.getBorders().getPaddingBefore(false);
- paddingAfter[column] = pgu.getBorders().getPaddingAfter(false);
+ paddingBefore[column] = pgu.getBorders().getPaddingBefore(false, pgu.getCellLM());
+ paddingAfter[column] = pgu.getBorders().getPaddingAfter(false, pgu.getCellLM());
start[column] = 0;
end[column] = -1;
widths[column] = 0;
@@ -301,8 +301,8 @@ public class TableStepper {
= getTableLM().getTable().getCommonBorderPaddingBackground();
effPenaltyLen += borders.getBorderBeforeWidth(false);
effPenaltyLen += borders.getBorderAfterWidth(false);
- effPenaltyLen += borders.getPaddingBefore(false);
- effPenaltyLen += borders.getPaddingAfter(false);
+ effPenaltyLen += borders.getPaddingBefore(false, getTableLM());
+ effPenaltyLen += borders.getPaddingAfter(false, getTableLM());
}
TableContentPosition tcpos = new TableContentPosition(getTableLM(),
gridUnitParts, getActiveRow());
diff --git a/src/java/org/apache/fop/render/rtf/TableAttributesConverter.java b/src/java/org/apache/fop/render/rtf/TableAttributesConverter.java
index 0f1a92a17..68d1a6871 100644
--- a/src/java/org/apache/fop/render/rtf/TableAttributesConverter.java
+++ b/src/java/org/apache/fop/render/rtf/TableAttributesConverter.java
@@ -142,34 +142,34 @@ public class TableAttributesConverter {
//TODO Make this configurable
if (reproduceMSWordBug) {
//MS Word has a bug where padding left and top are exchanged
- padding = border.getPaddingStart(false);
+ padding = border.getPaddingStart(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_TOP, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_TOP, 3 /*=twips*/);
}
- padding = border.getPaddingBefore(false);
+ padding = border.getPaddingBefore(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_LEFT, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_LEFT, 3 /*=twips*/);
}
} else {
- padding = border.getPaddingStart(false);
+ padding = border.getPaddingStart(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_LEFT, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_LEFT, 3 /*=twips*/);
}
- padding = border.getPaddingBefore(false);
+ padding = border.getPaddingBefore(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_TOP, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_TOP, 3 /*=twips*/);
}
}
- padding = border.getPaddingEnd(false);
+ padding = border.getPaddingEnd(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_RIGHT, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_RIGHT, 3 /*=twips*/);
}
- padding = border.getPaddingAfter(false);
+ padding = border.getPaddingAfter(false, null); // TODO do we need a real context here?
if (padding != 0) {
attrib.setTwips(ITableAttributes.ATTR_CELL_PADDING_BOTTOM, padding);
attrib.set(ITableAttributes.ATTR_CELL_U_PADDING_BOTTOM, 3 /*=twips*/);
diff --git a/src/java/org/apache/fop/render/rtf/TextAttributesConverter.java b/src/java/org/apache/fop/render/rtf/TextAttributesConverter.java
index 7de406c15..39a91ef91 100644
--- a/src/java/org/apache/fop/render/rtf/TextAttributesConverter.java
+++ b/src/java/org/apache/fop/render/rtf/TextAttributesConverter.java
@@ -186,9 +186,9 @@ class TextAttributesConverter {
private static void attrBlockMargin(CommonMarginBlock cmb, FOPRtfAttributes rtfAttr) {
rtfAttr.setTwips(RtfText.SPACE_BEFORE,
- cmb.spaceBefore.getOptimum().getLength());
+ cmb.spaceBefore.getOptimum(null).getLength());
rtfAttr.setTwips(RtfText.SPACE_AFTER,
- cmb.spaceAfter.getOptimum().getLength());
+ cmb.spaceAfter.getOptimum(null).getLength());
rtfAttr.setTwips(RtfText.LEFT_INDENT_BODY, cmb.marginLeft);
rtfAttr.setTwips(RtfText.RIGHT_INDENT_BODY, cmb.marginRight);
}
diff --git a/src/java/org/apache/fop/traits/SpaceVal.java b/src/java/org/apache/fop/traits/SpaceVal.java
index 5dfbab90f..4c9cdf5bc 100644
--- a/src/java/org/apache/fop/traits/SpaceVal.java
+++ b/src/java/org/apache/fop/traits/SpaceVal.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
package org.apache.fop.traits;
+import org.apache.fop.datatypes.PercentBaseContext;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.properties.Property;
import org.apache.fop.fo.properties.SpaceProperty;
@@ -37,11 +38,12 @@ public class SpaceVal {
/**
* Constructor for SpaceVal objects based on Space objects.
* @param spaceprop Space object to use
+ * @param context Percentage evaluation context
*/
- public SpaceVal(SpaceProperty spaceprop) {
- space = new MinOptMax(spaceprop.getMinimum().getLength().getValue(),
- spaceprop.getOptimum().getLength().getValue(),
- spaceprop.getMaximum().getLength().getValue());
+ public SpaceVal(SpaceProperty spaceprop, PercentBaseContext context) {
+ space = new MinOptMax(spaceprop.getMinimum(context).getLength().getValue(context),
+ spaceprop.getOptimum(context).getLength().getValue(context),
+ spaceprop.getMaximum(context).getLength().getValue(context));
bConditional =
(spaceprop.getConditionality().getEnum() == Constants.EN_DISCARD);
Property precProp = spaceprop.getPrecedence();
@@ -69,7 +71,9 @@ public class SpaceVal {
this.iPrecedence = iPrecedence;
}
- static public SpaceVal makeWordSpacing(Property wordSpacing, SpaceVal letterSpacing, Font fs) {
+ static public SpaceVal makeWordSpacing(Property wordSpacing,
+ SpaceVal letterSpacing,
+ Font fs) {
if (wordSpacing.getEnum() == Constants.EN_NORMAL) {
// give word spaces the possibility to shrink by a third,
// and stretch by a half;
@@ -80,7 +84,7 @@ public class SpaceVal {
(space, MinOptMax.multiply(letterSpacing.getSpace(), 2)),
true, true, 0);
} else {
- return new SpaceVal(wordSpacing.getSpace());
+ return new SpaceVal(wordSpacing.getSpace(), null);
}
}
@@ -89,7 +93,7 @@ public class SpaceVal {
// letter spaces are set to zero (or use different values?)
return new SpaceVal(new MinOptMax(0), true, true, 0);
} else {
- return new SpaceVal(letterSpacing.getSpace());
+ return new SpaceVal(letterSpacing.getSpace(), null);
}
}