]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
added support for markers in fo tree
authorKeiron Liddle <keiron@apache.org>
Fri, 15 Nov 2002 11:56:29 +0000 (11:56 +0000)
committerKeiron Liddle <keiron@apache.org>
Fri, 15 Nov 2002 11:56:29 +0000 (11:56 +0000)
bit of a cleanup

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195539 13f79535-47bb-0310-9956-ffa450edef68

26 files changed:
src/org/apache/fop/apps/StructureHandler.java
src/org/apache/fop/datatypes/LengthBase.java
src/org/apache/fop/fo/FONode.java
src/org/apache/fop/fo/FOText.java
src/org/apache/fop/fo/FObj.java
src/org/apache/fop/fo/FObjMixed.java
src/org/apache/fop/fo/RecursiveCharIterator.java
src/org/apache/fop/fo/flow/BasicLink.java
src/org/apache/fop/fo/flow/BidiOverride.java
src/org/apache/fop/fo/flow/Block.java
src/org/apache/fop/fo/flow/BlockContainer.java
src/org/apache/fop/fo/flow/Inline.java
src/org/apache/fop/fo/flow/InlineContainer.java
src/org/apache/fop/fo/flow/Leader.java
src/org/apache/fop/fo/flow/ListBlock.java
src/org/apache/fop/fo/flow/ListItem.java
src/org/apache/fop/fo/flow/ListItemBody.java
src/org/apache/fop/fo/flow/ListItemLabel.java
src/org/apache/fop/fo/flow/Marker.java
src/org/apache/fop/fo/flow/Table.java
src/org/apache/fop/fo/flow/TableAndCaption.java
src/org/apache/fop/fo/flow/TableBody.java
src/org/apache/fop/fo/flow/TableCaption.java
src/org/apache/fop/fo/flow/TableCell.java
src/org/apache/fop/fo/flow/Wrapper.java
src/org/apache/fop/layoutmgr/LMiter.java

index 0d68ef8bf2ac023202e65236282c65fff8c4827c..9ba7da70c28bc69430e6cd9d9a0eaf58696dc4a0 100644 (file)
@@ -8,6 +8,7 @@
 package org.apache.fop.apps;
 
 // Java
+import java.util.Set;
 import java.util.HashSet;
 
 // Avalon
