]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Use an iterator instead of get(index) to iterate over the list of Knuth elements
authorVincent Hennebert <vhennebert@apache.org>
Thu, 19 Jul 2007 09:57:10 +0000 (09:57 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Thu, 19 Jul 2007 09:57:10 +0000 (09:57 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@557541 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/layoutmgr/table/ActiveCell.java

index f9b100ddb7c8879298ad82798c1ce7feb7efde0b..df48ab78c89bdf1624bea36882c01e523352b463 100644 (file)
@@ -20,6 +20,7 @@
 package org.apache.fop.layoutmgr.table;
 
 import java.util.List;
+import java.util.ListIterator;
 
 import org.apache.fop.layoutmgr.ElementListUtils;
 import org.apache.fop.layoutmgr.KnuthBox;
@@ -30,6 +31,8 @@ class ActiveCell {
         private PrimaryGridUnit pgu;
         /** Knuth elements for this active cell. */
         private List elementList;
+        /** Iterator over the Knuth element list. */
+        private ListIterator knuthIter;
         private boolean prevIsBox = false;
         /** Number of the row where the row-span ends, zero-based. */
         private int endRow;
@@ -80,6 +83,7 @@ class ActiveCell {
 //                    log.trace("column " + (column+1) + ": recording " + elementLists.size() + " element(s)");
 //                }
             }
+            knuthIter = elementList.listIterator();
             includedLength = -1;  // Avoid troubles with cells having content of zero length
             this.previousRowsLength = previousRowsLength;
             width = previousRowsLength;
@@ -120,9 +124,8 @@ class ActiveCell {
         private void goToNextLegalBreak() {
             lastPenaltyLength = 0;
             boolean breakFound = false;
-            while (!breakFound && end + 1 < elementList.size()) {
-                end++;
-                KnuthElement el = (KnuthElement)elementList.get(end);
+            while (!breakFound && knuthIter.hasNext()) {
+                KnuthElement el = (KnuthElement) knuthIter.next();
                 if (el.isPenalty()) {
                     prevIsBox = false;
                     if (el.getP() < KnuthElement.INFINITE) {
@@ -143,6 +146,7 @@ class ActiveCell {
                     width += el.getW();
                 }
             }
+            end = knuthIter.nextIndex() - 1;
         }
 
         int getNextStep() {
@@ -150,8 +154,7 @@ class ActiveCell {
                 return width + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter;
             } else {
                 start = end + 1;
-                if (end < elementList.size() - 1) {
-
+                if (knuthIter.hasNext()) {
                     goToNextLegalBreak();
                     return width + lastPenaltyLength + borderBefore + borderAfter + paddingBefore + paddingAfter; 
                 } else {
@@ -176,15 +179,18 @@ class ActiveCell {
 
         private void computeRemainingLength() {
             remainingLength = totalLength - width;
-            int index = end + 1;
-            while (index < elementList.size()) {
-                KnuthElement el = (KnuthElement)elementList.get(index);
-                if (el.isBox()) {
-                    break;
-                } else if (el.isGlue()) {
+            // Save the current location in the element list
+            int oldIndex = knuthIter.nextIndex();
+            KnuthElement el;
+            while (knuthIter.hasNext()
+                    && !(el = (KnuthElement) knuthIter.next()).isBox()) {
+                if (el.isGlue()) {
                     remainingLength -= el.getW();
                 }
-                index++;
+            }
+            // Reset the iterator to the current location
+            while (knuthIter.nextIndex() > oldIndex) {
+                knuthIter.previous();
             }
         }