You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2005/04/28 15:44:01 UTC
cvs commit: xml-fop/src/java/org/apache/fop/layoutmgr/table TableRowIterator.java Cell.java GridUnit.java TableContentLayoutManager.java
jeremias 2005/04/28 06:44:01
Modified: src/java/org/apache/fop/layoutmgr/table Tag:
Temp_KnuthStylePageBreaking TableRowIterator.java
Cell.java GridUnit.java
TableContentLayoutManager.java
Log:
Fix for NPE in Cell.java (getBorders() can return null).
Added fetching of row groups as per definition in http://wiki.apache.org/xmlgraphics-fop/TableLayout/KnuthElementsForTables.
Revision Changes Path
No revision
No revision
1.1.2.4 +47 -3 xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableRowIterator.java
Index: TableRowIterator.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableRowIterator.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- TableRowIterator.java 9 Apr 2005 12:11:15 -0000 1.1.2.3
+++ TableRowIterator.java 28 Apr 2005 13:44:01 -0000 1.1.2.4
@@ -18,6 +18,7 @@
package org.apache.fop.layoutmgr.table;
+import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@@ -32,7 +33,10 @@
import org.apache.fop.traits.MinOptMax;
/**
- * Iterator that lets the table layout manager step over all rows of a table.
+ * <p>Iterator that lets the table layout manager step over all rows of a table.
+ * </p>
+ * <p>Note: This class is not thread-safe.
+ * </p>
*/
public class TableRowIterator {
@@ -46,6 +50,7 @@
/** Logger **/
private static Log log = LogFactory.getLog(TableRowIterator.class);
+ /** The table on with this instance operates. */
protected Table table;
private ColumnSetup columns;
@@ -57,6 +62,7 @@
private int currentRowIndex = -1;
//TODO rows should later be a Jakarta Commons LinkedList so concurrent modifications while
//using a ListIterator are possible
+ /** List of cache rows. */
private List rows = new java.util.ArrayList();
//private int indexOfFirstRowInList;
private int currentIndex = -1;
@@ -93,6 +99,44 @@
}
}
+ /**
+ * Returns the next row group if any. A row group in this context is the minimum number of
+ * consecutive rows which contains all spanned grid units of its cells.
+ * @return the next row group, or null
+ */
+ public EffRow[] getNextRowGroup() {
+ EffRow firstRowInGroup = getNextRow();
+ if (firstRowInGroup == null) {
+ return null;
+ }
+ EffRow lastRowInGroup = firstRowInGroup;
+ int lastIndex = lastRowInGroup.getIndex();
+ boolean allFinished = true;
+ do {
+ Iterator iter = lastRowInGroup.getGridUnits().iterator();
+ while (iter.hasNext()) {
+ GridUnit gu = (GridUnit)iter.next();
+ if (!gu.isLastGridUnitRowSpan()) {
+ allFinished = false;
+ break;
+ }
+ }
+ if (!allFinished) {
+ lastIndex = lastRowInGroup.getIndex();
+ lastRowInGroup = getNextRow();
+ if (lastRowInGroup == null) {
+ allFinished = true;
+ }
+ }
+ } while (!allFinished);
+ int rowCount = lastIndex - firstRowInGroup.getIndex() + 1;
+ EffRow[] rowGroup = new EffRow[rowCount];
+ for (int i = 0; i < rowCount; i++) {
+ rowGroup[i] = getCachedRow(i + firstRowInGroup.getIndex());
+ }
+ return rowGroup;
+ }
+
public EffRow getNextRow() {
currentIndex++;
boolean moreRows = true;
@@ -375,5 +419,5 @@
return sb.toString();
}
}
-
+
}
1.26.2.4 +1 -1 xml-fop/src/java/org/apache/fop/layoutmgr/table/Cell.java
Index: Cell.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Cell.java,v
retrieving revision 1.26.2.3
retrieving revision 1.26.2.4
diff -u -r1.26.2.3 -r1.26.2.4
--- Cell.java 7 Apr 2005 07:09:24 -0000 1.26.2.3
+++ Cell.java 28 Apr 2005 13:44:01 -0000 1.26.2.4
@@ -434,7 +434,7 @@
int lastRowHeight = 0;
for (int x = 0; x < gridUnits.length; x++) {
GridUnit gu = gridUnits[x];
- if (!gu.getBorders().hasBorder()) {
+ if (!gu.hasBorders()) {
continue;
}
1.1.2.4 +8 -1 xml-fop/src/java/org/apache/fop/layoutmgr/table/GridUnit.java
Index: GridUnit.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/GridUnit.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- GridUnit.java 9 Apr 2005 12:11:35 -0000 1.1.2.3
+++ GridUnit.java 28 Apr 2005 13:44:01 -0000 1.1.2.4
@@ -154,6 +154,13 @@
}
/**
+ * @return true if the grid unit has any borders.
+ */
+ public boolean hasBorders() {
+ return (getBorders() != null) && getBorders().hasBorder();
+ }
+
+ /**
* Assigns the borders from the given cell to this cell info. Used in
* case of separate border model.
*/
1.1.2.8 +75 -68 xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableContentLayoutManager.java
Index: TableContentLayoutManager.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableContentLayoutManager.java,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -u -r1.1.2.7 -r1.1.2.8
--- TableContentLayoutManager.java 9 Apr 2005 12:11:15 -0000 1.1.2.7
+++ TableContentLayoutManager.java 28 Apr 2005 13:44:01 -0000 1.1.2.8
@@ -67,10 +67,12 @@
Table table = getTableLM().getTable();
this.trIter = new TableRowIterator(table, getTableLM().getColumns(), TableRowIterator.BODY);
if (table.getTableHeader() != null) {
- headerIter = new TableRowIterator(table, getTableLM().getColumns(), TableRowIterator.HEADER);
+ headerIter = new TableRowIterator(table,
+ getTableLM().getColumns(), TableRowIterator.HEADER);
}
if (table.getTableFooter() != null) {
- footerIter = new TableRowIterator(table, getTableLM().getColumns(), TableRowIterator.FOOTER);
+ footerIter = new TableRowIterator(table,
+ getTableLM().getColumns(), TableRowIterator.FOOTER);
}
}
@@ -86,7 +88,7 @@
* @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(org.apache.fop.layoutmgr.LayoutContext, int)
*/
public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
- log.debug("Columns: " +getTableLM().getColumns());
+ log.debug("Columns: " + getTableLM().getColumns());
KnuthBox headerAsFirst = null;
KnuthBox headerAsSecondToLast = null;
KnuthBox footerAsLast = null;
@@ -164,83 +166,88 @@
/**
* Creates Knuth elements by iterating over a TableRowIterator.
- * @param context
- * @param alignment
- * @return
+ * @param iter TableRowIterator instance to fetch rows from
+ * @param context Active LayoutContext
+ * @param alignment alignment indicator
+ * @return An element list
*/
private LinkedList getKnuthElementsForRowIterator(TableRowIterator iter,
LayoutContext context, int alignment, boolean disableHeaderFooter) {
LinkedList returnList = new LinkedList();
+ TableRowIterator.EffRow[] rowGroup = null;
TableRowIterator.EffRow row = null;
- while ((row = iter.getNextRow()) != null) {
- List pgus = new java.util.ArrayList();
- TableRow tableRow = null;
- int maxCellHeight = 0;
- for (int j = 0; j < row.getGridUnits().size(); j++) {
- GridUnit gu = (GridUnit)row.getGridUnits().get(j);
- if (gu.isPrimary() && !gu.isEmpty()) {
- PrimaryGridUnit primary = (PrimaryGridUnit)gu;
- primary.getCellLM().setParent(tableLM);
-
- //Calculate width of cell
- int spanWidth = 0;
- for (int i = primary.getStartCol();
- i < primary.getStartCol() + primary.getCell().getNumberColumnsSpanned();
- i++) {
- spanWidth += getTableLM().getColumns().getColumn(i + 1)
- .getColumnWidth().getValue();
- }
- log.info("spanWidth=" + spanWidth);
- LayoutContext childLC = new LayoutContext(0);
- childLC.setStackLimit(context.getStackLimit()); //necessary?
- childLC.setRefIPD(spanWidth);
-
- LinkedList elems = primary.getCellLM().getNextKnuthElements(childLC, alignment);
- primary.setElements(elems);
- log.debug("Elements: " + elems);
- int len = calcCellHeightFromContents(elems);
- pgus.add(primary);
- maxCellHeight = Math.max(maxCellHeight, len);
- if (len > row.getHeight().opt) {
- row.setHeight(new MinOptMax(len));
+ while ((rowGroup = iter.getNextRowGroup()) != null) {
+ for (int rgi = 0; rgi < rowGroup.length; rgi++) {
+ row = rowGroup[rgi];
+ List pgus = new java.util.ArrayList();
+ TableRow tableRow = null;
+ int maxCellHeight = 0;
+ for (int j = 0; j < row.getGridUnits().size(); j++) {
+ GridUnit gu = (GridUnit)row.getGridUnits().get(j);
+ if (gu.isPrimary() && !gu.isEmpty()) {
+ PrimaryGridUnit primary = (PrimaryGridUnit)gu;
+ primary.getCellLM().setParent(tableLM);
+
+ //Calculate width of cell
+ int spanWidth = 0;
+ for (int i = primary.getStartCol();
+ i < primary.getStartCol() + primary.getCell().getNumberColumnsSpanned();
+ i++) {
+ spanWidth += getTableLM().getColumns().getColumn(i + 1)
+ .getColumnWidth().getValue();
+ }
+ log.info("spanWidth=" + spanWidth);
+ LayoutContext childLC = new LayoutContext(0);
+ childLC.setStackLimit(context.getStackLimit()); //necessary?
+ childLC.setRefIPD(spanWidth);
+
+ LinkedList elems = primary.getCellLM().getNextKnuthElements(childLC, alignment);
+ primary.setElements(elems);
+ log.debug("Elements: " + elems);
+ int len = calcCellHeightFromContents(elems);
+ pgus.add(primary);
+ maxCellHeight = Math.max(maxCellHeight, len);
+ if (len > row.getHeight().opt) {
+ row.setHeight(new MinOptMax(len));
+ }
+ LengthRangeProperty bpd = primary.getCell().getBlockProgressionDimension();
+ if (!bpd.getOptimum().isAuto()) {
+ if (bpd.getOptimum().getLength().getValue() > row.getHeight().opt) {
+ row.setHeight(new MinOptMax(bpd.getOptimum().getLength().getValue()));
+ }
+ }
+ if (tableRow == null) {
+ tableRow = primary.getRow();
+ }
}
- LengthRangeProperty bpd = primary.getCell().getBlockProgressionDimension();
+ }
+
+ if (tableRow != null) {
+ LengthRangeProperty bpd = tableRow.getBlockProgressionDimension();
if (!bpd.getOptimum().isAuto()) {
if (bpd.getOptimum().getLength().getValue() > row.getHeight().opt) {
row.setHeight(new MinOptMax(bpd.getOptimum().getLength().getValue()));
}
}
- if (tableRow == null) {
- tableRow = primary.getRow();
- }
}
- }
-
- if (tableRow != null) {
- LengthRangeProperty bpd = tableRow.getBlockProgressionDimension();
- if (!bpd.getOptimum().isAuto()) {
- if (bpd.getOptimum().getLength().getValue() > row.getHeight().opt) {
- row.setHeight(new MinOptMax(bpd.getOptimum().getLength().getValue()));
- }
+ log.debug(row);
+
+ PrimaryGridUnit[] pguArray = new PrimaryGridUnit[pgus.size()];
+ pguArray = (PrimaryGridUnit[])pgus.toArray(pguArray);
+ LinkedList returnedList = getCombinedKnuthElementsForRow(pguArray, row,
+ disableHeaderFooter);
+ if (returnedList != null) {
+ returnList.addAll(returnedList);
+ }
+
+ if (row.getHeight().opt > maxCellHeight) {
+ int space = row.getHeight().opt - maxCellHeight;
+ KnuthPenalty penalty = (KnuthPenalty)returnList.removeLast();
+ //Insert dummy box before penalty
+ returnList.add(new KnuthBox(space, new Position(getTableLM()), false));
+ returnList.add(penalty);
}
}
- log.debug(row);
-
- PrimaryGridUnit[] pguArray = new PrimaryGridUnit[pgus.size()];
- pguArray = (PrimaryGridUnit[])pgus.toArray(pguArray);
- LinkedList returnedList = getCombinedKnuthElementsForRow(pguArray, row,
- disableHeaderFooter);
- if (returnedList != null) {
- returnList.addAll(returnedList);
- }
-
- if (row.getHeight().opt > maxCellHeight) {
- int space = row.getHeight().opt - maxCellHeight;
- KnuthPenalty penalty = (KnuthPenalty)returnList.removeLast();
- //Insert dummy box before penalty
- returnList.add(new KnuthBox(space, new Position(getTableLM()), false));
- returnList.add(penalty);
- }
}
//Remove last penalty
@@ -322,7 +329,7 @@
private int getNextStep(int laststep, List[] elementLists, int[] index,
int[] start, int[] end, int[] widths, int[] fullWidths) {
- int backupWidths[] = new int[start.length];
+ int[] backupWidths = new int[start.length];
System.arraycopy(widths, 0, backupWidths, 0, backupWidths.length);
//set starting points
for (int i = 0; i < start.length; i++) {
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org