@@ -31,12 +32,12 @@ public class StructureHandler extends AbstractLogEnabled {
        The current set of id's in the FO tree
        This is used so we know if the FO tree contains duplicates
      */
-    private HashSet idReferences = new HashSet();
+    private Set idReferences = new HashSet();
 
     public StructureHandler() {
     }
 
-    public HashSet getIDReferences() {
+    public Set getIDReferences() {
         return idReferences;
     }
 
index c2d1d2cdc0380aeed3ebd1460f3616dc110ce2d5..0606fbfd62d8c0f2d15651f43275ad4a1aaa32d5 100644 (file)
@@ -70,9 +70,9 @@ public class LengthBase implements PercentBase {
             return propertyList.get("font-size").getLength().mvalue();
         case INH_FONTSIZE:
             return propertyList.getInherited("font-size").getLength().mvalue();
-        case CONTAINING_BOX:
+        //case CONTAINING_BOX:
             // depends on property?? inline-progression vs block-progression
-            return parentFO.getContentWidth();
+            //return parentFO.getContentWidth();
         case CONTAINING_REFAREA:    // example: start-indent, end-indent
          {
             //FONode fo;
index 4f4c34af9b45f8951d6a86e69f68c0c41a477e34..c212b85b96fb72cdbdaf888a4d2dbb79c97c75a9 100644 (file)
@@ -106,11 +106,22 @@ public abstract class FONode {
      * this FObj.
      */
     public ListIterator getChildren(FONode childNode) {
-    return null;
+        return null;
     }
 
     public CharIterator charIterator() {
-    return new OneCharIterator(CharUtilities.CODE_EOT);
+        return new OneCharIterator(CharUtilities.CODE_EOT);
     }
 
+    /**
+     * This is a quick check to see if it is a marker.
+     * This is needed since there is no other quick way of checking
+     * for a marker and not adding to the child list.
+     *
+     * @return true if this is a marker
+     */
+    protected boolean isMarker() {
+        return false;
+    }
 }
+
index 13dbf0f4f1a5feed48126ee911afce200df2e329..6393fdece3590f29b163d8a0949118eb2cc3bcbc 100644 (file)
@@ -51,6 +51,15 @@ public class FOText extends FObj {
         structHandler.characters(ca, start, length);
     }
 
+    /**
+     * Check if this text node will create an area.
+     * This means either there is non-whitespace or it is
+     * preserved whitespace.
+     * Maybe this just needs to check length > 0, since char iterators
+     * handle whitespace.
+     *
+     * @return true if this will create an area in the output
+     */
     public boolean willCreateArea() {
         if (textInfo.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE &&
                 length > 0) {
index 1a3061de5ca55597753f055fa546cda079741083..1f977da8873460c1ed44ee66f0b8e949eb5f179a 100644 (file)
@@ -24,65 +24,73 @@ import java.util.ListIterator;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Set;
+import java.util.Map;
 
 /**
  * base class for representation of formatting objects and their processing
  */
 public class FObj extends FONode {
-    protected StructureHandler structHandler;
-    public PropertyList properties;
-    protected PropertyManager propMgr;
-    protected String areaClass = AreaClass.UNASSIGNED;
-    protected String id = null;
+    private final static String FO_URI = "http://www.w3.org/1999/XSL/Format";
 
     /**
-     * value of marker before layout begins
+     * Static property list builder that converts xml attributes
+     * into fo properties. This is static since the underlying
+     * property mappings for fo are also static.
      */
-    public static final int START = -1000;
+    protected static PropertyListBuilder plb = null;
 
     /**
-     * value of marker after break-after
+     * Structure handler used to notify structure events
+     * such as start end element.
      */
-    public static final int BREAK_AFTER = -1001;
+    protected StructureHandler structHandler;
 
     /**
-     * where the layout was up to.
-     * for FObjs it is the child number
-     * for FOText it is the character number
+     * Formatting properties for this fo element.
      */
-    protected int marker = START;
-
-    protected ArrayList children = new ArrayList(); // made public for searching for id's
-
-    protected boolean isInTableCell = false;
+    public PropertyList properties;
 
-    protected int forcedStartOffset = 0;
-    protected int forcedWidth = 0;
+    /**
+     * Property manager for handler some common properties.
+     */
+    protected PropertyManager propMgr;
 
-    protected int widows = 0;
-    protected int orphans = 0;
+    /**
+     * Id of this fo element of null if no id.
+     */
+    protected String id = null;
 
-    // count of areas generated-by/returned-by
-    public int areasGenerated = 0;
+    /**
+     * The children of this node.
+     */
+    protected ArrayList children = null;
 
-    // markers
-    protected HashMap markers;
+    /**
+     * Markers added to this element.
+     */
+    protected Map markers = null;
 
+    /**
+     * Create a new formatting object.
+     * All formatting object classes extend this class.
+     *
+     * @param parent the parent node
+     */
     public FObj(FONode parent) {
         super(parent);
-        markers = new HashMap();
-        if (parent instanceof FObj) {
-            this.areaClass = ((FObj) parent).areaClass;
-        }
     }
 
+    /**
+     * Set the name of this element.
+     * The prepends "fo:" to the name to indicate it is in the fo namespace.
+     *
+     * @param str the xml element name
+     */
     public void setName(String str) {
         name = "fo:" + str;
     }
 
-    protected static PropertyListBuilder plb = null;
-
     protected PropertyListBuilder getListBuilder() {
         if (plb == null) {
             plb = new PropertyListBuilder();
@@ -105,7 +113,6 @@ public class FObj extends FONode {
      * will be altered for the next element.
      */
     public void handleAttrs(Attributes attlist) throws FOPException {
-        String uri = "http://www.w3.org/1999/XSL/Format";
         FONode par = parent;
         while (par != null && !(par instanceof FObj)) {
             par = par.parent;
@@ -114,7 +121,7 @@ public class FObj extends FONode {
         if (par != null) {
             props = ((FObj) par).properties;
         }
-        properties = getListBuilder().makeList(uri, name, attlist, props,
+        properties = getListBuilder().makeList(FO_URI, name, attlist, props,
                                                (FObj) par);
         properties.setFObj(this);
         this.propMgr = makePropertyManager(properties);
@@ -126,10 +133,27 @@ public class FObj extends FONode {
         return new PropertyManager(propertyList);
     }
 
+    /**
+     * Add the child to this object.
+     *
+     * @param child the child node to add
+     */
     protected void addChild(FONode child) {
-        children.add(child);
+        if (containsMarkers() && child.isMarker()) {
+            addMarker((Marker)child);
+        } else {
+            if (children == null) {
+                children = new ArrayList();
+            }
+            children.add(child);
+        }
     }
 
+    /**
+     * Set the structure handler for handling structure events.
+     *
+     * @param st the structure handler
+     */
     public void setStructHandler(StructureHandler st) {
         structHandler = st;
     }
@@ -144,12 +168,18 @@ public class FObj extends FONode {
         return (properties.get(name));
     }
 
+    /**
+     * Setup the id for this formatting object.
+     * Most formatting objects can have an id that can be referenced.
+     * This methods checks that the id isn't already used by another
+     * fo and sets the id attribute of this object.
+     */
     protected void setupID() {
         Property prop = this.properties.get("id");
         if (prop != null) {
             String str = prop.getString();
             if (str != null && !str.equals("")) {
-                HashSet idrefs = structHandler.getIDReferences();
+                Set idrefs = structHandler.getIDReferences();
                 if (!idrefs.contains(str)) {
                     id = str;
                     idrefs.add(id);
@@ -160,33 +190,43 @@ public class FObj extends FONode {
         }
     }
 
+    /**
+     * Get the id string for this formatting object.
+     * This will be unique for the fo document.
+     *
+     * @return the id string or null if not set
+     */
     public String getID() {
         return id;
     }
 
     /**
-     * Return the "content width" of the areas generated by this FO.
-     * This is used by percent-based properties to get the dimension of
-     * the containing block.
-     * If an FO has a property with a percentage value, that value
-     * is usually calculated on the basis of the corresponding dimension
-     * of the area which contains areas generated by the FO.
-     * NOTE: subclasses of FObj should implement this to return a reasonable
-     * value!
+     * Check if this formatting object generates reference areas.
+     *
+     * @return true if generates reference areas
      */
-    public int getContentWidth() {
-        return 0;
-    }
-
     public boolean generatesReferenceAreas() {
         return false;
     }
 
-
+    /**
+     * Check if this formatting object generates inline areas.
+     *
+     * @return true if generates inline areas
+     */
     public boolean generatesInlineAreas() {
         return true;
     }
 
+    /**
+     * Check if this formatting object may contain markers.
+     *
+     * @return true if this can contian markers
+     */
+    protected boolean containsMarkers() {
+        return false;
+    }
+
     /**
      * Set writing mode for this FO.
      * Find nearest ancestor, including self, which generates
@@ -231,147 +271,57 @@ public class FObj extends FONode {
      * this FObj.
      */
     public ListIterator getChildren(FONode childNode) {
-        int i = children.indexOf(childNode);
-        if (i >= 0) {
-            return children.listIterator(i);
-        } else {
-            return null;
-        }
-    }
-
-    public void setIsInTableCell() {
-        this.isInTableCell = true;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            Object obj = this.children.get(i);
-            if (obj instanceof FObj) {
-                FObj child = (FObj) obj;
-                child.setIsInTableCell();
-            }
-        }
-    }
-
-    public void forceStartOffset(int offset) {
-        this.forcedStartOffset = offset;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            Object obj = this.children.get(i);
-            if (obj instanceof FObj) {
-                FObj child = (FObj) obj;
-                child.forceStartOffset(offset);
-            }
-        }
-    }
-
-    public void forceWidth(int width) {
-        this.forcedWidth = width;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            Object obj = this.children.get(i);
-            if (obj instanceof FObj) {
-                FObj child = (FObj) obj;
-                child.forceWidth(width);
-            }
-        }
-    }
-
-    public void resetMarker() {
-        this.marker = START;
-        int numChildren = this.children.size();
-        for (int i = 0; i < numChildren; i++) {
-            Object obj = this.children.get(i);
-            if (obj instanceof FObj) {
-                FObj child = (FObj) obj;
-                child.resetMarker();
+        if (children != null) {
+            int i = children.indexOf(childNode);
+            if (i >= 0) {
+                return children.listIterator(i);
             }
         }
-    }
-
-    public void setWidows(int wid) {
-        widows = wid;
-    }
-
-    public void setOrphans(int orph) {
-        orphans = orph;
-    }
-
-    public void removeAreas() {
-        // still to do
-    }
-
-    /**
-     * At the start of a new span area layout may be partway through a
-     * nested FO, and balancing requires rollback to this known point.
-     * The snapshot records exactly where layout is at.
-     * @param snapshot a ArrayList of markers (Integer)
-     * @returns the updated ArrayList of markers (Integers)
-     */
-    public ArrayList getMarkerSnapshot(ArrayList snapshot) {
-        snapshot.add(new Integer(this.marker));
-
-        // terminate if no kids or child not yet accessed
-        if (this.marker < 0) {
-            return snapshot;
-        } else if (children.isEmpty()) {
-            return snapshot;
-        } else {
-            return ( (FObj) children.get(this.marker)).getMarkerSnapshot(
-                     snapshot);
-        }
+        return null;
     }
 
     /**
-     * When balancing occurs, the flow layout() method restarts at the
-     * point specified by the current marker snapshot, which is retrieved
-     * and restored using this method.
-     * @param snapshot the ArrayList of saved markers (Integers)
+     * Add the marker to this formatting object.
+     * If this object can contain markers it checks that the marker
+     * has a unique class-name for this object and that it is
+     * the first child.
      */
-    public void rollback(ArrayList snapshot) {
-        this.marker = ((Integer) snapshot.get(0)).intValue();
-        snapshot.remove(0);
-
-        if (this.marker == START) {
-            // make sure all the children of this FO are also reset
-            resetMarker();
-            return;
-        } else if ((this.marker == -1) || children.isEmpty()) {
-            return;
-        }
-
-        int numChildren = this.children.size();
-
-        if (this.marker <= START) {
-            return;
-        }
-
-        for (int i = this.marker + 1; i < numChildren; i++) {
-            Object obj = this.children.get(i);
-            if (obj instanceof FObj) {
-                FObj child = (FObj) obj;
-                child.resetMarker();
+    public void addMarker(Marker marker) {
+        String mcname = marker.getMarkerClassName();
+        if (children != null) {
+            // check for empty children
+            for (Iterator iter = children.iterator(); iter.hasNext();) {
+                FONode node = (FONode)iter.next();
+                if (node instanceof FOText) {
+                    FOText text = (FOText)node;
+                    if (text.willCreateArea()) {
+                        getLogger().error("fo:marker must be an initial child: " + mcname);
+                        return;
+                    } else {
+                        iter.remove();
+                    }
+                } else {
+                    getLogger().error("fo:marker must be an initial child: " + mcname);
+                    return;
+                }
             }
         }
-        ((FObj) children.get(this.marker)).rollback(snapshot);
-    }
-
-
-    public void addMarker(Marker marker) throws FOPException {
-        String mcname = marker.getMarkerClassName();
-        if (!markers.containsKey(mcname) && children.isEmpty()) {
+        if (markers == null) {
+            markers = new HashMap();
+        }
+        if (!markers.containsKey(mcname)) {
             markers.put(mcname, marker);
         } else {
-            getLogger().error("fo:marker must be an initial child," + "and 'marker-class-name' must be unique for same parent");
-            throw new FOPException(
-              "fo:marker must be an initial child," + "and 'marker-class-name' must be unique for same parent");
+            getLogger().error("fo:marker 'marker-class-name' must be unique for same parent: " + mcname);
         }
     }
 
     public boolean hasMarkers() {
-        return !markers.isEmpty();
+        return markers != null && !markers.isEmpty();
     }
 
-    public ArrayList getMarkers() {
-        return new ArrayList(markers.values());
+    public Map getMarkers() {
+        return markers;
     }
 
     /**
index 9e8dd79dc9d49949603ec49ecf3c79f3ae1a99ed..a3373e593d147066701a84dcfe76b97d719f33db 100644 (file)
@@ -22,7 +22,7 @@ import java.util.List;
  * and their processing
  */
 public class FObjMixed extends FObj {
-    TextInfo textInfo = null;
+    protected TextInfo textInfo = null;
     protected FontInfo fontInfo = null;
 
     public FObjMixed(FONode parent) {
@@ -35,8 +35,10 @@ public class FObjMixed extends FObj {
     }
 
     public void addLayoutManager(List lms) {
-        lms.add(new InlineStackingLayoutManager(this,
+        if (children != null) {
+            lms.add(new InlineStackingLayoutManager(this,
                      new LMiter(children.listIterator())));
+        }
     }
 
     protected void addCharacters(char data[], int start, int length) {
@@ -54,7 +56,6 @@ public class FObjMixed extends FObj {
     }
 
     public void setup() {
-
         if (this.properties != null) {
             setupID();
         }
index c39f886a7c8ae2c530a722f223dbd0a8ba40c064..4317571bff7d5036ff5d4f67de74e64e0e6c9b51 100644 (file)
@@ -54,7 +54,7 @@ public class RecursiveCharIterator extends AbstractCharIterator {
 
 
     private void getNextCharIter() {
-        if (childIter.hasNext()) {
+        if (childIter != null && childIter.hasNext()) {
             this.curChild = (FONode) childIter.next();
             this.curCharIter = curChild.charIterator();
         } else {
index bd1b72088734d2f782309ebfc07b6cd700fa1be9..06cf9352766871590f45219e2f6992f2893a6dd6 100644 (file)
@@ -120,8 +120,13 @@ public class BasicLink extends Inline {
 
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
     /**
      * Link resolving for resolving internal links.
+     * This is static since it is independant of the link fo.
      */
     protected static class LinkResolver implements Resolveable, Serializable {
         private boolean resolved = false;
index 280dff4d96feaf71571942ed35cace9578dce718..e23403339428010e83e3bdffdc06cdf1a5535996 100644 (file)
@@ -74,6 +74,10 @@ public class BidiOverride extends FObjMixed {
 
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
     /**
      * If this bidi has a different writing mode direction
      * ltr or rtl than its parent writing mode then this
index 47b23f11e5d468fc6d8a891a4dbe452d936c7947..296e45dbfe35f05c1c0bbe461b23eaee8b15caa6 100644 (file)
@@ -52,9 +52,6 @@ public class Block extends FObjMixed {
     int blockWidows;
     int blockOrphans;
 
-    int areaHeight = 0;
-    int contentWidth = 0;
-
     String id;
     int span;
     private int wsTreatment; //ENUMERATION
@@ -169,19 +166,10 @@ public class Block extends FObjMixed {
 
     }
 
-    public int getAreaHeight() {
-        return areaHeight;
+    protected boolean containsMarkers() {
+        return true;
     }
 
-
-    /**
-     * Return the content width of the boxes generated by this FO.
-     */
-    public int getContentWidth() {
-        return contentWidth; // getAllocationWidth()??
-    }
-
-
     public int getSpan() {
         return this.span;
     }
index ab64158b6494be1c3c844cd6efee37cccb9a4ec3..5e5ee18ce83623e82202bc314c6de916a49313e3 100644 (file)
@@ -78,8 +78,6 @@ public class BlockContainer extends FObj {
             // this.properties.get("width");
             // this.properties.get("writing-mode");
 
-            this.marker = 0;
-
             this.backgroundColor =
                 this.properties.get("background-color").getColorType();
 
@@ -97,6 +95,10 @@ public class BlockContainer extends FObj {
         return false;
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
     public int getSpan() {
         return this.span;
     }
index dff52afda01270324565e47f78cb6931bf357e75..2e6d2f90fc1552dad7e788913465814f8aa420eb 100644 (file)
@@ -87,6 +87,9 @@ public class Inline extends FObjMixed {
         }
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
 
     public CharIterator charIterator() {
         return new InlineCharIterator(this, propMgr.getBorderAndPadding());
index f6521cab43b8df848a1ebfa54876573f98100825..6959e3423aee6d42d5cd4d00c812393e96c56f0b 100644 (file)
@@ -69,6 +69,10 @@ public class InlineContainer extends FObj {
         // this.properties.get("writing-mode");
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
     /**
      * This creates a single inline container area after
      * laying out the child block areas. All footnotes, floats
index ad90f064bc0fd5f7db53900f8eb0d6830cc28a2b..c2fb0e372d5d9c030adfee4db5bc280aa55c62b4 100644 (file)
@@ -116,6 +116,10 @@ public class Leader extends FObjMixed {
 
             leaderArea = fa;
         } else if(leaderPattern == LeaderPattern.USECONTENT) {
+            if (children == null) {
+                getLogger().error("Leader use-content with no content");
+                return;
+            }
             InlineStackingLayoutManager lm;
             lm = new InlineStackingLayoutManager(this,
                      new LMiter(children.listIterator()));
index 5bb9e7fed34a95e9c3686558bd8558e95737cb79..638fdcc4ea453a9029ceb5f557fb492d0d0df66f 100644 (file)
@@ -92,5 +92,9 @@ public class ListBlock extends FObj {
         return false;
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
 
 }
+
index 9c258c79e63f6bd58ffaef1133386339f5c3ccb4..1dc296d3e4d9a730813ae7eb16c32e9173dbadaa 100644 (file)
@@ -99,4 +99,9 @@ public class ListItem extends FObj {
         return false;
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index f201aa9b35486106aa02efe0f9af22c71e7398a3..682cad474b07e42477d41090201035dd71cd7582 100644 (file)
@@ -46,4 +46,9 @@ public class ListItemBody extends FObj {
 
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index 3115b340690ce2f14f0d5e48d568230e035d76b5..be673ed3c16eb3f5fb4110afa90f24e0a8c91de4 100644 (file)
@@ -46,4 +46,9 @@ public class ListItemLabel extends FObj {
 
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index a9ef5aebc9c3ada9db6c4fe8c81ea6ac52333e62..31b465fe1ff7deeb493c7b34ecd0c3eb589ad35e 100644 (file)
@@ -16,31 +16,48 @@ import org.apache.fop.apps.FOPException;
 
 import org.xml.sax.Attributes;
 
+/**
+ * Marker formatting object.
+ * This is the marker formatting object that handles merkers.
+ * This attempts to add itself to the parent formatting object.
+ */
 public class Marker extends FObjMixed {
 
     private String markerClassName;
 
+    /**
+     * Create a marker fo.
+     *
+     * @param parent the parent fo node
+     */
     public Marker(FONode parent) {
         super(parent);
     }
 
+    /**
+     * Handle the attributes for this marker.
+     * This gets the marker-class-name and attempts to add itself
+     * to the parent formatting object.
+     *
+     * @param attlist the attribute list
+     * @throws FOPException if there is an exception
+     */
     public void handleAttrs(Attributes attlist) throws FOPException {
         super.handleAttrs(attlist);
-        // do check to see that 'this' is under fo:flow
 
         this.markerClassName =
             this.properties.get("marker-class-name").getString();
+    }
 
-        // check to ensure that no other marker with same parent
-        // has this 'marker-class-name' is in addMarker() method
-        try {
-            ((FObj)parent).addMarker(this);
-        } catch (FOPException fopex) {
-            getLogger().error("marker cannot be added to '" + parent
-                                 + "'");
-        }
+    protected boolean isMarker() {
+        return true;
     }
 
+    /**
+     * Get the marker class name for this marker.
+     *
+     * @return the marker class name
+     */
     public String getMarkerClassName() {
         return markerClassName;
     }
index 848cf34bc37af92a99e0bec353eb54ce4871d3e8..1e8db211c611cfb66b60e1d044265e1125e8e10c 100644 (file)
@@ -63,7 +63,7 @@ public class Table extends FObj {
             tableHeader = (TableBody)child;
         } else {
             // add bodies
-            children.add(child);
+            super.addChild(child);
         }
     }
 
@@ -149,4 +149,9 @@ public class Table extends FObj {
         return false;
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index 997127a32004b92e1c187e7dfd0ce30edacce50d..35e7cf3a99f463bbafb590f4f325dd30179a99ff 100644 (file)
@@ -51,4 +51,10 @@ public class TableAndCaption extends ToBeImplementedElement {
     public boolean generatesInlineAreas() {
         return false;
     }
+
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index b593b2f54d912a0e20682caeb836bc506a93b2d0..860625a0927e21bfd28900ee2b1b8007eb858ce5 100644 (file)
@@ -70,5 +70,9 @@ public class TableBody extends FObj {
 
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
 
index 98469babc59ddec9c6f40ca5f765b1ded8e4242b..468013c892b4de84f1684b16b9887729e56de767 100644 (file)
@@ -45,4 +45,10 @@ public class TableCaption extends ToBeImplementedElement {
         // this.properties.get("width");
 
     }
+
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index 66c7c398159350d3122048ba2efe1a7692a39bec..02a444ad2f00e584ede795753ec0bbc1497b781b 100644 (file)
@@ -296,5 +296,9 @@ public class TableCell extends FObj {
         }
     }
     
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
 
index 53f728bd51ac5ca45568db73910cb61e49e3c6e6..bba9b25137cada41cab0cc32ed8ff1bd88781561 100644 (file)
@@ -27,4 +27,9 @@ public class Wrapper extends FObjMixed {
         super(parent);
     }
 
+    protected boolean containsMarkers() {
+        return true;
+    }
+
 }
+
index 1c0baafad5f8c39ca520648da1d96ea97171630e..a08865a41754cc01c612a8572abbaa9d229c3da4 100644 (file)
@@ -33,7 +33,7 @@ public class LMiter implements ListIterator {
 
     protected boolean preLoadNext() {
         // skip over child FObj's that don't add lms
-        while (baseIter.hasNext()) {
+        while (baseIter != null && baseIter.hasNext()) {
             Object theobj = baseIter.next();
             if(theobj instanceof FObj) {
                 FObj fobj = (FObj) theobj;