git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1327244 13f79535-47bb-0310-9956-ffa450edef68tags/fop-1_1rc1old
import org.apache.fop.fo.properties.LengthPairProperty; | import org.apache.fop.fo.properties.LengthPairProperty; | ||||
import org.apache.fop.fo.properties.LengthRangeProperty; | import org.apache.fop.fo.properties.LengthRangeProperty; | ||||
import org.apache.fop.fo.properties.TableColLength; | import org.apache.fop.fo.properties.TableColLength; | ||||
import org.apache.fop.traits.Direction; | |||||
import org.apache.fop.traits.WritingMode; | |||||
import org.apache.fop.traits.WritingModeTraits; | |||||
import org.apache.fop.traits.WritingModeTraitsGetter; | |||||
/** | /** | ||||
* Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_table"> | * Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_table"> | ||||
* <code>fo:table</code></a> object. | * <code>fo:table</code></a> object. | ||||
*/ | */ | ||||
public class Table extends TableFObj implements ColumnNumberManagerHolder, BreakPropertySet, | |||||
public class Table extends TableFObj implements ColumnNumberManagerHolder, BreakPropertySet, WritingModeTraitsGetter, | |||||
CommonAccessibilityHolder { | CommonAccessibilityHolder { | ||||
// The value of FO traits (refined properties) that apply to fo:table. | // The value of FO traits (refined properties) that apply to fo:table. | ||||
private int tableLayout; | private int tableLayout; | ||||
private int tableOmitFooterAtBreak; | private int tableOmitFooterAtBreak; | ||||
private int tableOmitHeaderAtBreak; | private int tableOmitHeaderAtBreak; | ||||
private int writingMode; | |||||
private WritingModeTraits writingModeTraits; | |||||
// Unused but valid items, commented out for performance: | // Unused but valid items, commented out for performance: | ||||
// private CommonAural commonAural; | // private CommonAural commonAural; | ||||
// private CommonRelativePosition commonRelativePosition; | // private CommonRelativePosition commonRelativePosition; | ||||
tableLayout = pList.get(PR_TABLE_LAYOUT).getEnum(); | tableLayout = pList.get(PR_TABLE_LAYOUT).getEnum(); | ||||
tableOmitFooterAtBreak = pList.get(PR_TABLE_OMIT_FOOTER_AT_BREAK).getEnum(); | tableOmitFooterAtBreak = pList.get(PR_TABLE_OMIT_FOOTER_AT_BREAK).getEnum(); | ||||
tableOmitHeaderAtBreak = pList.get(PR_TABLE_OMIT_HEADER_AT_BREAK).getEnum(); | tableOmitHeaderAtBreak = pList.get(PR_TABLE_OMIT_HEADER_AT_BREAK).getEnum(); | ||||
writingMode = pList.get(PR_WRITING_MODE).getEnum(); | |||||
writingModeTraits = new WritingModeTraits | |||||
( WritingMode.valueOf(pList.get(PR_WRITING_MODE).getEnum()) ); | |||||
//Bind extension properties | //Bind extension properties | ||||
widowContentLimit = pList.get(PR_X_WIDOW_CONTENT_LIMIT).getLength(); | widowContentLimit = pList.get(PR_X_WIDOW_CONTENT_LIMIT).getLength(); | ||||
return borderSeparation; | return borderSeparation; | ||||
} | } | ||||
/** @return the "writing-mode" FO trait */ | |||||
public int getWritingMode() { | |||||
return writingMode; | |||||
/** {@inheritDoc} */ | |||||
public Direction getInlineProgressionDirection() { | |||||
return writingModeTraits.getInlineProgressionDirection(); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public Direction getBlockProgressionDirection() { | |||||
return writingModeTraits.getBlockProgressionDirection(); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public Direction getColumnProgressionDirection() { | |||||
return writingModeTraits.getColumnProgressionDirection(); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public Direction getRowProgressionDirection() { | |||||
return writingModeTraits.getRowProgressionDirection(); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public Direction getShiftDirection() { | |||||
return writingModeTraits.getShiftDirection(); | |||||
} | |||||
/** {@inheritDoc} */ | |||||
public WritingMode getWritingMode() { | |||||
return writingModeTraits.getWritingMode(); | |||||
} | } | ||||
/** @return the "fox:widow-content-limit" extension FO trait */ | /** @return the "fox:widow-content-limit" extension FO trait */ |
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="update" fixes-bug="53094" due-to="Luis Bernardo"> | |||||
<action context="Code" dev="GA" type="fix" fixes-bug="53097"> | |||||
Ensure writing-mode specified on fo:table is used to determine writing mode of table and its descendants. | |||||
</action> | |||||
<action context="Code" dev="GA" type="fix" fixes-bug="53094" due-to="Luis Bernardo"> | |||||
Convert block container overflow exception to event model, improving overflow property behavior. | Convert block container overflow exception to event model, improving overflow property behavior. | ||||
</action> | </action> | ||||
<action context="Code" dev="GA" type="update" fixes-bug="51617"> | <action context="Code" dev="GA" type="update" fixes-bug="51617"> |
final Property borderCollapseProperty = mock(Property.class); | final Property borderCollapseProperty = mock(Property.class); | ||||
when(borderCollapseProperty.getEnum()).thenReturn(Constants.EN_SEPARATE); | when(borderCollapseProperty.getEnum()).thenReturn(Constants.EN_SEPARATE); | ||||
when(mockPList.get(Constants.PR_BORDER_COLLAPSE)).thenReturn(borderCollapseProperty); | when(mockPList.get(Constants.PR_BORDER_COLLAPSE)).thenReturn(borderCollapseProperty); | ||||
final Property writingModeProperty = mock(Property.class); | |||||
when(writingModeProperty.getEnum()).thenReturn(Constants.EN_LR_TB); | |||||
when(mockPList.get(Constants.PR_WRITING_MODE)).thenReturn(writingModeProperty); | |||||
} catch (PropertyException e) { | } catch (PropertyException e) { | ||||
throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
} | } |
<testcase> | <testcase> | ||||
<info> | <info> | ||||
<p> | <p> | ||||
This test checks table column progression with right-to-left writing mode. The first column | |||||
should be to the right of the second column; the second column should be to the right of the | |||||
third column. The columns should be colored red, yellow, orange from right to left. | |||||
This test checks table column progression with right-to-left writing mode when writing-mode | |||||
is specified on fo:page-sequence. The first column should be to the right of the second column; the | |||||
second column should be to the right of the third column. The columns should be colored red, | |||||
yellow, orange from right to left. | |||||
</p> | </p> | ||||
</info> | </info> | ||||
<fo> | <fo> |
<?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 writing-mode | |||||
is specified on fo:table. The first column should be to the right of the second column; the | |||||
second column should be to the right of the third column. The columns should be colored red, | |||||
yellow, orange from right to left. | |||||
</p> | |||||
</info> | |||||
<fo> | |||||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg"> | |||||
<fo:layout-master-set> | |||||
<fo:simple-page-master master-name="normal" page-width="5in" page-height="5in" margin="0.5in"> | |||||
<fo:region-body/> | |||||
</fo:simple-page-master> | |||||
</fo:layout-master-set> | |||||
<fo:page-sequence master-reference="normal"> | |||||
<fo:flow flow-name="xsl-region-body"> | |||||
<fo:table table-layout="fixed" width="100%" writing-mode="rl"> | |||||
<fo:table-column column-width="1in" background-color="red"/> | |||||
<fo:table-column column-width="1in" background-color="yellow"/> | |||||
<fo:table-column column-width="2in" background-color="orange"/> | |||||
<fo:table-body> | |||||
<fo:table-row> | |||||
<fo:table-cell> | |||||
<fo:block>cell1</fo:block> | |||||
</fo:table-cell> | |||||
<fo:table-cell> | |||||
<fo:block>cell2</fo:block> | |||||
</fo:table-cell> | |||||
<fo:table-cell> | |||||
<fo:block>cell3</fo:block> | |||||
</fo:table-cell> | |||||
</fo:table-row> | |||||
</fo:table-body> | |||||
</fo:table> | |||||
</fo:flow> | |||||
</fo:page-sequence> | |||||
</fo:root> | |||||
</fo> | |||||
<checks> | |||||
<!-- cell 1 background --> | |||||
<eval expected="#ff0000" xpath="//flow/block[1]/block[1]/@bkg-color"/> | |||||
<!-- cell 1 --> | |||||
<eval expected="cell1" xpath="//flow/block[1]/block[2]/block[1]/lineArea/text"/> | |||||
<eval expected="72000" xpath="//flow/block[1]/block[2]/@ipd"/> | |||||
<eval expected="216000" xpath="//flow/block[1]/block[2]/@left-offset"/> | |||||
<!-- cell 2 background --> | |||||
<eval expected="#ffff00" xpath="//flow/block[1]/block[3]/@bkg-color"/> | |||||
<!-- cell 2 --> | |||||
<eval expected="cell2" xpath="//flow/block[1]/block[4]/block[1]/lineArea/text"/> | |||||
<eval expected="72000" xpath="//flow/block[1]/block[4]/@ipd"/> | |||||
<eval expected="144000" xpath="//flow/block[1]/block[4]/@left-offset"/> | |||||
<!-- cell 3 background --> | |||||
<eval expected="#ffa500" xpath="//flow/block[1]/block[5]/@bkg-color"/> | |||||
<!-- cell 3 --> | |||||
<eval expected="cell3" xpath="//flow/block[1]/block[6]/block[1]/lineArea/text"/> | |||||
<eval expected="144000" xpath="//flow/block[1]/block[6]/@ipd"/> | |||||
<true xpath="not(boolean(//flow/block[1]/block[6]/@left-offset))"/> | |||||
<!-- right-to-left offset invariant - cell 2 to the left of cell 1 --> | |||||
<true xpath="//flow/block[1]/block[4]/@left-offset < //flow/block[1]/block[2]/@left-offset"/> | |||||
<!-- right-to-left offset invariant - cell 3 to left right of cell 2 --> | |||||
<true xpath="//flow/block[1]/block[4]/@left-offset > 0"/> | |||||
</checks> | |||||
</testcase> |