aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java15
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.java9
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.xml1
-rw-r--r--test/layoutengine/standard-testcases/inline-container_auto-ipd.xml61
4 files changed, 85 insertions, 1 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java
index 3e044ad38..fb342bd8e 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/InlineContainerLayoutManager.java
@@ -75,7 +75,7 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
@Override
public List<KnuthSequence> getNextKnuthElements(LayoutContext context, int alignment) {
InlineContainer ic = (InlineContainer) fobj;
- contentAreaIPD = getLength(ic.getInlineProgressionDimension());
+ determineIPD(context);
contentAreaBPD = getLength(ic.getBlockProgressionDimension());
LayoutContext childLC = LayoutContext.offspringOf(context); // TODO copyOf?
childLC.setRefIPD(contentAreaIPD);
@@ -90,6 +90,19 @@ public class InlineContainerLayoutManager extends AbstractLayoutManager implemen
return knuthElements;
}
+ private void determineIPD(LayoutContext layoutContext) {
+ LengthRangeProperty ipd = ((InlineContainer) fobj).getInlineProgressionDimension();
+ Property optimum = ipd.getOptimum(this); // TODO percent base context
+ if (optimum.isAuto()) {
+ contentAreaIPD = layoutContext.getRefIPD();
+ InlineLevelEventProducer eventProducer = InlineLevelEventProducer.Provider.get(
+ fobj.getUserAgent().getEventBroadcaster());
+ eventProducer.inlineContainerAutoIPDNotSupported(this, contentAreaIPD / 1000f);
+ } else {
+ contentAreaIPD = optimum.getLength().getValue(this); // TODO percent base context
+ }
+ }
+
private int getLength(LengthRangeProperty property) {
Property optimum = property.getOptimum(this); // TODO percent base context
if (optimum.isAuto()) {
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.java b/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.java
index 15284ae0a..332e14935 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.java
@@ -67,4 +67,13 @@ public interface InlineLevelEventProducer extends EventProducer {
*/
void lineOverflows(Object source, String elementName, int line, int overflowLength, Locator loc);
+ /**
+ * Auto IPD on inline-container is not supported.
+ *
+ * @param source the event source
+ * @param fallback the value in points that will be used as a fallback
+ * @event.severity WARN
+ */
+ void inlineContainerAutoIPDNotSupported(Object source, float fallback);
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.xml b/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.xml
index 66d352eb7..8d699f6bc 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.xml
+++ b/src/java/org/apache/fop/layoutmgr/inline/InlineLevelEventProducer.xml
@@ -20,4 +20,5 @@
<message key="locator">[ (See position {loc})| (See {#gatherContextInfo})| (No context info available)]</message>
<message key="leaderWithoutContent">fo:leader is set to "use-content" but has no content.{{locator}}</message>
<message key="lineOverflows">The contents of {elementName} line {line} exceed the available area in the inline-progression direction by {overflowLength,choice,50000#{overflowLength} millipoints|50000&lt;more than 50 points}.{{locator}}</message>
+ <message key="inlineContainerAutoIPDNotSupported">A value of "auto" for the inline-progression-dimension property on fo:inline-container is not supported. Falling back to {fallback}pt.{{locator}}</message>
</catalogue>
diff --git a/test/layoutengine/standard-testcases/inline-container_auto-ipd.xml b/test/layoutengine/standard-testcases/inline-container_auto-ipd.xml
new file mode 100644
index 000000000..48f5cd1cf
--- /dev/null
+++ b/test/layoutengine/standard-testcases/inline-container_auto-ipd.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+ <info>
+ <p>
+ When inline-progression-dimension has been left to auto on fo:inline-container, fall back to
+ the IPD of the nearest ancestor reference-area.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="page"
+ page-height="220pt" page-width="320pt" margin="10pt">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="page">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>Before: <fo:inline-container height="20pt">
+ <fo:block>Text inside inline-container.</fo:block>
+ </fo:inline-container> After.</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ <fo:page-sequence master-reference="page">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block-container space-before="10pt" start-indent="100pt" width="100pt">
+ <fo:block start-indent="0">
+ Before: <fo:inline-container height="20pt">
+ <fo:block>Inside the inline-container.</fo:block>
+ </fo:inline-container> After.
+ </fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+
+ <checks>
+ <eval expected="3" xpath="count(//pageSequence[1]//flow/block/lineArea)"/>
+ <eval expected="300000" xpath="//pageSequence[1]//flow/block/lineArea[2]/viewport/@ipd"/>
+ <eval expected="3" xpath="count(//pageSequence[2]//flow/block/block/block/lineArea)"/>
+ <eval expected="100000" xpath="//pageSequence[2]//flow/block/block/block/lineArea[2]/viewport/@ipd"/>
+ </checks>
+</testcase>