]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
1. Moved getNameId() from FObj to FONode.
authorGlen Mazza <gmazza@apache.org>
Wed, 18 Aug 2004 03:26:37 +0000 (03:26 +0000)
committerGlen Mazza <gmazza@apache.org>
Wed, 18 Aug 2004 03:26:37 +0000 (03:26 +0000)
2. Centralized determination of generatesInlineAreas() from multiple FObj subclasses into fo.PropertySets BitSet object.

3. validateChildNode() implemented for fo:list-item.

4. fo:initial-property-set now extending FObj instead of ToBeImplementedElement; burden of implementation on individual FOInputHandler subclasses.

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

18 files changed:
src/java/org/apache/fop/fo/Constants.java
src/java/org/apache/fop/fo/FONode.java
src/java/org/apache/fop/fo/FOText.java
src/java/org/apache/fop/fo/FObj.java
src/java/org/apache/fop/fo/PropertyManager.java
src/java/org/apache/fop/fo/PropertySets.java
src/java/org/apache/fop/fo/flow/Block.java
src/java/org/apache/fop/fo/flow/BlockContainer.java
src/java/org/apache/fop/fo/flow/ExternalGraphic.java
src/java/org/apache/fop/fo/flow/InitialPropertySet.java
src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
src/java/org/apache/fop/fo/flow/ListBlock.java
src/java/org/apache/fop/fo/flow/ListItem.java
src/java/org/apache/fop/fo/flow/Table.java
src/java/org/apache/fop/fo/flow/TableAndCaption.java
src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java
src/java/org/apache/fop/fo/pagination/StaticContent.java
src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java

