diff options
3 files changed, 99 insertions, 14 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java index ffbb1ff03..30177f988 100644 --- a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java +++ b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java @@ -20,6 +20,7 @@ package org.apache.fop.layoutmgr.table; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.ListIterator; @@ -78,14 +79,6 @@ class ActiveCell { private int spanIndex = 0; - /** - * The list of active footnotes. Those are the footnotes from the next step - * that is due to be merged by TableStepper. - * - * @see {@link #addFootnotes(List)} - */ - private List footnotes; - private Step previousStep; private Step nextStep; /** @@ -111,6 +104,8 @@ class ActiveCell { private int penaltyLength; /** Value of the penalty ending this step, 0 if the step does not end on a penalty. */ private int penaltyValue; + /** List of footnotes for this step. */ + private List footnoteList; /** * One of {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN}, * {@link Constants#EN_PAGE}, {@link Constants#EN_EVEN_PAGE}, @@ -140,6 +135,12 @@ class ActiveCell { this.totalLength = other.totalLength; this.penaltyLength = other.penaltyLength; this.penaltyValue = other.penaltyValue; + if (other.footnoteList != null) { + if (this.footnoteList == null) { + this.footnoteList = new ArrayList(); + } + this.footnoteList.addAll(other.footnoteList); + } this.condBeforeContentLength = other.condBeforeContentLength; this.breakClass = other.breakClass; } @@ -303,6 +304,9 @@ class ActiveCell { afterNextStep.penaltyValue = 0; afterNextStep.condBeforeContentLength = 0; afterNextStep.breakClass = Constants.EN_AUTO; + if (afterNextStep.footnoteList != null) { + afterNextStep.footnoteList.clear(); + } boolean breakFound = false; boolean prevIsBox = false; boolean boxFound = false; @@ -333,10 +337,10 @@ class ActiveCell { prevIsBox = false; } else { if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) { - if (footnotes == null) { - footnotes = new ArrayList(); + if (afterNextStep.footnoteList == null) { + afterNextStep.footnoteList = new LinkedList(); } - footnotes.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs()); + afterNextStep.footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs()); } prevIsBox = true; boxFound = true; @@ -566,9 +570,9 @@ class ActiveCell { * @param footnoteList the list to which this cell must add its footnotes */ void addFootnotes(List footnoteList) { - if (includedInLastStep() && footnotes != null) { - footnoteList.addAll(footnotes); - footnotes.clear(); + if (includedInLastStep() && nextStep.footnoteList != null) { + footnoteList.addAll(nextStep.footnoteList); + nextStep.footnoteList.clear(); } } diff --git a/test/layoutengine/standard-testcases/footnote_in_table_2.xml b/test/layoutengine/standard-testcases/footnote_in_table_2.xml index f0514a889..5adb65a4e 100644 --- a/test/layoutengine/standard-testcases/footnote_in_table_2.xml +++ b/test/layoutengine/standard-testcases/footnote_in_table_2.xml @@ -171,14 +171,18 @@ <eval expected="(3) Third footnote from the table." xpath="//pageSequence[1]//footnote/block[3]"/> <eval expected="1" xpath="count(//pageSequence[2]/pageViewport[1]//footnote/block)"/> + <eval expected="Cell 1.2(1)." xpath="//pageSequence[2]/pageViewport[1]//regionBody//block[2]/block[3]/block[2]"/> <eval expected="(1) First footnote from the table." xpath="//pageSequence[2]/pageViewport[1]//footnote/block[1]"/> <eval expected="2" xpath="count(//pageSequence[2]/pageViewport[2]//footnote/block)"/> <eval expected="(2) Second footnote from the table." xpath="//pageSequence[2]/pageViewport[2]//footnote/block[1]"/> <eval expected="(3) Third footnote from the table." xpath="//pageSequence[2]/pageViewport[2]//footnote/block[2]"/> + <eval expected="Cell 1.1(2)" xpath="//pageSequence[3]/pageViewport[1]//regionBody//block[2]/block[2]/block[3]"/> + <eval expected="Cell 1.2(1)." xpath="//pageSequence[3]/pageViewport[1]//regionBody//block[2]/block[3]/block[2]"/> <eval expected="2" xpath="count(//pageSequence[3]/pageViewport[1]//footnote/block)"/> <eval expected="(1) First footnote from the table." xpath="//pageSequence[3]/pageViewport[1]//footnote/block[1]"/> <eval expected="(2) Second footnote from the table." xpath="//pageSequence[3]/pageViewport[1]//footnote/block[2]"/> + <eval expected="Cell(3) 2.2" xpath="//pageSequence[3]/pageViewport[2]//regionBody//block[1]/block[3]/block[1]"/> <eval expected="1" xpath="count(//pageSequence[3]/pageViewport[2]//footnote/block)"/> <eval expected="(3) Third footnote from the table." xpath="//pageSequence[3]/pageViewport[2]//footnote/block[1]"/> </checks> diff --git a/test/layoutengine/standard-testcases/footnote_in_table_3.xml b/test/layoutengine/standard-testcases/footnote_in_table_3.xml new file mode 100644 index 000000000..037e70f51 --- /dev/null +++ b/test/layoutengine/standard-testcases/footnote_in_table_3.xml @@ -0,0 +1,77 @@ +<?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> + This test checks that a footnote within the fixed height of a table row is properly handled. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="simple" page-height="220pt" page-width="3in" + margin="10pt"> + <fo:region-body background-color="#F0F0F0"/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="simple" font-size="8pt" line-height="10pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>Before the table</fo:block> + <fo:table table-layout="fixed" width="100%"> + <fo:table-column column-width="proportional-column-width(1)"/> + <fo:table-column column-width="proportional-column-width(1)"/> + <fo:table-body border="1pt solid black"> + <fo:table-row border="inherit"> + <fo:table-cell border="inherit"> + <fo:block break-after="page">Cell 1.1</fo:block> + <fo:block>Cell 1.1<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block>(2) Footnote number 2.</fo:block> + </fo:footnote-body> + </fo:footnote></fo:block> + <fo:block>Cell 1.1</fo:block> + </fo:table-cell> + <fo:table-cell border="inherit"> + <fo:block>Cell 1.2<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block>(1) Footnote number 1.</fo:block> + </fo:footnote-body> + </fo:footnote></fo:block> + <fo:block>Cell 1.2</fo:block> + <fo:block>Cell 1.2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <eval expected="Cell 1.2(1)" xpath="//pageViewport[1]//regionBody//block[2]/block[2]/block"/> + <eval expected="1" xpath="count(//pageViewport[1]//footnote/block)"/> + <eval expected="(1) Footnote number 1." xpath="//pageViewport[1]//footnote/block[1]"/> + + <eval expected="Cell 1.1(2)" xpath="//pageViewport[2]//regionBody//block[1]/block[1]/block[1]"/> + <eval expected="1" xpath="count(//pageViewport[2]//footnote/block)"/> + <eval expected="(2) Footnote number 2." xpath="//pageViewport[2]//footnote/block[1]"/> + </checks> +</testcase> |