浏览代码

Moved the contents of TableBody into a new abstract base class TablePart, which is now subclassed by TableBody, TableHeader and TableFooter.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@670217 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-1_0
Adrian Cumiskey 16 年前
父节点
当前提交
30d0f7a3e8
共有 23 个文件被更改,包括 397 次插入330 次删除
  1. 15
    12
      src/java/org/apache/fop/fo/FOEventHandler.java
  2. 1
    1
      src/java/org/apache/fop/fo/flow/table/BorderResolver.java
  3. 5
    5
      src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java
  4. 3
    3
      src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java
  5. 2
    2
      src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java
  6. 4
    4
      src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java
  7. 1
    1
      src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java
  8. 6
    6
      src/java/org/apache/fop/fo/flow/table/Table.java
  9. 2
    234
      src/java/org/apache/fop/fo/flow/table/TableBody.java
  10. 1
    1
      src/java/org/apache/fop/fo/flow/table/TableCell.java
  11. 2
    2
      src/java/org/apache/fop/fo/flow/table/TableCellContainer.java
  12. 1
    5
      src/java/org/apache/fop/fo/flow/table/TableFooter.java
  13. 1
    5
      src/java/org/apache/fop/fo/flow/table/TableHeader.java
  14. 274
    0
      src/java/org/apache/fop/fo/flow/table/TablePart.java
  15. 7
    7
      src/java/org/apache/fop/fo/flow/table/TableRow.java
  16. 2
    2
      src/java/org/apache/fop/fo/flow/table/VariableColRowGroupBuilder.java
  17. 2
    2
      src/java/org/apache/fop/layoutmgr/table/RowPainter.java
  18. 2
    2
      src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
  19. 11
    12
      src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
  20. 3
    3
      src/java/org/apache/fop/layoutmgr/table/TableContentPosition.java
  21. 5
    1
      src/java/org/apache/fop/layoutmgr/table/TableRowIterator.java
  22. 45
    17
      src/java/org/apache/fop/render/rtf/RTFHandler.java
  23. 2
    3
      src/java/org/apache/fop/render/rtf/TableAttributesConverter.java

+ 15
- 12
src/java/org/apache/fop/fo/FOEventHandler.java 查看文件