index 3c8638c1606713d14064c4f955e867ff1396de86..584c84e34d71238f42fc5875c51065db66916c10 100644 (file)
@@ -56,7 +56,7 @@ public interface Constants {
     int RENDER_RTF = 10;
     
     // element constants
-    int FO_UNKNOWN = 0;  // FObj base class
+    int FO_UNKNOWN_NODE = 0;  // FObj base class
     int FO_BASIC_LINK = 1;
     int FO_BIDI_OVERRIDE = 2;
     int FO_BLOCK = 3;
index 73204f27d505fdcfad144da81f107376227c37a6..0005397002764ad9e47709f747a238ad81eaba3b 100644 (file)
@@ -112,13 +112,22 @@ public abstract class FONode {
     }
 
     /**
-     * Returns the name of the object
-     * @return the name of this object
+     * Returns the name of the node
+     * @return the name of this node
      */
     public String getName() {
         return null;
     }
 
+    /**
+     * Returns the Constants class integer value of this node
+     * @return the integer enumeration of this FO (e.g., FO_ROOT)
+     *      if a formatting object, FO_UNKNOWN_NODE otherwise
+     */
+    public int getNameId() {
+        return Constants.FO_UNKNOWN_NODE;
+    }
+
     /**
      * Checks to make sure, during SAX processing of input document, that the
      * incoming node is valid for the this (parent) node (e.g., checking to
index 70a7db4f8fc7500d4de9580fc01b887fb5027cd3..5966928a23b9d5b80cfec948eb6ee262904dd93d 100644 (file)
@@ -488,6 +488,10 @@ public class FOText extends FObj {
 
     }
 
+    /**
+     * @todo rename somehow, there isn't an fo:text.
+     * @todo see if should still be a subclass of FObj
+     */
     public String getName() {
         return "fo:text";
     }
index f0e6f7461974ca198788a48066a30567ec851d92..cbff2af55b7b2aa2cd791be9f6cd957433351526 100644 (file)
@@ -192,8 +192,8 @@ public class FObj extends FONode implements Constants {
      */
     protected void addChildNode(FONode child) {
         if (PropertySets.canHaveMarkers(getNameId()) && 
-                "fo:marker".equals(child.getName())) {
-            addMarker((Marker) child);
+            child.getNameId() == FO_MARKER) {
+                addMarker((Marker) child);
         } else {
             if (childNodes == null) {
                 childNodes = new ArrayList();
@@ -332,15 +332,6 @@ public class FObj extends FONode implements Constants {
         return false;
     }
 
-    /**
-     * Check if this formatting object generates inline areas.
-     *
-     * @return true if generates inline areas
-     */
-    public boolean generatesInlineAreas() {
-        return true;
-    }
-
     /**
      * Set writing mode for this FO.
      * Use that from the nearest ancestor, including self, which generates
@@ -386,7 +377,7 @@ public class FObj extends FONode implements Constants {
      * the first child.
      * @param marker Marker to add.
      */
-    public void addMarker(Marker marker) {
+    protected void addMarker(Marker marker) {
         String mcname = marker.getMarkerClassName();
         if (childNodes != null) {
             // check for empty childNodes
@@ -541,21 +532,5 @@ public class FObj extends FONode implements Constants {
         }
         return -1;
     }
-
-    /**
-     * Returns the name of this FO (e.g., "fo:root");
-     * @return the name of the FO
-     */
-    public String getName() {
-        return null;
-    }
-
-    /**
-     * Returns the Constants class integer value of this formatting object
-     * @return the integer enumeration of this FO (e.g., FO_ROOT)
-     */
-    public int getNameId() {
-        return FO_UNKNOWN;
-    }
 }
 
index e241c31428b068192b847361bb6eee759926f6a5..c3ab8684750a05363233fff17fe67ea52d1f223b 100644 (file)
@@ -19,7 +19,6 @@
 package org.apache.fop.fo;
 
 // FOP
-import org.apache.fop.apps.FOPException;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fo.properties.Property;
index 0bb9f56f7656724d5d347ef95c21dc5ef00a215f..ebb3409910dd5e3a1a0d3e034f4bf27850635db7 100644 (file)
@@ -27,6 +27,7 @@ public class PropertySets {
     private static short[][] mapping = null;
     private static BitSet can_have_markers = null;
     private static BitSet can_have_id = null;
+    private static BitSet no_inline_areas = null;
 
     private Element[] elements = new Element[Constants.ELEMENT_COUNT+1];
     private BitSet block_elems = new BitSet();
@@ -1085,6 +1086,30 @@ public class PropertySets {
         return can_have_id.get(elementId);
     }
 
+    /**
+     * Determines if the FO generates inline areas.  Used only within flow.Block
+     * for whitespace handling
+     * @param elementId Constants enumeration ID of the FO (e.g., FO_ROOT)
+     * @return true if id property is applicable, false otherwise
+     * @todo see if more values need to be entered here (copied values over
+     *      from legacy code, list of FO's below probably incomplete)
+     * @todo see if still needed (LM has a similar generatesInlineAreas()
+     *      method)
+     */
+    public static boolean generatesInlineAreas(int elementId) {
+        if (no_inline_areas == null) {
+            no_inline_areas = new BitSet();
+            no_inline_areas.set(Constants.FO_UNKNOWN_NODE);
+            no_inline_areas.set(Constants.FO_BLOCK);
+            no_inline_areas.set(Constants.FO_BLOCK_CONTAINER);
+            no_inline_areas.set(Constants.FO_LIST_BLOCK);
+            no_inline_areas.set(Constants.FO_LIST_ITEM);
+            no_inline_areas.set(Constants.FO_TABLE);
+            no_inline_areas.set(Constants.FO_TABLE_AND_CAPTION);
+        }
+        return !(no_inline_areas.get(elementId));
+    }
+
     /**
      * An object that represent the properties and contents of a fo element
      */
index 537a0f553a5a2f1dad363840b431d3798ce6e0e5..254864f6fc9c658e20d05efed0e03dfff36bb705 100644 (file)
@@ -32,6 +32,7 @@ import org.apache.fop.fo.CharIterator;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FObjMixed;
+import org.apache.fop.fo.PropertySets;
 import org.apache.fop.fo.RecursiveCharIterator;
 import org.apache.fop.layoutmgr.BlockLayoutManager;
 import org.apache.fop.fo.Constants;
@@ -91,6 +92,7 @@ public class Block extends FObjMixed {
 
     /**
      * @param parent FONode that is the parent of this object
+     *
      */
     public Block(FONode parent) {
         super(parent);
@@ -175,13 +177,6 @@ public class Block extends FObjMixed {
         return this.span;
     }
 
-    /**
-     * @return false (Block cannot generate inline areas)
-     */
-    public boolean generatesInlineAreas() {
-        return false;
-    }
-
     /**
      * @see org.apache.fop.fo.FONode#addChildNode(FONode)
      */
@@ -189,11 +184,12 @@ public class Block extends FObjMixed {
         // Handle whitespace based on values of properties
         // Handle a sequence of inline-producing child nodes in
         // one pass
-        if (child instanceof FObj && ((FObj) child).generatesInlineAreas()) {
-            if (firstInlineChild == null) {
-                firstInlineChild = child;
-            }
-            // lastInlineChild = childNodes.size();
+        if (child instanceof FObj && ("fo:text".equals(child.getName()) 
+            || PropertySets.generatesInlineAreas(child.getNameId()))) {
+                if (firstInlineChild == null) {
+                    firstInlineChild = child;
+                }
+                // lastInlineChild = childNodes.size();
         } else {
             // Handle whitespace in preceeding inline areas if any
             handleWhiteSpace();
index 2f2813db589aad3750d24315111d1d0a3d83e40f..91214ad1bbd60e49c8578022f0be739fd9354228 100644 (file)
@@ -75,13 +75,6 @@ public class BlockContainer extends FObj {
         return true;
     }
 
-    /**
-     * @return false (BlockContainer cannot generate inline areas)
-     */
-    public boolean generatesInlineAreas() {
-        return false;
-    }
-
     /**
      * @return the span for this object
      */
@@ -98,6 +91,9 @@ public class BlockContainer extends FObj {
         list.add(blm);
     }
 
+    /**
+     * @see org.apache.fop.fo.FObj#getName()
+     */
     public String getName() {
         return "fo:block-container";
     }
index 99bb8bedb62255c9830874f5f8fd13a6bb9d35b6..fd449e9461ce9885e5211990b5b1401835af5903 100644 (file)
@@ -59,6 +59,7 @@ public class ExternalGraphic extends FObj {
 
     /**
      * @see org.apache.fop.fo.FObj#addProperties
+     * @todo switch method from image() to startImage()?
      */
     protected void addProperties(Attributes attlist) throws SAXParseException {
         super.addProperties(attlist);
index 982d1b434c0ba41bb7a24229ee794f4878eb6869..a3b39e0bb71c219551b1c5d1213febecfd201f65 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-/* $Id$ */
+/* $Id:$ */
 
 package org.apache.fop.fo.flow;
 
@@ -25,13 +25,12 @@ import org.xml.sax.SAXParseException;
 
 // FOP
 import org.apache.fop.fo.FONode;
-import org.apache.fop.fo.ToBeImplementedElement;
+import org.apache.fop.fo.FObj;
 
 /**
- * Class modelling the fo:initial-property-set object. See Sec. 6.6.4 of the
- * XSL-FO Standard.
+ * Class modelling the fo:initial-property-set object.
  */
-public class InitialPropertySet extends ToBeImplementedElement {
+public class InitialPropertySet extends FObj {
 
     /**
      * @param parent FONode that is the parent of this object
@@ -49,6 +48,9 @@ public class InitialPropertySet extends ToBeImplementedElement {
             invalidChildError(loc, nsURI, localName);
     }
 
+    /**
+     * @see org.apache.fop.fo.FObj#getName()
+     */
     public String getName() {
         return "fo:initial-property-set";
     }
index 8bd5a5f49f9c26a5e78d4b550b5364ce93fe2b0f..0da8d71ffe2da62b97bc467fc75c8156646a3c6c 100644 (file)
@@ -113,15 +113,6 @@ public class InstreamForeignObject extends FObj {
         return yoffset;
     }
 
-    /**
-     * This flow object generates inline areas.
-     * @see org.apache.fop.fo.FObj#generatesInlineAreas()
-     * @return true
-     */
-    public boolean generatesInlineAreas() {
-        return true;
-    }
-
     /**
      * @see org.apache.fop.fo.FObj#addLayoutManager(List)
      */
index 86d6b70e83ef17d9e0641d05e983fb2b50acdd2d..244095c25695ef2721747b8feb9a3c4706898dbd 100644 (file)
@@ -38,18 +38,6 @@ import org.apache.fop.layoutmgr.list.ListBlockLayoutManager;
  */
 public class ListBlock extends FObj {
 
-    private int align;
-    private int alignLast;
-    private int breakBefore;
-    private int breakAfter;
-    private int lineHeight;
-    private int startIndent;
-    private int endIndent;
-    private int spaceBefore;
-    private int spaceAfter;
-    private int spaceBetweenListRows = 0;
-    private ColorType backgroundColor;
-    
     // used for child node validation
     private boolean hasListItem = false;
 
@@ -65,22 +53,6 @@ public class ListBlock extends FObj {
      */
     protected void addProperties(Attributes attlist) throws SAXParseException {
         super.addProperties(attlist);
-
-        this.align = this.propertyList.get(PR_TEXT_ALIGN).getEnum();
-        this.alignLast = this.propertyList.get(PR_TEXT_ALIGN_LAST).getEnum();
-        this.lineHeight =
-            this.propertyList.get(PR_LINE_HEIGHT).getLength().getValue();
-        this.startIndent =
-            this.propertyList.get(PR_START_INDENT).getLength().getValue();
-        this.endIndent =
-            this.propertyList.get(PR_END_INDENT).getLength().getValue();
-        this.spaceBefore =
-            this.propertyList.get(PR_SPACE_BEFORE | CP_OPTIMUM).getLength().getValue();
-        this.spaceAfter =
-            this.propertyList.get(PR_SPACE_AFTER | CP_OPTIMUM).getLength().getValue();
-        this.spaceBetweenListRows = 0;    // not used at present
-        this.backgroundColor =
-            this.propertyList.get(PR_BACKGROUND_COLOR).getColorType();
         getFOInputHandler().startList(this);
     }
 
@@ -113,13 +85,6 @@ public class ListBlock extends FObj {
         getFOInputHandler().endList(this);
     }
 
-    /**
-     * @return false (ListBlock does not generate inline areas)
-     */
-    public boolean generatesInlineAreas() {
-        return false;
-    }
-
     /**
      * @see org.apache.fop.fo.FObj#addLayoutManager(List)
      */
@@ -128,6 +93,9 @@ public class ListBlock extends FObj {
         list.add(lm);   
     }
 
+    /**
+     * @see org.apache.fop.fo.FObj#getName()
+     */
     public String getName() {
         return "fo:list-block";
     }
index 49aaf4fe295c439cbaa26db677cce40865bee627..7fd8170b2eb81c709d83872e5c4ca2002a7b167b 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-/* $Id$ */
+/* $Id:$ */
 
 package org.apache.fop.fo.flow;
 
@@ -23,6 +23,7 @@ import java.util.List;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
 import org.xml.sax.SAXParseException;
 
 // FOP
@@ -31,24 +32,13 @@ import org.apache.fop.fo.FObj;
 import org.apache.fop.layoutmgr.list.ListItemLayoutManager;
 
 /**
- * Class modelling the fo:list-item object. See Sec. 6.8.3 of the XSL-FO
- * Standard.
+ * Class modelling the fo:list-item object.
  */
 public class ListItem extends FObj {
 
     private ListItemLabel label = null;
     private ListItemBody body = null;
 
-    private int align;
-    private int alignLast;
-    private int breakBefore;
-    private int breakAfter;
-    private int lineHeight;
-    private int startIndent;
-    private int endIndent;
-    private int spaceBefore;
-    private int spaceAfter;
-
     /**
      * @param parent FONode that is the parent of this object
      */
@@ -62,49 +52,68 @@ public class ListItem extends FObj {
     protected void addProperties(Attributes attlist) throws SAXParseException {
         super.addProperties(attlist);
         getFOInputHandler().startListItem(this);
-        this.align = this.propertyList.get(PR_TEXT_ALIGN).getEnum();
-        this.alignLast = this.propertyList.get(PR_TEXT_ALIGN_LAST).getEnum();
-        this.lineHeight =
-            this.propertyList.get(PR_LINE_HEIGHT).getLength().getValue();
-        this.spaceBefore =
-            this.propertyList.get(PR_SPACE_BEFORE | CP_OPTIMUM).getLength().getValue();
-        this.spaceAfter =
-            this.propertyList.get(PR_SPACE_AFTER | CP_OPTIMUM).getLength().getValue();
+    }
+
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
+     * XSL Content Model: marker* (list-item-label,list-item-body)
+     */
+    protected void validateChildNode(Locator loc, String nsURI, String localName) 
+        throws SAXParseException {
+            if (nsURI == FO_URI && localName.equals("marker")) {
+                if (label != null) {
+                    nodesOutOfOrderError(loc, "fo:marker", "fo:list-item-label");
+                }
+            } else if (nsURI == FO_URI && localName.equals("list-item-label")) {
+                if (label != null) {
+                    tooManyNodesError(loc, "fo:list-item-label");
+                }
+            } else if (nsURI == FO_URI && localName.equals("list-item-body")) {
+                if (label == null) {
+                    nodesOutOfOrderError(loc, "fo:list-item-label", "fo:list-item-body");
+                } else if (body != null) {
+                    tooManyNodesError(loc, "fo:list-item-body");
+                }
+            } else {
+                invalidChildError(loc, nsURI, localName);
+            }
     }
 
     /**
      * @see org.apache.fop.fo.FONode#addChildNode(FONode)
+     * @todo see if can/should rely on base class for this 
+     *    (i.e., add to childNodes instead)
      */
     public void addChildNode(FONode child) {
-        if ("fo:list-item-label".equals(child.getName())) {
-            label = (ListItemLabel)child;
-        } else if ("fo:list-item-body".equals(child.getName())) {
-            body = (ListItemBody)child;
-        } else if ("fo:marker".equals(child.getName())) {
-            // marker
-        } else {
-            // error
+        int nameId = ((FObj)child).getNameId();
+        
+        if (nameId == FO_LIST_ITEM_LABEL) {
+            label = (ListItemLabel) child;
+        } else if (nameId == FO_LIST_ITEM_BODY) {
+            body = (ListItemBody) child;
+        } else if (nameId == FO_MARKER) {
+            addMarker((Marker) child);
         }
     }
 
     /**
-     * @return false (ListItem cannot generate inline areas)
+     * Make sure content model satisfied, if so then tell the
+     * FOInputHandler that we are at the end of the flow.
+     * @see org.apache.fop.fo.FONode#end
      */
-    public boolean generatesInlineAreas() {
-        return false;
+    protected void endOfNode() throws SAXParseException {
+        if (label == null || body == null) {
+            missingChildElementError("marker* (list-item-label,list-item-body)");
+        }
+        getFOInputHandler().endListItem(this);
     }
 
     /**
      * @see org.apache.fop.fo.FObj#addLayoutManager(List)
-     * @todo remove checks for non-nulls after validateChildNode() added
      */
     public void addLayoutManager(List list) {   
-        if (label != null && body != null) {
-            ListItemLayoutManager blm = new ListItemLayoutManager(this);
-            list.add(blm);
-        } else {
-            getLogger().error("list-item requires list-item-label and list-item-body");
-        }
+        ListItemLayoutManager blm = new ListItemLayoutManager(this);
+        list.add(blm);
     }
 
     public ListItemLabel getLabel() {
@@ -115,11 +124,9 @@ public class ListItem extends FObj {
         return body;
     }
 
-    protected void endOfNode() throws SAXParseException {
-        super.endOfNode();
-        getFOInputHandler().endListItem(this);
-    }
-
+    /**
+     * @see org.apache.fop.fo.FObj#getName()
+     */
     public String getName() {
         return "fo:list-item";
     }
index e6402ecdab69439afac77e4cb2b13cc4d68b6059..57e380fb94397e0594e5845b6030eaad6b272078 100644 (file)
@@ -130,13 +130,6 @@ public class Table extends FObj {
         }
     }
 
-    /**
-     * @return false (Table does not generate inline areas)
-     */
-    public boolean generatesInlineAreas() {
-        return false;
-    }
-
     private ArrayList getColumns() {
         return columns;
     }
index caa8ee1899bb5c140c6363dbbd6f030a491b5d03..cd79627f90ccca32e0ea038f59ca52e974325b14 100644 (file)
@@ -36,12 +36,8 @@ public class TableAndCaption extends ToBeImplementedElement {
     }
 
     /**
-     * @return false (TableAndCaption doesn't generate inline areas)
+     * @see org.apache.fop.fo.FObj#getName()
      */
-    public boolean generatesInlineAreas() {
-        return false;
-    }
-
     public String getName() {
         return "fo:table-and-caption";
     }
index 8793f957bc17557cc6347e02b4b09efed397e671..322d3df25af4b9184d156b52f26fcfbf6044304a 100644 (file)
@@ -152,7 +152,7 @@ public class ConditionalPageMasterReference extends FObj {
      * Check that the parent is the right type of formatting object
      * repeatable-page-master-alternatives.
      * @param parent parent node
-     * @throws FOPException If the parent is invalid
+     * @throws SAXParseException If the parent is invalid
      */
     protected void validateParent(FONode parent) throws SAXParseException {
         if (parent.getName().equals("fo:repeatable-page-master-alternatives")) {
index 405e8d014382bb2fd20c5eede24a55375d27989e..02f725676eca0ca4b140f67bc04764aa721e4744 100644 (file)
@@ -68,7 +68,7 @@ public class StaticContent extends Flow {
     /**
      * flowname checking is more stringient for static content currently
      * @param name the flow-name to set
-     * @throws FOPException for a missing flow name
+     * @throws SAXParseException for a missing flow name
      */
     protected void setFlowName(String name) throws SAXParseException {
         if (name == null || name.equals("")) {
index 422da40d93e3e6385379f702ba2bb37c5ab3d8a0..fb6534577c130c24fbec9b5276da7dd564b7d1cc 100644 (file)
@@ -85,6 +85,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
 
     /**
      * @see org.apache.fop.layoutmgr.AbstractLayoutManager#initProperties()
+     * @todo need to take into account somewhere the effects of fo:initial-property-set,
+     *      if defined for the block.
      */
     protected void initProperties() {
         PropertyManager pm = fobj.getPropertyManager();