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/05/13 16:28:45 UTC
cvs commit: xml-fop/src/java/org/apache/fop/layoutmgr ElementListUtils.java
jeremias 2005/05/13 07:28:45
Modified: src/java/org/apache/fop/layoutmgr/table Tag:
Temp_KnuthStylePageBreaking TableStepper.java
TableContentLayoutManager.java EffRow.java
Added: src/java/org/apache/fop/layoutmgr Tag:
Temp_KnuthStylePageBreaking ElementListUtils.java
Log:
Improved handling of explicit height/block-progression-dimension on table-cell and table-row. May not yet be perfect, though.
Some helper methods moved to a utility class: ElementListUtils.
Revision Changes Path
No revision
No revision
1.1.2.4 +16 -6 xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableStepper.java
Index: TableStepper.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/TableStepper.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- TableStepper.java 12 May 2005 14:13:45 -0000 1.1.2.3
+++ TableStepper.java 13 May 2005 14:28:45 -0000 1.1.2.4
@@ -25,6 +25,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.layoutmgr.ElementListUtils;
import org.apache.fop.layoutmgr.KnuthBox;
import org.apache.fop.layoutmgr.KnuthElement;
import org.apache.fop.layoutmgr.KnuthPenalty;
@@ -127,13 +128,22 @@
private void setupElementList(int column) {
GridUnit gu = getActiveGridUnit(column);
+ EffRow row = getActiveRow();
if (gu.isPrimary() && !gu.isEmpty()) {
PrimaryGridUnit pgu = (PrimaryGridUnit)gu;
- if (pgu.hasBPD()) {
- List list = new java.util.ArrayList(1);
- list.add(new KnuthBoxCellWithBPD(
- pgu.getEffectiveContentLength(), pgu));
- elementLists[column] = list;
+ if (row.getExplicitHeight().min > 0) {
+ boolean contentsSmaller = ElementListUtils.removeLegalBreaks(
+ pgu.getElements(), row.getExplicitHeight());
+ if (contentsSmaller) {
+ List list = new java.util.ArrayList(1);
+ list.add(new KnuthBoxCellWithBPD(
+ row.getExplicitHeight().opt, pgu));
+ elementLists[column] = list;
+ } else {
+ //Copy elements (LinkedList) to array lists to improve
+ //element access performance
+ elementLists[column] = new java.util.ArrayList(pgu.getElements());
+ }
} else {
//Copy elements (LinkedList) to array lists to improve
//element access performance
1.1.2.15 +28 -67 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.14
retrieving revision 1.1.2.15
diff -u -r1.1.2.14 -r1.1.2.15
--- TableContentLayoutManager.java 13 May 2005 07:07:53 -0000 1.1.2.14
+++ TableContentLayoutManager.java 13 May 2005 14:28:45 -0000 1.1.2.15
@@ -33,6 +33,7 @@
import org.apache.fop.fo.flow.TableRow;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.fo.properties.LengthRangeProperty;
+import org.apache.fop.layoutmgr.ElementListUtils;
import org.apache.fop.layoutmgr.KnuthBox;
import org.apache.fop.layoutmgr.KnuthElement;
import org.apache.fop.layoutmgr.KnuthPenalty;
@@ -133,8 +134,8 @@
if (headerIter != null) {
this.headerList = getKnuthElementsForRowIterator(
headerIter, context, alignment, TableRowIterator.HEADER);
- removeLegalBreaks(this.headerList);
- this.headerNetHeight = calcCellHeightFromContents(this.headerList);
+ ElementListUtils.removeLegalBreaks(this.headerList);
+ this.headerNetHeight = ElementListUtils.calcContentLength(this.headerList);
if (log.isDebugEnabled()) {
log.debug("==> Header: " + headerNetHeight + " - " + this.headerList);
}
@@ -153,8 +154,8 @@
if (footerIter != null) {
this.footerList = getKnuthElementsForRowIterator(
footerIter, context, alignment, TableRowIterator.FOOTER);
- removeLegalBreaks(this.footerList);
- this.footerNetHeight = calcCellHeightFromContents(this.footerList);
+ ElementListUtils.removeLegalBreaks(this.footerList);
+ this.footerNetHeight = ElementListUtils.calcContentLength(this.footerList);
if (log.isDebugEnabled()) {
log.debug("==> Footer: " + footerNetHeight + " - " + this.footerList);
}
@@ -180,28 +181,6 @@
return returnList;
}
- private void removeLegalBreaks(LinkedList elements) {
- ListIterator i = elements.listIterator();
- while (i.hasNext()) {
- KnuthElement el = (KnuthElement)i.next();
- if (el.isPenalty()) {
- KnuthPenalty penalty = (KnuthPenalty)el;
- //Convert all penalties no break inhibitors
- if (penalty.getP() < KnuthPenalty.INFINITE) {
- i.set(new KnuthPenalty(penalty.getW(), KnuthPenalty.INFINITE,
- penalty.isFlagged(), penalty.getPosition(), penalty.isAuxiliary()));
- }
- } else if (el.isGlue()) {
- i.previous();
- if (el.isBox()) {
- i.next();
- i.add(new KnuthPenalty(0, KnuthPenalty.INFINITE, false,
- new Position(getTableLM()), false));
- }
- }
- }
- }
-
/**
* Creates Knuth elements by iterating over a TableRowIterator.
* @param iter TableRowIterator instance to fetch rows from
@@ -351,12 +330,14 @@
EffRow[] rowGroup) {
log.debug("Handling row group with " + rowGroup.length + " rows...");
MinOptMax[] rowHeights = new MinOptMax[rowGroup.length];
+ MinOptMax[] explicitRowHeights = new MinOptMax[rowGroup.length];
EffRow row;
int maxColumnCount = 0;
List pgus = new java.util.ArrayList(); //holds a list of a row's primary grid units
for (int rgi = 0; rgi < rowGroup.length; rgi++) {
row = rowGroup[rgi];
rowHeights[rgi] = new MinOptMax(0, 0, Integer.MAX_VALUE);
+ explicitRowHeights[rgi] = new MinOptMax(0, 0, Integer.MAX_VALUE);
pgus.clear();
TableRow tableRow = null;
@@ -382,6 +363,8 @@
minContentHeight = Math.max(minContentHeight,
bpd.getMinimum().getLength().getValue());
}
+ MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
+
}
//Calculate width of cell
@@ -404,7 +387,8 @@
//Calculate height of cell contents
- primary.setContentLength(calcCellHeightFromContents(primary.getElements()));
+ primary.setContentLength(ElementListUtils.calcContentLength(
+ primary.getElements()));
maxCellHeight = Math.max(maxCellHeight, primary.getContentLength());
//Calculate height of row, see CSS21, 17.5.3 Table height algorithms
@@ -415,6 +399,10 @@
effCellContentHeight = Math.max(effCellContentHeight,
bpd.getMinimum().getLength().getValue());
}
+ if (gu.getRowSpanIndex() == 0) {
+ //TODO ATM only non-row-spanned cells are taken for this
+ MinOptMaxUtil.restrict(explicitRowHeights[rgi], bpd);
+ }
effCellContentHeight = Math.max(effCellContentHeight,
primary.getContentLength());
int borderWidths;
@@ -445,23 +433,19 @@
}
}
}
-
- log.debug("row: " + row);
-
- PrimaryGridUnit[] pguArray = new PrimaryGridUnit[pgus.size()];
- pguArray = (PrimaryGridUnit[])pgus.toArray(pguArray);
- /*
- LinkedList returnedList = getCombinedKnuthElementsForRow(pguArray, row,
- isHeaderFooter);
- if (returnedList != null) {
- returnList.addAll(returnedList);
- }*/
+ row.setExplicitHeight(explicitRowHeights[rgi]);
+ if (row.getHeight().opt > row.getExplicitHeight().max) {
+ log.warn("Contents of row " + row.getIndex() + " violate a maximum constraint "
+ + "in block-progression-dimension. Due to its contents the row grows "
+ + "to " + row.getHeight().opt + " millipoints. The row constraint resolve "
+ + "to " + row.getExplicitHeight());
+ }
}
if (log.isDebugEnabled()) {
log.debug("rowGroup:");
for (int i = 0; i < rowHeights.length; i++) {
- log.debug(" " + rowHeights[i]);
+ log.debug(" height=" + rowHeights[i] + " explicit=" + explicitRowHeights[i]);
}
}
TableStepper stepper = new TableStepper(this);
@@ -473,32 +457,6 @@
}
- private int calcCellHeightFromContents(List elems, int start, int end) {
- ListIterator iter = elems.listIterator(start);
- int count = end - start + 1;
- int len = 0;
- while (iter.hasNext()) {
- KnuthElement el = (KnuthElement)iter.next();
- if (el.isBox()) {
- len += el.getW();
- } else if (el.isGlue()) {
- len += el.getW();
- } else {
- //log.debug("Ignoring penalty: " + el);
- //ignore penalties
- }
- count--;
- if (count == 0) {
- break;
- }
- }
- return len;
- }
-
- private int calcCellHeightFromContents(List elems) {
- return calcCellHeightFromContents(elems, 0, elems.size() - 1);
- }
-
protected int getXOffsetOfGridUnit(GridUnit gu) {
int col = gu.getStartCol();
return startXOffset + getTableLM().getColumns().getXOffset(col + 1);
@@ -676,8 +634,11 @@
log.debug("getting len for " + i + " "
+ start[i] + "-" + end[i]);
readyCount++;
- int len = calcCellHeightFromContents(
+ int len = ElementListUtils.calcContentLength(
gridUnits[i].getElements(), start[i], end[i]);
+ if (start[i] == 0 && lastRow.getExplicitHeight().min > 0) {
+ len = Math.max(len, lastRow.getExplicitHeight().opt);
+ }
partLength[i] = len;
log.debug("len of part: " + len);
1.1.2.4 +14 -4 xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/EffRow.java
Index: EffRow.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/table/Attic/EffRow.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- EffRow.java 13 May 2005 07:07:53 -0000 1.1.2.3
+++ EffRow.java 13 May 2005 14:28:45 -0000 1.1.2.4
@@ -32,7 +32,8 @@
private List gridUnits = new java.util.ArrayList();
private int index;
private int bodyType;
- private MinOptMax height = new MinOptMax(0);
+ private MinOptMax height;
+ private MinOptMax explicitHeight;
public EffRow(int index, int bodyType) {
this.index = index;
@@ -52,8 +53,16 @@
return this.height;
}
- public void setHeight(MinOptMax height) {
- this.height = height;
+ public void setHeight(MinOptMax mom) {
+ this.height = mom;
+ }
+
+ public MinOptMax getExplicitHeight() {
+ return this.explicitHeight;
+ }
+
+ public void setExplicitHeight(MinOptMax mom) {
+ this.explicitHeight = mom;
}
public List getGridUnits() {
@@ -104,6 +113,7 @@
sb.append(" in footer");
}
sb.append(", ").append(height);
+ sb.append(", ").append(explicitHeight);
sb.append(", ").append(gridUnits.size()).append(" gu");
sb.append("}");
return sb.toString();
No revision
No revision
1.1.2.1 +136 -0 xml-fop/src/java/org/apache/fop/layoutmgr/Attic/ElementListUtils.java
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org