git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1328515 13f79535-47bb-0310-9956-ffa450edef68tags/fop-1_1rc1old
* the left-most column; otherwise, the first column is the left-most | * the left-most column; otherwise, the first column is the left-most | ||||
* column. | * column. | ||||
* @param col column index (1 is first 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 | * @param context the context for percentage based calculations | ||||
* @return the X offset of the requested column | * @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] | // TODO handle vertical WMs [GA] | ||||
if ( (wmTraits != null) && (wmTraits.getColumnProgressionDirection() == Direction.RL) ) { | if ( (wmTraits != null) && (wmTraits.getColumnProgressionDirection() == Direction.RL) ) { | ||||
return getXOffsetRTL(col, context); | |||||
return getXOffsetRTL(col, nrColSpan, context); | |||||
} else { | } else { | ||||
return getXOffsetLTR(col, context); | return getXOffsetLTR(col, context); | ||||
} | } | ||||
* column; i.e., those columns whose column numbers are greater than the | * column; i.e., those columns whose column numbers are greater than the | ||||
* specified column number. | * specified column number. | ||||
*/ | */ | ||||
private int getXOffsetRTL(int col, PercentBaseContext context) { | |||||
private int getXOffsetRTL(int col, int nrColSpan, PercentBaseContext context) { | |||||
int xoffset = 0; | 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; | int effCol = i; | ||||
if (colWidths.get(effCol) != null) { | if (colWidths.get(effCol) != null) { | ||||
xoffset += ((Length) colWidths.get(effCol)).getValue(context); | xoffset += ((Length) colWidths.get(effCol)).getValue(context); |
block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); | block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); | ||||
block.setIPD(ipd); | block.setIPD(ipd); | ||||
block.setBPD(bpd); | block.setBPD(bpd); | ||||
block.setXOffset(tclm.getXOffsetOfGridUnit(colIndex) | |||||
block.setXOffset(tclm.getXOffsetOfGridUnit(colIndex, 1) | |||||
+ (borderStart.getRetainedWidth() / 2)); | + (borderStart.getRetainedWidth() / 2)); | ||||
block.setYOffset(getRowOffset(rowIndex) | block.setYOffset(getRowOffset(rowIndex) | ||||
- (borderBefore.getRetainedWidth() / 2)); | - (borderBefore.getRetainedWidth() / 2)); |
* @return the requested X offset | * @return the requested X offset | ||||
*/ | */ | ||||
protected int getXOffsetOfGridUnit(PrimaryGridUnit gu) { | 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. | * Returns the X offset of the grid unit in the given column. | ||||
* @param colIndex the column index (zero-based) | * @param colIndex the column index (zero-based) | ||||
* @param nrColSpan number columns spanned | |||||
* @return the requested X offset | * @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()); | |||||
} | } | ||||
/** | /** |
documents. Example: the fix of marks layering will be such a case when it's done. | documents. Example: the fix of marks layering will be such a case when it's done. | ||||
--> | --> | ||||
<release version="FOP Trunk" date="TBD"> | <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"> | <action context="Code" dev="GA" type="fix" fixes-bug="53086"> | ||||
Ensure that table footer and header are included in bididirectional resolution. | Ensure that table footer and header are included in bididirectional resolution. | ||||
</action> | </action> |
<?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> |