xmlgraphics-fop-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From acumis...@apache.org
Subject svn commit: r674497 [4/11] - in /xmlgraphics/fop/branches/Temp_AreaTreeNewDesign: ./ lib/ lib/build/ src/codegen/unicode/data/ src/codegen/unicode/java/org/apache/fop/text/linebreak/ src/documentation/ src/documentation/content/xdocs/ src/documentation...
Date Mon, 07 Jul 2008 14:09:10 GMT
Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOEventHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOEventHandler.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOEventHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOEventHandler.java Mon Jul  7 07:09:01 2008
@@ -19,9 +19,6 @@
 
 package org.apache.fop.fo;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import org.xml.sax.SAXException;
 
 import org.apache.fop.apps.FOUserAgent;
@@ -43,6 +40,9 @@
 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;
@@ -75,27 +75,6 @@
     protected FontInfo fontInfo;
 
     /**
-     * The current set of id's in the FO tree.
-     * This is used so we know if the FO tree contains duplicates.
-     */
-    private Set idReferences = new HashSet();
-    
-    /**
-     * The property list maker.
-     */
-    protected PropertyListMaker propertyListMaker;
-
-    /**
-     * The XMLWhitespaceHandler for this tree
-     */
-    protected XMLWhiteSpaceHandler whiteSpaceHandler = new XMLWhiteSpaceHandler();
-    
-    /**
-     * Indicates whether processing descendants of a marker
-     */
-    private boolean inMarker = false;
-    
-    /**
      * Main constructor
      * @param foUserAgent the apps.FOUserAgent instance for this process
      */
@@ -106,14 +85,6 @@
     }
 
     /**
-     * Retuns the set of ID references.
-     * @return the ID references
-     */
-    public Set getIDReferences() {
-        return idReferences;
-    }
-
-    /**
      * Returns the User Agent object associated with this FOEventHandler.
      * @return the User Agent object
      */
@@ -130,54 +101,6 @@
     }
 
     /**
-     * Return the propertyListMaker.
-     * 
-     * @return the currently active {@link PropertyListMaker}
-     */
-    public PropertyListMaker getPropertyListMaker() {
-        return propertyListMaker;
-    }
-     
-    /**
-     * Set a new propertyListMaker.
-     * 
-     * @param propertyListMaker the new {@link PropertyListMaker} to use
-     */
-    public void setPropertyListMaker(PropertyListMaker propertyListMaker) {
-        this.propertyListMaker = propertyListMaker;
-    }
-    
-    /**
-     * Return the XMLWhiteSpaceHandler
-     * @return the whiteSpaceHandler
-     */
-    public XMLWhiteSpaceHandler getXMLWhiteSpaceHandler() {
-        return whiteSpaceHandler;
-    }
-
-    /**
-     * Switch to or from marker context
-     * (used by FOTreeBuilder when processing
-     *  a marker)
-     * 
-     * @param inMarker  true if a marker is being processed; 
-     *                  false otherwise
-     *
-     */
-    protected void switchMarkerContext(boolean inMarker) {
-        this.inMarker = inMarker;
-    }
-    
-    /**
-     * Check whether in marker context
-     * 
-     * @return true if a marker is being processed
-     */
-    protected boolean inMarker() {
-        return this.inMarker;
-    }
-    
-    /**
      * This method is called to indicate the start of a new document run.
      * @throws SAXException In case of a problem
      */
@@ -337,44 +260,44 @@
 
     /**
      *
-     * @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) {
     }
 
     /**
@@ -566,7 +489,7 @@
      * @param start Offset for characters to process.
      * @param length Portion of array to process.
      */