@@ -40,6 +40,9 @@ import org.apache.fop.fo.flow.PageNumberCitation;
import org.apache.fop.fo.flow.PageNumberCitationLast;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TableFooter;
import org.apache.fop.fo.flow.table.TableHeader;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.fo.flow.table.TableCell;
import org.apache.fop.fo.flow.table.TableColumn;
import org.apache.fop.fo.flow.table.TableRow;
@@ -257,44 +260,44 @@ public abstract class FOEventHandler {

/**
*
* @param th TableBody that is starting;
* @param header TableHeader that is starting;
*/
public void startHeader(TableBody th) {
public void startHeader(TableHeader header) {
}

/**
*
* @param th TableBody that is ending.
* @param header TableHeader that is ending.
*/
public void endHeader(TableBody th) {
public void endHeader(TableHeader header) {
}

/**
*
* @param tf TableFooter that is starting.
* @param footer TableFooter that is starting.
*/
public void startFooter(TableBody tf) {
public void startFooter(TableFooter footer) {
}

/**
*
* @param tf TableFooter that is ending.
* @param footer TableFooter that is ending.
*/
public void endFooter(TableBody tf) {
public void endFooter(TableFooter footer) {
}

/**
*
* @param tb TableBody that is starting.
* @param body TableBody that is starting.
*/
public void startBody(TableBody tb) {
public void startBody(TableBody body) {
}

/**
*
* @param tb TableBody that is ending.
* @param body TableBody that is ending.
*/
public void endBody(TableBody tb) {
public void endBody(TableBody body) {
}

/**

+ 1
- 1
src/java/org/apache/fop/fo/flow/table/BorderResolver.java 查看文件

@@ -40,7 +40,7 @@ interface BorderResolver {
*
* @param part the part that has started
*/
void startPart(TableBody part);
void startPart(TablePart part);

/**
* Receives notification of the end of a table-header/footer/body.

+ 5
- 5
src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java 查看文件

@@ -73,7 +73,7 @@ class CollapsingBorderResolver implements BorderResolver {
*/
private abstract class Resolver {

protected TableBody tablePart;
protected TablePart tablePart;

protected boolean firstInPart;

@@ -177,7 +177,7 @@ class CollapsingBorderResolver implements BorderResolver {
}
}

void startPart(TableBody part) {
void startPart(TablePart part) {
tablePart = part;
firstInPart = true;
borderStartTableAndBody = collapsingBorderModel.determineWinner(table.borderStart,
@@ -415,8 +415,8 @@ class CollapsingBorderResolver implements BorderResolver {
}

/** {@inheritDoc} */
public void startPart(TableBody part) {
if (part.isTableHeader()) {
public void startPart(TablePart part) {
if (part instanceof TableHeader) {
delegate = new ResolverInHeader();
} else {
if (leadingBorders == null || table.omitHeaderAtBreak()) {
@@ -427,7 +427,7 @@ class CollapsingBorderResolver implements BorderResolver {
leadingBorders.add(border);
}
}
if (part.isTableFooter()) {
if (part instanceof TableFooter) {
resolverInFooter = new ResolverInFooter();
delegate = resolverInFooter;
} else {

+ 3
- 3
src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java 查看文件

@@ -143,8 +143,8 @@ class FixedColRowGroupBuilder extends RowGroupBuilder {
}

/** {@inheritDoc} */
void endRow(TableBody body) {
handleRowEnd(body);
void endRow(TablePart part) {
handleRowEnd(part);
}

private void handleRowEnd(TableCellContainer container) {
@@ -172,7 +172,7 @@ class FixedColRowGroupBuilder extends RowGroupBuilder {
}

/** {@inheritDoc} */
void startTablePart(TableBody part) {
void startTablePart(TablePart part) {
firstInPart = true;
borderResolver.startPart(part);
}

+ 2
- 2
src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java 查看文件

@@ -78,12 +78,12 @@ public class PrimaryGridUnit extends GridUnit {
*
* @return the enclosing table part
*/
public TableBody getTableBody() {
public TablePart getTablePart() {
FONode node = cell.getParent();
if (node instanceof TableRow) {
node = node.getParent();
}
return (TableBody) node;
return (TablePart) node;
}

public TableCellLayoutManager getCellLM() {

+ 4
- 4
src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java 查看文件

@@ -57,7 +57,7 @@ abstract class RowGroupBuilder {

/**
* Receives notification of the end of the current row. If the current row finishes
* the row group, the {@link TableBody#addRowGroup(List)} method of the parent table
* the row group, the {@link TablePart#addRowGroup(List)} method of the parent table
* part will be called.
*/
abstract void endTableRow();
@@ -65,21 +65,21 @@ abstract class RowGroupBuilder {
/**
* Receives notification of the end of the current row, when the source contains no
* fo:table-row element. If the current row finishes the row group, the
* {@link TableBody#addRowGroup(List)} method of the given table part will be called.
* {@link TablePart#addRowGroup(List)} method of the given table part will be called.
*
* <p>If the source does contain explicit fo:table-row elements, then the
* {@link #endTableRow()} method will be called instead.</p>
*
* @param part the part containing the current row
*/
abstract void endRow(TableBody part);
abstract void endRow(TablePart part);

/**
* Receives notification of the start of a table-header/footer/body.
*
* @param part the part being started
*/
abstract void startTablePart(TableBody part);
abstract void startTablePart(TablePart part);

/**
* Receives notification of the end of a table-header/footer/body. The current

+ 1
- 1
src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java 查看文件

@@ -31,7 +31,7 @@ class SeparateBorderResolver implements BorderResolver {
}

/** {@inheritDoc} */
public void startPart(TableBody part) {
public void startPart(TablePart part) {
}

/** {@inheritDoc} */

+ 6
- 6
src/java/org/apache/fop/fo/flow/table/Table.java 查看文件

@@ -76,8 +76,8 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
private ColumnNumberManager columnNumberManager = new ColumnNumberManager();

/** the table-header and -footer */
private TableBody tableHeader = null;
private TableBody tableFooter = null;
private TableHeader tableHeader = null;
private TableFooter tableFooter = null;

/** used for validation */
private boolean tableColumnFound = false;
@@ -279,10 +279,10 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
}
switch (childId) {
case FO_TABLE_FOOTER:
tableFooter = (TableBody) child;
tableFooter = (TableFooter) child;
break;
case FO_TABLE_HEADER:
tableHeader = (TableBody) child;
tableHeader = (TableHeader) child;
break;
default:
super.addChildNode(child);
@@ -404,12 +404,12 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
}

/** @return the body for the table-header. */
public TableBody getTableHeader() {
public TableHeader getTableHeader() {
return tableHeader;
}

/** @return the body for the table-footer. */
public TableBody getTableFooter() {
public TableFooter getTableFooter() {
return tableFooter;
}


+ 2
- 234
src/java/org/apache/fop/fo/flow/table/TableBody.java 查看文件

@@ -15,53 +15,17 @@
* limitations under the License.
*/

/* $Id$ */
/* $Id: $ */

package org.apache.fop.fo.flow.table;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;

/**
* Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_table-body">
* <code>fo:table-body</code></a> object.
*/
public class TableBody extends TableCellContainer {
// The value of properties relevant for fo:table-body.
private CommonBorderPaddingBackground commonBorderPaddingBackground;
// Unused but valid items, commented out for performance:
// private CommonAccessibility commonAccessibility;
// private CommonAural commonAural;
// private CommonRelativePosition commonRelativePosition;
// private int visibility;
// End of property values

/**
* used for validation
*/
protected boolean tableRowsFound = false;
protected boolean tableCellsFound = false;

private boolean firstRow = true;

private boolean rowsStarted = false;

private boolean lastCellEndsRow = true;

/** The last encountered table-row. */
private TableRow lastRow;

private List rowGroups = new LinkedList();
public class TableBody extends TablePart {

/**
* Create a TableBody instance with the given {@link FONode}
@@ -72,200 +36,4 @@ public class TableBody extends TableCellContainer {
super(parent);
}

/** {@inheritDoc} */
public void bind(PropertyList pList) throws FOPException {
commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps();
super.bind(pList);
}

/** {@inheritDoc} */
public void processNode(String elementName, Locator locator,
Attributes attlist, PropertyList pList)
throws FOPException {
if (!inMarker()) {
Table t = getTable();
if (t.hasExplicitColumns()) {
int size = t.getNumberOfColumns();
pendingSpans = new ArrayList(size);
for (int i = 0; i < size; i++) {
pendingSpans.add(null);
}
} else {
pendingSpans = new ArrayList();
}
columnNumberManager = new ColumnNumberManager();
}
super.processNode(elementName, locator, attlist, pList);
}

/** {@inheritDoc} */
public void startOfNode() throws FOPException {
super.startOfNode();
getFOEventHandler().startBody(this);
}

/** {@inheritDoc} */
public void endOfNode() throws FOPException {

if (!inMarker()) {
pendingSpans = null;
columnNumberManager = null;
}

getFOEventHandler().endBody(this);

if (!(tableRowsFound || tableCellsFound)) {
missingChildElementError("marker* (table-row+|table-cell+)", true);
getParent().removeChild(this);
} else {
finishLastRowGroup();
}
}

/** {@inheritDoc} */
TableBody getTablePart() {
return this;
}

protected void finishLastRowGroup() throws ValidationException {
if (!inMarker()) {
RowGroupBuilder rowGroupBuilder = getTable().getRowGroupBuilder();
if (tableRowsFound) {
rowGroupBuilder.endTableRow();
} else if (!lastCellEndsRow) {
rowGroupBuilder.endRow(this);
}
try {
rowGroupBuilder.endTablePart();
} catch (ValidationException e) {
e.setLocator(locator);
throw e;
}
}
}

/**
* {@inheritDoc}
* <br>XSL Content Model: marker* (table-row+|table-cell+)
*/
protected void validateChildNode(Locator loc, String nsURI, String localName)
throws ValidationException {
if (FO_URI.equals(nsURI)) {
if (localName.equals("marker")) {
if (tableRowsFound || tableCellsFound) {
nodesOutOfOrderError(loc, "fo:marker", "(table-row+|table-cell+)");
}
} else if (localName.equals("table-row")) {
tableRowsFound = true;
if (tableCellsFound) {
TableEventProducer eventProducer = TableEventProducer.Provider.get(
getUserAgent().getEventBroadcaster());
eventProducer.noMixRowsAndCells(this, getName(), getLocator());
}
} else if (localName.equals("table-cell")) {
tableCellsFound = true;
if (tableRowsFound) {
TableEventProducer eventProducer = TableEventProducer.Provider.get(
getUserAgent().getEventBroadcaster());
eventProducer.noMixRowsAndCells(this, getName(), getLocator());
}
} else {
invalidChildError(loc, nsURI, localName);
}
}
}

/** {@inheritDoc} */
protected void addChildNode(FONode child) throws FOPException {
if (!inMarker()) {
switch (child.getNameId()) {
case FO_TABLE_ROW:
if (!rowsStarted) {
getTable().getRowGroupBuilder().startTablePart(this);
} else {
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endTableRow();
}
rowsStarted = true;
lastRow = (TableRow) child;
getTable().getRowGroupBuilder().startTableRow(lastRow);
break;
case FO_TABLE_CELL:
if (!rowsStarted) {
getTable().getRowGroupBuilder().startTablePart(this);
}
rowsStarted = true;
TableCell cell = (TableCell) child;
addTableCellChild(cell, firstRow);
lastCellEndsRow = cell.endsRow();
if (lastCellEndsRow) {
firstRow = false;
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endRow(this);
}
break;
default:
//nop
}
}
super.addChildNode(child);
}

void addRowGroup(List rowGroup) {
rowGroups.add(rowGroup);
}

public List getRowGroups() {
return rowGroups;
}

/**
* Get the {@link CommonBorderPaddingBackground} instance attached
* to this TableBody.
* @return the {@link CommonBorderPaddingBackground} instance.
*/
public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
return commonBorderPaddingBackground;
}

/** {@inheritDoc} */
public String getLocalName() {
return "table-body";
}

/**
* {@inheritDoc}
* @return {@link org.apache.fop.fo.Constants#FO_TABLE_BODY}
*/
public int getNameId() {
return FO_TABLE_BODY;
}

protected boolean isTableHeader() {
return false;
}

protected boolean isTableFooter() {
return false;
}

/**
* @param obj table row in question
* @return true if the given table row is the first row of this body.
*/
public boolean isFirst(TableRow obj) {
return (firstChild == null
|| firstChild == obj);
}

void signalNewRow() {
if (rowsStarted) {
firstRow = false;
if (!lastCellEndsRow) {
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endRow(this);
}
}
}

}

+ 1
- 1
src/java/org/apache/fop/fo/flow/table/TableCell.java 查看文件

@@ -81,7 +81,7 @@ public class TableCell extends TableFObj {
startsRow = pList.get(PR_STARTS_ROW).getEnum();
// For properly computing columnNumber
if (startsRow() && getParent().getNameId() != FO_TABLE_ROW) {
((TableBody) getParent()).signalNewRow();
((TablePart) getParent()).signalNewRow();
}
endsRow = pList.get(PR_ENDS_ROW).getEnum();
columnNumber = pList.get(PR_COLUMN_NUMBER).getNumeric().getValue();

+ 2
- 2
src/java/org/apache/fop/fo/flow/table/TableCellContainer.java 查看文件

@@ -95,9 +95,9 @@ public abstract class TableCellContainer extends TableFObj implements ColumnNumb
/**
* Returns the enclosing table-header/footer/body of this container.
*
* @return <code>this</code> for TableBody, or the parent element for TableRow
* @return <code>this</code> for TablePart, or the parent element for TableRow
*/
abstract TableBody getTablePart();
abstract TablePart getTablePart();

/** {@inheritDoc} */
public ColumnNumberManager getColumnNumberManager() {

+ 1
- 5
src/java/org/apache/fop/fo/flow/table/TableFooter.java 查看文件

@@ -28,7 +28,7 @@ import org.apache.fop.fo.FONode;
* Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_table-footer">
* <code>fo:table-footer</code></a> object.
*/
public class TableFooter extends TableBody {
public class TableFooter extends TablePart {

/**
* Create a TableFooter instance with the given {@link FONode}
@@ -67,8 +67,4 @@ public class TableFooter extends TableBody {
return FO_TABLE_FOOTER;
}

/** {@inheritDoc} */
protected boolean isTableFooter() {
return true;
}
}

+ 1
- 5
src/java/org/apache/fop/fo/flow/table/TableHeader.java 查看文件

@@ -28,7 +28,7 @@ import org.apache.fop.fo.FONode;
* Class modelling the <a href="http://www.w3.org/TR/xsl/#fo_table-header">
* <code>fo:table-header</code></a> object.
*/
public class TableHeader extends TableBody {
public class TableHeader extends TablePart {

/**
* Create a TableHeader instance with the given {@link FONode}
@@ -66,8 +66,4 @@ public class TableHeader extends TableBody {
return FO_TABLE_HEADER;
}

/** {@inheritDoc} */
protected boolean isTableHeader() {
return true;
}
}

+ 274
- 0
src/java/org/apache/fop/fo/flow/table/TablePart.java 查看文件

@@ -0,0 +1,274 @@
/*
* 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: TableBody.java 655614 2008-05-12 19:37:39Z vhennebert $ */

package org.apache.fop.fo.flow.table;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.Locator;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;

/**
* An abstract base class modelling a TablePart
* (i.e. fo:table-header, fo:table-footer and fo:table-body).
*/
public abstract class TablePart extends TableCellContainer {
// The value of properties relevant for fo:table-body.
private CommonBorderPaddingBackground commonBorderPaddingBackground;
// Unused but valid items, commented out for performance:
// private CommonAccessibility commonAccessibility;
// private CommonAural commonAural;
// private CommonRelativePosition commonRelativePosition;
// private int visibility;
// End of property values

/**
* used for validation
*/
protected boolean tableRowsFound = false;
protected boolean tableCellsFound = false;

private boolean firstRow = true;

private boolean rowsStarted = false;

private boolean lastCellEndsRow = true;

/** The last encountered table-row. */
private TableRow lastRow;

private List rowGroups = new LinkedList();

/**
* Create a TablePart instance with the given {@link FONode}
* as parent.
* @param parent FONode that is the parent of the object
*/
public TablePart(FONode parent) {
super(parent);
}

/** {@inheritDoc} */
public void bind(PropertyList pList) throws FOPException {
commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps();
super.bind(pList);
}

/** {@inheritDoc} */
public void processNode(String elementName, Locator locator,
Attributes attlist, PropertyList pList)
throws FOPException {
if (!inMarker()) {
Table t = getTable();
if (t.hasExplicitColumns()) {
int size = t.getNumberOfColumns();
pendingSpans = new ArrayList(size);
for (int i = 0; i < size; i++) {
pendingSpans.add(null);
}
} else {
pendingSpans = new ArrayList();
}
columnNumberManager = new ColumnNumberManager();
}
super.processNode(elementName, locator, attlist, pList);
}

/** {@inheritDoc} */
public void startOfNode() throws FOPException {
super.startOfNode();
if (this instanceof TableHeader) {
getFOEventHandler().startHeader((TableHeader)this);
} else if (this instanceof TableFooter) {
getFOEventHandler().startFooter((TableFooter)this);
} else {
getFOEventHandler().startBody((TableBody)this);
}
}

/** {@inheritDoc} */
public void endOfNode() throws FOPException {
if (!inMarker()) {
pendingSpans = null;
columnNumberManager = null;
}

if (this instanceof TableHeader) {
getFOEventHandler().endHeader((TableHeader)this);
} else if (this instanceof TableFooter) {
getFOEventHandler().endFooter((TableFooter)this);
} else {
getFOEventHandler().endBody((TableBody)this);
}

if (!(tableRowsFound || tableCellsFound)) {
missingChildElementError("marker* (table-row+|table-cell+)", true);
getParent().removeChild(this);
} else {
finishLastRowGroup();
}
}

/** {@inheritDoc} */
TablePart getTablePart() {
return this;
}

protected void finishLastRowGroup() throws ValidationException {
if (!inMarker()) {
RowGroupBuilder rowGroupBuilder = getTable().getRowGroupBuilder();
if (tableRowsFound) {
rowGroupBuilder.endTableRow();
} else if (!lastCellEndsRow) {
rowGroupBuilder.endRow(this);
}
try {
rowGroupBuilder.endTablePart();
} catch (ValidationException e) {
e.setLocator(locator);
throw e;
}
}
}

/**
* {@inheritDoc}
* <br>XSL Content Model: marker* (table-row+|table-cell+)
*/
protected void validateChildNode(Locator loc, String nsURI, String localName)
throws ValidationException {
if (FO_URI.equals(nsURI)) {
if (localName.equals("marker")) {
if (tableRowsFound || tableCellsFound) {
nodesOutOfOrderError(loc, "fo:marker", "(table-row+|table-cell+)");
}
} else if (localName.equals("table-row")) {
tableRowsFound = true;
if (tableCellsFound) {
TableEventProducer eventProducer = TableEventProducer.Provider.get(
getUserAgent().getEventBroadcaster());
eventProducer.noMixRowsAndCells(this, getName(), getLocator());
}
} else if (localName.equals("table-cell")) {
tableCellsFound = true;
if (tableRowsFound) {
TableEventProducer eventProducer = TableEventProducer.Provider.get(
getUserAgent().getEventBroadcaster());
eventProducer.noMixRowsAndCells(this, getName(), getLocator());
}
} else {
invalidChildError(loc, nsURI, localName);
}
}
}

/** {@inheritDoc} */
protected void addChildNode(FONode child) throws FOPException {
if (!inMarker()) {
switch (child.getNameId()) {
case FO_TABLE_ROW:
if (!rowsStarted) {
getTable().getRowGroupBuilder().startTablePart(this);
} else {
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endTableRow();
}
rowsStarted = true;
lastRow = (TableRow) child;
getTable().getRowGroupBuilder().startTableRow(lastRow);
break;
case FO_TABLE_CELL:
if (!rowsStarted) {
getTable().getRowGroupBuilder().startTablePart(this);
}
rowsStarted = true;
TableCell cell = (TableCell) child;
addTableCellChild(cell, firstRow);
lastCellEndsRow = cell.endsRow();
if (lastCellEndsRow) {
firstRow = false;
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endRow(this);
}
break;
default:
//nop
}
}
super.addChildNode(child);
}

void addRowGroup(List rowGroup) {
rowGroups.add(rowGroup);
}

public List getRowGroups() {
return rowGroups;
}

/**
* Get the {@link CommonBorderPaddingBackground} instance attached
* to this TableBody.
* @return the {@link CommonBorderPaddingBackground} instance.
*/
public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
return commonBorderPaddingBackground;
}

/** {@inheritDoc} */
public String getLocalName() {
return "table-body";
}

/**
* {@inheritDoc}
* @return {@link org.apache.fop.fo.Constants#FO_TABLE_BODY}
*/
public int getNameId() {
return FO_TABLE_BODY;
}

/**
* @param obj table row in question
* @return true if the given table row is the first row of this body.
*/
public boolean isFirst(TableRow obj) {
return (firstChild == null
|| firstChild == obj);
}

void signalNewRow() {
if (rowsStarted) {
firstRow = false;
if (!lastCellEndsRow) {
columnNumberManager.prepareForNextRow(pendingSpans);
getTable().getRowGroupBuilder().endRow(this);
}
}
}

}

+ 7
- 7
src/java/org/apache/fop/fo/flow/table/TableRow.java 查看文件

@@ -79,9 +79,9 @@ public class TableRow extends TableCellContainer {
public void processNode(String elementName, Locator locator,
Attributes attlist, PropertyList pList) throws FOPException {
if (!inMarker()) {
TableBody body = (TableBody) parent;
pendingSpans = body.pendingSpans;
columnNumberManager = body.columnNumberManager;
TablePart part = (TablePart) parent;
pendingSpans = part.pendingSpans;
columnNumberManager = part.columnNumberManager;
}
super.processNode(elementName, locator, attlist, pList);
}
@@ -90,8 +90,8 @@ public class TableRow extends TableCellContainer {
protected void addChildNode(FONode child) throws FOPException {
if (!inMarker()) {
TableCell cell = (TableCell) child;
TableBody body = (TableBody) getParent();
addTableCellChild(cell, body.isFirst(this));
TablePart part = (TablePart) getParent();
addTableCellChild(cell, part.isFirst(this));
}
super.addChildNode(child);
}
@@ -129,8 +129,8 @@ public class TableRow extends TableCellContainer {
}

/** {@inheritDoc} */
TableBody getTablePart() {
return (TableBody) parent;
TablePart getTablePart() {
return (TablePart) parent;
}

/** {@inheritDoc} */

+ 2
- 2
src/java/org/apache/fop/fo/flow/table/VariableColRowGroupBuilder.java 查看文件

@@ -82,7 +82,7 @@ class VariableColRowGroupBuilder extends RowGroupBuilder {
}

/** {@inheritDoc} */
void endRow(final TableBody part) {
void endRow(final TablePart part) {
events.add(new Event() {
public void play(RowGroupBuilder rowGroupBuilder) {
rowGroupBuilder.endRow(part);
@@ -91,7 +91,7 @@ class VariableColRowGroupBuilder extends RowGroupBuilder {
}

/** {@inheritDoc} */
void startTablePart(final TableBody part) {
void startTablePart(final TablePart part) {
events.add(new Event() {
public void play(RowGroupBuilder rowGroupBuilder) {
rowGroupBuilder.startTablePart(part);

+ 2
- 2
src/java/org/apache/fop/layoutmgr/table/RowPainter.java 查看文件

@@ -32,7 +32,7 @@ import org.apache.fop.fo.flow.table.ConditionalBorder;
import org.apache.fop.fo.flow.table.EffRow;
import org.apache.fop.fo.flow.table.GridUnit;
import org.apache.fop.fo.flow.table.PrimaryGridUnit;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.ElementListUtils;
import org.apache.fop.layoutmgr.KnuthElement;
@@ -94,7 +94,7 @@ class RowPainter {
this.firstRowOnPageIndex = -1;
}

void startTablePart(TableBody tablePart) {
void startTablePart(TablePart tablePart) {
CommonBorderPaddingBackground background = tablePart.getCommonBorderPaddingBackground();
if (background.hasBackground()) {
tablePartBackground = background;

+ 2
- 2
src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java 查看文件

@@ -31,7 +31,7 @@ import org.apache.fop.fo.flow.table.ConditionalBorder;
import org.apache.fop.fo.flow.table.GridUnit;
import org.apache.fop.fo.flow.table.PrimaryGridUnit;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.fo.flow.table.TableCell;
import org.apache.fop.fo.flow.table.TableColumn;
import org.apache.fop.fo.flow.table.TableRow;
@@ -439,7 +439,7 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager
-startIndent);
}

TableBody body = primaryGridUnit.getTableBody();
TablePart body = primaryGridUnit.getTablePart();
if (body.getCommonBorderPaddingBackground().hasBackground()) {
painter.registerPartBackgroundArea(
getBackgroundArea(paddingRectBPD, borderBeforeWidth));

+ 11
- 12
src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java 查看文件

@@ -19,7 +19,6 @@

package org.apache.fop.layoutmgr.table;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -35,7 +34,7 @@ import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.table.EffRow;
import org.apache.fop.fo.flow.table.PrimaryGridUnit;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
import org.apache.fop.layoutmgr.BreakElement;
import org.apache.fop.layoutmgr.ElementListUtils;
@@ -324,7 +323,7 @@ public class TableContentLayoutManager implements PercentBaseContext {
this.usedBPD = 0;
RowPainter painter = new RowPainter(this, layoutContext);

List tablePositions = new ArrayList();
List tablePositions = new java.util.ArrayList();
List headerElements = null;
List footerElements = null;
Position firstPos = null;
@@ -417,9 +416,9 @@ public class TableContentLayoutManager implements PercentBaseContext {
}
}

private void addHeaderFooterAreas(List elements, TableBody part, RowPainter painter,
private void addHeaderFooterAreas(List elements, TablePart part, RowPainter painter,
boolean lastOnPage) {
List lst = new ArrayList(elements.size());
List lst = new java.util.ArrayList(elements.size());
for (Iterator iter = new KnuthPossPosIter(elements); iter.hasNext();) {
Position pos = (Position) iter.next();
/*
@@ -446,32 +445,32 @@ public class TableContentLayoutManager implements PercentBaseContext {
private void addBodyAreas(Iterator iterator, RowPainter painter,
boolean lastOnPage) {
painter.startBody();
List lst = new ArrayList();
List lst = new java.util.ArrayList();
TableContentPosition pos = (TableContentPosition) iterator.next();
boolean isFirstPos = pos.getFlag(TableContentPosition.FIRST_IN_ROWGROUP)
&& pos.getRow().getFlag(EffRow.FIRST_IN_PART);
TableBody body = pos.getTableBody();
TablePart part = pos.getTablePart();
lst.add(pos);
while (iterator.hasNext()) {
pos = (TableContentPosition) iterator.next();
if (pos.getTableBody() != body) {
addTablePartAreas(lst, painter, body, isFirstPos, true, false, false);
if (pos.getTablePart() != part) {
addTablePartAreas(lst, painter, part, isFirstPos, true, false, false);
isFirstPos = true;
lst.clear();
body = pos.getTableBody();
part = pos.getTablePart();
}
lst.add(pos);
}
boolean isLastPos = pos.getFlag(TableContentPosition.LAST_IN_ROWGROUP)
&& pos.getRow().getFlag(EffRow.LAST_IN_PART);
addTablePartAreas(lst, painter, body, isFirstPos, isLastPos, true, lastOnPage);
addTablePartAreas(lst, painter, part, isFirstPos, isLastPos, true, lastOnPage);
painter.endBody();
}

/**
* Adds the areas corresponding to a single fo:table-header/footer/body element.
*/
private void addTablePartAreas(List positions, RowPainter painter, TableBody body,
private void addTablePartAreas(List positions, RowPainter painter, TablePart body,
boolean isFirstPos, boolean isLastPos, boolean lastInBody, boolean lastOnPage) {
getTableLM().getCurrentPV().addMarkers(body.getMarkers(),
true, isFirstPos, isLastPos);

+ 3
- 3
src/java/org/apache/fop/layoutmgr/table/TableContentPosition.java 查看文件

@@ -22,7 +22,7 @@ package org.apache.fop.layoutmgr.table;
import java.util.List;

import org.apache.fop.fo.flow.table.EffRow;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.layoutmgr.LayoutManager;
import org.apache.fop.layoutmgr.Position;

@@ -80,8 +80,8 @@ class TableContentPosition extends Position {
return row;
}

TableBody getTableBody() {
return ((CellPart) cellParts.get(0)).pgu.getTableBody();
TablePart getTablePart() {
return ((CellPart) cellParts.get(0)).pgu.getTablePart();
}

/**

+ 5
- 1
src/java/org/apache/fop/layoutmgr/table/TableRowIterator.java 查看文件

@@ -28,6 +28,7 @@ import org.apache.fop.fo.FONode.FONodeIterator;
import org.apache.fop.fo.flow.table.EffRow;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;


/**
@@ -69,7 +70,7 @@ public class TableRowIterator {
case FOOTER:
rowGroupsIter = table.getTableFooter().getRowGroups().iterator();
break;
default:
case BODY:
List rowGroupsList = new LinkedList();
// TODO this is ugly
for (FONodeIterator iter = table.getChildNodes(); iter.hasNext();) {
@@ -79,6 +80,9 @@ public class TableRowIterator {
}
}
rowGroupsIter = rowGroupsList.iterator();
break;
default:
throw new IllegalArgumentException("Unrecognised TablePart: " + tablePart);
}
}


+ 45
- 17
src/java/org/apache/fop/render/rtf/RTFHandler.java 查看文件

@@ -76,6 +76,8 @@ import org.apache.fop.fo.flow.ListItemLabel;
import org.apache.fop.fo.flow.PageNumber;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TableFooter;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.fo.flow.table.TableCell;
import org.apache.fop.fo.flow.table.TableColumn;
import org.apache.fop.fo.flow.table.TableHeader;
@@ -611,25 +613,29 @@ public class RTFHandler extends FOEventHandler {
/**
* {@inheritDoc}
*/
public void startHeader(TableBody th) {
public void startHeader(TableHeader header) {
startPart(header);
}

/**
* {@inheritDoc}
*/
public void endHeader(TableBody th) {
public void endHeader(TableHeader header) {
endPart(header);
}

/**
* {@inheritDoc}
*/
public void startFooter(TableBody tf) {
public void startFooter(TableFooter footer) {
startPart(footer);
}

/**
* {@inheritDoc}
*/
public void endFooter(TableBody tf) {
public void endFooter(TableFooter footer) {
endPart(footer);
}

/**
@@ -687,31 +693,25 @@ public class RTFHandler extends FOEventHandler {
}
}

/**
* {@inheritDoc}
*/
public void startBody(TableBody tb) {
private void startPart(TablePart part) {
if (bDefer) {
return;
}

try {
RtfAttributes atts = TableAttributesConverter.convertTableBodyAttributes(tb);
RtfAttributes atts = TableAttributesConverter.convertTablePartAttributes(part);

RtfTable tbl = (RtfTable)builderContext.getContainer(RtfTable.class, true, this);
tbl.setHeaderAttribs(atts);
} catch (IOException ioe) {
handleIOTrouble(ioe);
} catch (Exception e) {
log.error("startBody: " + e.getMessage());
log.error("startPart: " + e.getMessage());
throw new RuntimeException(e.getMessage());
}
}
}

/**
* {@inheritDoc}
*/
public void endBody(TableBody tb) {
private void endPart(TablePart tb) {
if (bDefer) {
return;
}
@@ -722,9 +722,25 @@ public class RTFHandler extends FOEventHandler {
} catch (IOException ioe) {
handleIOTrouble(ioe);
} catch (Exception e) {
log.error("endBody: " + e.getMessage());
log.error("endPart: " + e.getMessage());
throw new RuntimeException(e.getMessage());
}
}
}

/**
* {@inheritDoc}
*/
public void startBody(TableBody body) {
startPart(body);
}

/**
* {@inheritDoc}
*/
public void endBody(TableBody body) {
endPart(body);
}

/**
@@ -1607,6 +1623,18 @@ public class RTFHandler extends FOEventHandler {
} else {
endTable( (Table) foNode);
}
} else if (foNode instanceof TableHeader) {
if (bStart) {
startHeader( (TableHeader) foNode);
} else {
endHeader( (TableHeader) foNode);
}
} else if (foNode instanceof TableFooter) {
if (bStart) {
startFooter( (TableFooter) foNode);
} else {
endFooter( (TableFooter) foNode);
}
} else if (foNode instanceof TableBody) {
if (bStart) {
startBody( (TableBody) foNode);

+ 2
- 3
src/java/org/apache/fop/render/rtf/TableAttributesConverter.java 查看文件

@@ -24,12 +24,11 @@ import java.awt.Color;
import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.flow.table.Table;
import org.apache.fop.fo.flow.table.TableBody;
import org.apache.fop.fo.flow.table.TablePart;
import org.apache.fop.fo.flow.table.TableCell;
import org.apache.fop.fo.flow.table.TableHeader;
import org.apache.fop.fo.flow.table.TableRow;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.fo.properties.FixedLength;
import org.apache.fop.render.rtf.rtflib.rtfdoc.ITableAttributes;
import org.apache.fop.render.rtf.rtflib.rtfdoc.RtfAttributes;

@@ -91,7 +90,7 @@ public final class TableAttributesConverter {
*
* @throws ConverterException On convertion error
*/
static RtfAttributes convertTableBodyAttributes(TableBody fobj)
static RtfAttributes convertTablePartAttributes(TablePart part)
throws FOPException {
FOPRtfAttributes attrib = new FOPRtfAttributes();
return attrib;

正在加载...
取消
保存