diff options
author | Glenn Adams <gadams@apache.org> | 2012-04-20 21:26:43 +0000 |
---|---|---|
committer | Glenn Adams <gadams@apache.org> | 2012-04-20 21:26:43 +0000 |
commit | 46917ef59fd0ffbbcccb16d57118a92da3dc1e0d (patch) | |
tree | 83d2fefc7d5db6b50850fd6d356c49117c36c410 | |
parent | e533832b11cea16e8599c549f015cab12c653f66 (diff) | |
download | xmlgraphics-fop-46917ef59fd0ffbbcccb16d57118a92da3dc1e0d.tar.gz xmlgraphics-fop-46917ef59fd0ffbbcccb16d57118a92da3dc1e0d.zip |
Bugzilla #53101: Ensure that table cell spanning works in right-to-left writing mode.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1328515 13f79535-47bb-0310-9956-ffa450edef68
5 files changed, 102 insertions, 8 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java b/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java index aaccbd0d3..b0ad22386 100644 --- a/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java +++ b/src/java/org/apache/fop/layoutmgr/table/ColumnSetup.java @@ -245,13 +245,14 @@ public class ColumnSetup { * the left-most column; otherwise, the first column is the left-most * column. * @param col column index (1 is first column) + * @param nrColSpan number columns spanned (for calculating offset in rtl mode) * @param context the context for percentage based calculations * @return the X offset of the requested column */ - public int getXOffset(int col, PercentBaseContext context) { + public int getXOffset(int col, int nrColSpan, PercentBaseContext context) { // TODO handle vertical WMs [GA] if ( (wmTraits != null) && (wmTraits.getColumnProgressionDirection() == Direction.RL) ) { - return getXOffsetRTL(col, context); + return getXOffsetRTL(col, nrColSpan, context); } else { return getXOffsetLTR(col, context); } @@ -262,9 +263,9 @@ public class ColumnSetup { * column; i.e., those columns whose column numbers are greater than the * specified column number. */ - private int getXOffsetRTL(int col, PercentBaseContext context) { + private int getXOffsetRTL(int col, int nrColSpan, PercentBaseContext context) { int xoffset = 0; - for (int i = col, nc = colWidths.size(); ++i < nc;) { + for (int i = (col + nrColSpan - 1), nc = colWidths.size(); ++i < nc;) { int effCol = i; if (colWidths.get(effCol) != null) { xoffset += ((Length) colWidths.get(effCol)).getValue(context); diff --git a/src/java/org/apache/fop/layoutmgr/table/RowPainter.java b/src/java/org/apache/fop/layoutmgr/table/RowPainter.java index f6c831b3f..955dafabd 100644 --- a/src/java/org/apache/fop/layoutmgr/table/RowPainter.java +++ b/src/java/org/apache/fop/layoutmgr/table/RowPainter.java @@ -468,7 +468,7 @@ class RowPainter { block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); block.setIPD(ipd); block.setBPD(bpd); - block.setXOffset(tclm.getXOffsetOfGridUnit(colIndex) + block.setXOffset(tclm.getXOffsetOfGridUnit(colIndex, 1) + (borderStart.getRetainedWidth() / 2)); block.setYOffset(getRowOffset(rowIndex) - (borderBefore.getRetainedWidth() / 2)); diff --git a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java index db5b4736c..f5e7500e2 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java @@ -317,16 +317,17 @@ public class TableContentLayoutManager implements PercentBaseContext { * @return the requested X offset */ protected int getXOffsetOfGridUnit(PrimaryGridUnit gu) { - return getXOffsetOfGridUnit(gu.getColIndex()); + return getXOffsetOfGridUnit(gu.getColIndex(), gu.getCell().getNumberColumnsSpanned()); } /** * Returns the X offset of the grid unit in the given column. * @param colIndex the column index (zero-based) + * @param nrColSpan number columns spanned * @return the requested X offset */ - protected int getXOffsetOfGridUnit(int colIndex) { - return startXOffset + getTableLM().getColumns().getXOffset(colIndex + 1, getTableLM()); + protected int getXOffsetOfGridUnit(int colIndex, int nrColSpan) { + return startXOffset + getTableLM().getColumns().getXOffset(colIndex + 1, nrColSpan, getTableLM()); } /** diff --git a/status.xml b/status.xml index 67e2fb973..13c5bc36f 100644 --- a/status.xml +++ b/status.xml @@ -62,6 +62,9 @@ documents. Example: the fix of marks layering will be such a case when it's done. --> <release version="FOP Trunk" date="TBD"> + <action context="Code" dev="GA" type="fix" fixes-bug="53103" due-to="Matthias Reischenbacher"> + Ensure that table cell spanning works in right-to-left writing mode. + </action> <action context="Code" dev="GA" type="fix" fixes-bug="53086"> Ensure that table footer and header are included in bididirectional resolution. </action> diff --git a/test/layoutengine/standard-testcases/table-column_column-progression-rl_3.xml b/test/layoutengine/standard-testcases/table-column_column-progression-rl_3.xml new file mode 100644 index 000000000..0b39606f7 --- /dev/null +++ b/test/layoutengine/standard-testcases/table-column_column-progression-rl_3.xml @@ -0,0 +1,89 @@ +<?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 table column progression with right-to-left writing mode when using multiple + column spans. See also bugzilla #53103. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="1cm" margin-right="1cm"> + <fo:region-body margin-top="3cm"/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="first"> + <fo:flow flow-name="xsl-region-body"> + <fo:table table-layout="fixed" width="125mm" writing-mode="rl-tb"> + <fo:table-header> + <fo:table-row> + <fo:table-cell number-columns-spanned="2" border="solid 1px black"> + <fo:block>header-R1;C1-span2</fo:block> + </fo:table-cell> + <fo:table-cell border="solid 1px black"> + <fo:block>header-R1;C2</fo:block> + </fo:table-cell> + <fo:table-cell border="solid 1px black"> + <fo:block>header-R1;C3</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-header> + <fo:table-body> + <fo:table-row> + <fo:table-cell border="solid 1px black"> + <fo:block>body-R2;C1</fo:block> + </fo:table-cell> + <fo:table-cell number-columns-spanned="2" border="solid 1px black"> + <fo:block>body-R2;C2</fo:block> + </fo:table-cell> + <fo:table-cell border="solid 1px black"> + <fo:block>body-R2;C3</fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row> + <fo:table-cell number-columns-spanned="3" border="solid 1px black"> + <fo:block>body-R3;C1-span3</fo:block> + </fo:table-cell> + <fo:table-cell border="solid 1px black"> + <fo:block>body-R3;C2</fo:block> + </fo:table-cell> + </fo:table-row> + </fo:table-body> + </fo:table> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <!-- row 1 (header), column 1, span 2 --> + <eval expected="header-R1;C1-span2" xpath="//flow/block[1]/block[3]//lineArea"/> + <eval expected="177664" xpath="//flow/block[1]/block[3]/@left-offset"/> + <eval expected="176164" xpath="//flow/block[1]/block[3]/@ipd"/> + <!-- row 2 (body), column 2, span 1 --> + <eval expected="body-R2;C2" xpath="//flow/block[1]/block[9]//lineArea"/> + <eval expected="89082" xpath="//flow/block[1]/block[9]/@left-offset"/> + <eval expected="176164" xpath="//flow/block[1]/block[9]/@ipd"/> + <!-- row 3 (body), column 1, span 3 --> + <eval expected="body-R3;C1-span3" xpath="//flow/block[1]/block[14]//lineArea"/> + <eval expected="89082" xpath="//flow/block[1]/block[14]/@left-offset"/> + <eval expected="264746" xpath="//flow/block[1]/block[14]/@ipd"/> + </checks> +</testcase> |