-    public void characters(char data[], int start, int length) {
+    public void characters(char[] data, int start, int length) {
     }
 
     /**

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FONode.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FONode.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FONode.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FONode.java Mon Jul  7 07:09:01 2008
@@ -22,7 +22,6 @@
 // Java
 import java.util.ListIterator;
 import java.util.Map;
-import java.util.NoSuchElementException;
 
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
@@ -158,11 +157,19 @@
     }
 
     /**
+     * Returns the context class providing information used during FO tree building.
+     * @return the builder context
+     */
+    public FOTreeBuilderContext getBuilderContext() {
+        return parent.getBuilderContext();
+    }
+    
+    /**
      * Indicates whether this node is a child of an fo:marker.
      * @return true if this node is a child of an fo:marker
      */
     protected boolean inMarker() {
-        return getFOEventHandler().inMarker();
+        return getBuilderContext().inMarker();
     }
 
     /**
@@ -267,12 +274,12 @@
      *
      * @param data array of characters containing text to be added
      * @param start starting array element to add
-     * @param end ending array element to add
+     * @param length number of elements to add
      * @param pList currently applicable PropertyList
      * @param locator location in the XSL-FO source file.
      * @throws FOPException if there's a problem during processing
      */
-    protected void addCharacters(char[] data, int start, int end,
+    protected void addCharacters(char[] data, int start, int length,
                                  PropertyList pList,
                                  Locator locator) throws FOPException {
         // ignore
@@ -291,11 +298,16 @@
      * Primarily used for making final content model validation checks
      * and/or informing the {@link FOEventHandler} that the end of this FO
      * has been reached.
+     * The default implementation simply calls {@link #finalizeNode()}, without
+     * sending any event to the {@link FOEventHandler}.
+     * <br/><i>Note: the recommended way to override this method in subclasses is</i>
+     * <br/><br/><code>super.endOfNode(); // invoke finalizeNode()
+     * <br/>getFOEventHandler().endXXX(); // send endOfNode() notification</code>
      *
      * @throws FOPException if there's a problem during processing
      */
     protected void endOfNode() throws FOPException {
-        // do nothing by default
+        this.finalizeNode();
     }
 
     /**
@@ -320,6 +332,20 @@
     }
 
     /**
+     * Finalize this node.
+     * This method can be overridden by subclasses to perform finishing
+     * tasks (cleanup, validation checks, ...) without triggering
+     * endXXX() events in the {@link FOEventHandler}.
+     * The method is called by the default {@link #endOfNode()}
+     * implementation.
+     * 
+     * @throws FOPException in case there was an error
+     */
+    public void finalizeNode() throws FOPException {
+        // do nothing by default
+    }
+
+    /**
      * Return the parent node of this node
      *
      * @return the parent node of this node

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOText.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOText.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOText.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOText.java Mon Jul  7 07:09:01 2008
@@ -20,6 +20,7 @@
 package org.apache.fop.fo;
 
 import java.awt.Color;
+import java.nio.CharBuffer;
 import java.util.NoSuchElementException;
 
 import org.xml.sax.Locator;
@@ -33,48 +34,17 @@
 import org.apache.fop.fo.properties.KeepProperty;
 import org.apache.fop.fo.properties.Property;
 import org.apache.fop.fo.properties.SpaceProperty;
+import org.apache.fop.util.CharUtilities;
 
 /**
  * A text node (PCDATA) in the formatting object tree.
- *
- * Unfortunately the BufferManager implementatation holds
- * onto references to the character data in this object
- * longer than the lifetime of the object itself, causing
- * excessive memory consumption and OOM errors.
  */
-public class FOText extends FONode {
+public class FOText extends FONode implements CharSequence {
 
-    /**
-     * the character array containing the text
-     */
-    public char[] ca;
-
-    /**
-     * The starting valid index of the ca array 
-     * to be processed.
-     *
-     * This value is originally equal to 0, but becomes 
-     * incremented during leading whitespace removal by the flow.Block class,  
-     * via the TextCharIterator.remove() method below.
-     */
-    public int startIndex = 0;
+    /** the <code>CharBuffer</code> containing the text */
+    private CharBuffer charBuffer;
 
-    /**
-     * The ending valid index of the ca array 
-     * to be processed.
-     *
-     * This value is originally equal to ca.length, but becomes 
-     * decremented during between-word whitespace removal by the 
-     * XMLWhiteSpaceHandler via the TextCharIterator.remove() 
-     * method below.
-     */
-    public int endIndex = 0;
-
-    /** properties relevant for PCDATA */
-    /* TODO: these are basically always the same as the parent FObj or FObjMixed
-     *      so maybe those can be removed, and the accessors could  
-     *      dispatch the call to the parent?
-     */
+    /** properties relevant for #PCDATA */
     private CommonFont commonFont;
     private CommonHyphenation commonHyphenation;
     private Color color;
@@ -105,10 +75,10 @@
      * which FOText nodes are descendants of the same block.
      */
     private Block ancestorBlock = null;
-    
+
     /** Holds the text decoration values. May be null */
     private CommonTextDecoration textDecoration;
-    
+
     private static final int IS_WORD_CHAR_FALSE = 0;
     private static final int IS_WORD_CHAR_TRUE = 1;
     private static final int IS_WORD_CHAR_MAYBE = 2;
@@ -123,37 +93,61 @@
     }
 
     /** {@inheritDoc} */
-    protected void addCharacters(char[] data, int start, int end,
+    protected void addCharacters(char[] data, int start, int length,
             PropertyList list, Locator locator) throws FOPException {
 
-        int length = end - start;
-        int calength = 0;
-        char[] nca;
-        if (ca != null) {
-            calength = ca.length;
-            nca = new char[calength + length];
-            System.arraycopy(ca, 0, nca, 0, calength);
+        if (this.charBuffer == null) {
+            // buffer not yet initialized, do so now
+            this.charBuffer = CharBuffer.allocate(length);
         } else {
-            nca = new char[length];
+            // allocate a larger buffer, and transfer contents
+            int newLength = this.charBuffer.limit() + length;
+            CharBuffer newBuffer = CharBuffer.allocate(newLength);
+            this.charBuffer.rewind();
+            newBuffer.put(this.charBuffer);
+            this.charBuffer = newBuffer;
         }
-        System.arraycopy(data, start, nca, calength, length);
-        endIndex = nca.length;
-        this.ca = nca;
-     }
+        // append characters
+        this.charBuffer.put(data, start, length);
+
+    }
 
     /**
-     * {@inheritDoc} 
+     * Return the array of characters for this instance.
+     *
+     * @return  a char array containing the text
      */
+    public char[] getCharArray() {
+
+        if (this.charBuffer == null) {
+            return null;
+        }
+
+        if (this.charBuffer.hasArray()) {
+            return this.charBuffer.array();
+        }
+
+        // only if the buffer implementation has
+        // no accessible backing array, return a new one
+        char[] ca = new char[this.charBuffer.limit()];
+        this.charBuffer.rewind();
+        this.charBuffer.get(ca);
+        return ca;
+
+    }
+
+    /** {@inheritDoc} */
     public FONode clone(FONode parent, boolean removeChildren)
             throws FOPException {
         FOText ft = (FOText) super.clone(parent, removeChildren);
         if (removeChildren) {
-            //not really removing, but just make sure the char array 
-            //pointed to is really a different one, and reset any
-            //possible whitespace-handling effects
-            if (ca != null) {
-                ft.ca = new char[ca.length];
-                System.arraycopy(ca, 0, ft.ca, 0, ca.length);
+            // not really removing, just make sure the char buffer
+            // pointed to is really a different one
+            if (this.charBuffer != null) {
+                ft.charBuffer = CharBuffer.allocate(this.charBuffer.limit());
+                this.charBuffer.rewind();
+                ft.charBuffer.put(this.charBuffer);
+                ft.charBuffer.rewind();
             }
         }
         ft.prevFOTextThisBlock = null;
@@ -162,29 +156,33 @@
         return ft;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public void bind(PropertyList pList) throws FOPException {
-        commonFont = pList.getFontProps();
-        commonHyphenation = pList.getHyphenationProps();
-        color = pList.get(Constants.PR_COLOR).getColor(getUserAgent());
-        keepTogether = pList.get(Constants.PR_KEEP_TOGETHER).getKeep();
-        lineHeight = pList.get(Constants.PR_LINE_HEIGHT).getSpace();
-        letterSpacing = pList.get(Constants.PR_LETTER_SPACING);
-        whiteSpaceCollapse = pList.get(Constants.PR_WHITE_SPACE_COLLAPSE).getEnum();
-        whiteSpaceTreatment = pList.get(Constants.PR_WHITE_SPACE_TREATMENT).getEnum();
-        textTransform = pList.get(Constants.PR_TEXT_TRANSFORM).getEnum();
-        wordSpacing = pList.get(Constants.PR_WORD_SPACING);
-        wrapOption = pList.get(Constants.PR_WRAP_OPTION).getEnum();
-        textDecoration = pList.getTextDecorationProps();
-        baselineShift = pList.get(Constants.PR_BASELINE_SHIFT).getLength();
+        this.commonFont = pList.getFontProps();
+        this.commonHyphenation = pList.getHyphenationProps();
+        this.color = pList.get(Constants.PR_COLOR).getColor(getUserAgent());
+        this.keepTogether = pList.get(Constants.PR_KEEP_TOGETHER).getKeep();
+        this.lineHeight = pList.get(Constants.PR_LINE_HEIGHT).getSpace();
+        this.letterSpacing = pList.get(Constants.PR_LETTER_SPACING);
+        this.whiteSpaceCollapse = pList.get(Constants.PR_WHITE_SPACE_COLLAPSE).getEnum();
+        this.whiteSpaceTreatment = pList.get(Constants.PR_WHITE_SPACE_TREATMENT).getEnum();
+        this.textTransform = pList.get(Constants.PR_TEXT_TRANSFORM).getEnum();
+        this.wordSpacing = pList.get(Constants.PR_WORD_SPACING);
+        this.wrapOption = pList.get(Constants.PR_WRAP_OPTION).getEnum();
+        this.textDecoration = pList.getTextDecorationProps();
+        this.baselineShift = pList.get(Constants.PR_BASELINE_SHIFT).getLength();
     }
 
     /** {@inheritDoc} */
     protected void endOfNode() throws FOPException {
+        super.endOfNode();
+        getFOEventHandler().characters(
+                this.getCharArray(), 0, this.charBuffer.limit());
+    }
+
+    /** {@inheritDoc} */
+    public void finalizeNode() {
         textTransform();
-        getFOEventHandler().characters(ca, startIndex, endIndex);
     }
 
     /**
@@ -198,16 +196,20 @@
      */
     public boolean willCreateArea() {
         if (whiteSpaceCollapse == Constants.EN_FALSE
-                && endIndex - startIndex > 0) {
+                && this.charBuffer.limit() > 0) {
             return true;
         }
 
-        for (int i = startIndex; i < endIndex; i++) {
-            char ch = ca[i];
-            if (!((ch == ' ')
-                    || (ch == '\n')
-                    || (ch == '\r')
-                    || (ch == '\t'))) { // whitespace
+        char ch;
+        this.charBuffer.rewind();
+        while (this.charBuffer.hasRemaining()) {
+            ch = this.charBuffer.get();
+            if (!((ch == CharUtilities.SPACE)
+                    || (ch == CharUtilities.LINEFEED_CHAR)
+                    || (ch == CharUtilities.CARRIAGE_RETURN)
+                    || (ch == CharUtilities.TAB))) {
+                // not whitespace
+                this.charBuffer.rewind();
                 return true;
             }
         }
@@ -222,7 +224,7 @@
     }
 
      /**
-     * This method is run as part of the ancestor Block's flushText(), to 
+     * This method is run as part of the ancestor Block's flushText(), to
      * create xref pointers to the previous FOText objects within the same Block
      * @param  ancestorBlock the ancestor fo:block
      */
@@ -230,7 +232,7 @@
         this.ancestorBlock = ancestorBlock;
         // if the last FOText is a sibling, point to it, and have it point here
         if (ancestorBlock.lastFOTextProcessed != null) {
-            if (ancestorBlock.lastFOTextProcessed.ancestorBlock 
+            if (ancestorBlock.lastFOTextProcessed.ancestorBlock
                     == this.ancestorBlock) {
                 prevFOTextThisBlock = ancestorBlock.lastFOTextProcessed;
                 prevFOTextThisBlock.nextFOTextThisBlock = this;
@@ -241,16 +243,47 @@
     }
 
     /**
-     * This method is run as part of the Constructor, to handle the
-     * text-transform property.
+     * This method is run as part of endOfNode(), to handle the
+     * text-transform property for accumulated FOText
      */
     private void textTransform() {
-        if (getFOEventHandler().inMarker() 
+        if (getBuilderContext().inMarker()
                 || textTransform == Constants.EN_NONE) {
             return;
         }
-        for (int i = 0; i < endIndex; i++) {
-            ca[i] = charTransform(i);
+
+        this.charBuffer.rewind();
+        CharBuffer tmp = this.charBuffer.slice();
+        char c;
+        int lim = this.charBuffer.limit();
+        int pos = -1;
+        while (++pos < lim) {
+            c = this.charBuffer.get();
+            switch (textTransform) {
+                case Constants.EN_UPPERCASE:
+                    tmp.put(Character.toUpperCase(c));
+                    break;
+                case Constants.EN_LOWERCASE:
+                    tmp.put(Character.toLowerCase(c));
+                    break;
+                case Constants.EN_CAPITALIZE:
+                    if (isStartOfWord(pos)) {
+                        /*
+                         Use toTitleCase here. Apparently, some languages use
+                         a different character to represent a letter when using
+                         initial caps than when all of the letters in the word
+                         are capitalized. We will try to let Java handle this.
+                        */
+                        tmp.put(Character.toTitleCase(c));
+                    } else {
+                        tmp.put(c);
+                    }
+                    break;
+                default:
+                     //should never happen as the property subsystem catches that case
+                    assert false;
+                    //nop
+            }
         }
     }
 
@@ -261,7 +294,7 @@
      * well, such as word-spacing. The definition of "word" is somewhat ambiguous
      * and appears to be definable by the user agent.
      *
-     * @param i index into ca[]
+     * @param i index into charBuffer
      *
      * @return True if the character at this location is the start of a new
      * word.
@@ -269,33 +302,33 @@
     private boolean isStartOfWord(int i) {
         char prevChar = getRelativeCharInBlock(i, -1);
         /* All we are really concerned about here is of what type prevChar
-           is. If inputChar is not part of a word, then the Java
-           conversions will (we hope) simply return inputChar.
-        */
-        switch (isWordChar(prevChar)) {
-        case IS_WORD_CHAR_TRUE:
-            return false;
-        case IS_WORD_CHAR_FALSE:
-            return true;
-        /* "MAYBE" implies that additional context is needed. An example is a
-         * single-quote, either straight or closing, which might be interpreted
-         * as a possessive or a contraction, or might be a closing quote.
+         * is. If inputChar is not part of a word, then the Java
+         * conversions will (we hope) simply return inputChar.
          */
-        case IS_WORD_CHAR_MAYBE:
-            char prevPrevChar = getRelativeCharInBlock(i, -2);
-            switch (isWordChar(prevPrevChar)) {
+        switch (isWordChar(prevChar)) {
             case IS_WORD_CHAR_TRUE:
                 return false;
             case IS_WORD_CHAR_FALSE:
                 return true;
+            /* "MAYBE" implies that additional context is needed. An example is a
+             * single-quote, either straight or closing, which might be interpreted
+             * as a possessive or a contraction, or might be a closing quote.
+             */
             case IS_WORD_CHAR_MAYBE:
-                return true;
+                char prevPrevChar = getRelativeCharInBlock(i, -2);
+                switch (isWordChar(prevPrevChar)) {
+                case IS_WORD_CHAR_TRUE:
+                    return false;
+                case IS_WORD_CHAR_FALSE:
+                    return true;
+                case IS_WORD_CHAR_MAYBE:
+                    return true;
+                default:
+                    return false;
+            }
             default:
                 return false;
         }
-        default:
-            return false;
-        }
     }
 
     /**
@@ -304,7 +337,7 @@
      * block as one unit, allowing text in adjoining FOText objects to be
      * returned if the parameters are outside of the current object.
      *
-     * @param i index into ca[]
+     * @param i index into the CharBuffer
      * @param offset signed integer with relative position within the
      *   block of the character to return. To return the character immediately
      *   preceding i, pass -1. To return the character immediately after i,
@@ -313,30 +346,34 @@
      * the offset points to an area outside of the block.
      */
     private char getRelativeCharInBlock(int i, int offset) {
+
+        int charIndex = i + offset;
         // The easy case is where the desired character is in the same FOText
-        if (((i + offset) >= 0) && ((i + offset) <= this.endIndex)) {
-            return ca[i + offset];
+        if (charIndex >= 0 && charIndex < this.length()) {
+            return this.charAt(i + offset);
         }
+
         // For now, we can't look at following FOText nodes
         if (offset > 0) {
-             return '\u0000';
-         }
+             return CharUtilities.NULL_CHAR;
+        }
+
         // Remaining case has the text in some previous FOText node
         boolean foundChar = false;
-        char charToReturn = '\u0000';
+        char charToReturn = CharUtilities.NULL_CHAR;
         FOText nodeToTest = this;
         int remainingOffset = offset + i;
         while (!foundChar) {
             if (nodeToTest.prevFOTextThisBlock == null) {
-                foundChar = true;
                 break;
             }
             nodeToTest = nodeToTest.prevFOTextThisBlock;
-            if ((nodeToTest.endIndex + remainingOffset) >= 0) {
-                charToReturn = nodeToTest.ca[nodeToTest.endIndex + remainingOffset];
+            int diff = nodeToTest.length() + remainingOffset - 1;
+            if (diff >= 0) {
+                charToReturn = nodeToTest.charAt(diff);
                 foundChar = true;
             } else {
-                remainingOffset = remainingOffset + nodeToTest.endIndex;
+                remainingOffset += diff;
             }
         }
         return charToReturn;
@@ -367,39 +404,6 @@
     }
 
     /**
-     * Transforms one character in ca[] using the text-transform property.
-     *
-     * @param i the index into ca[]
-     * @return char with transformed value
-     */
-    private char charTransform(int i) {
-        switch (textTransform) {
-        /* put NONE first, as this is probably the common case */
-        case Constants.EN_NONE:
-            return ca[i];
-        case Constants.EN_UPPERCASE:
-            return Character.toUpperCase(ca[i]);
-        case Constants.EN_LOWERCASE:
-            return Character.toLowerCase(ca[i]);
-        case Constants.EN_CAPITALIZE:
-            if (isStartOfWord(i)) {
-                /*
-                 Use toTitleCase here. Apparently, some languages use
-                 a different character to represent a letter when using
-                 initial caps than when all of the letters in the word
-                 are capitalized. We will try to let Java handle this.
-                */
-                return Character.toTitleCase(ca[i]);
-            } else {
-                return ca[i];
-            }
-        default:
-            assert false; //should never happen as the property subsystem catches that case
-            return ca[i];
-        }
-    }
-
-    /**
      * Determines whether the input char should be considered part of a
      * "word". This is used primarily to determine whether the character
      * immediately following starts a new word, but may have other uses.
@@ -484,57 +488,64 @@
     }
 
     private class TextCharIterator extends CharIterator {
-        private int curIndex = 0;
 
-        /* Current space removal process:  just increment the startIndex
-           to "remove" leading spaces from ca, until an unremoved character
-           is found.  Then perform arraycopy's to remove extra spaces
-           between words.  nextCharCalled is used to determine if an 
-           unremoved character has already been found--if its value > 2
-           than it means that has occurred (it is reset to zero each time we 
-           remove a space via incrementing the startIndex.)  */
-        private int nextCharCalled = 0;
-        
+        int currentPosition = 0;
+
+        boolean canRemove = false;
+        boolean canReplace = false;
+
+        /** {@inheritDoc} */
         public boolean hasNext() {
-           if (curIndex == 0) {
-//             log.debug("->" + new String(ca) + "<-");
-          }
-           return (curIndex < endIndex);
+           return (this.currentPosition < charBuffer.limit());
         }
 
+        /** {@inheritDoc} */
         public char nextChar() {
-            if (curIndex < endIndex) {
-                nextCharCalled++;
-                // Just a char class? Don't actually care about the value!
-                return ca[curIndex++];
+
+            if (this.currentPosition < charBuffer.limit()) {
+                this.canRemove = true;
+                this.canReplace = true;
+                return charBuffer.get(currentPosition++);
             } else {
                 throw new NoSuchElementException();
             }
+
         }
 
+        /** {@inheritDoc} */
         public void remove() {
-            if (curIndex < endIndex && nextCharCalled < 2) {
-                startIndex++;
-                nextCharCalled = 0;
-//              log.debug("removeA: " + new String(ca, startIndex, endIndex - startIndex));
-            } else if (curIndex < endIndex) {
-                // copy from curIndex to end to curIndex-1
-                System.arraycopy(ca, curIndex, ca, curIndex - 1, 
-                    endIndex - curIndex);
-                endIndex--;
-                curIndex--;
-//              log.debug("removeB: " + new String(ca, startIndex, endIndex - startIndex));
-            } else if (curIndex == endIndex) {
-//              log.debug("removeC: " + new String(ca, startIndex, endIndex - startIndex));
-                endIndex--;
-                curIndex--;
+
+            if (this.canRemove) {
+                charBuffer.position(currentPosition);
+                // Slice the buffer at the current position
+                CharBuffer tmp = charBuffer.slice();
+                // Reset position to before current character
+                charBuffer.position(--currentPosition);
+                if (tmp.hasRemaining()) {
+                    // Transfer any remaining characters
+                    charBuffer.mark();
+                    charBuffer.put(tmp);
+                    charBuffer.reset();
+                }
+                // Decrease limit
+                charBuffer.limit(charBuffer.limit() - 1);
+                // Make sure following calls fail, unless nextChar() was called
+                this.canRemove = false;
+            } else {
+                throw new IllegalStateException();
             }
+
         }
 
+        /** {@inheritDoc} */
         public void replaceChar(char c) {
-            if (curIndex > 0 && curIndex <= endIndex) {
-                ca[curIndex - 1] = c;
+
+            if (this.canReplace) {
+                charBuffer.put(currentPosition - 1, c);
+            } else {
+                throw new IllegalStateException();
             }
+
         }
 
     }
@@ -560,7 +571,7 @@
         return color;
     }
 
-    /** 
+    /**
      * @return the "keep-together" property.
      */
     public KeepProperty getKeepTogether() {
@@ -571,40 +582,40 @@
      * @return the "letter-spacing" property.
      */
     public Property getLetterSpacing() {
-        return letterSpacing; 
+        return letterSpacing;
     }
-    
+
     /**
      * @return the "line-height" property.
      */
     public SpaceProperty getLineHeight() {
         return lineHeight;
     }
-    
+
     /**
      * @return the "white-space-treatment" property
      */
     public int getWhitespaceTreatment() {
         return whiteSpaceTreatment;
     }
-    
+
     /**
      * @return the "word-spacing" property.
      */
     public Property getWordSpacing() {
-        return wordSpacing; 
+        return wordSpacing;
     }
-    
+
     /**
      * @return the "wrap-option" property.
      */
     public int getWrapOption() {
-        return wrapOption; 
+        return wrapOption;
     }
-    
+
     /** @return the "text-decoration" property. */
     public CommonTextDecoration getTextDecoration() {
-        return textDecoration; 
+        return textDecoration;
     }
 
     /** @return the baseline-shift property */
@@ -614,14 +625,12 @@
 
     /** {@inheritDoc} */
     public String toString() {
-        StringBuffer sb = new StringBuffer(super.toString());
-        sb.append(" (").append(ca).append(")");
-        return sb.toString();
+        return (this.charBuffer == null) ? "" : this.charBuffer.toString();
     }
- 
+
     /** {@inheritDoc} */
     public String getLocalName() {
-        return null;
+        return "#PCDATA";
     }
 
     /** {@inheritDoc} */
@@ -631,10 +640,34 @@
 
     /** {@inheritDoc} */
     protected String gatherContextInfo() {
-        if (getLocator() != null) {
+        if (this.locator != null) {
             return super.gatherContextInfo();
         } else {
-            return new String(ca).trim();
+            return this.toString();
         }
-    }    
-}
\ No newline at end of file
+    }
+
+    /** {@inheritDoc} */
+    public char charAt(int position) {
+        return this.charBuffer.get(position);
+    }
+
+    /** {@inheritDoc} */
+    public CharSequence subSequence(int start, int end) {
+        return this.charBuffer.subSequence(start, end);
+    }
+
+    /** {@inheritDoc} */
+    public int length() {
+        return this.charBuffer.limit();
+    }
+
+    /**
+     * Resets the backing <code>java.nio.CharBuffer</code>
+     */
+    public void resetBuffer() {
+        if (this.charBuffer != null) {
+            this.charBuffer.rewind();
+        }
+    }
+}

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOTreeBuilder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOTreeBuilder.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOTreeBuilder.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FOTreeBuilder.java Mon Jul  7 07:09:01 2008
@@ -66,6 +66,9 @@
     
     /** Current delegate ContentHandler to receive the SAX events */
     protected ContentHandler delegate;
+
+    /** Provides information used during tree building stage. */
+    private FOTreeBuilderContext builderContext;
     
     /** The object that handles formatting and rendering to a stream */
     private FOEventHandler foEventHandler;
@@ -101,7 +104,8 @@
         //one of the RTF-, MIF- etc. Handlers.
         foEventHandler = foUserAgent.getRendererFactory().createFOEventHandler(
                 foUserAgent, outputFormat, stream);
-        foEventHandler.setPropertyListMaker(new PropertyListMaker() {
+        builderContext = new FOTreeBuilderContext();
+        builderContext.setPropertyListMaker(new PropertyListMaker() {
             public PropertyList make(FObj fobj, PropertyList parentPropertyList) {
                 return new StaticPropertyList(fobj, parentPropertyList);
             }
@@ -140,7 +144,7 @@
             log.debug("Building formatting object tree");
         }
         foEventHandler.startDocument();
-        this.mainFOHandler = new MainFOHandler(); 
+        this.mainFOHandler = new MainFOHandler();
         this.mainFOHandler.startDocument();
         this.delegate = this.mainFOHandler;
     }
@@ -150,8 +154,7 @@
         this.delegate.endDocument();
         if (this.rootFObj == null && empty) {
             FOValidationEventProducer eventProducer
-                = FOValidationEventProducer.Provider.get(
-                    foEventHandler.getUserAgent().getEventBroadcaster());
+                = FOValidationEventProducer.Provider.get(userAgent.getEventBroadcaster());
             eventProducer.emptyDocument(this);
         }
         rootFObj = null;
@@ -221,7 +224,7 @@
         } else {
             //No formatting results available for output formats no 
             //involving the layout engine.
-            return null;   
+            return null;
         }
     }
     
@@ -254,7 +257,7 @@
                         || !localName.equals("root")) {
                     FOValidationEventProducer eventProducer
                         = FOValidationEventProducer.Provider.get(
-                                foEventHandler.getUserAgent().getEventBroadcaster());
+                                userAgent.getEventBroadcaster());
                     eventProducer.invalidFORoot(this, FONode.getNodeString(namespaceURI, localName),
                             getEffectiveLocator());
                 }
@@ -271,6 +274,7 @@
                 foNode = fobjMaker.make(currentFObj);
                 if (rootFObj == null) {
                     rootFObj = (Root) foNode;
+                    rootFObj.setBuilderContext(builderContext);
                     rootFObj.setFOEventHandler(foEventHandler);
                 }
                 propertyList = foNode.createPropertyList(
@@ -278,13 +282,12 @@
                 foNode.processNode(localName, getEffectiveLocator(), 
                                     attlist, propertyList);
                 if (foNode.getNameId() == Constants.FO_MARKER) {
-                    if (foEventHandler.inMarker()) {
+                    if (builderContext.inMarker()) {
                         nestedMarkerDepth++;
                     } else {
-                        foEventHandler.switchMarkerContext(true);
+                        builderContext.switchMarkerContext(true);
                     }
                 }
-                foNode.startOfNode();
             } catch (IllegalArgumentException e) {
                 throw new SAXException(e);
             }
@@ -310,9 +313,16 @@
             }
 
             currentFObj = foNode;
-            if (propertyList != null && !foEventHandler.inMarker()) {
+            if (propertyList != null && !builderContext.inMarker()) {
                 currentPropertyList = propertyList;
             }
+
+            // fo:characters can potentially be removed during
+            // white-space handling.
+            // Do not notify the FOEventHandler.
+            if (currentFObj.getNameId() != Constants.FO_CHARACTER) {
+                currentFObj.startOfNode();
+            }
         }
 
         /** {@inheritDoc} */
@@ -329,17 +339,22 @@
                         + ") vs. " + localName + " (" + uri + ")");
             }
             
-            currentFObj.endOfNode();
+            // fo:characters can potentially be removed during
+            // white-space handling.
+            // Do not notify the FOEventHandler.
+            if (currentFObj.getNameId() != Constants.FO_CHARACTER) {
+                currentFObj.endOfNode();
+            }
             
             if (currentPropertyList != null
                     && currentPropertyList.getFObj() == currentFObj
-                    && !foEventHandler.inMarker()) {
+                    && !builderContext.inMarker()) {
                 currentPropertyList = currentPropertyList.getParentPropertyList();
             }
             
             if (currentFObj.getNameId() == Constants.FO_MARKER) {
                 if (nestedMarkerDepth == 0) {
-                    foEventHandler.switchMarkerContext(false);
+                    builderContext.switchMarkerContext(false);
                 } else {
                     nestedMarkerDepth--;
                 }
@@ -356,7 +371,7 @@
         public void characters(char[] data, int start, int length) 
             throws FOPException {
             if (currentFObj != null) {
-                currentFObj.addCharacters(data, start, start + length, 
+                currentFObj.addCharacters(data, start, length, 
                         currentPropertyList, getEffectiveLocator());
             }
         }
@@ -379,7 +394,7 @@
             if (maker instanceof UnknownXMLObj.Maker) {
                 FOValidationEventProducer eventProducer
                     = FOValidationEventProducer.Provider.get(
-                        foEventHandler.getUserAgent().getEventBroadcaster());
+                        userAgent.getEventBroadcaster());
                 eventProducer.unknownFormattingObject(this, currentFObj.getName(),
                         new QName(namespaceURI, localName),
                         getEffectiveLocator());

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObj.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObj.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObj.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObj.java Mon Jul  7 07:09:01 2008
@@ -130,7 +130,7 @@
      */
     protected PropertyList createPropertyList(PropertyList parent, 
                     FOEventHandler foEventHandler) throws FOPException {
-        return foEventHandler.getPropertyListMaker().make(this, parent);
+        return getBuilderContext().getPropertyListMaker().make(this, parent);
     }
 
     /**
@@ -165,7 +165,7 @@
      */
     private void checkId(String id) throws ValidationException {
         if (!inMarker() && !id.equals("")) {
-            Set idrefs = getFOEventHandler().getIDReferences();
+            Set idrefs = getBuilderContext().getIDReferences();
             if (!idrefs.contains(id)) {
                 idrefs.add(id);
             } else {

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObjMixed.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObjMixed.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObjMixed.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/FObjMixed.java Mon Jul  7 07:09:01 2008
@@ -28,29 +28,29 @@
  * (= those that can contain both child {@link FONode}s and <code>#PCDATA</code>).
  */
 public abstract class FObjMixed extends FObj {
-    
+
     /** Represents accumulated, pending FO text. See {@link #flushText()}. */
-    protected FOText ft = null;
-    
+    private FOText ft = null;
+
     /** Used for white-space handling; start CharIterator at node ... */
     protected FONode currentTextNode;
-    
+
     /** Used in creating pointers between subsequent {@link FOText} nodes
-     *  in the same {@link org.apache.fop.fo.flow.Block} 
+     *  in the same {@link org.apache.fop.fo.flow.Block}
      *  (for handling text-transform) */
     protected FOText lastFOTextProcessed = null;
-    
+
     /**
      * Base constructor
-     * 
+     *
      * @param parent FONode that is the parent of this object
      */
     protected FObjMixed(FONode parent) {
         super(parent);
     }
-    
+
     /** {@inheritDoc} */
-    protected void addCharacters(char[] data, int start, int end,
+    protected void addCharacters(char[] data, int start, int length,
                                  PropertyList pList,
                                  Locator locator) throws FOPException {
         if (ft == null) {
@@ -60,113 +60,124 @@
                 ft.bind(pList);
             }
         }
-        ft.addCharacters(data, start, end, null, null);
+        ft.addCharacters(data, start, length, null, null);
     }
 
     /** {@inheritDoc} */
     protected void endOfNode() throws FOPException {
-        flushText();
-        if (!inMarker()
-                || getNameId() == FO_MARKER) {
-            getFOEventHandler().whiteSpaceHandler
-                .handleWhiteSpace(this, currentTextNode);
-        }
+
         super.endOfNode();
+        if (!inMarker() || getNameId() == FO_MARKER) {
+            // send character[s]() events to the FOEventHandler
+            sendCharacters();
+        }
+        
     }
 
     /**
-     * Handles white-space for the node that is passed in, 
+     * Handles white-space for the node that is passed in,
      * starting at its current text-node
-     * (used by {@link org.apache.fop.fo.flow.RetrieveMarker} 
+     * (used by {@link org.apache.fop.fo.flow.RetrieveMarker}
      *  to trigger 'end-of-node' white-space handling)
-     *  
+     *
      * @param fobj  the node for which to handle white-space
+     * @param nextChild the next child to be added
      */
-    protected static void handleWhiteSpaceFor(FObjMixed fobj) {
-        fobj.getFOEventHandler().getXMLWhiteSpaceHandler()
-            .handleWhiteSpace(fobj, fobj.currentTextNode);
+    protected static void handleWhiteSpaceFor(FObjMixed fobj, FONode nextChild) {
+        fobj.getBuilderContext().getXMLWhiteSpaceHandler()
+            .handleWhiteSpace(fobj, fobj.currentTextNode, nextChild);
     }
-    
+
     /**
-     * Adds accumulated text as one FOText instance, unless
-     * the one instance's <code>char</code> array contains more than 
-     * <code>Short.MAX_VALUE</code> characters. In the latter case the 
-     * instance is split up into more manageable chunks.
-     * 
+     * Creates block-pointers between subsequent FOText nodes
+     * in the same Block. (used for handling text-transform)
+     *
+     * TODO: !! Revisit: does not take into account fo:characters !!
+     *
      * @throws FOPException if there is a problem during processing
      */
-    protected void flushText() throws FOPException {
+    private void flushText() throws FOPException {
         if (ft != null) {
             FOText lft = ft;
             /* make sure nested calls to itself have no effect */
             ft = null;
-            FOText tmpText;
-            int indexStart = 0;
-            int indexEnd = (lft.ca.length > Short.MAX_VALUE 
-                            ? Short.MAX_VALUE : lft.ca.length) - 1;
-            int charCount = 0;
-            short tmpSize;
-            while (charCount < lft.ca.length) {
-                tmpSize = (short) (indexEnd - indexStart + 1);
-                charCount += tmpSize;
-                tmpText = (FOText) lft.clone(this, false);
-                tmpText.ca = new char[tmpSize];
-                tmpText.startIndex = 0;
-                tmpText.endIndex = tmpSize;
-                System.arraycopy(lft.ca, indexStart, 
-                                tmpText.ca, 0, indexEnd - indexStart + 1);
-                if (getNameId() == FO_BLOCK) {
-                    tmpText.createBlockPointers((org.apache.fop.fo.flow.Block) this);
-                    this.lastFOTextProcessed = tmpText;
-                } else if (getNameId() != FO_MARKER
-                        && getNameId() != FO_TITLE
-                        && getNameId() != FO_BOOKMARK_TITLE) {
-                    FONode fo = parent;
-                    int foNameId = fo.getNameId();
-                    while (foNameId != FO_BLOCK
-                            && foNameId != FO_MARKER
-                            && foNameId != FO_TITLE
-                            && foNameId != FO_BOOKMARK_TITLE
-                            && foNameId != FO_PAGE_SEQUENCE) {
-                        fo = fo.getParent();
-                        foNameId = fo.getNameId();
-                    }
-                    if (foNameId == FO_BLOCK) {
-                        tmpText.createBlockPointers((org.apache.fop.fo.flow.Block) fo);
-                        ((FObjMixed) fo).lastFOTextProcessed = tmpText;
-                    } else if (foNameId == FO_PAGE_SEQUENCE
-                                && tmpText.willCreateArea()) {
-                        log.error("Could not create block pointers."
-                                + " FOText w/o Block ancestor.");
-                    }
+            if (getNameId() == FO_BLOCK) {
+                lft.createBlockPointers((org.apache.fop.fo.flow.Block) this);
+                this.lastFOTextProcessed = lft;
+            } else if (getNameId() != FO_MARKER
+                    && getNameId() != FO_TITLE
+                    && getNameId() != FO_BOOKMARK_TITLE) {
+                FONode fo = parent;
+                int foNameId = fo.getNameId();
+                while (foNameId != FO_BLOCK
+                        && foNameId != FO_MARKER
+                        && foNameId != FO_TITLE
+                        && foNameId != FO_BOOKMARK_TITLE
+                        && foNameId != FO_PAGE_SEQUENCE) {
+                    fo = fo.getParent();
+                    foNameId = fo.getNameId();
+                }
+                if (foNameId == FO_BLOCK) {
+                    lft.createBlockPointers((org.apache.fop.fo.flow.Block) fo);
+                    ((FObjMixed) fo).lastFOTextProcessed = lft;
+                } else if (foNameId == FO_PAGE_SEQUENCE
+                            && lft.willCreateArea()) {
+                    log.error("Could not create block pointers."
+                            + " FOText w/o Block ancestor.");
+                }
+            }
+            this.addChildNode(lft);
+        }
+    }
+
+    private void sendCharacters() throws FOPException {
+
+        if (this.currentTextNode != null) {
+            FONodeIterator nodeIter
+                    = this.getChildNodes(this.currentTextNode);
+            FONode node;
+            while (nodeIter.hasNext()) {
+                node = nodeIter.nextNode();
+                assert (node instanceof FOText
+                        || node.getNameId() == FO_CHARACTER);
+                if (node.getNameId() == FO_CHARACTER) {
+                    node.startOfNode();
                 }
-                tmpText.endOfNode();
-                addChildNode(tmpText);
-                indexStart = indexEnd + 1;
-                indexEnd = (((lft.ca.length - charCount) < Short.MAX_VALUE)
-                    ? lft.ca.length : charCount + Short.MAX_VALUE) - 1;
+                node.endOfNode();
             }
         }
+        this.currentTextNode = null;
     }
 
     /** {@inheritDoc} */
     protected void addChildNode(FONode child) throws FOPException {
+
         flushText();
         if (!inMarker()) {
             if (child instanceof FOText || child.getNameId() == FO_CHARACTER) {
-                if (currentTextNode == null) {
-                    currentTextNode = child;
+                if (this.currentTextNode == null) {
+                    this.currentTextNode = child;
                 }
             } else {
                 // handle white-space for all text up to here
-                getFOEventHandler().whiteSpaceHandler
-                    .handleWhiteSpace(this, currentTextNode, child);
-                currentTextNode = null;
+                handleWhiteSpaceFor(this, child);
+                // send character[s]() events to the FOEventHandler
+                sendCharacters();
             }
         }
         super.addChildNode(child);
     }
-    
+
+    /** {@inheritDoc} */
+    public void finalizeNode() throws FOPException {
+
+        flushText();
+        if (!inMarker() || getNameId() == FO_MARKER) {
+            handleWhiteSpaceFor(this, null);
+        }
+
+    }
+
     /**
      * Returns a {@link CharIterator} over this FO's character content
      * 

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/RecursiveCharIterator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/RecursiveCharIterator.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/RecursiveCharIterator.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/RecursiveCharIterator.java Mon Jul  7 07:09:01 2008
@@ -113,7 +113,7 @@
      */
     public boolean hasNext() {
         while (curCharIter != null) {
-            if (curCharIter.hasNext() == false) {
+            if (!curCharIter.hasNext()) {
                 getNextCharIter();
             } else {
                 return true;

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLObj.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLObj.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLObj.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLObj.java Mon Jul  7 07:09:01 2008
@@ -214,7 +214,7 @@
      */
     protected void addCharacters(char[] data, int start, int length,
                                  PropertyList pList, Locator locator) {
-        String str = new String(data, start, length - start);
+        String str = new String(data, start, length);
         org.w3c.dom.Text text = doc.createTextNode(str);
         element.appendChild(text);
     }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java Mon Jul  7 07:09:01 2008
@@ -87,39 +87,49 @@
      * @param nextChild the node that will be added to the list
      *                  after firstTextNode
      */
-    public void handleWhiteSpace(FObjMixed fo, FONode firstTextNode, FONode nextChild) {
-        
+    public void handleWhiteSpace(FObjMixed fo,
+                                 FONode firstTextNode,
+                                 FONode nextChild) {
+
         Block currentBlock = null;
         int foId = fo.getNameId();
         
-        if (foId == Constants.FO_BLOCK) {
-            currentBlock = (Block) fo;
-            if (nestedBlockStack.isEmpty() || fo != nestedBlockStack.peek()) {
-                if (nextChild != null) {
-                    /* if already in a block, push the current block 
-                     * onto the stack of nested blocks
-                     */
-                    nestedBlockStack.push(currentBlock);
+        /* set the current block */
+        switch (foId) {
+            case Constants.FO_BLOCK:
+                currentBlock = (Block) fo;
+                if (nestedBlockStack.empty() || fo != nestedBlockStack.peek()) {
+                    if (nextChild != null) {
+                        /* if already in a block, push the current block 
+                         * onto the stack of nested blocks
+                         */
+                        nestedBlockStack.push(currentBlock);
+                    }
+                } else {
+                    if (nextChild == null) {
+                        nestedBlockStack.pop();
+                    }
                 }
-            } else {
-                if (nextChild == null) {
-                    nestedBlockStack.pop();
+                break;
+            
+            case Constants.FO_RETRIEVE_MARKER:
+                /* look for the nearest block ancestor, if any */
+                FONode ancestor = fo;
+                do {
+                    ancestor = ancestor.getParent();
+                } while (ancestor.getNameId() != Constants.FO_BLOCK
+                        && ancestor.getNameId() != Constants.FO_STATIC_CONTENT);
+                
+                if (ancestor.getNameId() == Constants.FO_BLOCK) {
+                    currentBlock = (Block) ancestor;
+                    nestedBlockStack.push(currentBlock);
                 }
-            }
-        } else if (foId == Constants.FO_RETRIEVE_MARKER) {
-            /* look for the nearest block ancestor, if any */
-            FONode ancestor = fo;
-            do {
-                ancestor = ancestor.getParent();
-            } while (ancestor.getNameId() != Constants.FO_BLOCK
-                    && ancestor.getNameId() != Constants.FO_STATIC_CONTENT);
+                break;
             
-            if (ancestor.getNameId() == Constants.FO_BLOCK) {
-                currentBlock = (Block) ancestor;
-                nestedBlockStack.push(currentBlock);
-            }
-        } else if (!nestedBlockStack.isEmpty()) {
-            currentBlock = (Block) nestedBlockStack.peek();
+            default:
+                if (!nestedBlockStack.empty()) {
+                    currentBlock = (Block) nestedBlockStack.peek();
+                }
         }
         
         if (currentBlock != null) {
@@ -132,8 +142,15 @@
             whiteSpaceTreatment = Constants.EN_IGNORE_IF_SURROUNDING_LINEFEED;
         }
         
+        endOfBlock = (nextChild == null && fo == currentBlock);
+        
         if (firstTextNode == null) {
-            //nothing to do but initialize related properties
+            //no text means no white-space to handle; return early
+            afterLinefeed = (fo == currentBlock && fo.firstChild == null);
+            nonWhiteSpaceCount = 0;
+            if (endOfBlock) {
+                handlePendingInlines();
+            }
             return;
         }
         
@@ -144,13 +161,32 @@
                 || currentBlock == null
                 || (foId == Constants.FO_RETRIEVE_MARKER
                         && fo.getParent() == currentBlock)) {
-            afterLinefeed = (
-                    (firstTextNode == fo.firstChild)
-                        || (firstTextNode.siblings[0].getNameId()
-                                == Constants.FO_BLOCK));
+            if (firstTextNode == fo.firstChild) {
+                afterLinefeed = true;
+            } else {
+                int previousChildId = firstTextNode.siblings[0].getNameId();
+                afterLinefeed = (previousChildId == Constants.FO_BLOCK
+                        || previousChildId == Constants.FO_TABLE_AND_CAPTION
+                        || previousChildId == Constants.FO_TABLE
+                        || previousChildId == Constants.FO_LIST_BLOCK
+                        || previousChildId == Constants.FO_BLOCK_CONTAINER);
+            }
         }
         
-        endOfBlock = (nextChild == null && fo == currentBlock);
+        if (foId == Constants.FO_WRAPPER) {
+            FONode parent = fo.parent;
+            int parentId = parent.getNameId();
+            while (parentId == Constants.FO_WRAPPER) {
+                parent = parent.parent;
+                parentId = parent.getNameId();
+            }
+            if (parentId == Constants.FO_FLOW
+                    || parentId == Constants.FO_STATIC_CONTENT
+                    || parentId == Constants.FO_BLOCK_CONTAINER
+                    || parentId == Constants.FO_TABLE_CELL) {
+                endOfBlock = (nextChild == null);
+            }
+        }
         
         if (nextChild != null) {
             int nextChildId = nextChild.getNameId();
@@ -167,26 +203,8 @@
         handleWhiteSpace();
         
         if (fo == currentBlock 
-                && pendingInlines != null 
-                && !pendingInlines.isEmpty()) {
-            /* current FO is a block, and has pending inlines */
-            if (endOfBlock || nextChildIsBlockLevel) {
-                if (nonWhiteSpaceCount == 0) {
-                    /* handle white-space for all pending inlines*/
-                    PendingInline p;
-                    for (int i = pendingInlines.size(); --i >= 0;) {
-                        p = (PendingInline)pendingInlines.get(i);
-                        charIter = (RecursiveCharIterator)p.firstTrailingWhiteSpace;
-                        handleWhiteSpace();
-                        pendingInlines.remove(p);
-                    }
-                } else {
-                    /* there is non-white-space text between the pending
-                     * inline(s) and the end of the block;
-                     * clear list of pending inlines */
-                    pendingInlines.clear();
-                }
-            }
+                && (endOfBlock || nextChildIsBlockLevel)) {
+            handlePendingInlines();
         }
         
         if (nextChild == null) {
@@ -333,6 +351,26 @@
         pendingInlines.add(new PendingInline(fo, firstWhiteSpaceInSeq));
     }
     
+    private void handlePendingInlines() {
+        if (!(pendingInlines == null || pendingInlines.isEmpty())) {
+            if (nonWhiteSpaceCount == 0) {
+                /* handle white-space for all pending inlines*/
+                PendingInline p;
+                for (int i = pendingInlines.size(); --i >= 0;) {
+                    p = (PendingInline)pendingInlines.get(i);
+                    charIter = (RecursiveCharIterator)p.firstTrailingWhiteSpace;
+                    handleWhiteSpace();
+                    pendingInlines.remove(p);
+                }
+            } else {
+                /* there is non-white-space text between the pending
+                 * inline(s) and the end of the block;
+                 * clear list of pending inlines */
+                pendingInlines.clear();
+            }
+        }
+    }
+    
     /**
      * Helper class, used during white-space handling to look ahead, and
      * see if the next character is a linefeed (or if there will be

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/expr/PropertyException.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/expr/PropertyException.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/expr/PropertyException.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/expr/PropertyException.java Mon Jul  7 07:09:01 2008
@@ -37,7 +37,7 @@
 
     /**
      * Constructor
-     * @param the Exception causing this PropertyException
+     * @param cause the Exception causing this PropertyException
      */
     public PropertyException(Exception cause) {
         super(cause);

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/extensions/xmp/XMPMetadata.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/extensions/xmp/XMPMetadata.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/extensions/xmp/XMPMetadata.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/extensions/xmp/XMPMetadata.java Mon Jul  7 07:09:01 2008
@@ -22,7 +22,7 @@
 import java.io.Serializable;
 
 import org.apache.fop.fo.extensions.ExtensionAttachment;
-import org.apache.fop.util.XMLizable;
+import org.apache.xmlgraphics.util.XMLizable;
 import org.apache.xmlgraphics.xmp.Metadata;
 import org.apache.xmlgraphics.xmp.XMPConstants;
 import org.xml.sax.ContentHandler;

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractPageNumberCitation.java Mon Jul  7 07:09:01 2008
@@ -22,6 +22,7 @@
 import java.awt.Color;
 
 import org.xml.sax.Locator;
+import org.xml.sax.Attributes;
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.Length;
@@ -104,9 +105,9 @@
     }
 
     /** {@inheritDoc} */
-    protected void startOfNode() throws FOPException {
-        super.startOfNode();
-        if (refId.equals("")) {
+    public void processNode(String elementName, Locator locator, Attributes attlist, PropertyList pList) throws FOPException {
+        super.processNode(elementName, locator, attlist, pList);
+        if (!inMarker() && (refId == null || "".equals(refId))) {
             missingPropertyError("ref-id");
         }
     }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java Mon Jul  7 07:09:01 2008
@@ -16,20 +16,22 @@
  */
 
 /* $Id$ */
+
 package org.apache.fop.fo.flow;
 
+import java.util.Iterator;
+
+import org.xml.sax.Locator;
+
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOText;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FObjMixed;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.ValidationException;
-import org.apache.fop.fo.flow.table.TableFObj;
 import org.apache.fop.fo.flow.table.Table;
-import org.apache.fop.apps.FOPException;
-import org.xml.sax.Locator;
-
-import java.util.Iterator;
+import org.apache.fop.fo.flow.table.TableFObj;
 
 /**
  * Abstract base class for the <a href="http://www.w3.org/TR/xsl/#fo_retrieve-marker">
@@ -80,7 +82,7 @@
     }
 
     private PropertyList createPropertyListFor(FObj fo, PropertyList parent) {
-        return getFOEventHandler().getPropertyListMaker().make(fo, parent);
+        return getBuilderContext().getPropertyListMaker().make(fo, parent);
     }
 
     private void cloneSingleNode(FONode child, FONode newParent,
@@ -100,16 +102,10 @@
                         getLocator(),
                         pList,
                         newPropertyList);
-                if (newChild instanceof TableFObj) {
-                    // TODO calling startOfNode (and endOfNode, below) on other fobjs may
-                    // have undesirable side-effects. This is really ugly and will need to
-                    // be addressed sooner or later
-                    ((TableFObj) newChild).startOfNode();
-                }
                 addChildTo(newChild, (FObj) newParent);
                 if (newChild.getNameId() == FO_TABLE) {
                     Table t = (Table) child;
-                    cloneSubtree(t.getColumns().listIterator(),
+                    cloneSubtree(t.getColumns().iterator(),
                             newChild, marker, newPropertyList);
                     cloneSingleNode(t.getTableHeader(),
                             newChild, marker, newPropertyList);
@@ -118,18 +114,15 @@
                 }
                 cloneSubtree(child.getChildNodes(), newChild,
                         marker, newPropertyList);
-                if (newChild instanceof TableFObj) {
-                    // TODO this is ugly
-                    ((TableFObj) newChild).endOfNode();
-                }
             } else if (child instanceof FOText) {
                 FOText ft = (FOText) newChild;
                 ft.bind(parentPropertyList);
                 addChildTo(newChild, (FObj) newParent);
             }
-            if (newChild instanceof FObjMixed) {
-                handleWhiteSpaceFor((FObjMixed) newChild);
-            }
+
+            // trigger end-of-node white-space handling
+            // and finalization for table-FOs
+            newChild.finalizeNode();
         }
     }
 
@@ -167,7 +160,7 @@
         }
         cloneSubtree(marker.getChildNodes(), this,
                         marker, propertyList);
-        handleWhiteSpaceFor(this);
+        handleWhiteSpaceFor(this, null);
     }
 
     /**

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/Marker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/Marker.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/Marker.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/Marker.java Mon Jul  7 07:09:01 2008
@@ -26,8 +26,8 @@
 import org.xml.sax.Locator;
 
 import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.FOEventHandler;
 import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.FOTreeBuilderContext;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FObjMixed;
 import org.apache.fop.fo.PropertyList;
@@ -84,10 +84,10 @@
     
     /** {@inheritDoc} */
     protected void startOfNode() {
-        FOEventHandler foEventHandler = getFOEventHandler(); 
+        FOTreeBuilderContext builderContext = getBuilderContext(); 
         // Push a new property list maker which will make MarkerPropertyLists.
-        savePropertyListMaker = foEventHandler.getPropertyListMaker();
-        foEventHandler.setPropertyListMaker(new PropertyListMaker() {
+        savePropertyListMaker = builderContext.getPropertyListMaker();
+        builderContext.setPropertyListMaker(new PropertyListMaker() {
             public PropertyList make(FObj fobj, PropertyList parentPropertyList) {
                 PropertyList pList = new MarkerPropertyList(fobj, parentPropertyList);
                 descendantPropertyLists.put(fobj, pList);
@@ -100,7 +100,7 @@
     protected void endOfNode() throws FOPException {
         super.endOfNode();
         // Pop the MarkerPropertyList maker.
-        getFOEventHandler().setPropertyListMaker(savePropertyListMaker);
+        getBuilderContext().setPropertyListMaker(savePropertyListMaker);
         savePropertyListMaker = null;
     }
 

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/BorderResolver.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/BorderResolver.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/BorderResolver.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/BorderResolver.java Mon Jul  7 07:09:01 2008
@@ -40,7 +40,7 @@
      * 
      * @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.

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/CollapsingBorderResolver.java Mon Jul  7 07:09:01 2008
@@ -73,7 +73,7 @@
      */
     private abstract class Resolver {
 
-        protected TableBody tablePart;
+        protected TablePart tablePart;
 
         protected boolean firstInPart;
 
@@ -177,7 +177,7 @@
             }
         }
 
-        void startPart(TableBody part) {
+        void startPart(TablePart part) {
             tablePart = part;
             firstInPart = true;
             borderStartTableAndBody = collapsingBorderModel.determineWinner(table.borderStart,
@@ -415,8 +415,8 @@
     }
 
     /** {@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 @@
                     leadingBorders.add(border);
                 }
             }
-            if (part.isTableFooter()) {
+            if (part instanceof TableFooter) {
                 resolverInFooter = new ResolverInFooter();
                 delegate = resolverInFooter;
             } else {

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/FixedColRowGroupBuilder.java Mon Jul  7 07:09:01 2008
@@ -143,8 +143,8 @@
     }
 
     /** {@inheritDoc} */
-    void endRow(TableBody body) {
-        handleRowEnd(body);
+    void endRow(TablePart part) {
+        handleRowEnd(part);
     }
 
     private void handleRowEnd(TableCellContainer container) {
@@ -172,7 +172,7 @@
     }
 
     /** {@inheritDoc} */
-    void startTablePart(TableBody part) {
+    void startTablePart(TablePart part) {
         firstInPart = true;
         borderResolver.startPart(part);
     }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/PrimaryGridUnit.java Mon Jul  7 07:09:01 2008
@@ -38,7 +38,7 @@
     /** Cell layout manager. */
     private TableCellLayoutManager cellLM;
     /** List of Knuth elements representing the contents of the cell. */
-    private LinkedList elements;
+    private List elements;
 
     /** Index of the row where this cell starts. */
     private int rowIndex;
@@ -78,12 +78,12 @@
      * 
      * @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() {
@@ -106,11 +106,11 @@
      *
      * @param elements a list of ListElement (?)
      */
-    public void setElements(LinkedList elements) {
+    public void setElements(List elements) {
         this.elements = elements;
     }
 
-    public LinkedList getElements() {
+    public List getElements() {
         return this.elements;
     }
 

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/RowGroupBuilder.java Mon Jul  7 07:09:01 2008
@@ -57,7 +57,7 @@
 
     /**
      * 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 @@
     /**
      * 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

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/SeparateBorderResolver.java Mon Jul  7 07:09:01 2008
@@ -31,7 +31,7 @@
     }
 
     /** {@inheritDoc} */
-    public void startPart(TableBody part) {
+    public void startPart(TablePart part) {
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/Table.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/Table.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/Table.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/Table.java Mon Jul  7 07:09:01 2008
@@ -76,8 +76,8 @@
     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;
@@ -157,10 +157,8 @@
         this.propList = pList;
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public void startOfNode() throws FOPException {
+    /** {@inheritDoc} */
+    protected void startOfNode() throws FOPException {
         super.startOfNode();
         getFOEventHandler().startTable(this);
     }
@@ -200,7 +198,9 @@
                 } else {
                     tableFooterFound = true;
                     if (tableBodyFound) {
-                        nodesOutOfOrderError(loc, "fo:table-footer", "(table-body+)", true);
+                        if (getUserAgent().validateStrictly()) {
+                            nodesOutOfOrderError(loc, "fo:table-footer", "(table-body+)", true);
+                        }
                         if (!isSeparateBorderModel()) {
                             TableEventProducer eventProducer = TableEventProducer.Provider.get(
                                     getUserAgent().getEventBroadcaster());
@@ -216,11 +216,15 @@
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public void endOfNode() throws FOPException {
+    /** {@inheritDoc} */
+    protected void endOfNode() throws FOPException {
+        super.endOfNode();
+        getFOEventHandler().endTable(this);
+    }
 
+    /** {@inheritDoc} */
+    public void finalizeNode() throws FOPException {
+        
         if (!tableBodyFound) {
            missingChildElementError(
                    "(marker*,table-column*,table-header?,table-footer?"
@@ -242,13 +246,10 @@
             this.propList = null;
             rowGroupBuilder = null;
         }
-        getFOEventHandler().endTable(this);
-
+        
     }
-
-    /**
-     * {@inheritDoc}
-     */
+    
+    /** {@inheritDoc} */
     protected void addChildNode(FONode child) throws FOPException {
 
         int childId = child.getNameId();
@@ -277,10 +278,10 @@
             }
             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);
@@ -402,12 +403,12 @@
     }
 
     /** @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;
     }
 
@@ -521,17 +522,17 @@
         return FO_TABLE;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public FONode clone(FONode parent, boolean removeChildren)
         throws FOPException {
         Table clone = (Table) super.clone(parent, removeChildren);
-        clone.columnsFinalized = false;
         if (removeChildren) {
             clone.columns = new ArrayList();
+            clone.columnsFinalized = false;
+            clone.columnNumberManager = new ColumnNumberManager();
             clone.tableHeader = null;
             clone.tableFooter = null;
+            clone.rowGroupBuilder = null;
         }
         return clone;
     }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCell.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCell.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCell.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCell.java Mon Jul  7 07:09:01 2008
@@ -81,7 +81,7 @@
         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();
@@ -91,17 +91,24 @@
     }
 
     /** {@inheritDoc} */
-    public void startOfNode() throws FOPException {
+    protected void startOfNode() throws FOPException {
         super.startOfNode();
         getFOEventHandler().startCell(this);
     }
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * FOEventHandler that we are at the end of the flow.
+     * FOEventHandler that we are at the end of the table-cell.
      * {@inheritDoc}
      */
-    public void endOfNode() throws FOPException {
+    protected void endOfNode() throws FOPException {
+        super.endOfNode();
+        getFOEventHandler().endCell(this);
+    }
+
+    /** {@inheritDoc} */
+    public void finalizeNode() throws FOPException {
+        
         if (!blockItemFound) {
             missingChildElementError("marker* (%block;)+", true);
         }
@@ -111,9 +118,9 @@
                     getUserAgent().getEventBroadcaster());
             eventProducer.startEndRowUnderTableRowWarning(this, getLocator());
         }
-        getFOEventHandler().endCell(this);
+        
     }
-
+    
     /**
      * {@inheritDoc}
      * <br>XSL Content Model: marker* (%block;)+

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCellContainer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCellContainer.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCellContainer.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableCellContainer.java Mon Jul  7 07:09:01 2008
@@ -95,9 +95,9 @@
     /**
      * 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() {

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableColumn.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableColumn.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableColumn.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableColumn.java Mon Jul  7 07:09:01 2008
@@ -239,7 +239,7 @@
             sb.append(" number-columns-spanned=")
                 .append(getNumberColumnsSpanned());
         }
-        sb.append(" column-width=").append(getColumnWidth());
+        sb.append(" column-width=").append(((Property)getColumnWidth()).getString());
         return sb.toString();
     }
 

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableEventProducer.java?rev=674497&r1=674496&r2=674497&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableEventProducer.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/fo/flow/table/TableEventProducer.java Mon Jul  7 07:09:01 2008
@@ -145,6 +145,17 @@
             Locator loc) throws PropertyException;
 
     /**
+     * @param source the event source
+     * @param elementName the name of the context node
+     * @param propValue the user-specified value of the column-number property
+     * @param columnNumber the generated value for the column-number property
+     * @param loc the location of the error or null
+     * @event.severity WARN
+     */
+    void forceNextColumnNumber(Object source, String elementName, Number propValue,
+                               int columnNumber, Locator loc);
+
+    /**
      * Break ignored due to row spanning.
      * @param source the event source
      * @param elementName the name of the context node



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org


Mime
View raw message