? src/java/org/apache/fop/fo/BorderWidthPropertyMaker.java
? src/java/org/apache/fop/fo/CompoundPropertyMaker.java
? src/java/org/apache/fop/fo/CorrespondingPropertyMaker.java
? src/java/org/apache/fop/fo/DimensionPropertyMaker.java
? src/java/org/apache/fop/fo/FOPropertyMapping.java
? src/java/org/apache/fop/fo/IndentPropertyMaker.java
? src/java/org/apache/fop/fo/LineHeightPropertyMaker.java
Index: src/java/org/apache/fop/area/CTM.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/area/CTM.java,v
retrieving revision 1.6
diff -u -r1.6 CTM.java
--- src/java/org/apache/fop/area/CTM.java	19 Sep 2003 14:33:15 -0000	1.6
+++ src/java/org/apache/fop/area/CTM.java	16 Jan 2004 16:15:10 -0000
@@ -55,7 +55,7 @@
 import java.io.Serializable;
 
 import org.apache.fop.datatypes.FODimension;
-import org.apache.fop.fo.properties.WritingMode;
+import org.apache.fop.fo.Constants;
 
 /**
  * Describe a PDF or PostScript style coordinate transformation matrix (CTM).
@@ -145,15 +145,15 @@
     public static CTM getWMctm(int wm, int ipd, int bpd) {
         CTM wmctm;
         switch (wm) {
-            case WritingMode.LR_TB:
+            case Constants.LR_TB:
                 return new CTM(CTM_LRTB);
-            case WritingMode.RL_TB: {
+            case Constants.RL_TB: {
                     wmctm = new CTM(CTM_RLTB);
                     wmctm.e = ipd;
                     return wmctm;
                 }
                 //return  CTM_RLTB.translate(ipd, 0);
-            case WritingMode.TB_RL: { // CJK
+            case Constants.TB_RL: { // CJK
                     wmctm = new CTM(CTM_TBRL);
                     wmctm.e = bpd;
                     return wmctm;
@@ -331,7 +331,7 @@
          * can set ipd and bpd appropriately based on the writing mode.
          */
 
-        if (writingMode == WritingMode.LR_TB || writingMode == WritingMode.RL_TB) {
+        if (writingMode == Constants.LR_TB || writingMode == Constants.RL_TB) {
             reldims.ipd = width;
             reldims.bpd = height;
         } else {
Index: src/java/org/apache/fop/area/PageViewport.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/area/PageViewport.java,v
retrieving revision 1.1
diff -u -r1.1 PageViewport.java
--- src/java/org/apache/fop/area/PageViewport.java	11 Mar 2003 13:05:27 -0000	1.1
+++ src/java/org/apache/fop/area/PageViewport.java	16 Jan 2004 16:15:10 -0000
@@ -59,7 +59,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
-import org.apache.fop.fo.properties.RetrievePosition;
+import org.apache.fop.fo.Constants;
 
 /**
  * Page viewport that specifies the viewport area and holds the page contents.
@@ -307,7 +307,7 @@
     public Object getMarker(String name, int pos) {
         Object mark = null;
         switch (pos) {
-            case RetrievePosition.FSWP:
+            case Constants.FSWP:
                 if (markerFirstStart != null) {
                     mark = markerFirstStart.get(name);
                 }
@@ -315,12 +315,12 @@
                     mark = markerFirstAny.get(name);
                 }
             break;
-            case RetrievePosition.FIC:
+            case Constants.FIC:
                 if (markerFirstAny != null) {
                     mark = markerFirstAny.get(name);
                 }
             break;
-            case RetrievePosition.LSWP:
+            case Constants.LSWP:
                 if (markerLastStart != null) {
                     mark = markerLastStart.get(name);
                 }
@@ -328,7 +328,7 @@
                     mark = markerLastAny.get(name);
                 }
             break;
-            case RetrievePosition.LEWP:
+            case Constants.LEWP:
                 if (markerLastEnd != null) {
                     mark = markerLastEnd.get(name);
                 }
Index: src/java/org/apache/fop/area/inline/Leader.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/area/inline/Leader.java,v
retrieving revision 1.2
diff -u -r1.2 Leader.java
--- src/java/org/apache/fop/area/inline/Leader.java	10 Sep 2003 18:42:22 -0000	1.2
+++ src/java/org/apache/fop/area/inline/Leader.java	16 Jan 2004 16:15:11 -0000
@@ -50,7 +50,7 @@
  */
 package org.apache.fop.area.inline;
 
-import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fo.Constants;
 
 /**
  * This is a leader inline area.
@@ -63,7 +63,7 @@
     // if space replaced with a space
     // otherwise this is a holder for a line
 
-    private int ruleStyle = RuleStyle.SOLID;
+    private int ruleStyle = Constants.SOLID;
     private int ruleThickness = 1000;
 
     /**
Index: src/java/org/apache/fop/datatypes/Keep.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/datatypes/Keep.java,v
retrieving revision 1.6
diff -u -r1.6 Keep.java
--- src/java/org/apache/fop/datatypes/Keep.java	7 Jan 2004 21:10:36 -0000	1.6
+++ src/java/org/apache/fop/datatypes/Keep.java	16 Jan 2004 16:15:11 -0000
@@ -51,7 +51,6 @@
 package org.apache.fop.datatypes;
 
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.Constants;
 
 /**
  * XSL FO Keep Property datatype (keep-together, etc)
Index: src/java/org/apache/fop/datatypes/LengthPair.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/datatypes/LengthPair.java,v
retrieving revision 1.5
diff -u -r1.5 LengthPair.java
--- src/java/org/apache/fop/datatypes/LengthPair.java	7 Jan 2004 21:10:37 -0000	1.5
+++ src/java/org/apache/fop/datatypes/LengthPair.java	16 Jan 2004 16:15:11 -0000
@@ -51,7 +51,6 @@
 package org.apache.fop.datatypes;
 
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.Constants;
 
 /**
  * Models a pair of lengths, one specifiying the dimensions for the
Index: src/java/org/apache/fop/fo/BoxPropShorthandParser.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/BoxPropShorthandParser.java,v
retrieving revision 1.4
diff -u -r1.4 BoxPropShorthandParser.java
--- src/java/org/apache/fop/fo/BoxPropShorthandParser.java	26 Dec 2003 23:41:47 -0000	1.4
+++ src/java/org/apache/fop/fo/BoxPropShorthandParser.java	16 Jan 2004 16:15:11 -0000
@@ -49,7 +49,6 @@
  * Software Foundation, please see <http://www.apache.org/>.
  */
 package org.apache.fop.fo;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 
 /**
  * Shorthand property parser for Box properties
@@ -57,10 +56,9 @@
 public class BoxPropShorthandParser extends GenericShorthandParser {
 
     /**
-     * @see org.apache.fop.fo.GenericShorthandParser#GenericShorthandParser(ListProperty)
+     * @see org.apache.fop.fo.GenericShorthandParser#GenericShorthandParser()
      */
-    public BoxPropShorthandParser(ListProperty listprop) {
-        super(listprop);
+    public BoxPropShorthandParser() {
     }
 
     /**
@@ -71,18 +69,20 @@
      * Property.Maker, PropertyList)
      */
     protected Property convertValueForProperty(int propId,
+                                               ListProperty listProperty,
                                                Property.Maker maker,
                                                PropertyList propertyList) {
         String name = FOPropertyMapping.getPropertyName(propId);
         Property p = null;
+        int count = listProperty.getList().size();
         if (name.indexOf("-top") >= 0) {
-            p = getElement(0);
+            p = getElement(listProperty, 0);
         } else if (name.indexOf("-right") >= 0) {
-            p = getElement(count() > 1 ? 1 : 0);
+            p = getElement(listProperty, count > 1 ? 1 : 0);
         } else if (name.indexOf("-bottom") >= 0) {
-            p = getElement(count() > 2 ? 2 : 0);
+            p = getElement(listProperty, count > 2 ? 2 : 0);
         } else if (name.indexOf("-left") >= 0) {
-            p = getElement(count() > 3 ? 3 : (count() > 1 ? 1 : 0));
+            p = getElement(listProperty, count > 3 ? 3 : (count > 1 ? 1 : 0));
         }
         // if p not null, try to convert it to a value of the correct type
         if (p != null) {
Index: src/java/org/apache/fop/fo/CondLengthProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/CondLengthProperty.java,v
retrieving revision 1.3
diff -u -r1.3 CondLengthProperty.java
--- src/java/org/apache/fop/fo/CondLengthProperty.java	22 Dec 2003 03:53:31 -0000	1.3
+++ src/java/org/apache/fop/fo/CondLengthProperty.java	16 Jan 2004 16:15:11 -0000
@@ -50,8 +50,9 @@
  */
 package org.apache.fop.fo;
 
-import org.apache.fop.datatypes.Length;
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.CondLength;
+import org.apache.fop.datatypes.Length;
 
 /**
  * Superclass for properties that have conditional lengths
@@ -61,7 +62,7 @@
     /**
      * Inner class for creating instances of CondLengthProperty
      */
-    public static class Maker extends Property.Maker {
+    public static class Maker extends CompoundPropertyMaker {
 
         /**
          * @param name of property for which a Maker should be created
@@ -70,6 +71,25 @@
             super(propId);
         }
 
+        /**
+         * Create a new empty instance of CondLengthProperty.
+         * @return the new instance. 
+         */
+        public Property makeNewProperty() {
+            return new CondLengthProperty(new CondLength());
+        }
+
+        /**
+         * @see CompoundPropertyMaker#convertProperty
+         */        
+        public Property convertProperty(Property p, PropertyList propertyList, FObj fo)
+            throws FOPException
+        {
+            if (p instanceof KeepProperty) {
+                return p;
+            }
+            return super.convertProperty(p, propertyList, fo);
+        }
     }
 
     private CondLength condLength = null;
Index: src/java/org/apache/fop/fo/Constants.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/Constants.java,v
retrieving revision 1.3
diff -u -r1.3 Constants.java
--- src/java/org/apache/fop/fo/Constants.java	22 Dec 2003 21:37:43 -0000	1.3
+++ src/java/org/apache/fop/fo/Constants.java	16 Jan 2004 16:15:12 -0000
@@ -377,6 +377,7 @@
     int CP_WITHIN_COLUMN = 9 << COMPOUND_SHIFT;
     int CP_WITHIN_LINE = 10 << COMPOUND_SHIFT;
     int CP_WITHIN_PAGE = 11 << COMPOUND_SHIFT;
+    int COMPOUND_COUNT = 11;
 
     // Enumeration constants
     int ABSOLUTE = 1;
Index: src/java/org/apache/fop/fo/EnumProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/EnumProperty.java,v
retrieving revision 1.4
diff -u -r1.4 EnumProperty.java
--- src/java/org/apache/fop/fo/EnumProperty.java	22 Dec 2003 03:53:31 -0000	1.4
+++ src/java/org/apache/fop/fo/EnumProperty.java	16 Jan 2004 16:15:12 -0000
@@ -77,7 +77,7 @@
         public Property checkEnumValues(String value) {
             //log.error("Unknown enumerated value for property '"
             //                       + getPropName() + "': " + value);
-            return null;
+            return super.checkEnumValues(value);
         }
 
         protected Property findConstant(String value) {
@@ -90,7 +90,7 @@
             if (p instanceof EnumProperty) {
                 return p;
             } else {
-                return null;
+                return super.convertProperty(p, propertyList, fo);
             }
         }
     }
Index: src/java/org/apache/fop/fo/FOText.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/FOText.java,v
retrieving revision 1.11
diff -u -r1.11 FOText.java
--- src/java/org/apache/fop/fo/FOText.java	16 Sep 2003 05:21:04 -0000	1.11
+++ src/java/org/apache/fop/fo/FOText.java	16 Jan 2004 16:15:13 -0000
@@ -54,10 +54,9 @@
 import java.util.NoSuchElementException;
 
 // FOP
-import org.apache.fop.fo.properties.WhiteSpaceCollapse;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.flow.Block;
 import org.apache.fop.fo.pagination.Root;
-import org.apache.fop.fo.properties.TextTransform;
 
 /**
  * A text node in the formatting object tree.
@@ -149,7 +148,7 @@
      * @return true if this will create an area in the output
      */
     public boolean willCreateArea() {
-        if (textInfo.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE
+        if (textInfo.whiteSpaceCollapse == Constants.FALSE
                 && length > 0) {
             return true;
         }
@@ -250,7 +249,7 @@
      * text-transform property.
      */
     private void textTransform() {
-        if (textInfo.textTransform == TextTransform.NONE) {
+        if (textInfo.textTransform == Constants.NONE) {
             return;
         }
         for (int i = 0; i < ca.length; i++) {
@@ -379,13 +378,13 @@
     public char charTransform(int i) {
         switch (textInfo.textTransform) {
         /* put NONE first, as this is probably the common case */
-        case TextTransform.NONE:
+        case Constants.NONE:
             return ca[i];
-        case TextTransform.UPPERCASE:
+        case Constants.UPPERCASE:
             return Character.toUpperCase(ca[i]);
-        case TextTransform.LOWERCASE:
+        case Constants.LOWERCASE:
             return Character.toLowerCase(ca[i]);
-        case TextTransform.CAPITALIZE:
+        case Constants.CAPITALIZE:
             if (isStartOfWord(i)) {
                 /*
                  Use toTitleCase here. Apparently, some languages use
Index: src/java/org/apache/fop/fo/FObj.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/FObj.java,v
retrieving revision 1.31
diff -u -r1.31 FObj.java
--- src/java/org/apache/fop/fo/FObj.java	14 Jan 2004 00:00:37 -0000	1.31
+++ src/java/org/apache/fop/fo/FObj.java	16 Jan 2004 16:15:14 -0000
@@ -59,7 +59,6 @@
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.flow.Marker;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 
Index: src/java/org/apache/fop/fo/GenericShorthandParser.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/GenericShorthandParser.java,v
retrieving revision 1.4
diff -u -r1.4 GenericShorthandParser.java
--- src/java/org/apache/fop/fo/GenericShorthandParser.java	27 Dec 2003 22:00:38 -0000	1.4
+++ src/java/org/apache/fop/fo/GenericShorthandParser.java	16 Jan 2004 16:15:14 -0000
@@ -50,55 +50,44 @@
  */
 package org.apache.fop.fo;
 
-import java.util.Vector;
 import java.util.Enumeration;
 
 public class GenericShorthandParser implements ShorthandParser {
 
-    /** Vector of Property objects */
-    protected Vector list;
-
     /**
-     * Constructor.
-     * @param listprop the ListProperty object that should be parsed
+     * Constructor. The listprop to operate on must b set with setList().
+     * @see #setList(ListProperty) 
      */
-    public GenericShorthandParser(ListProperty listprop) {
-        this.list = listprop.getList();
+    public GenericShorthandParser() {
     }
 
     /**
      * @param index the index into the List of properties
      * @return the property from the List of properties at the index parameter
      */
-    protected Property getElement(int index) {
-        if (list.size() > index) {
-            return (Property) list.elementAt(index);
+    protected Property getElement(ListProperty list, int index) {
+        if (list.getList().size() > index) {
+            return (Property) list.getList().elementAt(index);
         } else {
             return null;
         }
     }
 
-    /**
-     * @return the size of the list of properties
-     */
-    protected int count() {
-        return list.size();
-    }
-
     // Stores 1 to 3 values for border width, style, color
     // Used for: border, border-top, border-right etc
     public Property getValueForProperty(int propId,
+                                        ListProperty listProperty,
                                         Property.Maker maker,
                                         PropertyList propertyList) {
         Property prop = null;
         // Check for keyword "inherit"
-        if (count() == 1) {
-            String sval = ((Property)list.elementAt(0)).getString();
+        if (listProperty.getList().size() == 1) {
+            String sval = getElement(listProperty, 0).getString();
             if (sval != null && sval.equals("inherit")) {
                 return propertyList.getFromParent(propId);
             }
         }
-        return convertValueForProperty(propId, maker, propertyList);
+        return convertValueForProperty(propId, listProperty, maker, propertyList);
     }
 
 
@@ -111,11 +100,12 @@
      * @return the Property matching the parameters, or null if not found
      */
     protected Property convertValueForProperty(int propId,
+                                               ListProperty listProperty,
                                                Property.Maker maker,
                                                PropertyList propertyList) {
         Property prop = null;
         // Try each of the stored values in turn
-        Enumeration eprop = list.elements();
+        Enumeration eprop = listProperty.getList().elements();
         while (eprop.hasMoreElements() && prop == null) {
             Property p = (Property) eprop.nextElement();
             prop = maker.convertShorthandProperty(propertyList, p, null);
Index: src/java/org/apache/fop/fo/KeepProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/KeepProperty.java,v
retrieving revision 1.3
diff -u -r1.3 KeepProperty.java
--- src/java/org/apache/fop/fo/KeepProperty.java	22 Dec 2003 03:53:31 -0000	1.3
+++ src/java/org/apache/fop/fo/KeepProperty.java	16 Jan 2004 16:15:14 -0000
@@ -50,6 +50,7 @@
  */
 package org.apache.fop.fo;
 
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.Keep;
 
 /**
@@ -60,7 +61,7 @@
     /**
      * Inner class for creating instances of KeepProperty
      */
-    public static class Maker extends Property.Maker {
+    public static class Maker extends CompoundPropertyMaker {
 
         /**
          * @param name name of property for which Maker should be created
@@ -69,6 +70,25 @@
             super(propId);
         }
 
+        /**
+         * Create a new empty instance of KeepProperty.
+         * @return the new instance. 
+         */
+        public Property makeNewProperty() {
+            return new KeepProperty(new Keep());
+        }
+
+        /**
+         * @see CompoundPropertyMaker#convertProperty
+         */        
+        public Property convertProperty(Property p, PropertyList propertyList, FObj fo)
+            throws FOPException
+        {
+            if (p instanceof KeepProperty) {
+                return p;
+            }
+            return super.convertProperty(p, propertyList, fo);
+        }
     }
 
     private Keep keep;
Index: src/java/org/apache/fop/fo/LengthPairProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/LengthPairProperty.java,v
retrieving revision 1.3
diff -u -r1.3 LengthPairProperty.java
--- src/java/org/apache/fop/fo/LengthPairProperty.java	22 Dec 2003 03:53:31 -0000	1.3
+++ src/java/org/apache/fop/fo/LengthPairProperty.java	16 Jan 2004 16:15:14 -0000
@@ -50,6 +50,7 @@
  */
 package org.apache.fop.fo;
 
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.LengthPair;
 
 /**
@@ -60,7 +61,7 @@
     /**
      * Inner class for creating instances of LengthPairProperty
      */
-    public static class Maker extends LengthProperty.Maker {
+    public static class Maker extends CompoundPropertyMaker {
 
         /**
          * @param name name of property for which this Maker should be created
@@ -69,6 +70,25 @@
             super(propId);
         }
 
+        /**
+         * Create a new empty instance of LengthPairProperty.
+         * @return the new instance. 
+         */
+        public Property makeNewProperty() {
+            return new LengthPairProperty(new LengthPair());
+        }
+
+        /**
+         * @see CompoundPropertyMaker#convertProperty
+         */        
+        public Property convertProperty(Property p, PropertyList propertyList, FObj fo)
+            throws FOPException
+        {
+            if (p instanceof LengthPairProperty) {
+                return p;
+            }
+            return super.convertProperty(p, propertyList, fo);
+        }
     }
 
     private LengthPair lengthPair;
Index: src/java/org/apache/fop/fo/LengthProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/LengthProperty.java,v
retrieving revision 1.4
diff -u -r1.4 LengthProperty.java
--- src/java/org/apache/fop/fo/LengthProperty.java	22 Dec 2003 03:53:31 -0000	1.4
+++ src/java/org/apache/fop/fo/LengthProperty.java	16 Jan 2004 16:15:14 -0000
@@ -64,6 +64,7 @@
      * Inner class for making instances of LengthProperty
      */
     public static class Maker extends Property.Maker {
+        private boolean autoOk = false;
 
         /**
          * @param name name of property for which Maker should be created
@@ -85,7 +86,15 @@
          * @return false (auto-length is not allowed for Length values)
          */
         protected boolean isAutoLengthAllowed() {
-            return false;
+            return autoOk;
+        }
+
+        /**
+         * Set the auto length flag.
+         * @param inherited
+         */
+        public void setAutoOk(boolean autoOk) {
+            this.autoOk = autoOk;
         }
 
         /**
@@ -94,6 +103,10 @@
         public Property convertProperty(Property p,
                                         PropertyList propertyList,
                                         FObj fo) throws FOPException {
+            Property prop = super.convertProperty(p, propertyList, fo);
+            if (prop != null) {
+                return prop;
+            }
             if (isAutoLengthAllowed()) {
                 String pval = p.getString();
                 if (pval != null && pval.equals("auto")) {
@@ -109,7 +122,6 @@
             }
             return convertPropertyDatatype(p, propertyList, fo);
         }
-
     }
 
     /*
Index: src/java/org/apache/fop/fo/LengthRangeProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/LengthRangeProperty.java,v
retrieving revision 1.3
diff -u -r1.3 LengthRangeProperty.java
--- src/java/org/apache/fop/fo/LengthRangeProperty.java	22 Dec 2003 03:53:31 -0000	1.3
+++ src/java/org/apache/fop/fo/LengthRangeProperty.java	16 Jan 2004 16:15:15 -0000
@@ -51,6 +51,7 @@
 package org.apache.fop.fo;
 
 import org.apache.fop.datatypes.LengthRange;
+import org.apache.fop.apps.FOPException;
 
 /**
  * Superclass for properties that contain LengthRange values
@@ -60,7 +61,7 @@
     /**
      * Inner class for a Maker for LengthProperty objects
      */
-    public static class Maker extends LengthProperty.Maker {
+    public static class Maker extends CompoundPropertyMaker {
 
         /**
          * @param name name of property for which to create Maker
@@ -69,6 +70,25 @@
             super(propId);
         }
 
+        /**
+         * Create a new empty instance of LengthRangeProperty.
+         * @return the new instance. 
+         */
+        public Property makeNewProperty() {
+            return new LengthRangeProperty(new LengthRange());
+        }
+
+        /**
+         * @see CompoundPropertyMaker#convertProperty
+         */        
+        public Property convertProperty(Property p, PropertyList propertyList, FObj fo)
+            throws FOPException
+        {
+            if (p instanceof LengthRangeProperty) {
+                return p;
+            }
+            return super.convertProperty(p, propertyList, fo);
+        }
     }
 
     private LengthRange lengthRange;
Index: src/java/org/apache/fop/fo/Property.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/Property.java,v
retrieving revision 1.15
diff -u -r1.15 Property.java
--- src/java/org/apache/fop/fo/Property.java	10 Jan 2004 20:40:07 -0000	1.15
+++ src/java/org/apache/fop/fo/Property.java	16 Jan 2004 16:15:16 -0000
@@ -52,18 +52,21 @@
 
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.datatypes.CondLength;
+import org.apache.fop.datatypes.CompoundDatatype;
 import org.apache.fop.datatypes.Keep;
 import org.apache.fop.datatypes.Length;
 import org.apache.fop.datatypes.LengthPair;
 import org.apache.fop.datatypes.LengthRange;
 import org.apache.fop.datatypes.PercentBase;
+import org.apache.fop.datatypes.LengthBase;
 import org.apache.fop.datatypes.Space;
 import org.apache.fop.fo.expr.Numeric;
 import org.apache.fop.fo.expr.PropertyParser;
 import org.apache.fop.fo.expr.PropertyInfo;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 import org.apache.fop.apps.FOPException;
 import java.util.Vector;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Base class for all property objects
@@ -75,8 +78,20 @@
      * Base class for all property makers
      * @author unascribed
      */
-    public static class Maker {
-        private int propId;
+    public static class Maker implements Cloneable {
+        protected int propId;
+        private boolean inherited = true;
+        private Map enums = null;
+        private Map keywords = null;
+        protected String defaultValue = null;
+        protected boolean contextDep = false;
+        protected boolean setByShorthand = false;
+        private int percentBase = -1;
+        private Property.Maker[] shorthands = null;
+        private ShorthandParser datatypeParser;
+
+        protected Property defaultProperty;
+        protected CorrespondingPropertyMaker corresponding;
 
         /**
          * @return the name of the property for this Maker
@@ -89,37 +104,231 @@
          * Construct an instance of a Property.Maker for the given property.
          * @param propId The Constant ID of the property to be made.
          */
-        protected Maker(int propId) {
+        public Maker(int propId) {
             this.propId = propId;
         }
 
         /**
-         * Construct an instance of a Property.Maker.
-         * Note: the property ID is set to zero
+         * Copy all the values from the generic maker to this maker.
+         * @param generic a generic property maker.
          */
-        protected Maker() {
-            this.propId = 0;
+        public void useGeneric(Property.Maker generic) {
+            contextDep = generic.contextDep;
+            inherited = generic.inherited;
+            defaultValue = generic.defaultValue;
+            percentBase = generic.percentBase;
+            if (shorthands != null) {
+                shorthands = new Property.Maker[generic.shorthands.length];
+                System.arraycopy(shorthands, 0, generic.shorthands, 0, shorthands.length);
+            }
+            if (generic.enums != null) {
+                enums = new HashMap(generic.enums);
+            }
+            if (generic.keywords != null) {
+                keywords = new HashMap(generic.keywords);
+            }
         }
 
+        /**
+         * Set the inherited flag.
+         * @param inherited
+         */
+        public void setInherited(boolean inherited) {
+            this.inherited = inherited;
+        }
 
         /**
-         * Default implementation of isInherited.
-         * @return A boolean indicating whether this property is inherited.
+         * Add a keyword-equiv to the maker.
+         * @param keyword
+         * @param value
          */
-        public boolean isInherited() {
-            return false;
+        public void addKeyword(String keyword, String value) {
+            if (keywords == null) {
+                keywords = new HashMap();
+            }
+            keywords.put(keyword, value);
+        }
+
+        /**
+         * Add a enum constant.
+         * @param constant
+         * @param value
+         */
+        public void addEnum(String constant, Property value) {
+            if (enums == null) {
+                enums = new HashMap();
+            }
+            enums.put(constant, value);
+        }
+
+        /**
+         * Add a subproperty to this maker.
+         * @param subproperty
+         */
+        public void addSubpropMaker(Property.Maker subproperty) {
+            throw new RuntimeException("Unable to add subproperties " + getClass()); 
+        }
+
+        /**
+         * Return a subproperty maker for the subpropId. 
+         * @param subpropId The subpropId of the maker. 
+         * @return The subproperty maker.
+         */
+        public Property.Maker getSubpropMaker(int subpropId) {
+            throw new RuntimeException("Unable to add subproperties"); 
+        }
+
+        /**
+         * Add a shorthand to this maker. Only an Integer is added to the
+         * shorthands list. Later the Integers are replaced with references
+         * to the actual shorthand property makers.
+         * @param shorthand a property maker thar is that is checked for
+         *        shorthand values. 
+         */
+        public void addShorthand(Property.Maker shorthand) {
+            if (shorthands == null) {
+                shorthands = new Property.Maker[3];
+            }
+            for (int i = 0; i < shorthands.length; i++) {
+                if (shorthands[i] == null) {
+                    shorthands[i] = shorthand;
+                    break;
+                }
+            }
+        }
+
+        /**
+         * Set the shorthand datatype parser.
+         * @param subproperty
+         */
+        public void setDatatypeParser(ShorthandParser parser) {
+            datatypeParser = parser;
+        }
+
+        /**
+         * Set the default value for this maker.
+         * @param defaultValue the default value.
+         */
+        public void setDefault(String defaultValue) {
+            this.defaultValue = defaultValue;
+        }
+
+        /**
+         * Set the default value for this maker.
+         * @param defaultValue
+         * @param contextDep true when the value context dependent and
+         *        must not be cached.
+         */
+        public void setDefault(String defaultValue, boolean contextDep) {
+            this.defaultValue = defaultValue;
+            this.contextDep = contextDep;
+        }
+
+        /**
+         * Set the percent base identifier for this maker. 
+         * @param percentBase
+         */
+        public void setPercentBase(int percentBase) {
+            this.percentBase = percentBase;
         }
 
         /**
-         * Return a boolean indicating whether this property inherits the
-         * "specified" value rather than the "computed" value. The default is
-         * to inherit the "computed" value.
-         * @return true, if the property inherits the value specified.
+         * Set the byShorthand flag which only is applicable for subproperty 
+         * makers. It should be true for the subproperties which must be 
+         * assigned a value when the base property is assigned a attribute 
+         * value directly.
+         * @param defaultValue
          */
-        public boolean inheritsSpecified() {
-            return false;
+        public void setByShorthand(boolean setByShorthand) {
+            this.setByShorthand = setByShorthand;
         }
 
+        /**
+         * Set the correspoding property information.
+         * @param corresponding a corresponding maker where the 
+         *        isForcedCorresponding and compute methods are delegated to.
+         */
+        public void setCorresponding(CorrespondingPropertyMaker corresponding) {
+            this.corresponding = corresponding;
+        }
+
+        /**
+         * Create a new empty property. Must be overriden in compound 
+         * subclasses.
+         * @return a new instance of the Property for which this is a maker.
+         */
+        public Property makeNewProperty() {
+            return null;
+        }
+
+        /*
+         * If the property is a relative property with a corresponding absolute
+         * value specified, the absolute value is used. This is also true of
+         * the inheritance priority (I think...)
+         * If the property is an "absolute" property and it isn't specified, then
+         * we try to compute it from the corresponding relative property: this
+         * happens in computeProperty.
+         */
+        protected Property findProperty(PropertyList propertyList, 
+                                     boolean bTryInherit)
+            throws FOPException
+        {
+            Property p = null;
+
+            if (corresponding != null && corresponding.isCorrespondingForced(propertyList)) {
+                p = corresponding.compute(propertyList);
+            } else {
+                p = propertyList.getExplicitBaseProp(propId);
+                if (p == null) {
+                    p = this.compute(propertyList);
+                }
+                if (p == null) {    // check for shorthand specification
+                    p = getShorthand(propertyList);
+                }
+                if (p == null && bTryInherit) {    
+                    // else inherit (if has parent and is inheritable)
+                    PropertyList parentPropertyList = propertyList.getParentPropertyList(); 
+                    if (parentPropertyList != null && isInherited()) {
+                        p = findProperty(parentPropertyList, true);
+                    }
+                }
+            }
+            return p;
+        }
+
+        /**
+         * Return the property on the current FlowObject. Depending on the passed flags,
+         * this will try to compute it based on other properties, or if it is
+         * inheritable, to return the inherited value. If all else fails, it returns
+         * the default value.
+         * @param subpropId  The subproperty id of the property being retrieved.
+         *        Is 0 when retriving a base property.
+         * @param propertylist The PropertyList object being built for this FO.
+         * @param bTryInherit true if inherited properties should be examined.
+         * @param bTryDefault true if the default value should be returned. 
+         */
+        public Property get(int subpropId, PropertyList propertyList,
+                            boolean bTryInherit, boolean bTryDefault)
+            throws FOPException
+        {
+            Property p = findProperty(propertyList, bTryInherit);
+            if (p == null && bTryDefault) {    // default value for this FO!
+                try {
+                    p = make(propertyList);
+                } catch (FOPException e) {
+                    // don't know what to do here
+                }
+            }
+            return p;
+        }
+
+        /**
+         * Default implementation of isInherited.
+         * @return A boolean indicating whether this property is inherited.
+         */
+        public boolean isInherited() {
+            return inherited;
+        }
 
         /**
          * This is used to handle properties specified as a percentage of
@@ -133,21 +342,9 @@
          * @return an object implementing the PercentBase interface.
          */
         public PercentBase getPercentBase(FObj fo, PropertyList pl) {
-            return null;
-        }
-
-        /**
-         * Return a Maker object which is used to set the values on components
-         * of compound property types, such as "space".
-         * Overridden by property maker subclasses which handle
-         * compound properties.
-         * @param subprop The Constants ID of the component for which a Maker is to
-         * returned, for example CP_OPTIMUM, if the FO attribute is
-         * space.optimum='10pt'.
-         * @return the Maker object specified
-         */
-        protected Maker getSubpropMaker(int subpropId) {
-            return null;
+            if (percentBase == -1)
+                return null;
+            return new LengthBase(fo, pl, percentBase);
         }
 
         /**
@@ -165,43 +362,9 @@
          * compound properties.
          * @return the Property containing the subproperty
          */
-        public Property getSubpropValue(Property p, int subpropId) {
-            return null;
-        }
-
-        /**
-         * Return a property value for a compound property. If the property
-         * value is already partially initialized, this method will modify it.
-         * @param baseProp The Property object representing the compound property,
-         * for example: SpaceProperty.
-         * @param subpropId The Constants ID of the subproperty (component)
-         *        whose value is specified.
-         * @param propertyList The propertyList being built.
-         * @param fo The FO whose properties are being set.
-         * @param value the value of the
-         * @return baseProp (or if null, a new compound property object) with
-         * the new subproperty added
-         * @throws FOPException for invalid or inconsistent FO input
-         */
-        public Property make(Property baseProp, int subpropId,
-                             PropertyList propertyList, String value,
-                             FObj fo) throws FOPException {
-            if (baseProp == null) {
-                baseProp = makeCompound(propertyList, fo);
-            }
-
-            Maker spMaker = getSubpropMaker(subpropId);
-
-            if (spMaker != null) {
-                Property p = spMaker.make(propertyList, value, fo);
-                if (p != null) {
-                    return setSubprop(baseProp, subpropId, p);
-                }
-            } else {
-                //getLogger().error("compound property component "
-                //                       + partName + " unknown.");
-            }
-            return baseProp;
+        public Property getSubprop(Property p, int subpropId) {
+            CompoundDatatype val = (CompoundDatatype) p.getObject();
+            return val.getComponent(subpropId);
         }
 
         /**
@@ -220,10 +383,29 @@
          */
         protected Property setSubprop(Property baseProp, int partId,
                                       Property subProp) {
+            CompoundDatatype val = (CompoundDatatype) baseProp.getObject();
+            val.setComponent(partId, subProp, false);
             return baseProp;
         }
 
         /**
+         * Return the default value.   
+         * @param propertyList The PropertyList object being built for this FO.
+         * @return the Property object corresponding to the parameters
+         * @throws FOPException for invalid or inconsisten FO input
+         */
+        public Property make(PropertyList propertyList) throws FOPException {
+            if (defaultProperty != null) {
+                return defaultProperty;
+            }
+            Property p = make(propertyList, defaultValue, propertyList.getParentFObj());
+            if (!contextDep) {
+                defaultProperty = p;
+            }
+            return p;
+        }
+
+        /**
          * Create a Property object from an attribute specification.
          * @param propertyList The PropertyList object being built for this FO.
          * @param value The attribute value.
@@ -249,13 +431,9 @@
                                                       new PropertyInfo(this,
                                                       propertyList, fo));
                     newProp = convertProperty(p, propertyList, fo);
-                } else if (isCompoundMaker()) {
-                    newProp = convertProperty(newProp, propertyList, fo);
                 }
                 if (newProp == null) {
                     throw new org.apache.fop.fo.expr.PropertyException("No conversion defined");
-                } else if (inheritsSpecified()) {
-                    newProp.setSpecifiedValue(pvalue);
                 }
                 return newProp;
             } catch (org.apache.fop.fo.expr.PropertyException propEx) {
@@ -266,6 +444,28 @@
             }
         }
 
+        /**
+         * Make a property value for a compound property. If the property
+         * value is already partially initialized, this method will modify it.
+         * @param baseProp The Property object representing the compound property,
+         * for example: SpaceProperty.
+         * @param subpropId The Constants ID of the subproperty (component)
+         *        whose value is specified.
+         * @param propertyList The propertyList being built.
+         * @param fo The FO whose properties are being set.
+         * @param value the value of the
+         * @return baseProp (or if null, a new compound property object) with
+         * the new subproperty added
+         * @throws FOPException for invalid or inconsistent FO input
+         */
+        public Property make(Property baseProp, int subpropId,
+                             PropertyList propertyList, String value,
+                             FObj fo) throws FOPException {
+            //getLogger().error("compound property component "
+            //                       + partName + " unknown.");
+            return baseProp;
+        }
+
         public Property convertShorthandProperty(PropertyList propertyList,
                                                  Property prop, FObj fo) {
             Property pret = null;
@@ -311,23 +511,15 @@
         }
 
         /**
-         * Each property is either compound or not, with the default being not.
-         * This method should be overridden by subclasses that are Makers of
-         * compound properties.
-         * @return true if this Maker makes instances of compound properties
-         */
-        protected boolean isCompoundMaker() {
-            return false;
-        }
-
-        /**
          * For properties that contain enumerated values.
          * This method should be overridden by subclasses.
          * @param value the string containing the property value
          * @return the Property encapsulating the enumerated equivalent of the
          * input value
          */
-        public Property checkEnumValues(String value) {
+        protected Property checkEnumValues(String value) {
+            if (enums != null)
+                return (Property) enums.get(value);
             return null;
         }
 
@@ -335,25 +527,27 @@
          * Return a String to be parsed if the passed value corresponds to
          * a keyword which can be parsed and used to initialize the property.
          * For example, the border-width family of properties can have the
-         * initializers "thin", "medium", or "thick". The foproperties.xml
+         * initializers "thin", "medium", or "thick". The FOPropertyMapping
          * file specifies a length value equivalent for these keywords,
-         * such as "0.5pt" for "thin". These values are considered parseable,
-         * since the Length object is no longer responsible for parsing
-         * unit expresssions.
+         * such as "0.5pt" for "thin".
          * @param value The string value of property attribute.
          * @return A String containging a parseable equivalent or null if
          * the passed value isn't a keyword initializer for this Property.
          */
-        protected String checkValueKeywords(String value) {
-            return value;
+        protected String checkValueKeywords(String keyword) {
+            if (keywords != null) {
+                String value = (String)keywords.get(keyword);
+                if (value != null)
+                    return value;
+            }
+            return keyword;            
         }
 
         /**
          * Return a Property object based on the passed Property object.
          * This method is called if the Property object built by the parser
          * isn't the right type for this property.
-         * It is overridden by subclasses when the property specification in
-         * foproperties.xml specifies conversion rules.
+         * It is overridden by subclasses.
          * @param p The Property object return by the expression parser
          * @param propertyList The PropertyList object being built for this FO.
          * @param fo The current FO whose properties are being set.
@@ -361,7 +555,7 @@
          * can't be converted to the correct type.
          * @throws FOPException for invalid or inconsistent FO input
          */
-        public Property convertProperty(Property p,
+        protected Property convertProperty(Property p,
                                         PropertyList propertyList,
                                         FObj fo) throws FOPException {
             return null;
@@ -386,86 +580,24 @@
         }
 
         /**
-         * This method expects to be overridden by its subclasses.
-         * @param propertyList The PropertyList object being built for this FO.
-         * @return the Property object corresponding to the parameters
-         * @throws FOPException for invalid or inconsisten FO input
-         */
-        public Property make(PropertyList propertyList) throws FOPException {
-            return null;
-        }
-
-        /**
-         * Return a Property object representing the parameters.
-         * This method expects to be overridden by its subclasses.
-         * @param propertyList The PropertyList object being built for this FO.
-         * @param parentFO The parent FO for the FO whose property is being made.
-         * @return a Property subclass object holding a "compound" property object
-         * initialized to the default values for each component.
-         * @throws FOPException for invalid or inconsistent FO input
-         */
-        protected Property makeCompound(PropertyList propertyList,
-                                        FObj parentFO) throws FOPException {
-            return null;
-        }
-
-        /**
          * Return a Property object representing the value of this property,
          * based on other property values for this FO.
          * A special case is properties which inherit the specified value,
          * rather than the computed value.
          * @param propertyList The PropertyList for the FO.
          * @return Property A computed Property value or null if no rules
-         * are specified (in foproperties.xml) to compute the value.
+         * are specified to compute the value.
          * @throws FOPException for invalid or inconsistent FO input
          */
-        public Property compute(PropertyList propertyList)
+        protected Property compute(PropertyList propertyList)
                 throws FOPException {
-            if (inheritsSpecified()) {
-                // recalculate based on last specified value
-                // Climb up propertylist and find last spec'd value
-                Property specProp =
-                    propertyList.getNearestSpecified(propId);
-                if (specProp != null) {
-                    // Only need to do this if the value is relative!!!
-                    String specVal = specProp.getSpecifiedValue();
-                    if (specVal != null) {
-                        try {
-                            return make(propertyList, specVal,
-                                        propertyList.getParentFObj());
-                        } catch (FOPException e) {
-                            //getLogger()error("Error computing property value for "
-                            //                       + propName + " from "
-                            //                       + specVal);
-                            return null;
-                        }
-                    }
-                }
+            if (corresponding != null) {
+                return corresponding.compute(propertyList);
             }
             return null;    // standard
         }
 
         /**
-         * For properties that operate on a relative direction (before, after,
-         * start, end) instead of an absolute direction (top, bottom, left,
-         * right), this method determines whether a corresponding property
-         * is specified on the corresponding absolute direction. For example,
-         * the border-start-color property in a lr-tb writing-mode specifies
-         * the same thing that the border-left-color property specifies. In this
-         * example, if the Maker for the border-start-color property is testing,
-         * and if the border-left-color is specified in the properties,
-         * this method should return true.
-         * @param propertyList collection of properties to be tested
-         * @return true iff 1) the property operates on a relative direction,
-         * AND 2) the property has a corresponding property on an absolute
-         * direction, AND 3) the corresponding property on that absolute
-         * direction has been specified in the input properties
-         */
-        public boolean isCorrespondingForced(PropertyList propertyList) {
-            return false;
-        }
-
-        /**
          * For properties that can be set by shorthand properties, this method
          * should return the Property, if any, that is parsed from any
          * shorthand properties that affect this property.
@@ -478,11 +610,39 @@
          * @param propertyList the collection of properties to be considered
          * @return the Property, if found, the correspons, otherwise, null
          */
-        public Property getShorthand(PropertyList propertyList) {
+        protected Property getShorthand(PropertyList propertyList) {
+            if (shorthands == null) {
+                return null;
+            }
+            ListProperty listprop;
+            int n = shorthands.length;
+            for (int i = 0; i < n; i++) {
+                Property.Maker shorthand = shorthands[i];
+                listprop = (ListProperty)propertyList.getExplicit(shorthand.propId);
+                if (listprop != null) {
+                    ShorthandParser parser = shorthand.datatypeParser;
+                    Property p = parser.getValueForProperty(getPropId(),
+                                            listprop, this, propertyList);
+                    if (p != null) {
+                        return p;
+                    }
+                }
+            }
             return null;
         }
 
-    }    // end of nested Maker class
+        /**
+         * Return a clone of the makers. Used by useGeneric() to clone the
+         * subproperty makers of the generic compound makers. 
+         */
+        public Object clone() {
+            try {
+                return super.clone();
+            } catch (CloneNotSupportedException exc) {
+                return null;
+            }
+        }
+    }   // end of nested Maker class
 
     /**
      * The original specified value for properties which inherit
@@ -632,4 +792,11 @@
         return (o == null) ? null : o.toString();
     }
 
+    /**
+     * Return a string representation of the property value. Only used
+     * for debugging.
+     */
+    public String toString() {
+        return getString();
+    }
 }
Index: src/java/org/apache/fop/fo/PropertyList.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/PropertyList.java,v
retrieving revision 1.25
diff -u -r1.25 PropertyList.java
--- src/java/org/apache/fop/fo/PropertyList.java	13 Jan 2004 23:28:31 -0000	1.25
+++ src/java/org/apache/fop/fo/PropertyList.java	16 Jan 2004 16:15:16 -0000
@@ -57,8 +57,6 @@
 // FOP
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.Property.Maker;
-import org.apache.fop.fo.properties.FOPropertyMapping;
-import org.apache.fop.fo.properties.WritingMode;
 
 
 /**
@@ -68,6 +66,7 @@
 
     // writing-mode values
     private byte[] wmtable = null;
+    // writing-mode index
     private int writingMode;
     private static boolean[] inheritableProperty;
 
@@ -110,15 +109,15 @@
 
     private static final HashMap WRITING_MODE_TABLES = new HashMap(4);
     {
-        WRITING_MODE_TABLES.put(new Integer(WritingMode.LR_TB),    /* lr-tb */
+        WRITING_MODE_TABLES.put(new Integer(Constants.LR_TB),    /* lr-tb */
         new byte[] {
             START, END, BEFORE, AFTER, BLOCKPROGDIM, INLINEPROGDIM
         });
-        WRITING_MODE_TABLES.put(new Integer(WritingMode.RL_TB),    /* rl-tb */
+        WRITING_MODE_TABLES.put(new Integer(Constants.RL_TB),    /* rl-tb */
         new byte[] {
             END, START, BEFORE, AFTER, BLOCKPROGDIM, INLINEPROGDIM
         });
-        WRITING_MODE_TABLES.put(new Integer(WritingMode.TB_RL),    /* tb-rl */
+        WRITING_MODE_TABLES.put(new Integer(Constants.TB_RL),    /* tb-rl */
         new byte[] {
             AFTER, BEFORE, START, END, INLINEPROGDIM, BLOCKPROGDIM
         });
@@ -163,6 +162,13 @@
     }
 
     /**
+     * @return the FObj object attached to the parentPropetyList
+     */
+    public PropertyList getParentPropertyList() {
+        return parentPropertyList;
+    }
+
+    /**
      * @return the namespace of this element
      */
     public String getNameSpace() {
@@ -271,62 +277,19 @@
     private Property get(int propId, boolean bTryInherit,
                          boolean bTryDefault) {
 
-        Property p = findProperty(propId & Constants.PROPERTY_MASK, 
-                                    bTryInherit);
-        if (p == null && bTryDefault) {    // default value for this FO!
-            try {
-                p = makeProperty(propId & Constants.PROPERTY_MASK);
-            } catch (FOPException e) {
-                // don't know what to do here
-            }
-        }
-
-        // if value is inherit then get computed value from
-        // parent
-        if (p != null && "inherit".equals(p.getSpecifiedValue())) {
-            if (this.parentPropertyList != null) {
-                p = parentPropertyList.get(propId, true, false);
-            }
-        }
-
-        if ((propId & Constants.COMPOUND_MASK) != 0 && p != null) {
-            return getSubpropValue(p, propId);
-        } else {
-            return p;
+        Property.Maker propertyMaker = findMaker(propId & Constants.PROPERTY_MASK);
+        if (propertyMaker == null)
+            System.out.println("null");
+        try {
+            return propertyMaker.get(propId & Constants.COMPOUND_MASK, this,
+                                     bTryInherit, bTryDefault);
+        } catch (FOPException exc) {
+            fobj.getLogger().error("Error during property processing", exc);
         }
+        return null;
     }
 
-    /*
-     * If the property is a relative property with a corresponding absolute
-     * value specified, the absolute value is used. This is also true of
-     * the inheritance priority (I think...)
-     * If the property is an "absolute" property and it isn't specified, then
-     * we try to compute it from the corresponding relative property: this
-     * happens in computeProperty.
-     */
-    private Property findProperty(int propId, boolean bTryInherit) {
-        Property p = null;
 
-        if (isCorrespondingForced(propId)) {
-            p = computeProperty(propId);
-        } else {
-            p = getExplicitBaseProp(propId);
-            if (p == null) {
-                p = this.computeProperty(propId);
-            }
-            if (p == null) {    // check for shorthand specification
-                p = getShorthand(propId);
-            }
-            if (p == null && bTryInherit) {    
-                // else inherit (if has parent and is inheritable)
-                if (this.parentPropertyList != null
-                        && isInherited(propId)) {
-                    p = parentPropertyList.findProperty(propId, true);
-                }
-            }
-        }
-        return p;
-    }
 
     /**
      * Return the "nearest" specified value for the given property.
@@ -385,26 +348,13 @@
      */
     public int wmMap(int lrtb, int rltb, int tbrl) {
         switch (writingMode) {
-        case WritingMode.LR_TB: return lrtb;
-        case WritingMode.RL_TB: return rltb;
-        case WritingMode.TB_RL: return tbrl;
+        case Constants.LR_TB: return lrtb;
+        case Constants.RL_TB: return rltb;
+        case Constants.TB_RL: return tbrl;
         }
         return -1;
     }
 
-    /**
-     * Uses the stored writingMode.
-     * @param absdir an absolute direction (top, bottom, left, right)
-     * @return the corresponding writing model relative direction name
-     * for the flow object.
-     */
-    public String wmAbsToRel(int absdir) {
-        if (wmtable != null) {
-            return REL_NAMES[wmtable[absdir]];
-        } else {
-            return "";
-        }
-    }
 
     /**
      * Uses the stored writingMode.
@@ -593,7 +543,7 @@
         Property.Maker maker = findMaker(propId & Constants.PROPERTY_MASK);
 
         if (maker != null) {
-            return maker.getSubpropValue(p, propId & Constants.COMPOUND_MASK);
+            return maker.getSubprop(p, propId & Constants.COMPOUND_MASK);
         } else {
             return null;
         }
@@ -601,22 +551,6 @@
 
     /**
      * @param propId ID of property
-     * @return value from the appropriate Property.Maker
-     */
-    private boolean isCorrespondingForced(int propId) {
-                                             
-        Property.Maker propertyMaker = findMaker(propId);
-        
-        if (propertyMaker != null) {
-            return propertyMaker.isCorrespondingForced(this);
-        } else {
-            //log.error("no Maker for " + propertyName);
-        }
-        return false;
-    }
-
-    /**
-     * @param propId ID of property
      * @return new Property object
      */
     private Property getShorthand(int propId) {
@@ -642,31 +576,6 @@
 
         if (propertyMaker != null) {
             p = propertyMaker.make(this);
-        } else {
-            //log.error("property " + propertyName
-            //                       + " ignored");
-        }
-        return p;
-    }
-
-    /**
-     * @param propID ID of property
-     * @return the requested Property object
-     */
-    private Property computeProperty(int propId) {
-
-        Property p = null;
-        Property.Maker propertyMaker = findMaker(propId);
-
-        if (propertyMaker != null) {
-            try {
-                p = propertyMaker.compute(this);
-            } catch (FOPException e) {
-                //log.error("exception occurred while computing"
-                //                       + " value of property '"
-                //                       + propertyName + "': "
-                //                       + e.getMessage());
-            }
         } else {
             //log.error("property " + propertyName
             //                       + " ignored");
Index: src/java/org/apache/fop/fo/PropertyManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/PropertyManager.java,v
retrieving revision 1.19
diff -u -r1.19 PropertyManager.java
--- src/java/org/apache/fop/fo/PropertyManager.java	4 Jan 2004 21:14:34 -0000	1.19
+++ src/java/org/apache/fop/fo/PropertyManager.java	16 Jan 2004 16:15:17 -0000
@@ -64,7 +64,6 @@
 import org.apache.fop.traits.InlineProps;
 import org.apache.fop.traits.SpaceVal;
 import org.apache.fop.traits.LayoutProps; // keep, break, span, space?
-import org.apache.fop.fo.properties.Span;
 import org.apache.fop.fonts.FontMetrics;
 import org.apache.fop.fo.properties.CommonHyphenation;
 
@@ -316,7 +315,6 @@
                         getLength().getValue();
         props.endIndent = this.propertyList.get(PR_END_INDENT).
                         getLength().getValue();
-
         return props;
     }
 
@@ -454,7 +452,7 @@
         LayoutProps props = new LayoutProps();
         props.breakBefore = this.propertyList.get(PR_BREAK_BEFORE).getEnum();
         props.breakAfter = this.propertyList.get(PR_BREAK_AFTER).getEnum();
-        props.bIsSpan = (this.propertyList.get(PR_SPAN).getEnum() == Span.ALL);
+        props.bIsSpan = (this.propertyList.get(PR_SPAN).getEnum() == Constants.ALL);
         props.spaceBefore = new SpaceVal(
                               this.propertyList.get(PR_SPACE_BEFORE).getSpace());
         props.spaceAfter = new SpaceVal(
Index: src/java/org/apache/fop/fo/ShorthandParser.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/ShorthandParser.java,v
retrieving revision 1.4
diff -u -r1.4 ShorthandParser.java
--- src/java/org/apache/fop/fo/ShorthandParser.java	26 Dec 2003 23:41:47 -0000	1.4
+++ src/java/org/apache/fop/fo/ShorthandParser.java	16 Jan 2004 16:15:17 -0000
@@ -63,6 +63,7 @@
      * @return Property object corresponding to propName
      */
     Property getValueForProperty(int propId,
+                                 ListProperty listProperty,
                                  Property.Maker maker,
                                  PropertyList propertyList);
 }
Index: src/java/org/apache/fop/fo/SpaceProperty.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/SpaceProperty.java,v
retrieving revision 1.3
diff -u -r1.3 SpaceProperty.java
--- src/java/org/apache/fop/fo/SpaceProperty.java	22 Dec 2003 03:53:31 -0000	1.3
+++ src/java/org/apache/fop/fo/SpaceProperty.java	16 Jan 2004 16:15:17 -0000
@@ -50,8 +50,9 @@
  */
 package org.apache.fop.fo;
 
-import org.apache.fop.datatypes.Space;
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.LengthRange;
+import org.apache.fop.datatypes.Space;
 
 /**
  * Base class used for handling properties of the fo:space-before and
@@ -63,7 +64,7 @@
     /**
      * Inner class used to create new instances of SpaceProperty
      */
-    public static class Maker extends LengthRangeProperty.Maker {
+    public static class Maker extends CompoundPropertyMaker {
 
         /**
          * @param name name of the property whose Maker is to be created
@@ -72,6 +73,25 @@
             super(propId);
         }
 
+        /**
+         * Create a new empty instance of SpaceProperty.
+         * @return the new instance. 
+         */
+        public Property makeNewProperty() {
+            return new SpaceProperty(new Space());
+        }
+
+        /**
+         * @see CompoundPropertyMaker#convertProperty
+         */
+        public Property convertProperty(Property p,
+                                        PropertyList propertyList,
+                                        FObj fo) throws FOPException {
+            if (p instanceof SpaceProperty) {
+                return p;
+            }
+            return super.convertProperty(p, propertyList, fo);
+        }
     }
 
     private Space space;
Index: src/java/org/apache/fop/fo/TextInfo.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/TextInfo.java,v
retrieving revision 1.4
diff -u -r1.4 TextInfo.java
--- src/java/org/apache/fop/fo/TextInfo.java	14 Aug 2003 15:31:09 -0000	1.4
+++ src/java/org/apache/fop/fo/TextInfo.java	16 Jan 2004 16:15:17 -0000
@@ -54,7 +54,7 @@
 import org.apache.fop.fonts.Font;
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.traits.SpaceVal;
-import org.apache.fop.fo.properties.TextTransform;
+import org.apache.fop.fo.Constants;
 
 /**
  * Collection of properties used in
@@ -75,7 +75,7 @@
     /** fo:line-height property */
     public int lineHeight;
     /** fo:text-transform property */
-    public int textTransform = TextTransform.NONE;
+    public int textTransform = Constants.NONE;
 
     // Props used for calculating inline-progression-dimension
     /** fo:word-spacing property */
Index: src/java/org/apache/fop/fo/expr/FopPropValFunction.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/expr/FopPropValFunction.java,v
retrieving revision 1.4
diff -u -r1.4 FopPropValFunction.java
--- src/java/org/apache/fop/fo/expr/FopPropValFunction.java	31 Dec 2003 01:41:46 -0000	1.4
+++ src/java/org/apache/fop/fo/expr/FopPropValFunction.java	16 Jan 2004 16:15:18 -0000
@@ -50,8 +50,8 @@
  */
 package org.apache.fop.fo.expr;
 
+import org.apache.fop.fo.FOPropertyMapping;
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 
 
 /**
Index: src/java/org/apache/fop/fo/expr/FromParentFunction.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/expr/FromParentFunction.java,v
retrieving revision 1.3
diff -u -r1.3 FromParentFunction.java
--- src/java/org/apache/fop/fo/expr/FromParentFunction.java	27 Dec 2003 22:00:38 -0000	1.3
+++ src/java/org/apache/fop/fo/expr/FromParentFunction.java	16 Jan 2004 16:15:18 -0000
@@ -50,8 +50,8 @@
  */
 package org.apache.fop.fo.expr;
 
+import org.apache.fop.fo.FOPropertyMapping;
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 
 
 /**
Index: src/java/org/apache/fop/fo/expr/InheritedPropFunction.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/expr/InheritedPropFunction.java,v
retrieving revision 1.3
diff -u -r1.3 InheritedPropFunction.java
--- src/java/org/apache/fop/fo/expr/InheritedPropFunction.java	5 Jan 2004 01:31:09 -0000	1.3
+++ src/java/org/apache/fop/fo/expr/InheritedPropFunction.java	16 Jan 2004 16:15:18 -0000
@@ -51,7 +51,7 @@
 package org.apache.fop.fo.expr;
 
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.properties.FOPropertyMapping;
+import org.apache.fop.fo.FOPropertyMapping;
 
 /**
  * Class modelling the inherited-property-value Property Value function. See
Index: src/java/org/apache/fop/fo/expr/NearestSpecPropFunction.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/expr/NearestSpecPropFunction.java,v
retrieving revision 1.3
diff -u -r1.3 NearestSpecPropFunction.java
--- src/java/org/apache/fop/fo/expr/NearestSpecPropFunction.java	5 Jan 2004 00:44:59 -0000	1.3
+++ src/java/org/apache/fop/fo/expr/NearestSpecPropFunction.java	16 Jan 2004 16:15:18 -0000
@@ -51,7 +51,7 @@
 package org.apache.fop.fo.expr;
 
 import org.apache.fop.fo.Property;
-import org.apache.fop.fo.properties.FOPropertyMapping;
+import org.apache.fop.fo.FOPropertyMapping;
 
 /**
  * Class modelling the from-nearest-specified-value function. See Sec. 5.10.4
Index: src/java/org/apache/fop/fo/expr/PropertyInfo.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/expr/PropertyInfo.java,v
retrieving revision 1.3
diff -u -r1.3 PropertyInfo.java
--- src/java/org/apache/fop/fo/expr/PropertyInfo.java	29 Dec 2003 23:28:47 -0000	1.3
+++ src/java/org/apache/fop/fo/expr/PropertyInfo.java	16 Jan 2004 16:15:18 -0000
@@ -84,16 +84,6 @@
     }
 
     /**
-     * Return whether this property inherits specified values.
-     * Propagates to the Maker.
-     * @return true if the property inherits specified values, false if it
-     * inherits computed values.
-     */
-    public boolean inheritsSpecified() {
-        return maker.inheritsSpecified();
-    }
-
-    /**
      * Return the PercentBase object used to calculate the absolute value from
      * a percent specification.
      * Propagates to the Maker.
Index: src/java/org/apache/fop/fo/flow/ExternalGraphic.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/ExternalGraphic.java,v
retrieving revision 1.16
diff -u -r1.16 ExternalGraphic.java
--- src/java/org/apache/fop/fo/flow/ExternalGraphic.java	3 Jan 2004 03:13:37 -0000	1.16
+++ src/java/org/apache/fop/fo/flow/ExternalGraphic.java	16 Jan 2004 16:15:19 -0000
@@ -58,10 +58,6 @@
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.TextAlign;
-import org.apache.fop.fo.properties.Overflow;
-import org.apache.fop.fo.properties.DisplayAlign;
-import org.apache.fop.fo.properties.Scaling;
 import org.apache.fop.image.ImageFactory;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.datatypes.Length;
@@ -153,7 +149,7 @@
         }
 
         int scaling = propertyList.get(PR_SCALING).getEnum();
-        if ((scaling == Scaling.UNIFORM) || (cwidth == -1) || cheight == -1) {
+        if ((scaling == UNIFORM) || (cwidth == -1) || cheight == -1) {
             ImageFactory fact = ImageFactory.getInstance();
             fopimage = fact.getImage(url, getUserAgent());
             if (fopimage == null) {
@@ -196,9 +192,9 @@
 
         if (cwidth > viewWidth || cheight > viewHeight) {
             int overflow = propertyList.get(PR_OVERFLOW).getEnum();
-            if (overflow == Overflow.HIDDEN) {
+            if (overflow == HIDDEN) {
                 clip = true;
-            } else if (overflow == Overflow.ERROR_IF_OVERFLOW) {
+            } else if (overflow == ERROR_IF_OVERFLOW) {
                 getLogger().error("Image: " + url
                                   + " overflows the viewport, clipping to viewport");
                 clip = true;
@@ -209,30 +205,30 @@
         int yoffset = 0;
         int da = propertyList.get(PR_DISPLAY_ALIGN).getEnum();
         switch(da) {
-            case DisplayAlign.BEFORE:
+            case BEFORE:
             break;
-            case DisplayAlign.AFTER:
+            case AFTER:
                 yoffset = viewHeight - cheight;
             break;
-            case DisplayAlign.CENTER:
+            case CENTER:
                 yoffset = (viewHeight - cheight) / 2;
             break;
-            case DisplayAlign.AUTO:
+            case AUTO:
             default:
             break;
         }
 
         int ta = propertyList.get(PR_TEXT_ALIGN).getEnum();
         switch(ta) {
-            case TextAlign.CENTER:
+            case CENTER:
                 xoffset = (viewWidth - cwidth) / 2;
             break;
-            case TextAlign.END:
+            case END:
                 xoffset = viewWidth - cwidth;
             break;
-            case TextAlign.START:
+            case START:
             break;
-            case TextAlign.JUSTIFY:
+            case JUSTIFY:
             default:
             break;
         }
Index: src/java/org/apache/fop/fo/flow/Inline.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/Inline.java,v
retrieving revision 1.8
diff -u -r1.8 Inline.java
--- src/java/org/apache/fop/fo/flow/Inline.java	27 Dec 2003 22:00:38 -0000	1.8
+++ src/java/org/apache/fop/fo/flow/Inline.java	16 Jan 2004 16:15:19 -0000
@@ -59,7 +59,6 @@
 import org.apache.fop.fo.FObjMixed;
 import org.apache.fop.fo.InlineCharIterator;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.TextDecoration;
 import org.apache.fop.fo.properties.CommonAccessibility;
 import org.apache.fop.fo.properties.CommonAural;
 import org.apache.fop.fo.properties.CommonBackground;
@@ -135,15 +134,15 @@
 
         int textDecoration = this.propertyList.get(PR_TEXT_DECORATION).getEnum();
 
-        if (textDecoration == TextDecoration.UNDERLINE) {
+        if (textDecoration == UNDERLINE) {
             this.underlined = true;
         }
 
-        if (textDecoration == TextDecoration.OVERLINE) {
+        if (textDecoration == OVERLINE) {
             this.overlined = true;
         }
 
-        if (textDecoration == TextDecoration.LINE_THROUGH) {
+        if (textDecoration == LINE_THROUGH) {
             this.lineThrough = true;
         }
         
Index: src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java,v
retrieving revision 1.11
diff -u -r1.11 InstreamForeignObject.java
--- src/java/org/apache/fop/fo/flow/InstreamForeignObject.java	28 Dec 2003 17:10:16 -0000	1.11
+++ src/java/org/apache/fop/fo/flow/InstreamForeignObject.java	16 Jan 2004 16:15:19 -0000
@@ -53,8 +53,6 @@
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.fo.FObj;
-import org.apache.fop.fo.properties.DisplayAlign;
-import org.apache.fop.fo.properties.TextAlign;
 
 /**
  * The instream-foreign-object flow formatting object.
@@ -76,15 +74,15 @@
         int xoffset = 0;
         int ta = propertyList.get(PR_TEXT_ALIGN).getEnum();
         switch (ta) {
-            case TextAlign.CENTER:
+            case CENTER:
                 xoffset = (ipd - cwidth) / 2;
                 break;
-            case TextAlign.END:
+            case END:
                 xoffset = ipd - cwidth;
                 break;
-            case TextAlign.START:
+            case START:
                 break;
-            case TextAlign.JUSTIFY:
+            case JUSTIFY:
             default:
                 break;
         }
@@ -95,15 +93,15 @@
         int yoffset = 0;
         int da = propertyList.get(PR_DISPLAY_ALIGN).getEnum();
         switch (da) {
-            case DisplayAlign.BEFORE:
+            case BEFORE:
                 break;
-            case DisplayAlign.AFTER:
+            case AFTER:
                 yoffset = bpd - cheight;
                 break;
-            case DisplayAlign.CENTER:
+            case CENTER:
                 yoffset = (bpd - cheight) / 2;
                 break;
-            case DisplayAlign.AUTO:
+            case AUTO:
             default:
                 break;
         }
Index: src/java/org/apache/fop/fo/flow/Leader.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/Leader.java,v
retrieving revision 1.19
diff -u -r1.19 Leader.java
--- src/java/org/apache/fop/fo/flow/Leader.java	2 Jan 2004 23:53:09 -0000	1.19
+++ src/java/org/apache/fop/fo/flow/Leader.java	16 Jan 2004 16:15:19 -0000
@@ -62,8 +62,6 @@
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
 import org.apache.fop.fo.properties.CommonMarginInline;
 import org.apache.fop.fo.properties.CommonRelativePosition;
-import org.apache.fop.fo.properties.FOPropertyMapping;
-import org.apache.fop.fo.properties.LeaderPattern;
 import org.apache.fop.fonts.Font;
 
 /**
@@ -140,19 +138,19 @@
         // determines the pattern of leader; allowed values: space, rule,dots, use-content
         leaderPattern = this.propertyList.get(PR_LEADER_PATTERN).getEnum();
         switch(leaderPattern) {
-            case LeaderPattern.SPACE:
+            case SPACE:
                 // use Space
             break;
-            case LeaderPattern.RULE:
+            case RULE:
                 // the following properties only apply
                 // for leader-pattern = "rule"
                 ruleThickness =
                          propertyList.get(PR_RULE_THICKNESS).getLength().getValue();
                 ruleStyle = propertyList.get(PR_RULE_STYLE).getEnum();
             break;
-            case LeaderPattern.DOTS:
+            case DOTS:
             break;
-            case LeaderPattern.USECONTENT:
+            case USECONTENT:
                 // use inline layout manager to create inline areas
                 // add the inline parent multiple times until leader full
             break;
@@ -164,9 +162,8 @@
 
     }
 
-    public int getLength(String prop, int dim) {
+    public int getLength(int propId, int dim) {
         int length;
-        int propId = FOPropertyMapping.getPropertyId(prop);
         Length maxlength = propertyList.get(propId).getLength();
         if (maxlength instanceof PercentLength) {
             length = (int)(((PercentLength)maxlength).value()
Index: src/java/org/apache/fop/fo/flow/Table.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/Table.java,v
retrieving revision 1.10
diff -u -r1.10 Table.java
--- src/java/org/apache/fop/fo/flow/Table.java	28 Dec 2003 17:10:17 -0000	1.10
+++ src/java/org/apache/fop/fo/flow/Table.java	16 Jan 2004 16:15:20 -0000
@@ -63,9 +63,6 @@
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.TableLayout;
-import org.apache.fop.fo.properties.TableOmitFooterAtBreak;
-import org.apache.fop.fo.properties.TableOmitHeaderAtBreak;
 import org.apache.fop.fo.properties.CommonAccessibility;
 import org.apache.fop.fo.properties.CommonAural;
 import org.apache.fop.fo.properties.CommonBackground;
@@ -181,14 +178,12 @@
                      PR_INLINE_PROGRESSION_DIMENSION).getLengthRange();
         this.height = this.propertyList.get(PR_HEIGHT).getLength().getValue();
         this.bAutoLayout = (this.propertyList.get(
-                PR_TABLE_LAYOUT).getEnum() == TableLayout.AUTO);
+                PR_TABLE_LAYOUT).getEnum() == AUTO);
 
         this.omitHeaderAtBreak = this.propertyList.get(
-                PR_TABLE_OMIT_HEADER_AT_BREAK).getEnum()
-                                            == TableOmitHeaderAtBreak.TRUE;
+                PR_TABLE_OMIT_HEADER_AT_BREAK).getEnum() == TRUE;
         this.omitFooterAtBreak = this.propertyList.get(
-                PR_TABLE_OMIT_FOOTER_AT_BREAK).getEnum()
-                                            == TableOmitFooterAtBreak.TRUE;
+                PR_TABLE_OMIT_FOOTER_AT_BREAK).getEnum() == TRUE;
 
     }
 
Index: src/java/org/apache/fop/fo/flow/TableCell.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/TableCell.java,v
retrieving revision 1.10
diff -u -r1.10 TableCell.java
--- src/java/org/apache/fop/fo/flow/TableCell.java	28 Dec 2003 17:10:17 -0000	1.10
+++ src/java/org/apache/fop/fo/flow/TableCell.java	16 Jan 2004 16:15:20 -0000
@@ -59,8 +59,6 @@
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.BorderCollapse;
-import org.apache.fop.fo.properties.DisplayAlign;
 
 import org.apache.fop.fo.properties.CommonAccessibility;
 import org.apache.fop.fo.properties.CommonAural;
@@ -252,13 +250,13 @@
             this.propertyList.get(PR_BACKGROUND_COLOR).getColorType();
 
         bSepBorders = (this.propertyList.get(PR_BORDER_COLLAPSE).getEnum()
-                       == BorderCollapse.SEPARATE);
+                       == SEPARATE);
 
         calcBorders(propMgr.getBorderAndPadding());
 
         // Vertical cell alignment
         verticalAlign = this.propertyList.get(PR_DISPLAY_ALIGN).getEnum();
-        if (verticalAlign == DisplayAlign.AUTO) {
+        if (verticalAlign == AUTO) {
             // Depends on all cells starting in row
             bRelativeAlign = true;
             verticalAlign = this.propertyList.get(PR_RELATIVE_ALIGN).getEnum();
Index: src/java/org/apache/fop/fo/flow/TableRow.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/flow/TableRow.java,v
retrieving revision 1.12
diff -u -r1.12 TableRow.java
--- src/java/org/apache/fop/fo/flow/TableRow.java	14 Jan 2004 00:00:37 -0000	1.12
+++ src/java/org/apache/fop/fo/flow/TableRow.java	16 Jan 2004 16:15:21 -0000
@@ -58,6 +58,7 @@
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.datatypes.KeepValue;
 import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.FOPropertyMapping;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.Property;
 import org.apache.fop.fo.FOTreeVisitor;
@@ -68,7 +69,6 @@
 import org.apache.fop.fo.properties.CommonBackground;
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
 import org.apache.fop.fo.properties.CommonRelativePosition;
-import org.apache.fop.fo.properties.FOPropertyMapping;
 
 /**
  * Class modelling the fo:table-row object. See Sec. 6.7.9 of the XSL-FO
Index: src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java,v
retrieving revision 1.6
diff -u -r1.6 ConditionalPageMasterReference.java
--- src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java	14 Jan 2004 00:00:37 -0000	1.6
+++ src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java	16 Jan 2004 16:15:21 -0000
@@ -57,9 +57,6 @@
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.BlankOrNotBlank;
-import org.apache.fop.fo.properties.OddOrEven;
-import org.apache.fop.fo.properties.PagePosition;
 import org.apache.fop.apps.FOPException;
 
 /**
@@ -133,17 +130,17 @@
                               boolean isBlankPage) {
         // page-position
         if (isFirstPage) {
-            if (pagePosition == PagePosition.REST) {
+            if (pagePosition == REST) {
                 return false;
-            } else if (pagePosition == PagePosition.LAST) {
+            } else if (pagePosition == LAST) {
                 // ?? how can one know at this point?
                 getLogger().debug("LAST PagePosition NYI");
                 return false;
             }
         } else {
-            if (pagePosition == PagePosition.FIRST) {
+            if (pagePosition == FIRST) {
                 return false;
-            } else if (pagePosition == PagePosition.LAST) {
+            } else if (pagePosition == LAST) {
                 // ?? how can one know at this point?
                 getLogger().debug("LAST PagePosition NYI");
                 // potentially valid, don't return
@@ -152,22 +149,22 @@
 
         // odd-or-even
         if (isOddPage) {
-            if (oddOrEven == OddOrEven.EVEN) {
+            if (oddOrEven == EVEN) {
               return false;
             }
         } else {
-            if (oddOrEven == OddOrEven.ODD) {
+            if (oddOrEven == ODD) {
               return false;
             }
         }
 
         // blank-or-not-blank
         if (isBlankPage) {
-            if (blankOrNotBlank == BlankOrNotBlank.NOT_BLANK) {
+            if (blankOrNotBlank == NOT_BLANK) {
                 return false;
             }
         } else {
-            if (blankOrNotBlank == BlankOrNotBlank.BLANK) {
+            if (blankOrNotBlank == BLANK) {
                 return false;
             }
         }
Index: src/java/org/apache/fop/fo/pagination/RegionAfter.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionAfter.java,v
retrieving revision 1.6
diff -u -r1.6 RegionAfter.java
--- src/java/org/apache/fop/fo/pagination/RegionAfter.java	16 Sep 2003 05:21:06 -0000	1.6
+++ src/java/org/apache/fop/fo/pagination/RegionAfter.java	16 Jan 2004 16:15:21 -0000
@@ -56,7 +56,6 @@
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.datatypes.FODimension;
 
 /**
@@ -77,7 +76,7 @@
     public Rectangle getViewportRectangle (FODimension reldims) {
         // Depends on extent, precedence ans writing mode
         Rectangle vpRect;
-        if (this.wm == WritingMode.LR_TB || this.wm == WritingMode.RL_TB) {
+        if (this.wm == LR_TB || this.wm == RL_TB) {
             vpRect = new Rectangle(0, reldims.bpd - getExtent(), reldims.ipd, getExtent());
         } else {
             vpRect = new Rectangle(0, reldims.bpd - getExtent(), getExtent(), reldims.ipd);
Index: src/java/org/apache/fop/fo/pagination/RegionBA.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionBA.java,v
retrieving revision 1.5
diff -u -r1.5 RegionBA.java
--- src/java/org/apache/fop/fo/pagination/RegionBA.java	28 Dec 2003 17:10:17 -0000	1.5
+++ src/java/org/apache/fop/fo/pagination/RegionBA.java	16 Jan 2004 16:15:21 -0000
@@ -55,8 +55,6 @@
 
 // FOP
 import org.apache.fop.fo.FONode;
-import org.apache.fop.fo.properties.Precedence;
-import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.fo.FOTreeVisitor;
 
 /**
@@ -86,7 +84,7 @@
     public void end() {
         super.end();
         bPrecedence =
-            (this.propertyList.get(PR_PRECEDENCE).getEnum() == Precedence.TRUE);
+            (this.propertyList.get(PR_PRECEDENCE).getEnum() == TRUE);
     }
 
     /**
@@ -110,7 +108,7 @@
             offset += end.getExtent();
         }
         if (offset > 0) {
-            if (wm == WritingMode.LR_TB || wm == WritingMode.RL_TB) {
+            if (wm == LR_TB || wm == RL_TB) {
                 vpRect.width -= offset;
             } else {
                 vpRect.height -= offset;
Index: src/java/org/apache/fop/fo/pagination/RegionBefore.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionBefore.java,v
retrieving revision 1.6
diff -u -r1.6 RegionBefore.java
--- src/java/org/apache/fop/fo/pagination/RegionBefore.java	16 Sep 2003 05:21:06 -0000	1.6
+++ src/java/org/apache/fop/fo/pagination/RegionBefore.java	16 Jan 2004 16:15:21 -0000
@@ -52,7 +52,6 @@
 
 // FOP
 import org.apache.fop.datatypes.FODimension;
-import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
 
@@ -103,7 +102,7 @@
         // Before is always 0, start depends on extent
         // ipd depends on precedence, bpd=extent
         Rectangle vpRect;
-        if (this.wm == WritingMode.LR_TB || this.wm == WritingMode.RL_TB) {
+        if (this.wm == LR_TB || this.wm == RL_TB) {
             vpRect = new Rectangle(0, 0, reldims.ipd, getExtent());
         } else {
             vpRect = new Rectangle(0, 0, getExtent(), reldims.ipd);
Index: src/java/org/apache/fop/fo/pagination/RegionBody.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionBody.java,v
retrieving revision 1.12
diff -u -r1.12 RegionBody.java
--- src/java/org/apache/fop/fo/pagination/RegionBody.java	14 Jan 2004 00:00:37 -0000	1.12
+++ src/java/org/apache/fop/fo/pagination/RegionBody.java	16 Jan 2004 16:15:22 -0000
@@ -60,8 +60,7 @@
 import org.apache.fop.fo.Property;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.properties.CommonMarginBlock;
-import org.apache.fop.fo.properties.FOPropertyMapping;
-import org.apache.fop.fo.properties.WritingMode;
+import org.apache.fop.fo.FOPropertyMapping;
 
 /**
  * The fo:region-body element.
@@ -91,7 +90,7 @@
         CommonMarginBlock mProps = propMgr.getMarginProps();
         int start = getRelMargin(PropertyList.START, PR_START_INDENT);
         Rectangle vpRect;
-        if (this.wm == WritingMode.LR_TB || this.wm == WritingMode.RL_TB) {
+        if (this.wm == LR_TB || this.wm == RL_TB) {
             vpRect = new Rectangle(start, mProps.spaceBefore,
                     reldims.ipd - start
                         - getRelMargin(PropertyList.END, PR_END_INDENT),
Index: src/java/org/apache/fop/fo/pagination/RegionEnd.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionEnd.java,v
retrieving revision 1.6
diff -u -r1.6 RegionEnd.java
--- src/java/org/apache/fop/fo/pagination/RegionEnd.java	16 Sep 2003 05:21:06 -0000	1.6
+++ src/java/org/apache/fop/fo/pagination/RegionEnd.java	16 Jan 2004 16:15:22 -0000
@@ -56,7 +56,6 @@
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.datatypes.FODimension;
 
 /**
@@ -78,7 +77,7 @@
     public Rectangle getViewportRectangle (FODimension reldims) {
         // Depends on extent, precedence and writing mode
         Rectangle vpRect;
-        if (this.wm == WritingMode.LR_TB || this.wm == WritingMode.RL_TB) {
+        if (this.wm == LR_TB || this.wm == RL_TB) {
             vpRect = new Rectangle(reldims.ipd - getExtent(), 0,
                     getExtent(), reldims.bpd);
         } else {
Index: src/java/org/apache/fop/fo/pagination/RegionSE.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionSE.java,v
retrieving revision 1.3
diff -u -r1.3 RegionSE.java
--- src/java/org/apache/fop/fo/pagination/RegionSE.java	16 Sep 2003 05:21:06 -0000	1.3
+++ src/java/org/apache/fop/fo/pagination/RegionSE.java	16 Jan 2004 16:15:22 -0000
@@ -56,7 +56,6 @@
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.WritingMode;
 
 /**
  * Abstract base class for fo:region-start and fo:region-end.
@@ -92,7 +91,7 @@
             offset += after.getExtent();
         }
         if (offset > 0) {
-            if (wm == WritingMode.LR_TB || wm == WritingMode.RL_TB) {
+            if (wm == LR_TB || wm == RL_TB) {
                 refRect.height -= offset;
             } else {
                 refRect.width -= offset;
Index: src/java/org/apache/fop/fo/pagination/RegionStart.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/fo/pagination/RegionStart.java,v
retrieving revision 1.6
diff -u -r1.6 RegionStart.java
--- src/java/org/apache/fop/fo/pagination/RegionStart.java	16 Sep 2003 05:21:06 -0000	1.6
+++ src/java/org/apache/fop/fo/pagination/RegionStart.java	16 Jan 2004 16:15:22 -0000
@@ -56,7 +56,6 @@
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeVisitor;
-import org.apache.fop.fo.properties.WritingMode;
 import org.apache.fop.datatypes.FODimension;
 
 /**
@@ -79,7 +78,7 @@
         // This is the rectangle relative to the page-reference area in
         // writing-mode relative coordinates
         Rectangle vpRect;
-        if (this.wm == WritingMode.LR_TB || this.wm == WritingMode.RL_TB) {
+        if (this.wm == LR_TB || this.wm == RL_TB) {
             vpRect = new Rectangle(0, 0, getExtent(), reldims.bpd);
         } else {
             vpRect = new Rectangle(0, 0, reldims.bpd, getExtent());
Index: src/java/org/apache/fop/layoutmgr/AddLMVisitor.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/AddLMVisitor.java,v
retrieving revision 1.27
diff -u -r1.27 AddLMVisitor.java
--- src/java/org/apache/fop/layoutmgr/AddLMVisitor.java	9 Jan 2004 03:26:00 -0000	1.27
+++ src/java/org/apache/fop/layoutmgr/AddLMVisitor.java	16 Jan 2004 16:15:24 -0000
@@ -154,9 +154,6 @@
 import org.apache.fop.fo.pagination.Title;
 import org.apache.fop.fo.properties.CommonBackground;
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
-import org.apache.fop.fo.properties.LeaderPattern;
-import org.apache.fop.fo.properties.Overflow;
-import org.apache.fop.fo.properties.Scaling;
 import org.apache.fop.layoutmgr.list.Item;
 import org.apache.fop.layoutmgr.list.ListBlockLayoutManager;
 import org.apache.fop.layoutmgr.list.ListItemLayoutManager;
@@ -359,9 +356,9 @@
 
      public MinOptMax getLeaderAllocIPD(Leader node, int ipd) {
          // length of the leader
-         int opt = node.getLength("leader-length.optimum", ipd);
-         int min = node.getLength("leader-length.minimum", ipd);
-         int max = node.getLength("leader-length.maximum", ipd);
+         int opt = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_OPTIMUM, ipd);
+         int min = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_MINIMUM, ipd);
+         int max = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_MAXIMUM, ipd);
 
          return new MinOptMax(min, opt, max);
      }
@@ -370,14 +367,14 @@
          node.setup();
          InlineArea leaderArea = null;
 
-         if (node.getLeaderPattern() == LeaderPattern.RULE) {
+         if (node.getLeaderPattern() == Constants.RULE) {
              org.apache.fop.area.inline.Leader leader = new org.apache.fop.area.inline.Leader();
              leader.setRuleStyle(node.getRuleStyle());
              leader.setRuleThickness(node.getRuleThickness());
              leaderArea = leader;
-         } else if (node.getLeaderPattern() == LeaderPattern.SPACE) {
+         } else if (node.getLeaderPattern() == Constants.SPACE) {
              leaderArea = new Space();
-         } else if (node.getLeaderPattern() == LeaderPattern.DOTS) {
+         } else if (node.getLeaderPattern() == Constants.DOTS) {
              TextArea t = new TextArea();
              char dot = '.'; // userAgent.getLeaderDotCharacter();
 
@@ -403,7 +400,7 @@
              fa.setHeight(node.getFontState().getAscender());
 
              leaderArea = fa;
-         } else if (node.getLeaderPattern() == LeaderPattern.USECONTENT) {
+         } else if (node.getLeaderPattern() == Constants.USECONTENT) {
              if (node.getChildren() == null) {
                  node.getLogger().error("Leader use-content with no content");
                  return null;
@@ -644,7 +641,7 @@
              cheight = (int)size.getY() * 1000;
          }
          int scaling = node.propertyList.get(Constants.PR_SCALING).getEnum();
-         if (scaling == Scaling.UNIFORM) {
+         if (scaling == Constants.UNIFORM) {
              // adjust the larger
              double rat1 = cwidth / (size.getX() * 1000f);
              double rat2 = cheight / (size.getY() * 1000f);
@@ -666,9 +663,9 @@
          boolean clip = false;
          if (cwidth > ipd || cheight > bpd) {
              int overflow = node.propertyList.get(Constants.PR_OVERFLOW).getEnum();
-             if (overflow == Overflow.HIDDEN) {
+             if (overflow == Constants.HIDDEN) {
                  clip = true;
-             } else if (overflow == Overflow.ERROR_IF_OVERFLOW) {
+             } else if (overflow == Constants.ERROR_IF_OVERFLOW) {
                  node.getLogger().error("Instream foreign object overflows the viewport: clipping");
                  clip = true;
              }
Index: src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java,v
retrieving revision 1.10
diff -u -r1.10 BlockContainerLayoutManager.java
--- src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java	29 Dec 2003 23:28:47 -0000	1.10
+++ src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java	16 Jan 2004 16:15:25 -0000
@@ -58,8 +58,6 @@
 import org.apache.fop.area.Block;
 import org.apache.fop.fo.PropertyManager;
 import org.apache.fop.fo.properties.CommonAbsolutePosition;
-import org.apache.fop.fo.properties.AbsolutePosition;
-import org.apache.fop.fo.properties.Overflow;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.area.CTM;
 import org.apache.fop.datatypes.FODimension;
@@ -99,7 +97,7 @@
         propManager = pm;
 
         abProps = pm.getAbsolutePositionProps();
-        if (abProps.absolutePosition == AbsolutePosition.ABSOLUTE) {
+        if (abProps.absolutePosition == ABSOLUTE) {
             Rectangle2D rect = new Rectangle2D.Double(abProps.left,
                                 abProps.top, abProps.right - abProps.left,
                                 abProps.bottom - abProps.top);
@@ -121,7 +119,7 @@
 
     public BreakPoss getNextBreakPoss(LayoutContext context) {
 
-        if (abProps.absolutePosition == AbsolutePosition.ABSOLUTE) {
+        if (abProps.absolutePosition == ABSOLUTE) {
             return getAbsoluteBreakPoss(context);
         }
 
@@ -251,9 +249,9 @@
         breakPoss.setStackingSize(new MinOptMax(0));
 
         if (stackSize.opt > relDims.bpd) {
-            if (overflow == Overflow.HIDDEN) {
+            if (overflow == HIDDEN) {
                 clip = true;
-            } else if (overflow == Overflow.ERROR_IF_OVERFLOW) {
+            } else if (overflow == ERROR_IF_OVERFLOW) {
                 getLogger().error("contents overflows block-container viewport: clipping");
                 clip = true;
             }
@@ -307,7 +305,7 @@
             TraitSetter.addBackground(viewportBlockArea,
                                       propManager.getBackgroundProps());
             
-            if (abProps.absolutePosition == AbsolutePosition.ABSOLUTE) {
+            if (abProps.absolutePosition == ABSOLUTE) {
                 viewportBlockArea.setXOffset(abProps.left);
                 viewportBlockArea.setYOffset(abProps.top);
                 viewportBlockArea.setWidth(abProps.right - abProps.left);
@@ -340,7 +338,7 @@
 
             curBlockArea = new Block();
 
-            if (abProps.absolutePosition == AbsolutePosition.ABSOLUTE) {
+            if (abProps.absolutePosition == ABSOLUTE) {
                 viewportBlockArea.setPositioning(Block.ABSOLUTE);
             }
 
Index: src/java/org/apache/fop/layoutmgr/InlineStackingLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/InlineStackingLayoutManager.java,v
retrieving revision 1.4
diff -u -r1.4 InlineStackingLayoutManager.java
--- src/java/org/apache/fop/layoutmgr/InlineStackingLayoutManager.java	8 Sep 2003 17:00:54 -0000	1.4
+++ src/java/org/apache/fop/layoutmgr/InlineStackingLayoutManager.java	16 Jan 2004 16:15:26 -0000
@@ -292,6 +292,10 @@
             // Reset state variables
             clearPrevIPD(); // Clear stored prev content dimensions
         }
+        // I don't have a clue if this is right.
+        if (childLC == null) {
+            childLC = new LayoutContext(lc);
+        }
 
         // We only do this loop more than once if a childLM returns
         // a null BreakPoss, meaning it has nothing (more) to layout.
Index: src/java/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java,v
retrieving revision 1.3
diff -u -r1.3 LeafNodeLayoutManager.java
--- src/java/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java	8 Sep 2003 17:00:54 -0000	1.3
+++ src/java/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java	16 Jan 2004 16:15:26 -0000
@@ -52,7 +52,6 @@
 
 import org.apache.fop.area.Area;
 import org.apache.fop.area.inline.InlineArea;
-import org.apache.fop.fo.properties.VerticalAlign;
 import org.apache.fop.traits.MinOptMax;
 
 /**
@@ -171,17 +170,17 @@
 
         int bpd = curArea.getHeight();
         switch (alignment) {
-            case VerticalAlign.MIDDLE:
+            case MIDDLE:
                 bp.setMiddle(bpd / 2 /* - fontLead/2 */);
                 bp.setLead(bpd / 2 /* + fontLead/2 */);
             break;
-            case VerticalAlign.TOP:
+            case TOP:
                 bp.setTotal(bpd);
             break;
-            case VerticalAlign.BOTTOM:
+            case BOTTOM:
                 bp.setTotal(bpd);
             break;
-            case VerticalAlign.BASELINE:
+            case BASELINE:
             default:
                 bp.setLead(bpd);
             break;
@@ -243,16 +242,16 @@
     protected void offsetArea(LayoutContext context) {
         int bpd = curArea.getHeight();
         switch (alignment) {
-            case VerticalAlign.MIDDLE:
+            case MIDDLE:
                 curArea.setOffset(context.getBaseline() - bpd / 2 /* - fontLead/2 */);
             break;
-            case VerticalAlign.TOP:
+            case TOP:
                 //curArea.setOffset(0);
             break;
-            case VerticalAlign.BOTTOM:
+            case BOTTOM:
                 curArea.setOffset(context.getLineHeight() - bpd);
             break;
-            case VerticalAlign.BASELINE:
+            case BASELINE:
             default:
                 curArea.setOffset(context.getBaseline() - bpd);
             break;
Index: src/java/org/apache/fop/layoutmgr/LineLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/LineLayoutManager.java,v
retrieving revision 1.10
diff -u -r1.10 LineLayoutManager.java
--- src/java/org/apache/fop/layoutmgr/LineLayoutManager.java	2 Jan 2004 22:51:31 -0000	1.10
+++ src/java/org/apache/fop/layoutmgr/LineLayoutManager.java	16 Jan 2004 16:15:27 -0000
@@ -58,7 +58,6 @@
 import org.apache.fop.traits.BlockProps;
 import org.apache.fop.area.LineArea;
 import org.apache.fop.area.Resolveable;
-import org.apache.fop.fo.properties.TextAlign;
 
 import java.util.ListIterator;
 import java.util.Iterator;
@@ -109,7 +108,7 @@
     private List vecInlineBreaks = new ArrayList();
 
     private BreakPoss prevBP = null; // Last confirmed break position
-    private int bTextAlignment = TextAlign.JUSTIFY;
+    private int bTextAlignment = JUSTIFY;
     private int iTextIndent = 0;
     private int iIndents = 0;
     private CommonHyphenation hyphProps;
@@ -238,7 +237,7 @@
 
                     // This break position doesn't fit
                     // TODO: If we are in nowrap, we use it as is!
-                    if (bTextAlignment == TextAlign.JUSTIFY || prevBP == null) {
+                    if (bTextAlignment == JUSTIFY || prevBP == null) {
                         // If we are already in a hyphenation loop, then stop.
 
                         if (inlineLC.tryHyphenate()) {
@@ -347,10 +346,10 @@
 
         // Don't justify last line in the sequence or if forced line-end
         int talign = bTextAlignment;
-        if ((bTextAlignment == TextAlign.JUSTIFY
+        if ((bTextAlignment == JUSTIFY
                              && (prevBP.isForcedBreak()
                              || isFinished()))) {
-            talign = TextAlign.START;
+            talign = START;
         }
         return makeLineBreak(iPrevLineEnd, availIPD, talign);
     }
@@ -613,18 +612,18 @@
         double dAdjust = 0.0;
         int indent = 0;
         switch (textalign) {
-            case TextAlign.JUSTIFY:
+            case JUSTIFY:
                 if (realWidth != 0) {
                     dAdjust = (targetWith - realWidth) / realWidth;
                 }
             break;
-            case TextAlign.START:
+            case START:
                 //indent = 0;
             break;
-            case TextAlign.CENTER:
+            case CENTER:
                 indent = (targetWith - realWidth) / 2;
             break;
-            case TextAlign.END:
+            case END:
                 indent = targetWith - realWidth;
             break;
         }
Index: src/java/org/apache/fop/layoutmgr/PageLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/PageLayoutManager.java,v
retrieving revision 1.27
diff -u -r1.27 PageLayoutManager.java
--- src/java/org/apache/fop/layoutmgr/PageLayoutManager.java	2 Jan 2004 12:18:44 -0000	1.27
+++ src/java/org/apache/fop/layoutmgr/PageLayoutManager.java	16 Jan 2004 16:15:28 -0000
@@ -75,13 +75,11 @@
 import org.apache.fop.fo.pagination.PageNumberGenerator;
 import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.fo.pagination.Region;
-import org.apache.fop.fo.properties.RetrieveBoundary;
 import org.apache.fop.fo.pagination.SimplePageMaster;
 import org.apache.fop.fo.pagination.StaticContent;
 import org.apache.fop.fo.properties.CommonBackground;
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
 import org.apache.fop.fo.properties.CommonMarginBlock;
-import org.apache.fop.fo.properties.Overflow;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -365,10 +363,10 @@
     public Marker retrieveMarker(String name, int pos, int boundary) {
         // get marker from the current markers on area tree
         Marker mark = (Marker)curPage.getMarker(name, pos);
-        if (mark == null && boundary != RetrieveBoundary.PAGE) {
+        if (mark == null && boundary != PAGE) {
             // go back over pages until mark found
             // if document boundary then keep going
-            boolean doc = boundary == RetrieveBoundary.DOCUMENT;
+            boolean doc = boundary == DOCUMENT;
             AreaTreeModel atm = areaTree.getAreaTreeModel();
             int seq = atm.getPageSequenceCount();
             int page = atm.getPageCount(seq) - 1;
@@ -858,7 +856,7 @@
         setRegionPosition(r, body, absRegVPRect);
         int columnCount =
                 r.propertyList.get(PR_COLUMN_COUNT).getNumber().intValue();
-        if ((columnCount > 1) && (r.overflow == Overflow.SCROLL)) {
+        if ((columnCount > 1) && (r.overflow == SCROLL)) {
             // recover by setting 'column-count' to 1. This is allowed but
             // not required by the spec.
             getLogger().error("Setting 'column-count' to 1 because "
Index: src/java/org/apache/fop/render/awt/AWTRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/awt/AWTRenderer.java,v
retrieving revision 1.17
diff -u -r1.17 AWTRenderer.java
--- src/java/org/apache/fop/render/awt/AWTRenderer.java	20 Dec 2003 06:53:23 -0000	1.17
+++ src/java/org/apache/fop/render/awt/AWTRenderer.java	16 Jan 2004 16:15:29 -0000
@@ -88,7 +88,7 @@
 import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.fo.FOTreeControl;
-import org.apache.fop.fo.properties.BackgroundRepeat;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.image.ImageFactory;
 import org.apache.fop.render.AbstractRenderer;
@@ -411,7 +411,7 @@
                 ImageFactory fact = ImageFactory.getInstance();
                 FopImage fopimage = fact.getImage(back.getURL(), userAgent);
                 if (fopimage != null && fopimage.load(FopImage.DIMENSIONS, userAgent)) {
-                    if (back.getRepeat() == BackgroundRepeat.REPEAT) {
+                    if (back.getRepeat() == Constants.REPEAT) {
                         // create a pattern for the image
                     } else {
                         // place once
Index: src/java/org/apache/fop/render/pdf/PDFRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java,v
retrieving revision 1.26
diff -u -r1.26 PDFRenderer.java
--- src/java/org/apache/fop/render/pdf/PDFRenderer.java	2 Jan 2004 12:18:45 -0000	1.26
+++ src/java/org/apache/fop/render/pdf/PDFRenderer.java	16 Jan 2004 16:15:31 -0000
@@ -90,8 +90,7 @@
 import org.apache.fop.area.inline.Leader;
 import org.apache.fop.area.inline.InlineParent;
 import org.apache.fop.datatypes.ColorType;
-import org.apache.fop.fo.properties.BackgroundRepeat;
-import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontSetup;
@@ -598,7 +597,7 @@
                 ImageFactory fact = ImageFactory.getInstance();
                 FopImage fopimage = fact.getImage(back.getURL(), userAgent);
                 if (fopimage != null && fopimage.load(FopImage.DIMENSIONS, userAgent)) {
-                    if (back.getRepeat() == BackgroundRepeat.REPEAT) {
+                    if (back.getRepeat() == Constants.REPEAT) {
                         // create a pattern for the image
                     } else {
                         // place once
@@ -1269,18 +1268,18 @@
         int style = area.getRuleStyle();
         boolean alt = false;
         switch(style) {
-            case RuleStyle.SOLID:
+            case Constants.SOLID:
                 currentStream.add("[] 0 d\n");
             break;
-            case RuleStyle.DOTTED:
+            case Constants.DOTTED:
                 currentStream.add("[2] 0 d\n");
             break;
-            case RuleStyle.DASHED:
+            case Constants.DASHED:
                 currentStream.add("[6 4] 0 d\n");
             break;
-            case RuleStyle.DOUBLE:
-            case RuleStyle.GROOVE:
-            case RuleStyle.RIDGE:
+            case Constants.DOUBLE:
+            case Constants.GROOVE:
+            case Constants.RIDGE:
                 alt = true;
             break;
         }
@@ -1291,7 +1290,7 @@
             currentStream.add(area.getRuleThickness() / 1000f + " w\n");
             drawLine(startx, starty, endx, starty);
         } else {
-            if (style == RuleStyle.DOUBLE) {
+            if (style == Constants.DOUBLE) {
                 float third = area.getRuleThickness() / 3000f;
                 currentStream.add(third + " w\n");
                 drawLine(startx, starty, endx, starty);
@@ -1307,7 +1306,7 @@
                 currentStream.add(startx + " " + (starty + 2 * half) + " l\n");
                 currentStream.add("h\n");
                 currentStream.add("f\n");
-                if (style == RuleStyle.GROOVE) {
+                if (style == Constants.GROOVE) {
                     currentStream.add("0 g\n");
                     currentStream.add(startx + " " + starty + " m\n");
                     currentStream.add(endx + " " + starty + " l\n");
Index: src/java/org/apache/fop/render/ps/PSRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/ps/PSRenderer.java,v
retrieving revision 1.19
diff -u -r1.19 PSRenderer.java
--- src/java/org/apache/fop/render/ps/PSRenderer.java	12 Dec 2003 22:37:39 -0000	1.19
+++ src/java/org/apache/fop/render/ps/PSRenderer.java	16 Jan 2004 16:15:32 -0000
@@ -59,7 +59,7 @@
 // FOP
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.fop.fo.properties.BackgroundRepeat;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.area.Area;
 import org.apache.fop.area.RegionViewport;
 import org.apache.fop.apps.FOPException;
@@ -732,7 +732,7 @@
                 ImageFactory fact = ImageFactory.getInstance();
                 FopImage fopimage = fact.getImage(back.getURL(), userAgent);
                 if (fopimage != null && fopimage.load(FopImage.DIMENSIONS, userAgent)) {
-                    if (back.getRepeat() == BackgroundRepeat.REPEAT) {
+                    if (back.getRepeat() == Constants.REPEAT) {
                         // create a pattern for the image
                     } else {
                         // place once
Index: src/java/org/apache/fop/render/svg/SVGRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/svg/SVGRenderer.java,v
retrieving revision 1.10
diff -u -r1.10 SVGRenderer.java
--- src/java/org/apache/fop/render/svg/SVGRenderer.java	28 Oct 2003 04:22:14 -0000	1.10
+++ src/java/org/apache/fop/render/svg/SVGRenderer.java	16 Jan 2004 16:15:32 -0000
@@ -59,7 +59,7 @@
 import org.apache.fop.svg.SVGUtilities;
 import org.apache.fop.apps.Document;
 import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FOTreeControl;
 
 import org.w3c.dom.Node;
@@ -395,19 +395,19 @@
         String style = "stroke:black;stroke-width:"
                        + (area.getRuleThickness() / 1000) + ";";
         switch (area.getRuleStyle()) {
-            case RuleStyle.DOTTED:
+            case Constants.DOTTED:
                 style += "stroke-dasharray:1,1";
                 break;
-            case RuleStyle.DASHED:
+            case Constants.DASHED:
                 style += "stroke-dasharray:5,1";
                 break;
-            case RuleStyle.SOLID:
+            case Constants.SOLID:
                 break;
-            case RuleStyle.DOUBLE:
+            case Constants.DOUBLE:
                 break;
-            case RuleStyle.GROOVE:
+            case Constants.GROOVE:
                 break;
-            case RuleStyle.RIDGE:
+            case Constants.RIDGE:
                 break;
         }
         Element line = SVGUtilities.createLine(svgDocument,
Index: src/java/org/apache/fop/render/xml/XMLRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/xml/XMLRenderer.java,v
retrieving revision 1.12
diff -u -r1.12 XMLRenderer.java
--- src/java/org/apache/fop/render/xml/XMLRenderer.java	12 Dec 2003 22:37:39 -0000	1.12
+++ src/java/org/apache/fop/render/xml/XMLRenderer.java	16 Jan 2004 16:15:33 -0000
@@ -93,7 +93,7 @@
 import org.apache.fop.area.inline.Viewport;
 import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.fonts.FontSetup;
-import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FOTreeControl;
 import org.apache.fop.fo.pagination.Region;
 
@@ -367,10 +367,11 @@
      * @see org.apache.fop.render.AbstractRenderer#renderBlock(Block)
      */
     protected void renderBlock(Block block) {
-        String prop = "";
+        String prop = " width=\"" + block.getWidth() + 
+                      "\" height=\"" + block.getHeight() + "\"";
         Map map = block.getTraits();
         if (map != null) {
-            prop = " props=\"" + getPropString(map) + "\"";
+            prop = prop + " props=\"" + getPropString(map) + "\"";
         }
         writeStartTag("<block" + prop + ">");
         super.renderBlock(block);
@@ -485,21 +486,21 @@
     public void renderLeader(Leader area) {
         String style = "solid";
         switch (area.getRuleStyle()) {
-            case RuleStyle.DOTTED:
+            case Constants.DOTTED:
                 style = "dotted";
                 break;
-            case RuleStyle.DASHED:
+            case Constants.DASHED:
                 style = "dashed";
                 break;
-            case RuleStyle.SOLID:
+            case Constants.SOLID:
                 break;
-            case RuleStyle.DOUBLE:
+            case Constants.DOUBLE:
                 style = "double";
                 break;
-            case RuleStyle.GROOVE:
+            case Constants.GROOVE:
                 style = "groove";
                 break;
-            case RuleStyle.RIDGE:
+            case Constants.RIDGE:
                 style = "ridge";
                 break;
         }
Index: src/java/org/apache/fop/tools/AreaTreeBuilder.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/tools/AreaTreeBuilder.java,v
retrieving revision 1.11
diff -u -r1.11 AreaTreeBuilder.java
--- src/java/org/apache/fop/tools/AreaTreeBuilder.java	1 Nov 2003 04:28:01 -0000	1.11
+++ src/java/org/apache/fop/tools/AreaTreeBuilder.java	16 Jan 2004 16:15:34 -0000
@@ -108,7 +108,7 @@
 import org.apache.fop.render.xml.XMLRenderer;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fo.pagination.Region;
-import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.FontMetrics;
 
 // Avalon
@@ -698,17 +698,17 @@
         Leader leader = new Leader();
         String rs = root.getAttribute("ruleStyle");
         if ("solid".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.SOLID);
+            leader.setRuleStyle(Constants.SOLID);
         } else if ("dotted".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.DOTTED);
+            leader.setRuleStyle(Constants.DOTTED);
         } else if ("dashed".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.DASHED);
+            leader.setRuleStyle(Constants.DASHED);
         } else if ("double".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.DOUBLE);
+            leader.setRuleStyle(Constants.DOUBLE);
         } else if ("groove".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.GROOVE);
+            leader.setRuleStyle(Constants.GROOVE);
         } else if ("ridge".equals(rs)) {
-            leader.setRuleStyle(RuleStyle.RIDGE);
+            leader.setRuleStyle(Constants.RIDGE);
         }
         String rt = root.getAttribute("ruleThickness");
         int thick = Integer.parseInt(rt);
--- src/java/org/apache/fop/fo/BorderWidthPropertyMaker.java
+++ src/java/org/apache/fop/fo/BorderWidthPropertyMaker.java	Fri Jan 16 10:55:32 2004
@@ -0,0 +1,100 @@
+/*
+ * $Id: $
+ * ============================================================================
+ *                    The Apache Software License, Version 1.1
+ * ============================================================================
+ *
+ * Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modifica-
+ * tion, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if any, must
+ *    include the following acknowledgment: "This product includes software
+ *    developed by the Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself, if
+ *    and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ *    endorse or promote products derived from this software without prior
+ *    written permission. For written permission, please contact
+ *    apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache", nor may
+ *    "Apache" appear in their name, without prior written permission of the
+ *    Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * on behalf of the Apache Software Foundation and was originally created by
+ * James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ * Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+
+/**
+ * This subclass of LengthProperty.Maker handles the special treatment of 
+ * border width described in 7.7.20.
+ */
+public class BorderWidthPropertyMaker extends LengthProperty.Maker {
+    int borderStyleId = 0;    
+    
+    /**
+     * Create a length property which check the value of the border-*-style
+     * property and return a length of 0 when the style is "none". 
+     * @param propId the border-*-width of the property.
+     */
+    public BorderWidthPropertyMaker(int propId) {
+        super(propId);
+    }
+    
+    /**
+     * Set the propId of the style property for the same side.
+     * @param borderStyleId
+     */
+    public void setBorderStyleId(int borderStyleId) {
+        this.borderStyleId = borderStyleId;
+    }
+
+    /**
+     * Check the value of the style property and return a length of 0 when
+     * the style is NONE.
+     * @see org.apacge.fo.Property.Maker.get(int, PropertyList, boolean, boolean)
+     */
+   
+    public Property get(int subpropId, PropertyList propertyList,
+                        boolean bTryInherit, boolean bTryDefault)
+        throws FOPException
+    {
+        Property p = super.get(subpropId, propertyList,
+                               bTryInherit, bTryDefault);
+
+        // Calculate the values as described in 7.7.20.
+        Property style = propertyList.get(borderStyleId);
+        if (style.getEnum() == Constants.NONE) {
+            // TODO: bckfnn reenable
+            return p; // new LengthProperty(new FixedLength(0));
+        }
+        return p;
+    }
+}
--- src/java/org/apache/fop/fo/CompoundPropertyMaker.java
+++ src/java/org/apache/fop/fo/CompoundPropertyMaker.java	Fri Jan 16 11:28:30 2004
@@ -0,0 +1,298 @@
+/*
+ * $Id: $
+ * ============================================================================
+ *                    The Apache Software License, Version 1.1
+ * ============================================================================
+ *
+ * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modifica-
+ * tion, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if any, must
+ *    include the following acknowledgment: "This product includes software
+ *    developed by the Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself, if
+ *    and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ *    endorse or promote products derived from this software without prior
+ *    written permission. For written permission, please contact
+ *    apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache", nor may
+ *    "Apache" appear in their name, without prior written permission of the
+ *    Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * on behalf of the Apache Software Foundation and was originally created by
+ * James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ * Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.CompoundDatatype;
+
+/**
+ * @author me
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+/**
+ * This class extends Property.Maker with support for sub-properties.  
+ */
+public class CompoundPropertyMaker extends Property.Maker {
+    /**
+     *  The list of subproperty makers supported by this compound maker.
+     */ 
+    private Property.Maker[] subproperties = 
+                    new Property.Maker[Constants.COMPOUND_COUNT];
+
+    /**
+     *  The first subproperty maker which has a setByShorthand of true.
+     */
+    private Property.Maker shorthandMaker = null;
+
+    /**
+     * Construct an instance of a CompoundPropertyMaker for the given property.
+     * @param propId The Constant ID of the property to be made.
+     */
+    public CompoundPropertyMaker(int propId) {
+        super(propId);
+    }
+
+    /**
+     * @see org.apache.fop.fo.Property#useGeneric(Property.Maker)
+     */
+    public void useGeneric(Property.Maker generic) {
+        super.useGeneric(generic);
+        if (generic instanceof CompoundPropertyMaker) {
+            CompoundPropertyMaker compoundGeneric = (CompoundPropertyMaker) generic;
+            for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
+                Property.Maker submaker = compoundGeneric.subproperties[i];
+                if (submaker != null) {
+                    addSubpropMaker((Property.Maker) submaker.clone());
+                }
+            }
+        }
+    }
+    
+    /**
+     * Add a subproperty to this maker.
+     * @param subproperty
+     */
+    public void addSubpropMaker(Property.Maker subproperty) {
+        // Place the base propId in the propId of the subproperty.
+        subproperty.propId &= Constants.COMPOUND_MASK;
+        subproperty.propId |= this.propId;
+        
+        subproperties[getSubpropIndex(subproperty.getPropId())] = subproperty;
+
+        // Store the first subproperty with a setByShorthand. That subproperty
+        // will be used for converting a value set on the base property.
+        if (shorthandMaker == null && subproperty.setByShorthand) {
+            shorthandMaker = subproperty;
+        }
+    }
+    
+    
+    /**
+     * Return a Maker object which is used to set the values on components
+     * of compound property types, such as "space".
+     * Overridden by property maker subclasses which handle
+     * compound properties.
+     * @param subprop The Constants ID of the component for which a Maker is to
+     * returned, for example CP_OPTIMUM, if the FO attribute is
+     * space.optimum='10pt'.
+     * @return the Maker object specified
+     */
+    public Property.Maker getSubpropMaker(int subpropId) {
+        return subproperties[getSubpropIndex(subpropId)];
+    }
+    
+    /**
+     * Calculate the real value of a subproperty by unmasking and shifting
+     * the value into the range [0 - (COMPOUND_COUNT-1)].
+     * The value is used as index into the subproperties array. 
+     * @param propId the property id of the sub property.
+     * @return the array index.
+     */
+    private int getSubpropIndex(int subpropId) {
+        return ((subpropId & Constants.COMPOUND_MASK) >>
+                                    Constants.COMPOUND_SHIFT)-1;
+    }
+
+    /**
+     * For compound properties which can take enumerate values.
+     * Delegate the enumeration check to one of the subpropeties. 
+     * @param value the string containing the property value
+     * @return the Property encapsulating the enumerated equivalent of the
+     * input value
+     */
+    protected Property checkEnumValues(String value) {
+        if (shorthandMaker != null) {
+            return shorthandMaker.checkEnumValues(value);
+        }
+        return null;
+    }
+
+    /**
+     * Return the property on the current FlowObject. Depending on the passed flags,
+     * this will try to compute it based on other properties, or if it is
+     * inheritable, to return the inherited value. If all else fails, it returns
+     * the default value.
+     * @param subpropId  The subproperty id of the property being retrieved.
+     *        Is 0 when retriving a base property.
+     * @param propertylist The PropertyList object being built for this FO.
+     * @param bTryInherit true if inherited properties should be examined.
+     * @param bTryDefault true if the default value should be returned. 
+     */
+    public Property get(int subpropId, PropertyList propertyList,
+                        boolean bTryInherit, boolean bTryDefault)
+        throws FOPException
+    {
+        Property p = super.get(subpropId, propertyList, bTryInherit, bTryDefault);
+        if (subpropId != 0 && p != null) {
+            p = getSubprop(p, subpropId);
+        }
+        return p;
+    }
+   
+    /**
+     * Return a Property object based on the passed Property object.
+     * This method is called if the Property object built by the parser
+     * isn't the right type for this compound property.
+     * @param p The Property object return by the expression parser
+     * @param propertyList The PropertyList object being built for this FO.
+     * @param fo The current FO whose properties are being set.
+     * @return A Property of the correct type or null if the parsed value
+     * can't be converted to the correct type.
+     * @throws FOPException for invalid or inconsistent FO input
+     */
+    protected Property convertProperty(Property p,
+                                    PropertyList propertyList,
+                                    FObj fo) throws FOPException {
+        if (!EnumProperty.class.isAssignableFrom(p.getClass())) {
+            // delegate to the subprop maker to do conversions
+            p = shorthandMaker.convertProperty(p, propertyList, fo);
+        }
+        
+        if (p != null) {
+            Property prop = makeCompound(propertyList, fo);
+            CompoundDatatype pval = (CompoundDatatype) prop.getObject();
+            for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
+                Property.Maker submaker = subproperties[i];
+                if (submaker != null && submaker.setByShorthand) {
+                    pval.setComponent(submaker.getPropId() & Constants.COMPOUND_MASK, p, false);
+                }
+            }
+            return prop;
+        }
+        return null;
+    }
+
+    /**
+     * Make a compound property with default values. 
+     * @param propertyList The PropertyList object being built for this FO.
+     * @return the Property object corresponding to the parameters
+     * @throws FOPException for invalid or inconsisten FO input
+     */
+    public Property make(PropertyList propertyList) throws FOPException {
+        return makeCompound(propertyList, propertyList.getParentFObj());       
+    }
+    
+    /**
+     * Create a Property object from an attribute specification.
+     * @param propertyList The PropertyList object being built for this FO.
+     * @param value The attribute value.
+     * @param fo The current FO whose properties are being set.
+     * @return The initialized Property object.
+     * @throws FOPException for invalid or inconsistent FO input
+     */    
+    public Property make(PropertyList propertyList, String value,
+                         FObj fo) throws FOPException {
+        Property p = super.make(propertyList, value, fo);
+        p = convertProperty(p, propertyList, fo);
+        return p; 
+    }
+    
+    /**
+     * Return a property value for a compound property. If the property
+     * value is already partially initialized, this method will modify it.
+     * @param baseProp The Property object representing the compound property,
+     * for example: SpaceProperty.
+     * @param subpropId The Constants ID of the subproperty (component)
+     *        whose value is specified.
+     * @param propertyList The propertyList being built.
+     * @param fo The FO whose properties are being set.
+     * @param value the value of the
+     * @return baseProp (or if null, a new compound property object) with
+     * the new subproperty added
+     * @throws FOPException for invalid or inconsistent FO input
+     */
+    public Property make(Property baseProp, int subpropId,
+                         PropertyList propertyList, String value,
+                         FObj fo) throws FOPException {
+        if (baseProp == null) {
+            baseProp = makeCompound(propertyList, fo);
+        }
+
+        Property.Maker spMaker = getSubpropMaker(subpropId);
+
+        if (spMaker != null) {
+            Property p = spMaker.make(propertyList, value, fo);
+            if (p != null) {
+                return setSubprop(baseProp, subpropId & Constants.COMPOUND_MASK, p);
+            }
+        } else {
+            //getLogger().error("compound property component "
+            //                       + partName + " unknown.");
+        }
+        return baseProp;
+    }
+    
+    /**
+     * Create a empty compound property and fill it with default values for
+     * the subproperties.
+     * @param propertyList The propertyList being built.
+     * @param parentFO The parent FO for the FO whose property is being made.
+     * @return a Property subclass object holding a "compound" property object
+     *         initialized to the default values for each component.
+     * @throws FOPException
+     */
+    protected Property makeCompound(PropertyList propertyList, FObj parentFO)
+        throws FOPException
+    {
+        Property p = makeNewProperty();
+        CompoundDatatype data = (CompoundDatatype) p.getObject();
+        for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
+            Property.Maker submaker = subproperties[i];
+            if (submaker != null) {
+                Property subprop = submaker.make(propertyList, submaker.defaultValue, parentFO);
+                data.setComponent(submaker.getPropId() & Constants.COMPOUND_MASK, subprop, true);
+            }
+        }
+        return p;
+    }    
+}
\ No newline at end of file
--- src/java/org/apache/fop/fo/CorrespondingPropertyMaker.java
+++ src/java/org/apache/fop/fo/CorrespondingPropertyMaker.java	Fri Jan 16 10:54:27 2004
@@ -0,0 +1,103 @@
+/*
+ * Created on Jan 12, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+
+/**
+ */
+public class CorrespondingPropertyMaker {
+    protected Property.Maker baseMaker;
+    protected int lr_tb;
+    protected int rl_tb;
+    protected int tb_rl;
+    private boolean useParent;
+    private boolean relative;
+    
+    CorrespondingPropertyMaker(Property.Maker baseMaker) {
+        this.baseMaker = baseMaker;
+        baseMaker.setCorresponding(this);
+    }
+    
+    
+    public void setCorresponding(int lr_tb, int rl_tb, int tb_rl) {
+        this.lr_tb = lr_tb;
+        this.rl_tb = rl_tb;
+        this.tb_rl = tb_rl;
+    }
+    
+    public void setUseParent(boolean useParent) {
+        this.useParent = useParent;
+    }
+
+    public void setRelative(boolean relative) {
+        this.relative = relative;
+    }
+    
+    /**
+     * For properties that operate on a relative direction (before, after,
+     * start, end) instead of an absolute direction (top, bottom, left,
+     * right), this method determines whether a corresponding property
+     * is specified on the corresponding absolute direction. For example,
+     * the border-start-color property in a lr-tb writing-mode specifies
+     * the same thing that the border-left-color property specifies. In this
+     * example, if the Maker for the border-start-color property is testing,
+     * and if the border-left-color is specified in the properties,
+     * this method should return true.
+     * @param propertyList collection of properties to be tested
+     * @return true iff 1) the property operates on a relative direction,
+     * AND 2) the property has a corresponding property on an absolute
+     * direction, AND 3) the corresponding property on that absolute
+     * direction has been specified in the input properties
+     */
+    public boolean isCorrespondingForced(PropertyList propertyList) {
+        if (!relative) {
+            return false;
+        }
+        PropertyList pList;
+        if (useParent) {
+            pList = propertyList.getParentFObj().propertyList;
+        } else {
+            pList = propertyList;
+        }
+        int correspondingId = pList.wmMap(lr_tb, rl_tb, tb_rl);
+        if (propertyList.getExplicit(correspondingId) != null)
+            return true;
+        return false;            
+    }
+    
+    /**
+     * Return a Property object representing the value of this property,
+     * based on other property values for this FO.
+     * A special case is properties which inherit the specified value,
+     * rather than the computed value.
+     * @param propertyList The PropertyList for the FO.
+     * @return Property A computed Property value or null if no rules
+     * are specified (in foproperties.xml) to compute the value.
+     * @throws FOPException for invalid or inconsistent FO input
+     */
+    public Property compute(PropertyList propertyList) throws FOPException {
+        PropertyList pList;
+        if (useParent) {
+            pList = propertyList.getParentPropertyList();
+            if (pList == null) {
+                return null;
+            }
+        } else {
+            pList = propertyList;
+        }
+        int correspondingId = pList.wmMap(lr_tb, rl_tb, tb_rl);
+            
+        Property p = propertyList.getExplicitOrShorthand(correspondingId);
+        if (p != null) {
+            FObj parentFO = propertyList.getParentFObj();
+            p = baseMaker.convertProperty(p, propertyList, parentFO);
+        }
+        return p;
+    }
+}
+
--- src/java/org/apache/fop/fo/DimensionPropertyMaker.java
+++ src/java/org/apache/fop/fo/DimensionPropertyMaker.java	Fri Jan 16 10:54:21 2004
@@ -0,0 +1,67 @@
+/*
+ * Created on Jan 1, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+
+/**
+ * @author me
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class DimensionPropertyMaker extends CorrespondingPropertyMaker {
+    int[][] extraCorresponding = null;
+
+    public DimensionPropertyMaker(Property.Maker baseMaker) {
+        super(baseMaker);
+    }
+    
+    public void setExtraCorresponding(int[][] extraCorresponding) {
+        this.extraCorresponding = extraCorresponding;
+    }
+
+    public boolean isCorrespondingForced(PropertyList propertyList) {
+        if (super.isCorrespondingForced(propertyList))
+            return true;
+        for (int i = 0; i < extraCorresponding.length; i++) {
+            int wmcorr = extraCorresponding[i][0]; //propertyList.getWritingMode()];
+            if (propertyList.getExplicit(wmcorr) != null)
+                return true;
+        }            
+        return false;
+    }
+
+    public Property compute(PropertyList propertyList) throws FOPException {
+        // Based on [width|height]
+        Property p = super.compute(propertyList);
+        if (p == null) {
+            p = baseMaker.make(propertyList);
+        }
+
+        // Based on min-[width|height]
+        int wmcorr = propertyList.wmMap(extraCorresponding[0][0], 
+                                        extraCorresponding[0][1], 
+                                        extraCorresponding[0][2]);
+        Property subprop = propertyList.getExplicitOrShorthand(wmcorr);
+        if (subprop != null) {
+            baseMaker.setSubprop(p, Constants.CP_MINIMUM, subprop);
+        }
+
+        // Based on max-[width|height]
+        wmcorr = propertyList.wmMap(extraCorresponding[1][0], 
+                                    extraCorresponding[1][1], 
+                                    extraCorresponding[1][2]);
+        subprop = propertyList.getExplicitOrShorthand(wmcorr);
+        // TODO: Don't set when NONE.
+        if (subprop != null) {
+            baseMaker.setSubprop(p, Constants.CP_MAXIMUM, subprop);
+        }
+
+        return p;
+    }   
+}
--- src/java/org/apache/fop/fo/FOPropertyMapping.java
+++ src/java/org/apache/fop/fo/FOPropertyMapping.java	Fri Jan 16 13:13:15 2004
@@ -0,0 +1,2533 @@
+/*
+ * $Id: GenericShorthandParser.java,v 1.4 2003/03/05 21:48:01 jeremias Exp $
+ * ============================================================================
+ *                    The Apache Software License, Version 1.1
+ * ============================================================================
+ *
+ * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modifica-
+ * tion, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if any, must
+ *    include the following acknowledgment: "This product includes software
+ *    developed by the Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself, if
+ *    and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ *    endorse or promote products derived from this software without prior
+ *    written permission. For written permission, please contact
+ *    apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache", nor may
+ *    "Apache" appear in their name, without prior written permission of the
+ *    Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * on behalf of the Apache Software Foundation and was originally created by
+ * James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ * Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.fop.datatypes.ColorType;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.datatypes.ToBeImplementedProperty;
+
+/**
+ * This class creates and returns an array of Property.Maker instances
+ * indexed by the PR_* propId from Constants.java. 
+ */
+public class FOPropertyMapping implements Constants {
+    private static Map s_htPropNames = new HashMap();
+    private static Map s_htSubPropNames = new HashMap();
+    private static Map s_htPropIds = new HashMap();
+    
+    private static Property.Maker[] s_generics = 
+                new Property.Maker[PROPERTY_COUNT + 1];
+    
+    // The rest is only used during the building of the s_generics array.
+    private Property[] enums = null;
+    
+    private Property.Maker genericColor = null;
+    private Property.Maker genericBoolean = null;
+    private Property.Maker genericKeep = null;
+    private Property.Maker genericCondLength = null;    
+    private Property.Maker genericCondPadding = null;
+    private Property.Maker genericPadding = null;
+    private Property.Maker genericCondBorderWidth = null;
+    private Property.Maker genericBorderWidth = null;
+    private Property.Maker genericBorderStyle = null;
+    private Property.Maker genericBreak = null;
+    private Property.Maker genericSpace = null;
+    
+    /**
+     * Create the generic property maker templates. These templates
+     * are used be the actual makers as a parameter to .useGeneric(...).
+     */
+    public void createGenerics() {
+        Property.Maker sub;
+        
+        genericColor = new ColorTypeProperty.Maker(0);
+        genericColor.addKeyword("aliceblue", "#f0f8ff");
+        genericColor.addKeyword("antiquewhite", "#faebd7");
+        genericColor.addKeyword("aqua", "#00ffff");
+        genericColor.addKeyword("aquamarine", "#7fffd4");
+        genericColor.addKeyword("azure", "#f0ffff");
+        genericColor.addKeyword("beige", "#f5f5dc");
+        genericColor.addKeyword("bisque", "#ffe4c4");
+        genericColor.addKeyword("black", "#000000");
+        genericColor.addKeyword("blanchedalmond", "#ffebcd");
+        genericColor.addKeyword("blue", "#0000ff");
+        genericColor.addKeyword("blueviolet", "#8a2be2");
+        genericColor.addKeyword("brown", "#a52a2a");
+        genericColor.addKeyword("burlywood", "#deb887");
+        genericColor.addKeyword("cadetblue", "#5f9ea0");
+        genericColor.addKeyword("chartreuse", "#7fff00");
+        genericColor.addKeyword("chocolate", "#d2691e");
+        genericColor.addKeyword("coral", "#ff7f50");
+        genericColor.addKeyword("cornflowerblue", "#6495ed");
+        genericColor.addKeyword("cornsilk", "#fff8dc");
+        genericColor.addKeyword("crimson", "#dc143c");
+        genericColor.addKeyword("cyan", "#00ffff");
+        genericColor.addKeyword("darkblue", "#00008b");
+        genericColor.addKeyword("darkcyan", "#008b8b");
+        genericColor.addKeyword("darkgoldenrod", "#b8860b");
+        genericColor.addKeyword("darkgray", "#a9a9a9");
+        genericColor.addKeyword("darkgreen", "#006400");
+        genericColor.addKeyword("darkgrey", "#a9a9a9");
+        genericColor.addKeyword("darkkhaki", "#bdb76b");
+        genericColor.addKeyword("darkmagenta", "#8b008b");
+        genericColor.addKeyword("darkolivegreen", "#556b2f");
+        genericColor.addKeyword("darkorange", "#ff8c00");
+        genericColor.addKeyword("darkorchid", "#9932cc");
+        genericColor.addKeyword("darkred", "#8b0000");
+        genericColor.addKeyword("darksalmon", "#e9967a");
+        genericColor.addKeyword("darkseagreen", "#8fbc8f");
+        genericColor.addKeyword("darkslateblue", "#483d8b");
+        genericColor.addKeyword("darkslategray", "#2f4f4f");
+        genericColor.addKeyword("darkslategrey", "#2f4f4f");
+        genericColor.addKeyword("darkturquoise", "#00ced1");
+        genericColor.addKeyword("darkviolet", "#9400d3");
+        genericColor.addKeyword("deeppink", "#ff1493");
+        genericColor.addKeyword("deepskyblue", "#00bfff");
+        genericColor.addKeyword("dimgray", "#696969");
+        genericColor.addKeyword("dimgrey", "#696969");
+        genericColor.addKeyword("dodgerblue", "#1e90ff");
+        genericColor.addKeyword("firebrick", "#b22222");
+        genericColor.addKeyword("floralwhite", "#fffaf0");
+        genericColor.addKeyword("forestgreen", "#228b22");
+        genericColor.addKeyword("fuchsia", "#ff00ff");
+        genericColor.addKeyword("gainsboro", "#dcdcdc");
+        genericColor.addKeyword("lightpink", "#ffb6c1");
+        genericColor.addKeyword("lightsalmon", "#ffa07a");
+        genericColor.addKeyword("lightseagreen", "#20b2aa");
+        genericColor.addKeyword("lightskyblue", "#87cefa");
+        genericColor.addKeyword("lightslategray", "#778899");
+        genericColor.addKeyword("lightslategrey", "#778899");
+        genericColor.addKeyword("lightsteelblue", "#b0c4de");
+        genericColor.addKeyword("lightyellow", "#ffffe0");
+        genericColor.addKeyword("lime", "#00ff00");
+        genericColor.addKeyword("limegreen", "#32cd32");
+        genericColor.addKeyword("linen", "#faf0e6");
+        genericColor.addKeyword("magenta", "#ff00ff");
+        genericColor.addKeyword("maroon", "#800000");
+        genericColor.addKeyword("mediumaquamarine", "#66cdaa");
+        genericColor.addKeyword("mediumblue", "#0000cd");
+        genericColor.addKeyword("mediumorchid", "#ba55d3");
+        genericColor.addKeyword("mediumpurple", "#9370db");
+        genericColor.addKeyword("mediumseagreen", "#3cb371");
+        genericColor.addKeyword("mediumslateblue", "#7b68ee");
+        genericColor.addKeyword("mediumspringgreen", "#00fa9a");
+        genericColor.addKeyword("mediumturquoise", "#48d1cc");
+        genericColor.addKeyword("mediumvioletred", "#c71585");
+        genericColor.addKeyword("midnightblue", "#191970");
+        genericColor.addKeyword("mintcream", "#f5fffa");
+        genericColor.addKeyword("mistyrose", "#ffe4e1");
+        genericColor.addKeyword("moccasin", "#ffe4b5");
+        genericColor.addKeyword("navajowhite", "#ffdead");
+        genericColor.addKeyword("navy", "#000080");
+        genericColor.addKeyword("oldlace", "#fdf5e6");
+        genericColor.addKeyword("olive", "#808000");
+        genericColor.addKeyword("olivedrab", "#6b8e23");
+        genericColor.addKeyword("orange", "#ffa500");
+        genericColor.addKeyword("orangered", "#ff4500");
+        genericColor.addKeyword("orchid", "#da70d6");
+        genericColor.addKeyword("palegoldenrod", "#eee8aa");
+        genericColor.addKeyword("palegreen", "#98fb98");
+        genericColor.addKeyword("paleturquoise", "#afeeee");
+        genericColor.addKeyword("palevioletred", "#db7093");
+        genericColor.addKeyword("papayawhip", "#ffefd5");
+        genericColor.addKeyword("peachpuff", "#ffdab9");
+        genericColor.addKeyword("peru", "#cd853f");
+        genericColor.addKeyword("pink", "#ffc0cb");
+        genericColor.addKeyword("plum", "#dda0dd");
+        genericColor.addKeyword("powderblue", "#b0e0e6");
+        genericColor.addKeyword("purple", "#800080");
+        genericColor.addKeyword("red", "#ff0000");
+        genericColor.addKeyword("rosybrown", "#bc8f8f");
+        genericColor.addKeyword("royalblue", "#4169e1");
+        genericColor.addKeyword("saddlebrown", "#8b4513");
+        genericColor.addKeyword("salmon", "#fa8072");
+        genericColor.addKeyword("ghostwhite", "#f8f8ff");
+        genericColor.addKeyword("gold", "#ffd700");
+        genericColor.addKeyword("goldenrod", "#daa520");
+        genericColor.addKeyword("gray", "#808080");
+        genericColor.addKeyword("grey", "#808080");
+        genericColor.addKeyword("green", "#008000");
+        genericColor.addKeyword("greenyellow", "#adff2f");
+        genericColor.addKeyword("honeydew", "#f0fff0");
+        genericColor.addKeyword("hotpink", "#ff69b4");
+        genericColor.addKeyword("indianred", "#cd5c5c");
+        genericColor.addKeyword("indigo", "#4b0082");
+        genericColor.addKeyword("ivory", "#fffff0");
+        genericColor.addKeyword("khaki", "#f0e68c");
+        genericColor.addKeyword("lavender", "#e6e6fa");
+        genericColor.addKeyword("lavenderblush", "#fff0f5");
+        genericColor.addKeyword("lawngreen", "#7cfc00");
+        genericColor.addKeyword("lemonchiffon", "#fffacd");
+        genericColor.addKeyword("lightblue", "#add8e6");
+        genericColor.addKeyword("lightcoral", "#f08080");
+        genericColor.addKeyword("lightcyan", "#e0ffff");
+        genericColor.addKeyword("lightgoldenrodyellow", "#fafad2");
+        genericColor.addKeyword("lightgray", "#d3d3d3");
+        genericColor.addKeyword("lightgreen", "#90ee90");
+        genericColor.addKeyword("lightgrey", "#d3d3d3");
+        genericColor.addKeyword("sandybrown", "#f4a460");
+        genericColor.addKeyword("seagreen", "#2e8b57");
+        genericColor.addKeyword("seashell", "#fff5ee");
+        genericColor.addKeyword("sienna", "#a0522d");
+        genericColor.addKeyword("silver", "#c0c0c0");
+        genericColor.addKeyword("skyblue", "#87ceeb");
+        genericColor.addKeyword("slateblue", "#6a5acd");
+        genericColor.addKeyword("slategray", "#708090");
+        genericColor.addKeyword("slategrey", "#708090");
+        genericColor.addKeyword("snow", "#fffafa");
+        genericColor.addKeyword("springgreen", "#00ff7f");
+        genericColor.addKeyword("steelblue", "#4682b4");
+        genericColor.addKeyword("tan", "#d2b48c");
+        genericColor.addKeyword("teal", "#008080");
+        genericColor.addKeyword("thistle", "#d8bfd8");
+        genericColor.addKeyword("tomato", "#ff6347");
+        genericColor.addKeyword("turquoise", "#40e0d0");
+        genericColor.addKeyword("violet", "#ee82ee");
+        genericColor.addKeyword("wheat", "#f5deb3");
+        genericColor.addKeyword("white", "#ffffff");
+        genericColor.addKeyword("whitesmoke", "#f5f5f5");
+        genericColor.addKeyword("yellow", "#ffff00");
+        genericColor.addKeyword("yellowgreen", "#9acd32");
+
+        // GenericBoolean        
+        genericBoolean = new EnumProperty.Maker(0);
+        genericBoolean.addEnum("true", makeEnumProperty(TRUE));
+        genericBoolean.addEnum("false", makeEnumProperty(FALSE));
+        
+        // GenericKeep
+        genericKeep = new KeepProperty.Maker(0);
+        sub = new NumberProperty.Maker(CP_WITHIN_PAGE);
+        sub.setByShorthand(true);
+        sub.setDefault("auto");
+        sub.addEnum("auto", makeEnumProperty(AUTO));
+        sub.addEnum("always", makeEnumProperty(ALWAYS));
+        genericKeep.addSubpropMaker(sub); 
+        sub = new NumberProperty.Maker(CP_WITHIN_LINE);
+        sub.setByShorthand(true);
+        sub.setDefault("auto");
+        sub.addEnum("auto", makeEnumProperty(AUTO));
+        sub.addEnum("always", makeEnumProperty(ALWAYS));
+        genericKeep.addSubpropMaker(sub); 
+        sub = new NumberProperty.Maker(CP_WITHIN_COLUMN);
+        sub.setByShorthand(true);
+        sub.setDefault("auto");
+        sub.addEnum("auto", makeEnumProperty(AUTO));
+        sub.addEnum("always", makeEnumProperty(ALWAYS));
+        genericKeep.addSubpropMaker(sub);
+        
+        // GenericCondLength
+        genericCondLength = new CondLengthProperty.Maker(0);
+        sub = new LengthProperty.Maker(CP_LENGTH);
+        sub.setByShorthand(true);
+        genericCondLength.addSubpropMaker(sub);
+        sub = new EnumProperty.Maker(CP_CONDITIONALITY);
+        sub.addEnum("discard", makeEnumProperty(DISCARD));
+        sub.addEnum("retain", makeEnumProperty(RETAIN));
+        genericCondLength.addSubpropMaker(sub);
+
+        // GenericCondPadding
+        genericCondPadding = new CondLengthProperty.Maker(0);
+        genericCondPadding.useGeneric(genericCondLength);
+        genericCondPadding.setInherited(false);
+        genericCondPadding.getSubpropMaker(CP_LENGTH).setDefault("0pt");
+        
+        // GenericPadding
+        genericPadding = new LengthProperty.Maker(0);
+        genericPadding.setInherited(false);
+        genericPadding.setDefault("0pt");
+        genericPadding.addShorthand(s_generics[PR_PADDING]);
+        
+        // GenericCondBorderWidth
+        genericCondBorderWidth = new CondLengthProperty.Maker(0);
+        genericCondBorderWidth.setInherited(false);
+        genericCondBorderWidth.addKeyword("thin", "0.5pt");
+        genericCondBorderWidth.addKeyword("medium", "1pt");
+        genericCondBorderWidth.addKeyword("thick", "2pt");
+        sub = new LengthProperty.Maker(CP_LENGTH);
+        sub.setByShorthand(true);
+        sub.addKeyword("thin", "0.5pt");
+        sub.addKeyword("medium", "1pt");
+        sub.addKeyword("thick", "2pt");
+        sub.setDefault("medium");
+        genericCondBorderWidth.addSubpropMaker(sub);
+        sub = new EnumProperty.Maker(CP_CONDITIONALITY);
+        sub.addEnum("discard", makeEnumProperty(DISCARD));
+        sub.addEnum("retain", makeEnumProperty(RETAIN));
+        genericCondBorderWidth.addSubpropMaker(sub);
+        
+        // GenericBorderWidth
+        genericBorderWidth = new LengthProperty.Maker(0);
+        genericBorderWidth.setInherited(false);
+        genericBorderWidth.addKeyword("thin", "0.5pt");
+        genericBorderWidth.addKeyword("medium", "1pt");
+        genericBorderWidth.addKeyword("thick", "2pt");
+        // TODO: bckfnn reenable
+        genericBorderWidth.setDefault("0pt");
+        genericBorderWidth.addShorthand(s_generics[PR_BORDER_WIDTH]);
+
+        // GenericBorderStyle
+        genericBorderStyle = new EnumProperty.Maker(0);
+        genericBorderStyle.setInherited(false);
+        genericBorderStyle.addEnum("none", makeEnumProperty(NONE));
+        genericBorderStyle.addEnum("hidden", makeEnumProperty(HIDDEN));
+        genericBorderStyle.addEnum("dotted", makeEnumProperty(DOTTED));
+        genericBorderStyle.addEnum("dashed", makeEnumProperty(DASHED));
+        genericBorderStyle.addEnum("solid", makeEnumProperty(SOLID));
+        genericBorderStyle.addEnum("double", makeEnumProperty(DOUBLE));
+        genericBorderStyle.addEnum("groove", makeEnumProperty(GROOVE));
+        genericBorderStyle.addEnum("ridge", makeEnumProperty(RIDGE));
+        genericBorderStyle.addEnum("inset", makeEnumProperty(INSET));
+        genericBorderStyle.addEnum("outset", makeEnumProperty(OUTSET));
+        genericBorderStyle.setDefault("none");
+        genericBorderWidth.addShorthand(s_generics[PR_BORDER_STYLE]);
+        
+        // GenericBreak
+        genericBreak = new EnumProperty.Maker(0);
+        genericBreak.setInherited(false);
+        genericBreak.addEnum("auto", makeEnumProperty(AUTO));
+        genericBreak.addEnum("column", makeEnumProperty(COLUMN));
+        genericBreak.addEnum("page", makeEnumProperty(PAGE));
+        genericBreak.addEnum("even-page", makeEnumProperty(EVEN_PAGE));
+        genericBreak.addEnum("odd-page", makeEnumProperty(ODD_PAGE));
+        genericBreak.setDefault("auto");
+        
+        // GenericSpace
+        genericSpace = new SpaceProperty.Maker(0);
+        genericSpace.setInherited(false);
+        sub = new LengthProperty.Maker(CP_MINIMUM);
+        sub.setDefault("0pt");
+        sub.setByShorthand(true);
+        genericSpace.addSubpropMaker(sub);
+        sub = new LengthProperty.Maker(CP_OPTIMUM);
+        sub.setDefault("0pt");
+        sub.setByShorthand(true);
+        genericSpace.addSubpropMaker(sub);
+        sub = new LengthProperty.Maker(CP_MAXIMUM);
+        sub.setDefault("0pt");
+        sub.setByShorthand(true);
+        genericSpace.addSubpropMaker(sub);
+        sub = new NumberProperty.Maker(CP_PRECEDENCE);
+        sub.addEnum("force", makeEnumProperty(FORCE));
+        sub.setDefault("0");
+        genericSpace.addSubpropMaker(sub);
+        sub = new EnumProperty.Maker(CP_CONDITIONALITY);
+        sub.addEnum("discard", makeEnumProperty(DISCARD));
+        sub.addEnum("retain", makeEnumProperty(RETAIN));
+        sub.setDefault("discard");
+        genericSpace.addSubpropMaker(sub);
+    }
+    
+    /**
+     * Add a property maker to the generics array. 
+     * Also creates the name <-> id mapping in s_htPropNames and s_htPropIds. 
+     * 
+     * @param name  the name of the property maker.
+     * @param maker the maker.
+     */
+    private static void addPropertyMaker(String name, Property.Maker maker) {
+        s_generics[maker.getPropId()] = maker;
+        s_htPropNames.put(name, new Integer(maker.getPropId()));
+        s_htPropIds.put(new Integer(maker.getPropId()), name);        
+    }
+    
+    /**
+     * Create the name<->id mapping for the subproperty names. 
+     * @param name name of the subproperty.
+     * @param id   Id for the subproperty from CP_* in Constants.java. 
+     */
+    public static void addSubpropMakerName(String name, int id) {
+        s_htSubPropNames.put(name, new Integer(id));
+        s_htPropIds.put(new Integer(id), name);
+    }
+    
+    /**
+     * Return a (possible cached) enum property based in the enum value.
+     * @param enum A enum value from Constants.java.
+     * @return An EnumProperty instance.
+     */
+    private Property makeEnumProperty(int enum) {
+        if (enums == null) {
+            enums = new Property[200];
+        }
+        if (enums[enum] == null) {
+            enums[enum] = new EnumProperty(enum);
+        }
+        return enums[enum];
+    }
+
+    /**
+     * Return the array of Makers.
+     * @return the maker array.
+     */
+    public static Property.Maker[] getGenericMappings() {
+        FOPropertyMapping gp = new FOPropertyMapping();
+        gp.createGenerics();
+        // Create the shorthand first, they are referenced by the real properties. 
+        gp.createShorthandProperties();
+        gp.createAccessibilityProperties();
+        gp.createAbsolutePositionProperties();
+        gp.createAuralProperties();
+        gp.createBorderPaddingBackgroundProperties();
+        gp.createFontProperties();
+        gp.createHyphenationProperties();
+        gp.createMarginBlockProperties();
+        gp.createMarginInlineProperties();
+        gp.createRelativePosProperties();
+        gp.createAreaAlignmentProperties();
+        gp.createAreaDimensionProperties();
+        gp.createBlockAndLineProperties();
+        gp.createCharacterProperties();
+        gp.createColorProperties();
+        gp.createFloatProperties();
+        gp.createKeepsAndBreaksProperties();
+        gp.createLayoutProperties();
+        gp.createLeaderAndRuleProperties();
+        gp.createDynamicProperties();
+        gp.createMarkersProperties();
+        gp.createNumberToStringProperties();
+        gp.createPaginationAndLayoutProperties();
+        gp.createTableProperties();
+        gp.createWritingModeProperties();
+        gp.createMiscProperties();
+
+        // Hardcode the subproperties.
+        addSubpropMakerName("length", CP_LENGTH);
+        addSubpropMakerName("conditionality", CP_CONDITIONALITY);
+        addSubpropMakerName("block-progression-direction", CP_BLOCK_PROGRESSION_DIRECTION);
+        addSubpropMakerName("inline-progression-direction", CP_INLINE_PROGRESSION_DIRECTION);
+        addSubpropMakerName("within-line", CP_WITHIN_LINE);
+        addSubpropMakerName("within-column", CP_WITHIN_COLUMN);
+        addSubpropMakerName("within-page", CP_WITHIN_PAGE);
+        addSubpropMakerName("minimum", CP_MINIMUM);
+        addSubpropMakerName("maximum", CP_MAXIMUM);
+        addSubpropMakerName("optimum", CP_OPTIMUM);
+        addSubpropMakerName("precedence", CP_PRECEDENCE);
+        
+        return s_generics;
+    }
+
+    /**
+     * Return the propId for a property name.
+     * @param name the property name
+     * @return a propId that matches the property name.
+     */
+    public static int getPropertyId(String name) {
+        Integer i = (Integer) s_htPropNames.get(name);
+        if (i == null)
+            return -1;
+        return i.intValue();
+    }
+
+    /**
+     * Return the subpropId for a subproperty name.
+     * @param name the subproperty name.
+     * @return a subpropId that matches the subproperty name.
+     */
+    public static int getSubPropertyId(String name) {
+        Integer i = (Integer) s_htSubPropNames.get(name);
+        if (i == null)
+            return -1;
+        return i.intValue();
+    }
+    
+    // returns a property, compound, or property.compound name
+    public static String getPropertyName(int id) {
+        if (((id & Constants.COMPOUND_MASK) == 0) 
+                || ((id & Constants.PROPERTY_MASK) == 0)) {
+            return (String) s_htPropIds.get(new Integer(id));
+        } else {
+            return (String) s_htPropIds.get(new Integer(
+                    id & Constants.PROPERTY_MASK)) + "." + s_htPropIds.get(
+                            new Integer(id & Constants.COMPOUND_MASK));
+        }
+    }
+    
+    private void createAccessibilityProperties() {
+        Property.Maker m;
+
+        // source-document
+        m  = new StringProperty.Maker(PR_SOURCE_DOCUMENT);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("source-document", m);
+
+        // role
+        m  = new StringProperty.Maker(PR_ROLE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("role", m);
+    }
+    
+    private void createAbsolutePositionProperties() {
+        Property.Maker m;
+        LengthProperty.Maker l;
+        
+        // absolute-position
+        m  = new EnumProperty.Maker(PR_ABSOLUTE_POSITION);
+        m.setInherited(false);
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.addEnum("fixed", makeEnumProperty(FIXED));
+        m.addEnum("absolute", makeEnumProperty(ABSOLUTE));
+        m.setDefault("auto");
+        addPropertyMaker("absolute-position", m);
+
+        // top
+        l  = new LengthProperty.Maker(PR_TOP);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("top", l);
+
+        // right
+        l  = new LengthProperty.Maker(PR_RIGHT);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("right", l);
+
+        // bottom
+        l  = new LengthProperty.Maker(PR_BOTTOM);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("bottom", l);
+
+        // left
+        l  = new LengthProperty.Maker(PR_LEFT);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("left", l);
+    }
+        
+    private void createAuralProperties() {
+        Property.Maker m;
+            
+        // azimuth
+        m  = new ToBeImplementedProperty.Maker(PR_AZIMUTH);
+        m.setInherited(true);
+        m.setDefault("center");
+        addPropertyMaker("azimuth", m);
+
+        // cue-after
+        m  = new ToBeImplementedProperty.Maker(PR_CUE_AFTER);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("cue-after", m);
+
+        // cue-before
+        m  = new ToBeImplementedProperty.Maker(PR_CUE_BEFORE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("cue-before", m);
+
+        // elevation
+        m  = new ToBeImplementedProperty.Maker(PR_ELEVATION);
+        m.setInherited(true);
+        m.setDefault("level");
+        addPropertyMaker("elevation", m);
+
+        // pause-after
+        m  = new ToBeImplementedProperty.Maker(PR_PAUSE_AFTER);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("pause-after", m);
+
+        // pause-before
+        m  = new ToBeImplementedProperty.Maker(PR_PAUSE_BEFORE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("pause-before", m);
+
+        // pitch
+        m  = new ToBeImplementedProperty.Maker(PR_PITCH);
+        m.setInherited(true);
+        m.setDefault("medium");
+        addPropertyMaker("pitch", m);
+
+        // pitch-range
+        m  = new ToBeImplementedProperty.Maker(PR_PITCH_RANGE);
+        m.setInherited(true);
+        m.setDefault("50");
+        addPropertyMaker("pitch-range", m);
+
+        // play-during
+        m  = new ToBeImplementedProperty.Maker(PR_PLAY_DURING);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("play-during", m);
+
+        // richness
+        m  = new ToBeImplementedProperty.Maker(PR_RICHNESS);
+        m.setInherited(true);
+        m.setDefault("50");
+        addPropertyMaker("richness", m);
+
+        // speak
+        m  = new ToBeImplementedProperty.Maker(PR_SPEAK);
+        m.setInherited(true);
+        m.setDefault("normal");
+        addPropertyMaker("speak", m);
+
+        // speak-header
+        m  = new ToBeImplementedProperty.Maker(PR_SPEAK_HEADER);
+        m.setInherited(true);
+        m.setDefault("once");
+        addPropertyMaker("speak-header", m);
+
+        // speak-numeral
+        m  = new ToBeImplementedProperty.Maker(PR_SPEAK_NUMERAL);
+        m.setInherited(true);
+        m.setDefault("continuous");
+        addPropertyMaker("speak-numeral", m);
+
+        // speak-punctuation
+        m  = new ToBeImplementedProperty.Maker(PR_SPEAK_PUNCTUATION);
+        m.setInherited(true);
+        m.setDefault("none");
+        addPropertyMaker("speak-punctuation", m);
+
+        // speech-rate
+        m  = new ToBeImplementedProperty.Maker(PR_SPEECH_RATE);
+        m.setInherited(true);
+        m.setDefault("medium");
+        addPropertyMaker("speech-rate", m);
+
+        // stress
+        m  = new ToBeImplementedProperty.Maker(PR_STRESS);
+        m.setInherited(true);
+        m.setDefault("50");
+        addPropertyMaker("stress", m);
+
+        // voice-family
+        m  = new ToBeImplementedProperty.Maker(PR_VOICE_FAMILY);
+        m.setInherited(true);
+        m.setDefault("");
+        addPropertyMaker("voice-family", m);
+
+        // volume
+        m  = new ToBeImplementedProperty.Maker(PR_VOLUME);
+        m.setInherited(true);
+        m.setDefault("medium");
+        addPropertyMaker("volume", m);
+    }
+        
+    private void createBorderPaddingBackgroundProperties() {
+        Property.Maker m;
+        BorderWidthPropertyMaker bwm;
+        CorrespondingPropertyMaker corr;
+        
+        // background-attachment
+        m  = new ToBeImplementedProperty.Maker(PR_BACKGROUND_ATTACHMENT);
+        m.setInherited(false);
+        m.setDefault("scroll");
+        addPropertyMaker("background-attachment", m);
+
+        // background-color
+        m  = new ColorTypeProperty.Maker(PR_BACKGROUND_COLOR) {
+            protected Property convertPropertyDatatype(
+                    Property p, PropertyList propertyList, FObj fo) {
+                String nameval = p.getNCname();
+                if (nameval != null) {
+                    return new ColorTypeProperty(new ColorType(nameval));
+                }
+                return super.convertPropertyDatatype(p, propertyList, fo);
+            }
+        };
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("transparent");
+        addPropertyMaker("background-color", m);
+
+        // background-image
+        m  = new StringProperty.Maker(PR_BACKGROUND_IMAGE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("background-image", m);
+
+        // background-repeat
+        m  = new EnumProperty.Maker(PR_BACKGROUND_REPEAT);
+        m.setInherited(false);
+        m.addEnum("repeat", makeEnumProperty(REPEAT));
+        m.addEnum("repeat-x", makeEnumProperty(REPEATX));
+        m.addEnum("repeat-y", makeEnumProperty(REPEATY));
+        m.addEnum("no-repeat", makeEnumProperty(NOREPEAT));
+        m.setDefault("repeat");
+        addPropertyMaker("background-repeat", m);
+
+        // background-position-horizontal
+        m  = new LengthProperty.Maker(PR_BACKGROUND_POSITION_HORIZONTAL);
+        m.setInherited(false);
+        m.setDefault("0%");
+        addPropertyMaker("background-position-horizontal", m);
+
+        // background-position-vertical
+        m  = new LengthProperty.Maker(PR_BACKGROUND_POSITION_VERTICAL);
+        m.setInherited(false);
+        m.setDefault("0%");
+        addPropertyMaker("background-position-vertical", m);
+
+        // border-before-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_BEFORE_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_TOP_COLOR, PR_BORDER_TOP_COLOR,
+                PR_BORDER_RIGHT_COLOR);
+        corr.setRelative(true);
+        addPropertyMaker("border-before-color", m);
+
+        // border-before-style
+        m  = new EnumProperty.Maker(PR_BORDER_BEFORE_STYLE);
+        m.useGeneric(genericBorderStyle);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_TOP_STYLE, PR_BORDER_TOP_STYLE,
+                PR_BORDER_RIGHT_STYLE);
+        corr.setRelative(true);
+        addPropertyMaker("border-before-style", m);
+
+        // border-before-width
+        m  = new CondLengthProperty.Maker(PR_BORDER_BEFORE_WIDTH);
+        m.useGeneric(genericCondBorderWidth);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("retain");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_TOP_WIDTH, PR_BORDER_TOP_WIDTH,
+                PR_BORDER_RIGHT_WIDTH);
+        corr.setRelative(true);
+        addPropertyMaker("border-before-width", m);
+
+        // border-after-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_AFTER_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_BOTTOM_COLOR, PR_BORDER_BOTTOM_COLOR,
+                PR_BORDER_LEFT_COLOR);
+        corr.setRelative(true);
+        addPropertyMaker("border-after-color", m);
+
+        // border-after-style
+        m  = new EnumProperty.Maker(PR_BORDER_AFTER_STYLE);
+        m.useGeneric(genericBorderStyle);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_BOTTOM_STYLE, PR_BORDER_BOTTOM_STYLE,
+                PR_BORDER_LEFT_STYLE);
+        corr.setRelative(true);
+        addPropertyMaker("border-after-style", m);
+
+        // border-after-width
+        m  = new CondLengthProperty.Maker(PR_BORDER_AFTER_WIDTH);
+        m.useGeneric(genericCondBorderWidth);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("retain");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_BOTTOM_WIDTH, PR_BORDER_BOTTOM_WIDTH,
+                PR_BORDER_LEFT_WIDTH);
+        corr.setRelative(true);
+        addPropertyMaker("border-after-width", m);
+
+        // border-start-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_START_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_LEFT_COLOR, PR_BORDER_RIGHT_COLOR,
+                PR_BORDER_TOP_COLOR);
+        corr.setRelative(true);
+        addPropertyMaker("border-start-color", m);
+
+        // border-start-style
+        m  = new EnumProperty.Maker(PR_BORDER_START_STYLE);
+        m.useGeneric(genericBorderStyle);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_LEFT_STYLE, PR_BORDER_RIGHT_STYLE,
+                PR_BORDER_TOP_STYLE);
+        corr.setRelative(true);
+        addPropertyMaker("border-start-style", m);
+
+        // border-start-width
+        m  = new CondLengthProperty.Maker(PR_BORDER_START_WIDTH);
+        m.useGeneric(genericCondBorderWidth);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("discard");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_LEFT_WIDTH, PR_BORDER_RIGHT_WIDTH,
+                PR_BORDER_TOP_WIDTH);
+        corr.setRelative(true);
+        addPropertyMaker("border-start-width", m);
+
+        // border-end-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_END_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_RIGHT_COLOR, PR_BORDER_LEFT_COLOR,
+                PR_BORDER_BOTTOM_COLOR);
+        corr.setRelative(true);
+        addPropertyMaker("border-end-color", m);
+
+        // border-end-style
+        m  = new EnumProperty.Maker(PR_BORDER_END_STYLE);
+        m.useGeneric(genericBorderStyle);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_RIGHT_STYLE, PR_BORDER_LEFT_STYLE,
+                PR_BORDER_BOTTOM_STYLE);
+        corr.setRelative(true);
+        addPropertyMaker("border-end-style", m);
+
+        // border-end-width
+        m  = new CondLengthProperty.Maker(PR_BORDER_END_WIDTH);
+        m.useGeneric(genericCondBorderWidth);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("discard");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_RIGHT_WIDTH, PR_BORDER_LEFT_WIDTH,
+                PR_BORDER_BOTTOM_WIDTH);
+        corr.setRelative(true);
+        addPropertyMaker("border-end-width", m);
+
+        // border-top-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_TOP_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        m.addShorthand(s_generics[PR_BORDER_TOP]);
+        m.addShorthand(s_generics[PR_BORDER_COLOR]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_BEFORE_COLOR, PR_BORDER_BEFORE_COLOR,
+                PR_BORDER_START_COLOR);
+        addPropertyMaker("border-top-color", m);
+
+        // border-top-style
+        m  = new EnumProperty.Maker(PR_BORDER_TOP_STYLE);
+        m.useGeneric(genericBorderStyle);
+        m.addShorthand(s_generics[PR_BORDER_TOP]);
+        m.addShorthand(s_generics[PR_BORDER_STYLE]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_BEFORE_STYLE, PR_BORDER_BEFORE_STYLE,
+                PR_BORDER_START_STYLE);
+        addPropertyMaker("border-top-style", m);
+
+        // border-top-width
+        bwm  = new BorderWidthPropertyMaker(PR_BORDER_TOP_WIDTH);
+        bwm.useGeneric(genericBorderWidth);
+        bwm.setBorderStyleId(PR_BORDER_TOP_STYLE);
+        bwm.addShorthand(s_generics[PR_BORDER_TOP]);
+        bwm.addShorthand(s_generics[PR_BORDER_WIDTH]);
+        bwm.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(bwm);
+        corr.setCorresponding(PR_BORDER_BEFORE_WIDTH, PR_BORDER_BEFORE_WIDTH,
+                PR_BORDER_START_WIDTH);
+        addPropertyMaker("border-top-width", bwm);
+
+        // border-bottom-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_BOTTOM_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        m.addShorthand(s_generics[PR_BORDER_BOTTOM]);
+        m.addShorthand(s_generics[PR_BORDER_COLOR]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_AFTER_COLOR, PR_BORDER_AFTER_COLOR,
+                PR_BORDER_END_COLOR);
+        addPropertyMaker("border-bottom-color", m);
+
+        // border-bottom-style
+        m  = new EnumProperty.Maker(PR_BORDER_BOTTOM_STYLE);
+        m.useGeneric(genericBorderStyle);
+        m.addShorthand(s_generics[PR_BORDER_BOTTOM]);
+        m.addShorthand(s_generics[PR_BORDER_STYLE]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_AFTER_STYLE, PR_BORDER_AFTER_STYLE,
+                PR_BORDER_END_STYLE);
+        addPropertyMaker("border-bottom-style", m);
+
+        // border-bottom-width
+        bwm  = new BorderWidthPropertyMaker(PR_BORDER_BOTTOM_WIDTH);
+        bwm.useGeneric(genericBorderWidth);
+        bwm.setBorderStyleId(PR_BORDER_BOTTOM_STYLE);
+        bwm.addShorthand(s_generics[PR_BORDER_BOTTOM]);
+        bwm.addShorthand(s_generics[PR_BORDER_WIDTH]);
+        bwm.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(bwm);
+        corr.setCorresponding(PR_BORDER_AFTER_WIDTH, PR_BORDER_AFTER_WIDTH,
+                PR_BORDER_END_WIDTH);
+        addPropertyMaker("border-bottom-width", bwm);
+
+        // border-left-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_LEFT_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        m.addShorthand(s_generics[PR_BORDER_LEFT]);
+        m.addShorthand(s_generics[PR_BORDER_COLOR]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_START_COLOR, PR_BORDER_END_COLOR,
+                PR_BORDER_AFTER_COLOR);
+        addPropertyMaker("border-left-color", m);
+
+        // border-left-style
+        m  = new EnumProperty.Maker(PR_BORDER_LEFT_STYLE);
+        m.useGeneric(genericBorderStyle);
+        m.addShorthand(s_generics[PR_BORDER_LEFT]);
+        m.addShorthand(s_generics[PR_BORDER_STYLE]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_START_STYLE, PR_BORDER_END_STYLE,
+                PR_BORDER_AFTER_STYLE);
+        addPropertyMaker("border-left-style", m);
+
+        // border-left-width
+        bwm  = new BorderWidthPropertyMaker(PR_BORDER_LEFT_WIDTH);
+        bwm.useGeneric(genericBorderWidth);
+        bwm.setBorderStyleId(PR_BORDER_LEFT_STYLE);
+        bwm.addShorthand(s_generics[PR_BORDER_LEFT]);
+        bwm.addShorthand(s_generics[PR_BORDER_WIDTH]);
+        bwm.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(bwm);
+        corr.setCorresponding(PR_BORDER_START_WIDTH, PR_BORDER_END_WIDTH,
+                PR_BORDER_AFTER_WIDTH);
+        addPropertyMaker("border-left-width", bwm);
+
+        // border-right-color
+        m  = new ColorTypeProperty.Maker(PR_BORDER_RIGHT_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(false);
+        m.setDefault("black");
+        m.addShorthand(s_generics[PR_BORDER_RIGHT]);
+        m.addShorthand(s_generics[PR_BORDER_COLOR]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_END_COLOR, PR_BORDER_START_COLOR,
+                PR_BORDER_BEFORE_COLOR);
+        addPropertyMaker("border-right-color", m);
+
+        // border-right-style
+        m  = new EnumProperty.Maker(PR_BORDER_RIGHT_STYLE);
+        m.useGeneric(genericBorderStyle);
+        m.addShorthand(s_generics[PR_BORDER_RIGHT]);
+        m.addShorthand(s_generics[PR_BORDER_STYLE]);
+        m.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_BORDER_END_STYLE, PR_BORDER_START_STYLE,
+                PR_BORDER_BEFORE_STYLE);
+        addPropertyMaker("border-right-style", m);
+
+        // border-right-width
+        bwm  = new BorderWidthPropertyMaker(PR_BORDER_RIGHT_WIDTH);
+        bwm.useGeneric(genericBorderWidth);
+        bwm.setBorderStyleId(PR_BORDER_RIGHT_STYLE);
+        bwm.addShorthand(s_generics[PR_BORDER_RIGHT]);
+        bwm.addShorthand(s_generics[PR_BORDER_WIDTH]);
+        bwm.addShorthand(s_generics[PR_BORDER]);
+        corr = new CorrespondingPropertyMaker(bwm);
+        corr.setCorresponding(PR_BORDER_END_WIDTH, PR_BORDER_START_WIDTH,
+                PR_BORDER_BEFORE_WIDTH);
+        addPropertyMaker("border-right-width", bwm);
+
+        // padding-before
+        m  = new CondLengthProperty.Maker(PR_PADDING_BEFORE);
+        m.useGeneric(genericCondPadding);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("retain");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_TOP, PR_PADDING_TOP,
+                PR_PADDING_RIGHT);
+        corr.setRelative(true);
+        addPropertyMaker("padding-before", m);
+
+        // padding-after
+        m  = new CondLengthProperty.Maker(PR_PADDING_AFTER);
+        m.useGeneric(genericCondPadding);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("retain");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_BOTTOM, PR_PADDING_BOTTOM,
+                PR_PADDING_LEFT);
+        corr.setRelative(true);
+        addPropertyMaker("padding-after", m);
+
+        // padding-start
+        m  = new CondLengthProperty.Maker(PR_PADDING_START);
+        m.useGeneric(genericCondPadding);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("discard");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_LEFT, PR_PADDING_RIGHT,
+                PR_PADDING_TOP);
+        corr.setRelative(true);
+        addPropertyMaker("padding-start", m);
+
+        // padding-end
+        m  = new CondLengthProperty.Maker(PR_PADDING_END);
+        m.useGeneric(genericCondPadding);
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("discard");
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_RIGHT, PR_PADDING_LEFT,
+                PR_PADDING_BOTTOM);
+        corr.setRelative(true);
+        addPropertyMaker("padding-end", m);
+
+        // padding-top
+        m  = new LengthProperty.Maker(PR_PADDING_TOP);
+        m.useGeneric(genericPadding);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_BEFORE, PR_PADDING_BEFORE,
+                PR_PADDING_START);
+        addPropertyMaker("padding-top", m);
+
+        // padding-bottom
+        m  = new LengthProperty.Maker(PR_PADDING_BOTTOM);
+        m.useGeneric(genericPadding);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_AFTER, PR_PADDING_AFTER,
+                PR_PADDING_END);
+        addPropertyMaker("padding-bottom", m);
+
+        // padding-left
+        m  = new LengthProperty.Maker(PR_PADDING_LEFT);
+        m.useGeneric(genericPadding);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_START, PR_PADDING_END,
+                PR_PADDING_AFTER);
+        addPropertyMaker("padding-left", m);
+
+        // padding-right
+        m  = new LengthProperty.Maker(PR_PADDING_RIGHT);
+        m.useGeneric(genericPadding);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_PADDING_END, PR_PADDING_START,
+                PR_PADDING_BEFORE);
+        addPropertyMaker("padding-right", m);
+    }
+        
+    private void createFontProperties() {
+        Property.Maker m;
+
+        // font-family
+        m  = new StringProperty.Maker(PR_FONT_FAMILY);
+        m.setInherited(true);
+        m.setDefault("sans-serif");
+        addPropertyMaker("font-family", m);
+
+        // font-selection-strategy
+        m  = new ToBeImplementedProperty.Maker(PR_FONT_SELECTION_STRATEGY);
+        m.setInherited(true);
+        m.setDefault("auto");
+        addPropertyMaker("font-selection-strategy", m);
+
+        // font-size
+        m  = new LengthProperty.Maker(PR_FONT_SIZE);
+        m.setInherited(true);
+        m.setDefault("12pt");
+        m.setPercentBase(LengthBase.INH_FONTSIZE);
+        addPropertyMaker("font-size", m);
+
+        // font-stretch
+        m  = new ToBeImplementedProperty.Maker(PR_FONT_STRETCH);
+        m.setInherited(true);
+        m.setDefault("normal");
+        addPropertyMaker("font-stretch", m);
+
+        // font-size-adjust
+        m  = new ToBeImplementedProperty.Maker(PR_FONT_SIZE_ADJUST);
+        m.setInherited(true);
+        m.setDefault("none");
+        addPropertyMaker("font-size-adjust", m);
+
+        // font-style
+        m  = new StringProperty.Maker(PR_FONT_STYLE);
+        m.setInherited(true);
+        m.setDefault("normal");
+        addPropertyMaker("font-style", m);
+
+        // font-variant
+        m  = new EnumProperty.Maker(PR_FONT_VARIANT);
+        m.setInherited(true);
+        m.addEnum("normal", makeEnumProperty(NORMAL));
+        m.addEnum("small-caps", makeEnumProperty(SMALL_CAPS));
+        m.setDefault("normal");
+        addPropertyMaker("font-variant", m);
+
+        // font-weight
+        m  = new StringProperty.Maker(PR_FONT_WEIGHT);
+        m.setInherited(true);
+        m.addKeyword("normal", "400");
+        m.addKeyword("bold", "700");
+        m.setDefault("400");
+        addPropertyMaker("font-weight", m);
+    }
+        
+    private void createHyphenationProperties() {
+        Property.Maker m;
+        
+        // country
+        m  = new StringProperty.Maker(PR_COUNTRY);
+        m.setInherited(true);
+        m.setDefault("none");
+        addPropertyMaker("country", m);
+
+        // language
+        m  = new StringProperty.Maker(PR_LANGUAGE);
+        m.setInherited(true);
+        m.setDefault("none");
+        addPropertyMaker("language", m);
+
+        // script
+        m  = new ToBeImplementedProperty.Maker(PR_SCRIPT);
+        m.setInherited(true);
+        m.setDefault("auto");
+        addPropertyMaker("script", m);
+
+        // hyphenate
+        m  = new EnumProperty.Maker(PR_HYPHENATE);
+        m.setInherited(true);
+        m.addEnum("true", makeEnumProperty(TRUE));
+        m.addEnum("false", makeEnumProperty(FALSE));
+        m.setDefault("false");
+        addPropertyMaker("hyphenate", m);
+
+        // hyphenation-character
+        m  = new CharacterProperty.Maker(PR_HYPHENATION_CHARACTER);
+        m.setInherited(true);
+        m.setDefault("-");
+        addPropertyMaker("hyphenation-character", m);
+
+        // hyphenation-push-character-count
+        m  = new NumberProperty.Maker(PR_HYPHENATION_PUSH_CHARACTER_COUNT);
+        m.setInherited(true);
+        m.setDefault("2");
+        addPropertyMaker("hyphenation-push-character-count", m);
+
+        // hyphenation-remain-character-count
+        m  = new NumberProperty.Maker(PR_HYPHENATION_REMAIN_CHARACTER_COUNT);
+        m.setInherited(true);
+        m.setDefault("2");
+        addPropertyMaker("hyphenation-remain-character-count", m);
+    }
+    
+    private void createMarginBlockProperties() {
+        Property.Maker m;
+        CorrespondingPropertyMaker corr;
+            
+        // margin-top
+        m  = new LengthProperty.Maker(PR_MARGIN_TOP);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("margin-top", m);
+
+        // margin-bottom
+        m  = new LengthProperty.Maker(PR_MARGIN_BOTTOM);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("margin-bottom", m);
+
+        // margin-left
+        m  = new LengthProperty.Maker(PR_MARGIN_LEFT);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("margin-left", m);
+
+        // margin-right
+        m  = new LengthProperty.Maker(PR_MARGIN_RIGHT);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("margin-right", m);
+
+        // space-before
+        m  = new SpaceProperty.Maker(PR_SPACE_BEFORE);
+        m.useGeneric(genericSpace);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_MARGIN_TOP, PR_MARGIN_TOP, PR_MARGIN_RIGHT);
+        corr.setUseParent(true);
+        corr.setRelative(true);
+        addPropertyMaker("space-before", m);
+
+        // space-after
+        m  = new SpaceProperty.Maker(PR_SPACE_AFTER);
+        m.useGeneric(genericSpace);
+        corr = new CorrespondingPropertyMaker(m);
+        corr.setCorresponding(PR_MARGIN_BOTTOM, PR_MARGIN_BOTTOM, PR_MARGIN_LEFT);
+        corr.setUseParent(true);
+        corr.setRelative(true);
+        addPropertyMaker("space-after", m);
+
+        // start-indent
+        m = new LengthProperty.Maker(PR_START_INDENT);
+        m.setInherited(true);
+        m.setDefault("0pt");
+        IndentPropertyMaker sCorr = new IndentPropertyMaker(m);
+        sCorr.setCorresponding(PR_MARGIN_LEFT, PR_MARGIN_RIGHT, PR_MARGIN_TOP);
+        sCorr.setRelative(true);
+        sCorr.setPaddingCorresponding(new int[] {
+             PR_PADDING_LEFT, PR_PADDING_RIGHT, PR_PADDING_TOP 
+        });
+        sCorr.setBorderWidthCorresponding(new int[] {
+            PR_BORDER_LEFT_WIDTH, PR_BORDER_RIGHT_WIDTH, PR_BORDER_TOP_WIDTH
+        });
+        addPropertyMaker("start-indent", m);
+
+        // end-indent
+        m = new LengthProperty.Maker(PR_END_INDENT);
+        m.setInherited(true);
+        m.setDefault("0pt");
+        IndentPropertyMaker eCorr = new IndentPropertyMaker(m);
+        eCorr.setCorresponding(PR_MARGIN_RIGHT, PR_MARGIN_LEFT, PR_MARGIN_BOTTOM);
+        eCorr.setRelative(true);
+        eCorr.setPaddingCorresponding(new int[] {
+            PR_PADDING_RIGHT, PR_PADDING_LEFT, PR_PADDING_BOTTOM 
+        });
+        eCorr.setBorderWidthCorresponding(new int[] {
+            PR_BORDER_RIGHT_WIDTH, PR_BORDER_LEFT_WIDTH, PR_BORDER_BOTTOM_WIDTH
+        });
+        addPropertyMaker("end-indent", m);
+    }
+    
+    private void createMarginInlineProperties() {
+        Property.Maker m;
+            
+        // space-end
+        m  = new SpaceProperty.Maker(PR_SPACE_END);
+        m.useGeneric(genericSpace);
+        addPropertyMaker("space-end", m);
+
+        // space-start
+        m  = new SpaceProperty.Maker(PR_SPACE_START);
+        m.useGeneric(genericSpace);
+        addPropertyMaker("space-start", m);
+    }
+    
+    private void createRelativePosProperties() {
+        Property.Maker m;
+            
+        // relative-position
+        m  = new ToBeImplementedProperty.Maker(PR_RELATIVE_POSITION);
+        m.setInherited(false);
+        m.setDefault("static");
+        addPropertyMaker("relative-position", m);
+    }
+        
+    private void createAreaAlignmentProperties() {
+        Property.Maker m;
+            
+        // alignment-adjust
+        m  = new ToBeImplementedProperty.Maker(PR_ALIGNMENT_ADJUST);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("alignment-adjust", m);
+
+        // alignment-baseline
+        m  = new ToBeImplementedProperty.Maker(PR_ALIGNMENT_BASELINE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("alignment-baseline", m);
+
+        // baseline-shift
+        m  = new LengthProperty.Maker(PR_BASELINE_SHIFT);
+        m.setInherited(false);
+        m.addEnum("baseline", makeEnumProperty(BASELINE));
+        m.addEnum("sub", makeEnumProperty(SUB));
+        m.addEnum("super", makeEnumProperty(SUPER));
+        m.setDefault("baseline");
+        addPropertyMaker("baseline-shift", m);
+
+        // display-align
+        m  = new EnumProperty.Maker(PR_DISPLAY_ALIGN);
+        m.setInherited(true);
+        m.addEnum("before", makeEnumProperty(BEFORE));
+        m.addEnum("after", makeEnumProperty(AFTER));
+        m.addEnum("center", makeEnumProperty(CENTER));
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.setDefault("auto");
+        addPropertyMaker("display-align", m);
+
+        // dominant-baseline
+        m  = new ToBeImplementedProperty.Maker(PR_DOMINANT_BASELINE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("dominant-baseline", m);
+
+        // relative-align
+        m  = new EnumProperty.Maker(PR_RELATIVE_ALIGN);
+        m.setInherited(true);
+        m.addEnum("before", makeEnumProperty(BEFORE));
+        m.addEnum("after", makeEnumProperty(BASELINE));
+        m.setDefault("before");
+        addPropertyMaker("relative-align", m);
+    }
+    
+    private void createAreaDimensionProperties() {
+        Property.Maker m;
+        LengthProperty.Maker l;
+        DimensionPropertyMaker pdim;
+        CorrespondingPropertyMaker corr;
+            
+        // block-progression-dimension
+        m = new LengthRangeProperty.Maker(PR_BLOCK_PROGRESSION_DIMENSION);
+        m.setInherited(false);
+        
+        l = new LengthProperty.Maker(CP_MINIMUM);
+        l.setDefault("auto");
+        l.setAutoOk(true);
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+
+        l = new LengthProperty.Maker(CP_OPTIMUM);
+        l.setDefault("auto");
+        l.setAutoOk(true);
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+
+        l = new LengthProperty.Maker(CP_MAXIMUM);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+        
+        pdim = new DimensionPropertyMaker(m);
+        pdim.setCorresponding(PR_HEIGHT, PR_HEIGHT, PR_WIDTH);
+        pdim.setExtraCorresponding(new int[][] {
+             { PR_MIN_HEIGHT, PR_MIN_HEIGHT, PR_MIN_WIDTH, },
+             { PR_MAX_HEIGHT, PR_MAX_HEIGHT, PR_MAX_WIDTH, }
+        });
+        pdim.setRelative(true);
+        addPropertyMaker("block-progression-dimension", m);
+
+        // content-height
+        l  = new LengthProperty.Maker(PR_CONTENT_HEIGHT);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("content-height", l);
+
+        // content-width
+        l  = new LengthProperty.Maker(PR_CONTENT_WIDTH);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("content-width", l);
+
+        // height
+        l  = new LengthProperty.Maker(PR_HEIGHT);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        addPropertyMaker("height", l);
+
+        // inline-progression-dimension
+        m = new LengthRangeProperty.Maker(PR_INLINE_PROGRESSION_DIMENSION);
+        m.setInherited(false);
+        
+        l = new LengthProperty.Maker(CP_MINIMUM);
+        l.setDefault("auto");
+        l.setAutoOk(true);
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+
+        l= new LengthProperty.Maker(CP_OPTIMUM);
+        l.setDefault("auto");
+        l.setAutoOk(true);
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+
+        l = new LengthProperty.Maker(CP_MAXIMUM);
+        l.setAutoOk(true);
+        l.setDefault("auto");
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setByShorthand(true);
+        m.addSubpropMaker(l);
+
+        pdim = new DimensionPropertyMaker(m);
+        pdim.setRelative(true);
+        pdim.setCorresponding(PR_WIDTH, PR_WIDTH, PR_HEIGHT);
+        pdim.setExtraCorresponding(new int[][] {
+			{ PR_MIN_WIDTH, PR_MIN_WIDTH, PR_MIN_HEIGHT, },
+            { PR_MAX_WIDTH, PR_MAX_WIDTH, PR_MAX_HEIGHT, }
+        });
+        addPropertyMaker("inline-progression-dimension", m);
+
+        // max-height
+        m  = new ToBeImplementedProperty.Maker(PR_MAX_HEIGHT);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("max-height", m);
+
+        // max-width
+        m  = new ToBeImplementedProperty.Maker(PR_MAX_WIDTH);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("max-width", m);
+
+        // min-height
+        m  = new ToBeImplementedProperty.Maker(PR_MIN_HEIGHT);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("min-height", m);
+
+        // min-width
+        m  = new ToBeImplementedProperty.Maker(PR_MIN_WIDTH);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("min-width", m);
+
+        // scaling
+        m  = new EnumProperty.Maker(PR_SCALING);
+        m.setInherited(true);
+        m.addEnum("uniform", makeEnumProperty(UNIFORM));
+        m.addEnum("non-uniform", makeEnumProperty(NON_UNIFORM));
+        m.setDefault("uniform");
+        addPropertyMaker("scaling", m);
+
+        // scaling-method
+        m  = new ToBeImplementedProperty.Maker(PR_SCALING_METHOD);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("scaling-method", m);
+
+        // width
+        l  = new LengthProperty.Maker(PR_WIDTH);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setPercentBase(LengthBase.CONTAINING_BOX);
+        l.setDefault("auto");
+        addPropertyMaker("width", l);
+    }
+    
+    private void createBlockAndLineProperties() {
+        Property.Maker m;
+            
+        // hyphenation-keep
+        m  = new ToBeImplementedProperty.Maker(PR_HYPHENATION_KEEP);
+        m.setInherited(true);
+        m.setDefault("auto");
+        addPropertyMaker("hyphenation-keep", m);
+
+        // hyphenation-ladder-count
+        m  = new ToBeImplementedProperty.Maker(PR_HYPHENATION_LADDER_COUNT);
+        m.setInherited(true);
+        m.setDefault("no-limit");
+        addPropertyMaker("hyphenation-ladder-count", m);
+
+        // last-line-end-indent
+        m  = new ToBeImplementedProperty.Maker(PR_LAST_LINE_END_INDENT);
+        m.setInherited(true);
+        m.setDefault("0pt");
+        addPropertyMaker("last-line-end-indent", m);
+
+        // line-height
+        m  = new LineHeightPropertyMaker(PR_LINE_HEIGHT);
+        m.setInherited(true);
+        m.setDefault("normal", true);
+        m.addKeyword("normal", "1.2em");
+        m.setPercentBase(LengthBase.FONTSIZE);
+        addPropertyMaker("line-height", m);
+
+        // line-height-shift-adjustment
+        m  = new ToBeImplementedProperty.Maker(PR_LINE_HEIGHT_SHIFT_ADJUSTMENT);
+        m.setInherited(true);
+        m.setDefault("consider-shifts");
+        addPropertyMaker("line-height-shift-adjustment", m);
+
+        // line-stacking-strategy
+        m  = new ToBeImplementedProperty.Maker(PR_LINE_STACKING_STRATEGY);
+        m.setInherited(true);
+        m.setDefault("line-height");
+        addPropertyMaker("line-stacking-strategy", m);
+
+        // linefeed-treatment
+        m  = new EnumProperty.Maker(PR_LINEFEED_TREATMENT);
+        m.setInherited(true);
+        m.addEnum("ignore", makeEnumProperty(IGNORE));
+        m.addEnum("preserve", makeEnumProperty(PRESERVE));
+        m.addEnum("treat-as-space", makeEnumProperty(TREAT_AS_SPACE));
+        m.addEnum("treat-as-zero-width-space", makeEnumProperty(TREAT_AS_ZERO_WIDTH_SPACE));
+        m.setDefault("treat-as-space");
+        addPropertyMaker("linefeed-treatment", m);
+
+        // space-treatment
+        m  = new ToBeImplementedProperty.Maker(PR_SPACE_TREATMENT);
+        m.setInherited(true);
+        m.setDefault("preserve");
+        addPropertyMaker("space-treatment", m);
+
+        // text-align
+        m  = new EnumProperty.Maker(PR_TEXT_ALIGN);
+        m.setInherited(true);
+        // Note: both 'end' and 'right' are mapped to END
+        //       both 'start' and 'left' are mapped to START
+        m.addEnum("center", makeEnumProperty(CENTER));
+        m.addEnum("end", makeEnumProperty(END));
+        m.addEnum("right", makeEnumProperty(END));
+        m.addEnum("start", makeEnumProperty(START));
+        m.addEnum("left", makeEnumProperty(START));
+        m.addEnum("justify", makeEnumProperty(JUSTIFY));
+        m.setDefault("start");
+        addPropertyMaker("text-align", m);
+
+        // text-align-last
+        m  = new EnumProperty.Maker(PR_TEXT_ALIGN_LAST) {
+            public Property compute(PropertyList propertyList) {
+                Property corresponding = propertyList.get(PR_TEXT_ALIGN);
+                if (corresponding == null) {
+                    return null;
+                }
+                int correspondingValue = corresponding.getEnum();
+                if (correspondingValue == JUSTIFY)
+                    return new EnumProperty(START);
+                else if (correspondingValue == END)
+                    return new EnumProperty(END);
+                else if (correspondingValue == START)
+                    return new EnumProperty(START);
+                else if (correspondingValue == CENTER)
+                    return new EnumProperty(CENTER);
+                return null;
+            }
+        };
+        m.setInherited(true);
+        m.addEnum("center", makeEnumProperty(CENTER));
+        m.addEnum("end", makeEnumProperty(END));
+        m.addEnum("start", makeEnumProperty(START));
+        m.addEnum("justify", makeEnumProperty(JUSTIFY));
+        m.setDefault("start");
+        addPropertyMaker("text-align-last", m);
+
+        // text-indent
+        m  = new LengthProperty.Maker(PR_TEXT_INDENT);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("text-indent", m);
+
+        // white-space-collapse
+        m  = new EnumProperty.Maker(PR_WHITE_SPACE_COLLAPSE);
+        m.useGeneric(genericBoolean);
+        m.setInherited(true);
+        m.setDefault("true");
+        addPropertyMaker("white-space-collapse", m);
+
+        // wrap-option
+        m  = new EnumProperty.Maker(PR_WRAP_OPTION);
+        m.setInherited(true);
+        m.addEnum("wrap", makeEnumProperty(WRAP));
+        m.addEnum("no-wrap", makeEnumProperty(NO_WRAP));
+        m.setDefault("wrap");
+        addPropertyMaker("wrap-option", m);
+    }
+    
+    private void createCharacterProperties() {
+        Property.Maker m;
+            
+        // character
+        m  = new CharacterProperty.Maker(PR_CHARACTER);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("character", m);
+
+        // letter-spacing
+        m  = new ToBeImplementedProperty.Maker(PR_LETTER_SPACING);
+        m.setInherited(true);
+        m.setDefault("normal");
+        addPropertyMaker("letter-spacing", m);
+
+        // suppress-at-line-break
+        m  = new ToBeImplementedProperty.Maker(PR_SUPPRESS_AT_LINE_BREAK);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("suppress-at-line-break", m);
+
+        // text-decoration
+        m  = new EnumProperty.Maker(PR_TEXT_DECORATION);
+        m.setInherited(false);
+        m.addEnum("none", makeEnumProperty(NONE));
+        m.addEnum("underline", makeEnumProperty(UNDERLINE));
+        m.addEnum("overline", makeEnumProperty(OVERLINE));
+        m.addEnum("line-through", makeEnumProperty(LINE_THROUGH));
+        m.addEnum("blink", makeEnumProperty(BLINK));
+        m.addEnum("no-underline", makeEnumProperty(NO_UNDERLINE));
+        m.addEnum("no-overline", makeEnumProperty(NO_OVERLINE));
+        m.addEnum("no-line-through", makeEnumProperty(NO_LINE_THROUGH));
+        m.addEnum("no-blink", makeEnumProperty(NO_BLINK));
+        m.setDefault("none");
+        addPropertyMaker("text-decoration", m);
+
+        // text-shadow
+        m  = new ToBeImplementedProperty.Maker(PR_TEXT_SHADOW);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("text-shadow", m);
+
+        // text-transform
+        m  = new EnumProperty.Maker(PR_TEXT_TRANSFORM);
+        m.setInherited(true);
+        m.addEnum("none", makeEnumProperty(NONE));
+        m.addEnum("capitalize", makeEnumProperty(CAPITALIZE));
+        m.addEnum("uppercase", makeEnumProperty(UPPERCASE));
+        m.addEnum("lowercase", makeEnumProperty(LOWERCASE));
+        m.setDefault("none");
+        addPropertyMaker("text-transform", m);
+
+        // treat-as-word-space
+        m  = new ToBeImplementedProperty.Maker(PR_TREAT_AS_WORD_SPACE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("treat-as-word-space", m);
+
+        // word-spacing
+        m  = new SpaceProperty.Maker(PR_WORD_SPACING);
+        m.useGeneric(genericSpace);
+        m.setInherited(true);
+        m.getSubpropMaker(CP_PRECEDENCE).setDefault("force");
+        m.getSubpropMaker(CP_CONDITIONALITY).setDefault("discard");
+        m.setDefault("0pt");
+        addPropertyMaker("word-spacing", m);
+    }
+    
+    private void createColorProperties() {
+        Property.Maker m;
+            
+        // color
+        m  = new ColorTypeProperty.Maker(PR_COLOR);
+        m.useGeneric(genericColor);
+        m.setInherited(true);
+        m.setDefault("black");
+        addPropertyMaker("color", m);
+
+        // color-profile-name
+        m  = new StringProperty.Maker(PR_COLOR_PROFILE_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("color-profile-name", m);
+
+        // rendering-intent
+        m  = new EnumProperty.Maker(PR_RENDERING_INTENT);
+        m.setInherited(false);
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.addEnum("perceptual", makeEnumProperty(PERCEPTUAL));
+        m.addEnum("relative-colorimetric", makeEnumProperty(RELATIVE_COLOMETRIC));
+        m.addEnum("saturation", makeEnumProperty(SATURATION));
+        m.addEnum("absolute-colorimetric", makeEnumProperty(ABSOLUTE_COLORMETRIC));
+        m.setDefault("auto");
+        addPropertyMaker("rendering-intent", m);
+    }
+    
+    private void createFloatProperties() {
+        Property.Maker m;
+            
+        // clear
+        m  = new ToBeImplementedProperty.Maker(PR_CLEAR);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("clear", m);
+
+        // float
+        m  = new ToBeImplementedProperty.Maker(PR_FLOAT);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("float", m);
+    }
+    
+    private void createKeepsAndBreaksProperties() {
+        Property.Maker m;
+           
+        // break-after
+        m  = new EnumProperty.Maker(PR_BREAK_AFTER);
+        m.useGeneric(genericBreak);
+        addPropertyMaker("break-after", m);
+
+        // break-before
+        m  = new EnumProperty.Maker(PR_BREAK_BEFORE);
+        m.useGeneric(genericBreak);
+        addPropertyMaker("break-before", m);
+
+        // keep-together
+        m  = new KeepProperty.Maker(PR_KEEP_TOGETHER);
+        m.useGeneric(genericKeep);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("keep-together", m);
+
+        // keep-with-next
+        m  = new KeepProperty.Maker(PR_KEEP_WITH_NEXT);
+        m.useGeneric(genericKeep);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("keep-with-next", m);
+
+        // keep-with-previous
+        m  = new KeepProperty.Maker(PR_KEEP_WITH_PREVIOUS);
+        m.useGeneric(genericKeep);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("keep-with-previous", m);
+
+        // orphans
+        m  = new NumberProperty.Maker(PR_ORPHANS);
+        m.setInherited(true);
+        m.setDefault("2");
+        addPropertyMaker("orphans", m);
+
+        // widows
+        m  = new NumberProperty.Maker(PR_WIDOWS);
+        m.setInherited(true);
+        m.setDefault("2");
+        addPropertyMaker("widows", m);
+    }
+    
+    private void createLayoutProperties() {
+        Property.Maker m;
+            
+        // clip
+        m  = new ToBeImplementedProperty.Maker(PR_CLIP);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("clip", m);
+
+        // overflow
+        m  = new EnumProperty.Maker(PR_OVERFLOW);
+        m.setInherited(false);
+        m.addEnum("visible", makeEnumProperty(VISIBLE));
+        m.addEnum("hidden", makeEnumProperty(HIDDEN));
+        m.addEnum("scroll", makeEnumProperty(SCROLL));
+        m.addEnum("error-if-overflow", makeEnumProperty(ERROR_IF_OVERFLOW));
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.setDefault("auto");
+        addPropertyMaker("overflow", m);
+
+        // reference-orientation
+        m  = new NumberProperty.Maker(PR_REFERENCE_ORIENTATION);
+        m.setInherited(true);
+        m.setDefault("0");
+        addPropertyMaker("reference-orientation", m);
+
+        // span
+        m  = new EnumProperty.Maker(PR_SPAN);
+        m.setInherited(false);
+        m.addEnum("none", makeEnumProperty(NONE));
+        m.addEnum("all", makeEnumProperty(ALL));
+        m.setDefault("none");
+        addPropertyMaker("span", m);
+    }
+    
+    private void createLeaderAndRuleProperties() {
+        Property.Maker m;
+        Property.Maker sub;
+            
+        // leader-alignment
+        m  = new EnumProperty.Maker(PR_LEADER_ALIGNMENT);
+        m.setInherited(true);
+        m.addEnum("none", makeEnumProperty(NONE));
+        m.addEnum("reference-area", makeEnumProperty(REFERENCE_AREA));
+        m.addEnum("page", makeEnumProperty(PAGE));
+        m.setDefault("none");
+        addPropertyMaker("leader-alignment", m);
+
+        // leader-pattern
+        m  = new EnumProperty.Maker(PR_LEADER_PATTERN);
+        m.setInherited(true);
+        m.addEnum("space", makeEnumProperty(SPACE));
+        m.addEnum("rule", makeEnumProperty(RULE));
+        m.addEnum("dots", makeEnumProperty(DOTS));
+        m.addEnum("use-content", makeEnumProperty(USECONTENT));
+        m.setDefault("space");
+        addPropertyMaker("leader-pattern", m);
+
+        // leader-pattern-width
+        m  = new LengthProperty.Maker(PR_LEADER_PATTERN_WIDTH);
+        m.setInherited(true);
+        m.setDefault("use-font-metrics", true);
+        m.addKeyword("use-font-metrics", "0pt");
+        m.setPercentBase(LengthBase.CONTAINING_BOX);
+        addPropertyMaker("leader-pattern-width", m);
+
+        // leader-length
+        m  = new LengthRangeProperty.Maker(PR_LEADER_LENGTH);
+        m.setInherited(true);
+        m.setPercentBase(LengthBase.CONTAINING_BOX);
+
+        sub = new LengthProperty.Maker(CP_MINIMUM);
+        sub.setDefault("0pt");
+        sub.setPercentBase(LengthBase.CONTAINING_BOX);
+        sub.setByShorthand(true);
+        m.addSubpropMaker(sub);
+
+        sub = new LengthProperty.Maker(CP_OPTIMUM);
+        sub.setDefault("12.0pt");
+        sub.setPercentBase(LengthBase.CONTAINING_BOX);
+        sub.setByShorthand(true);
+        m.addSubpropMaker(sub);
+
+        sub = new LengthProperty.Maker(CP_MAXIMUM);
+        sub.setDefault("100%", true);
+        sub.setPercentBase(LengthBase.CONTAINING_BOX);
+        sub.setByShorthand(true);
+        m.addSubpropMaker(sub);
+        addPropertyMaker("leader-length", m);
+
+        // rule-style
+        m  = new EnumProperty.Maker(PR_RULE_STYLE);
+        m.setInherited(true);
+        m.addEnum("none", makeEnumProperty(NONE));
+        m.addEnum("dotted", makeEnumProperty(DOTTED));
+        m.addEnum("dashed", makeEnumProperty(DASHED));
+        m.addEnum("solid", makeEnumProperty(SOLID));
+        m.addEnum("double", makeEnumProperty(DOUBLE));
+        m.addEnum("groove", makeEnumProperty(GROOVE));
+        m.addEnum("ridge", makeEnumProperty(RIDGE));
+        m.setDefault("solid");
+        addPropertyMaker("rule-style", m);
+
+        // rule-thickness
+        m  = new LengthProperty.Maker(PR_RULE_THICKNESS);
+        m.setInherited(true);
+        m.setDefault("1.0pt");
+        addPropertyMaker("rule-thickness", m);
+    }
+    
+    private void createDynamicProperties() {
+        Property.Maker m;
+            
+        // active-state
+        m  = new ToBeImplementedProperty.Maker(PR_ACTIVE_STATE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("active-state", m);
+
+        // auto-restore
+        m  = new ToBeImplementedProperty.Maker(PR_AUTO_RESTORE);
+        m.setInherited(true);
+        m.setDefault("false");
+        addPropertyMaker("auto-restore", m);
+
+        // case-name
+        m  = new ToBeImplementedProperty.Maker(PR_CASE_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("case-name", m);
+
+        // case-title
+        m  = new ToBeImplementedProperty.Maker(PR_CASE_TITLE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("case-title", m);
+
+        // destination-placement-offset
+        m  = new ToBeImplementedProperty.Maker(PR_DESTINATION_PLACEMENT_OFFSET);
+        m.setInherited(false);
+        m.setDefault("0pt");
+        addPropertyMaker("destination-placement-offset", m);
+
+        // external-destination
+        m  = new StringProperty.Maker(PR_EXTERNAL_DESTINATION);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("external-destination", m);
+
+        // indicate-destination
+        m  = new ToBeImplementedProperty.Maker(PR_INDICATE_DESTINATION);
+        m.setInherited(false);
+        m.setDefault("false");
+        addPropertyMaker("indicate-destination", m);
+
+        // internal-destination
+        m  = new StringProperty.Maker(PR_INTERNAL_DESTINATION);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("internal-destination", m);
+
+        // show-destination
+        m  = new ToBeImplementedProperty.Maker(PR_SHOW_DESTINATION);
+        m.setInherited(false);
+        m.setDefault("replace");
+        addPropertyMaker("show-destination", m);
+
+        // starting-state
+        m  = new ToBeImplementedProperty.Maker(PR_STARTING_STATE);
+        m.setInherited(false);
+        m.setDefault("show");
+        addPropertyMaker("starting-state", m);
+
+        // switch-to
+        m  = new ToBeImplementedProperty.Maker(PR_SWITCH_TO);
+        m.setInherited(false);
+        m.setDefault("xsl-any");
+        addPropertyMaker("switch-to", m);
+
+        // target-presentation-context
+        m  = new ToBeImplementedProperty.Maker(PR_TARGET_PRESENTATION_CONTEXT);
+        m.setInherited(false);
+        m.setDefault("use-target-processing-context");
+        addPropertyMaker("target-presentation-context", m);
+
+        // target-processing-context
+        m  = new ToBeImplementedProperty.Maker(PR_TARGET_PROCESSING_CONTEXT);
+        m.setInherited(false);
+        m.setDefault("document-root");
+        addPropertyMaker("target-processing-context", m);
+
+        // target-stylesheet
+        m  = new ToBeImplementedProperty.Maker(PR_TARGET_STYLESHEET);
+        m.setInherited(false);
+        m.setDefault("use-normal-stylesheet");
+        addPropertyMaker("target-stylesheet", m);
+    }
+    
+    private void createMarkersProperties() {
+        Property.Maker m;
+            
+        // marker-class-name
+        m  = new StringProperty.Maker(PR_MARKER_CLASS_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("marker-class-name", m);
+
+        // retrieve-class-name
+        m  = new StringProperty.Maker(PR_RETRIEVE_CLASS_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("retrieve-class-name", m);
+
+        // retrieve-position
+        m  = new EnumProperty.Maker(PR_RETRIEVE_POSITION);
+        m.setInherited(false);
+        m.addEnum("first-starting-within-page", makeEnumProperty(FSWP));
+        m.addEnum("first-including-carryover", makeEnumProperty(FIC));
+        m.addEnum("last-starting-within-page", makeEnumProperty(LSWP));
+        m.addEnum("last-ending-within-page", makeEnumProperty(LEWP));
+        m.setDefault("first-starting-within-page");
+        addPropertyMaker("retrieve-position", m);
+
+        // retrieve-boundary
+        m  = new EnumProperty.Maker(PR_RETRIEVE_BOUNDARY);
+        m.setInherited(false);
+        m.addEnum("page", makeEnumProperty(PAGE));
+        m.addEnum("page-sequence", makeEnumProperty(PAGE_SEQUENCE));
+        m.addEnum("document", makeEnumProperty(DOCUMENT));
+        m.setDefault("page-sequence");
+        addPropertyMaker("retrieve-boundary", m);
+    }
+    
+    private void createNumberToStringProperties() {
+        Property.Maker m;
+            
+        // format
+        m  = new StringProperty.Maker(PR_FORMAT);
+        m.setInherited(false);
+        m.setDefault("1");
+        addPropertyMaker("format", m);
+
+        // grouping-separator
+        m  = new CharacterProperty.Maker(PR_GROUPING_SEPARATOR);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("grouping-separator", m);
+
+        // grouping-size
+        m  = new NumberProperty.Maker(PR_GROUPING_SIZE);
+        m.setInherited(false);
+        m.setDefault("0");
+        addPropertyMaker("grouping-size", m);
+
+        // letter-value
+        m  = new EnumProperty.Maker(PR_LETTER_VALUE);
+        m.setInherited(false);
+        m.addEnum("alphabetic", makeEnumProperty(ALPHABETIC));
+        m.addEnum("traditional", makeEnumProperty(TRADITIONAL));
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.setDefault("auto");
+        addPropertyMaker("letter-value", m);
+    }
+    
+    private void createPaginationAndLayoutProperties() {
+        Property.Maker m;
+        LengthProperty.Maker l;
+            
+        // blank-or-not-blank
+        m  = new EnumProperty.Maker(PR_BLANK_OR_NOT_BLANK);
+        m.setInherited(false);
+        m.addEnum("blank", makeEnumProperty(BLANK));
+        m.addEnum("not-blank", makeEnumProperty(NOT_BLANK));
+        m.addEnum("any", makeEnumProperty(ANY));
+        m.setDefault("any");
+        addPropertyMaker("blank-or-not-blank", m);
+
+        // column-count
+        m  = new NumberProperty.Maker(PR_COLUMN_COUNT);
+        m.setInherited(false);
+        m.setDefault("1");
+        addPropertyMaker("column-count", m);
+
+        // column-gap
+        l  = new LengthProperty.Maker(PR_COLUMN_GAP);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("0.25in");
+        addPropertyMaker("column-gap", l);
+
+        // extent
+        m  = new LengthProperty.Maker(PR_EXTENT);
+        m.setInherited(true);
+        m.setDefault("0pt");
+        addPropertyMaker("extent", m);
+
+        // flow-name
+        m  = new StringProperty.Maker(PR_FLOW_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("flow-name", m);
+
+        // force-page-count
+        m  = new EnumProperty.Maker(PR_FORCE_PAGE_COUNT);
+        m.setInherited(false);
+        m.addEnum("even", makeEnumProperty(EVEN));
+        m.addEnum("odd", makeEnumProperty(ODD));
+        m.addEnum("end-on-even", makeEnumProperty(END_ON_EVEN));
+        m.addEnum("end-on-odd", makeEnumProperty(END_ON_ODD));
+        m.addEnum("no-force", makeEnumProperty(NO_FORCE));
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.setDefault("auto");
+        addPropertyMaker("force-page-count", m);
+
+        // initial-page-number
+        m  = new StringProperty.Maker(PR_INITIAL_PAGE_NUMBER);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("initial-page-number", m);
+
+        // master-name
+        m  = new StringProperty.Maker(PR_MASTER_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("master-name", m);
+
+        // master-reference
+        m  = new StringProperty.Maker(PR_MASTER_REFERENCE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("master-reference", m);
+
+        // maximum-repeats
+        m  = new StringProperty.Maker(PR_MAXIMUM_REPEATS);
+        m.setInherited(false);
+        m.setDefault("no-limit");
+        addPropertyMaker("maximum-repeats", m);
+
+        // media-usage
+        m  = new ToBeImplementedProperty.Maker(PR_MEDIA_USAGE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("media-usage", m);
+
+        // odd-or-even
+        m  = new EnumProperty.Maker(PR_ODD_OR_EVEN);
+        m.setInherited(false);
+        m.addEnum("odd", makeEnumProperty(ODD));
+        m.addEnum("even", makeEnumProperty(EVEN));
+        m.addEnum("any", makeEnumProperty(ANY));
+        m.setDefault("any");
+        addPropertyMaker("odd-or-even", m);
+
+        // page-height
+        l  = new LengthProperty.Maker(PR_PAGE_HEIGHT);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("11in");
+        addPropertyMaker("page-height", l);
+
+        // page-position
+        m  = new EnumProperty.Maker(PR_PAGE_POSITION);
+        m.setInherited(false);
+        m.addEnum("first", makeEnumProperty(FIRST));
+        m.addEnum("last", makeEnumProperty(LAST));
+        m.addEnum("rest", makeEnumProperty(REST));
+        m.addEnum("any", makeEnumProperty(ANY));
+        m.setDefault("any");
+        addPropertyMaker("page-position", m);
+
+        // page-width
+        l  = new LengthProperty.Maker(PR_PAGE_WIDTH);
+        l.setInherited(false);
+        l.setAutoOk(true);
+        l.setDefault("8in");
+        addPropertyMaker("page-width", l);
+
+        // precedence
+        m  = new EnumProperty.Maker(PR_PRECEDENCE);
+        m.setInherited(false);
+        m.addEnum("true", makeEnumProperty(TRUE));
+        m.addEnum("false", makeEnumProperty(FALSE));
+        m.setDefault("false");
+        addPropertyMaker("precedence", m);
+
+        // region-name
+        m  = new StringProperty.Maker(PR_REGION_NAME);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("region-name", m);
+    }
+    
+    private void createTableProperties() {
+        Property.Maker m;
+        Property.Maker sub;
+            
+        // border-after-precedence
+        m  = new ToBeImplementedProperty.Maker(PR_BORDER_AFTER_PRECEDENCE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("border-after-precedence", m);
+
+        // border-before-precedence
+        m  = new ToBeImplementedProperty.Maker(PR_BORDER_BEFORE_PRECEDENCE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("border-before-precedence", m);
+
+        // border-collapse
+        m  = new EnumProperty.Maker(PR_BORDER_COLLAPSE);
+        m.setInherited(true);
+        m.setDefault("collapse");
+        m.addEnum("separate", makeEnumProperty(SEPARATE));
+        m.addEnum("collapse", makeEnumProperty(COLLAPSE));
+        addPropertyMaker("border-collapse", m);
+
+        // border-end-precedence
+        m  = new ToBeImplementedProperty.Maker(PR_BORDER_END_PRECEDENCE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("border-end-precedence", m);
+
+        // border-separation
+        m  = new LengthPairProperty.Maker(PR_BORDER_SEPARATION);
+        m.setInherited(true);
+
+        sub = new LengthProperty.Maker(CP_BLOCK_PROGRESSION_DIRECTION);
+        sub.setDefault("0pt");
+        m.addSubpropMaker(sub);
+
+        sub = new LengthProperty.Maker(CP_INLINE_PROGRESSION_DIRECTION);
+        sub.setDefault("0pt");
+        m.addSubpropMaker(sub);
+        addPropertyMaker("border-separation", m);
+
+        // border-start-precedence
+        m  = new ToBeImplementedProperty.Maker(PR_BORDER_START_PRECEDENCE);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("border-start-precedence", m);
+
+        // caption-side
+        m  = new EnumProperty.Maker(PR_CAPTION_SIDE);
+        m.setInherited(true);
+        m.addEnum("before", makeEnumProperty(BEFORE));
+        m.addEnum("after", makeEnumProperty(AFTER));
+        m.addEnum("start", makeEnumProperty(START));
+        m.addEnum("end", makeEnumProperty(END));
+        m.addEnum("top", makeEnumProperty(TOP));
+        m.addEnum("bottom", makeEnumProperty(BOTTOM));
+        m.addEnum("left", makeEnumProperty(LEFT));
+        m.addEnum("right", makeEnumProperty(RIGHT));
+        m.setDefault("before");
+        addPropertyMaker("caption-side", m);
+
+        // column-number
+        m  = new NumberProperty.Maker(PR_COLUMN_NUMBER);
+        m.setInherited(false);
+        m.setDefault("0");
+        addPropertyMaker("column-number", m);
+
+        // column-width
+        m  = new LengthProperty.Maker(PR_COLUMN_WIDTH);
+        m.setInherited(false);
+        m.setDefault("proportional-column-width(1)", true);
+        addPropertyMaker("column-width", m);
+
+        // empty-cells
+        m  = new ToBeImplementedProperty.Maker(PR_EMPTY_CELLS);
+        m.setInherited(true);
+        m.setDefault("show");
+        addPropertyMaker("empty-cells", m);
+
+        // ends-row
+        m  = new ToBeImplementedProperty.Maker(PR_ENDS_ROW);
+        m.setInherited(false);
+        m.setDefault("false");
+        addPropertyMaker("ends-row", m);
+
+        // number-columns-repeated
+        m  = new NumberProperty.Maker(PR_NUMBER_COLUMNS_REPEATED);
+        m.setInherited(false);
+        m.setDefault("1");
+        addPropertyMaker("number-columns-repeated", m);
+
+        // number-columns-spanned
+        m  = new NumberProperty.Maker(PR_NUMBER_COLUMNS_SPANNED);
+        m.setInherited(false);
+        m.setDefault("1");
+        addPropertyMaker("number-columns-spanned", m);
+
+        // number-rows-spanned
+        m  = new NumberProperty.Maker(PR_NUMBER_ROWS_SPANNED);
+        m.setInherited(false);
+        m.setDefault("1");
+        addPropertyMaker("number-rows-spanned", m);
+
+        // starts-row
+        m  = new ToBeImplementedProperty.Maker(PR_STARTS_ROW);
+        m.setInherited(false);
+        m.setDefault("false");
+        addPropertyMaker("starts-row", m);
+
+        // table-layout
+        m  = new EnumProperty.Maker(PR_TABLE_LAYOUT);
+        m.setInherited(false);
+        m.setDefault("auto");
+        m.addEnum("auto", makeEnumProperty(AUTO));
+        m.addEnum("fixed", makeEnumProperty(FIXED));
+        addPropertyMaker("table-layout", m);
+
+        // table-omit-footer-at-break
+        m  = new EnumProperty.Maker(PR_TABLE_OMIT_FOOTER_AT_BREAK);
+        m.useGeneric(genericBoolean);
+        m.setInherited(false);
+        m.setDefault("false");
+        addPropertyMaker("table-omit-footer-at-break", m);
+
+        // table-omit-header-at-break
+        m  = new EnumProperty.Maker(PR_TABLE_OMIT_HEADER_AT_BREAK);
+        m.useGeneric(genericBoolean);
+        m.setInherited(false);
+        m.setDefault("false");
+        addPropertyMaker("table-omit-header-at-break", m);
+    }
+    
+    private void createWritingModeProperties() {
+        Property.Maker m;
+            
+        // direction
+        m  = new ToBeImplementedProperty.Maker(PR_DIRECTION);
+        m.setInherited(true);
+        m.setDefault("ltr");
+        addPropertyMaker("direction", m);
+
+        // glyph-orientation-horizontal
+        m  = new ToBeImplementedProperty.Maker(PR_GLYPH_ORIENTATION_HORIZONTAL);
+        m.setInherited(true);
+        m.setDefault("0deg");
+        addPropertyMaker("glyph-orientation-horizontal", m);
+
+        // glyph-orientation-vertical
+        m  = new ToBeImplementedProperty.Maker(PR_GLYPH_ORIENTATION_VERTICAL);
+        m.setInherited(true);
+        m.setDefault("auto");
+        addPropertyMaker("glyph-orientation-vertical", m);
+
+        // text-altitude
+        m  = new ToBeImplementedProperty.Maker(PR_TEXT_ALTITUDE);
+        m.setInherited(false);
+        m.setDefault("use-font-metrics");
+        addPropertyMaker("text-altitude", m);
+
+        // text-depth
+        m  = new ToBeImplementedProperty.Maker(PR_TEXT_DEPTH);
+        m.setInherited(false);
+        m.setDefault("use-font-metrics");
+        addPropertyMaker("text-depth", m);
+
+        // unicode-bidi
+        m  = new ToBeImplementedProperty.Maker(PR_UNICODE_BIDI);
+        m.setInherited(false);
+        m.setDefault("normal");
+        addPropertyMaker("unicode-bidi", m);
+
+        // writing-mode
+        m  = new EnumProperty.Maker(PR_WRITING_MODE);
+        m.setInherited(true);
+        m.setDefault("lr-tb");
+        m.addEnum("lr-tb", makeEnumProperty(LR_TB));
+        m.addEnum("rl-tb", makeEnumProperty(RL_TB));
+        m.addEnum("tb-rl", makeEnumProperty(TB_RL));
+        addPropertyMaker("writing-mode", m);
+    }
+    
+    private void createMiscProperties() {
+        Property.Maker m;
+            
+        // content-type
+        m  = new ToBeImplementedProperty.Maker(PR_CONTENT_TYPE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("content-type", m);
+
+        // id
+        m  = new StringProperty.Maker(PR_ID);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("id", m);
+
+        // provisional-label-separation
+        m  = new LengthProperty.Maker(PR_PROVISIONAL_LABEL_SEPARATION);
+        m.setInherited(true);
+        m.setDefault("6pt");
+        addPropertyMaker("provisional-label-separation", m);
+
+        // provisional-distance-between-starts
+        m  = new LengthProperty.Maker(PR_PROVISIONAL_DISTANCE_BETWEEN_STARTS);
+        m.setInherited(true);
+        m.setDefault("24pt");
+        addPropertyMaker("provisional-distance-between-starts", m);
+
+        // ref-id
+        m  = new StringProperty.Maker(PR_REF_ID);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("ref-id", m);
+
+        // score-spaces
+        m  = new ToBeImplementedProperty.Maker(PR_SCORE_SPACES);
+        m.setInherited(true);
+        m.setDefault("true");
+        addPropertyMaker("score-spaces", m);
+
+        // src
+        m  = new StringProperty.Maker(PR_SRC);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("src", m);
+
+        // visibility
+        m  = new ToBeImplementedProperty.Maker(PR_VISIBILITY);
+        m.setInherited(false);
+        m.setDefault("visible");
+        addPropertyMaker("visibility", m);
+
+        // z-index
+        m  = new ToBeImplementedProperty.Maker(PR_Z_INDEX);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("z-index", m);
+    }
+    
+    private void createShorthandProperties() {
+        Property.Maker m;
+            
+        // background
+        m  = new ToBeImplementedProperty.Maker(PR_BACKGROUND);
+        m.setInherited(false);
+        m.setDefault("none");
+        addPropertyMaker("background", m);
+
+        // background-position
+        m  = new ToBeImplementedProperty.Maker(PR_BACKGROUND_POSITION);
+        m.setInherited(false);
+        m.setDefault("0%");
+        addPropertyMaker("background-position", m);
+
+        // border
+        m  = new ListProperty.Maker(PR_BORDER);
+        m.setInherited(false);
+        m.setDatatypeParser(new GenericShorthandParser());
+        addPropertyMaker("border", m);
+
+        // border-bottom
+        m  = new ListProperty.Maker(PR_BORDER_BOTTOM);
+        m.setInherited(false);
+        m.setDatatypeParser(new GenericShorthandParser());
+        addPropertyMaker("border-bottom", m);
+
+        // border-color
+        m  = new ListProperty.Maker(PR_BORDER_COLOR);
+        m.setInherited(false);
+        m.setDatatypeParser(new BoxPropShorthandParser());
+        addPropertyMaker("border-color", m);
+
+        // border-left
+        m  = new ListProperty.Maker(PR_BORDER_LEFT);
+        m.setInherited(false);
+        m.setDatatypeParser(new GenericShorthandParser());
+        addPropertyMaker("border-left", m);
+
+        // border-right
+        m  = new ListProperty.Maker(PR_BORDER_RIGHT);
+        m.setInherited(false);
+        m.setDatatypeParser(new GenericShorthandParser());
+        addPropertyMaker("border-right", m);
+
+        // border-style
+        m  = new ListProperty.Maker(PR_BORDER_STYLE);
+        m.setInherited(false);
+        m.setDatatypeParser(new BoxPropShorthandParser());
+        addPropertyMaker("border-style", m);
+
+        // border-spacing
+        m  = new ToBeImplementedProperty.Maker(PR_BORDER_SPACING);
+        m.setInherited(true);
+        m.setDefault("0pt");
+        addPropertyMaker("border-spacing", m);
+
+        // border-top
+        m  = new ListProperty.Maker(PR_BORDER_TOP);
+        m.setInherited(false);
+        m.setDatatypeParser(new GenericShorthandParser());
+        addPropertyMaker("border-top", m);
+
+        // border-width
+        m  = new ListProperty.Maker(PR_BORDER_WIDTH);
+        m.setInherited(false);
+        m.setDatatypeParser(new BoxPropShorthandParser());
+        addPropertyMaker("border-width", m);
+
+        // cue
+        m  = new ToBeImplementedProperty.Maker(PR_CUE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("cue", m);
+
+        // font
+        m  = new ToBeImplementedProperty.Maker(PR_FONT);
+        m.setInherited(true);
+        m.setDefault("");
+        addPropertyMaker("font", m);
+
+        // margin
+        m  = new ToBeImplementedProperty.Maker(PR_MARGIN);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("margin", m);
+
+        // padding
+        m  = new ListProperty.Maker(PR_PADDING);
+        m.setInherited(false);
+        m.setDatatypeParser(new BoxPropShorthandParser());
+        addPropertyMaker("padding", m);
+
+        // page-break-after
+        m  = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_AFTER);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("page-break-after", m);
+
+        // page-break-before
+        m  = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_BEFORE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("page-break-before", m);
+
+        // page-break-inside
+        m  = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_INSIDE);
+        m.setInherited(true);
+        m.setDefault("auto");
+        addPropertyMaker("page-break-inside", m);
+
+        // pause
+        m  = new ToBeImplementedProperty.Maker(PR_PAUSE);
+        m.setInherited(false);
+        m.setDefault("");
+        addPropertyMaker("pause", m);
+
+        // position
+        m  = new EnumProperty.Maker(PR_POSITION);
+        m.setInherited(false);
+        m.addEnum("static", makeEnumProperty(STATIC));
+        m.addEnum("relative", makeEnumProperty(RELATIVE));
+        m.addEnum("absolute", makeEnumProperty(ABSOLUTE));
+        m.addEnum("fixed", makeEnumProperty(FIXED));
+        m.setDefault("static");
+        addPropertyMaker("position", m);
+
+        // size
+        m  = new ToBeImplementedProperty.Maker(PR_SIZE);
+        m.setInherited(false);
+        m.setDefault("auto");
+        addPropertyMaker("size", m);
+
+        // vertical-align
+        m  = new EnumProperty.Maker(PR_VERTICAL_ALIGN);
+        m.setInherited(false);
+        m.addEnum("baseline", makeEnumProperty(BASELINE));
+        m.addEnum("middle", makeEnumProperty(MIDDLE));
+        m.addEnum("sub", makeEnumProperty(SUB));
+        m.addEnum("super", makeEnumProperty(SUPER));
+        m.addEnum("text-top", makeEnumProperty(TEXT_TOP));
+        m.addEnum("text-bottom", makeEnumProperty(TEXT_BOTTOM));
+        m.addEnum("top", makeEnumProperty(TOP));
+        m.addEnum("bottom", makeEnumProperty(BOTTOM));
+        m.setDefault("baseline");
+        addPropertyMaker("vertical-align", m);
+
+        // white-space-treatment
+        m  = new EnumProperty.Maker(PR_WHITE_SPACE_TREATMENT);
+        m.setInherited(true);
+        m.addEnum("ignore", makeEnumProperty(IGNORE));
+        m.addEnum("preserve", makeEnumProperty(PRESERVE));
+        m.addEnum("ignore-if-before-linefeed", makeEnumProperty(IGNORE_IF_BEFORE_LINEFEED));
+        m.addEnum("ignore-if-after-linefeed", makeEnumProperty(IGNORE_IF_AFTER_LINEFEED));
+        m.addEnum("ignore-if-surrounding-linefeed", makeEnumProperty(IGNORE_IF_SURROUNDING_LINEFEED));
+        m.setDefault("ignore-if-surrounding-linefeed");
+        addPropertyMaker("white-space-treatment", m);
+
+        // xml:lang
+        m  = new ToBeImplementedProperty.Maker(PR_XML_LANG);
+        m.setInherited(true);
+        m.setDefault("");
+        addPropertyMaker("xml:lang", m);
+
+       }
+        
+}
--- src/java/org/apache/fop/fo/IndentPropertyMaker.java
+++ src/java/org/apache/fop/fo/IndentPropertyMaker.java	Fri Jan 16 10:14:42 2004
@@ -0,0 +1,130 @@
+/*
+ * $Id: $
+ * ============================================================================
+ *                    The Apache Software License, Version 1.1
+ * ============================================================================
+ *
+ * Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modifica-
+ * tion, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if any, must
+ *    include the following acknowledgment: "This product includes software
+ *    developed by the Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself, if
+ *    and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ *    endorse or promote products derived from this software without prior
+ *    written permission. For written permission, please contact
+ *    apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache", nor may
+ *    "Apache" appear in their name, without prior written permission of the
+ *    Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * on behalf of the Apache Software Foundation and was originally created by
+ * James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ * Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.FixedLength;
+import org.apache.fop.fo.expr.Numeric;
+
+/**
+ * This property maker handles the calculations described in 5.3.2 which
+ * involves the sizes of the corresponding margin-* properties and the
+ * padding-* and border-*-width properties.
+ */
+public class IndentPropertyMaker extends CorrespondingPropertyMaker {
+    /**
+     * The corresponding padding-* propIds 
+     */
+    private int[] paddingCorresponding = null;    
+
+    /**
+     * The corresponding border-*-width propIds 
+     */
+    private int[] borderWidthCorresponding = null;
+    
+    /**
+     * Create a start-indent or end-indent property maker.
+     * @param baseMaker
+     */
+    public IndentPropertyMaker(Property.Maker baseMaker) {
+        super(baseMaker);
+    }
+
+    /**
+     * Set the corresponding values for the padding-* properties.
+     * @param paddingCorresponding the corresping propids.
+     */
+    public void setPaddingCorresponding(int[] paddingCorresponding) {
+        this.paddingCorresponding = paddingCorresponding;
+    }
+    
+    /**
+     * Set the corresponding values for the border-*-width properties.
+     * @param borderWidthCorresponding the corresping propids.
+     */
+    public void setBorderWidthCorresponding(int[] borderWidthCorresponding) {
+        this.borderWidthCorresponding = borderWidthCorresponding;
+    }
+    
+    /**
+     * Calculate the corresponding value for start-indent and end-indent.  
+     * @see CorrespondingPropertyMaker.compute(PropertyList)
+     */
+    public Property compute(PropertyList propertyList) throws FOPException {
+        // TODO: bckfnn reenable
+        if (propertyList.getExplicitOrShorthand(propertyList.wmMap(lr_tb, rl_tb, tb_rl)) == null) {
+            return null;
+        }
+        // Calculate the values as described in 5.3.2.
+        try {
+            Numeric v = new Numeric(new FixedLength(0));
+            /*
+            if (!propertyList.getFObj().generatesInlineAreas()) {
+                String propName = FOPropertyMapping.getPropertyName(this.propId);
+                v = v.add(propertyList.getInherited(propName).getNumeric());
+            }
+            */
+            v = v.add(propertyList.get(propertyList.wmMap(lr_tb, rl_tb, tb_rl)).getNumeric());
+            v = v.add(getCorresponding(paddingCorresponding, propertyList).getNumeric());
+            v = v.add(getCorresponding(borderWidthCorresponding, propertyList).getNumeric());
+            return new LengthProperty(v.asLength());
+        } catch (org.apache.fop.fo.expr.PropertyException propEx) {
+           String propName = FOPropertyMapping.getPropertyName(baseMaker.getPropId());
+           throw new FOPException("Error in " + propName 
+                   + " calculation " + propEx);
+        }    
+    }
+    
+    private Property getCorresponding(int[] corresponding, PropertyList propertyList) {
+        int wmcorr = propertyList.wmMap(corresponding[0], corresponding[1], corresponding[2]);
+        return propertyList.get(wmcorr);
+    }
+}
--- src/java/org/apache/fop/fo/LineHeightPropertyMaker.java
+++ src/java/org/apache/fop/fo/LineHeightPropertyMaker.java	Fri Jan 16 10:55:13 2004
@@ -0,0 +1,121 @@
+/*
+ * $Id: $
+ * ============================================================================
+ *                    The Apache Software License, Version 1.1
+ * ============================================================================
+ *
+ * Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modifica-
+ * tion, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if any, must
+ *    include the following acknowledgment: "This product includes software
+ *    developed by the Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself, if
+ *    and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "FOP" and "Apache Software Foundation" must not be used to
+ *    endorse or promote products derived from this software without prior
+ *    written permission. For written permission, please contact
+ *    apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache", nor may
+ *    "Apache" appear in their name, without prior written permission of the
+ *    Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
+ * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * on behalf of the Apache Software Foundation and was originally created by
+ * James Tauber <jtauber@jtauber.com>. For more information on the Apache
+ * Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.fo;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.PercentLength;
+
+/**
+ * A maker which calculates the line-height property.
+ * This property maker is special because line-heighe inherot the specified
+ * value, instead of the computed value.
+ * So when a line-height is create based on a attribute, the specified value
+ * is stored in the property and in compute() the stored specified value of
+ * the nearest specified is used to recalculate the line-height.  
+ */
+
+public class LineHeightPropertyMaker extends LengthProperty.Maker {
+    /**
+     * Create a maker for line-height.
+     * @param propId the is for linehight.
+     */
+    public LineHeightPropertyMaker(int propId) {
+        super(propId);
+    }
+
+    /**
+     * Make a property as normal, and save the specified value.
+     * @see Property.Maker.make(propertyList, String, FObj)
+     */
+    public Property make(PropertyList propertyList, String value,
+                         FObj fo) throws FOPException {
+        Property p = super.make(propertyList, value, fo);
+        p.setSpecifiedValue(checkValueKeywords(value));
+        return p;
+    }
+    
+    /**
+     * Recalculate the line-height value based on the nearest specified
+     * value.
+     * @see Property.Maker.compute(propertyList)
+     */
+    protected Property compute(PropertyList propertyList) throws FOPException {
+        // recalculate based on last specified value
+        // Climb up propertylist and find last spec'd value
+        Property specProp = propertyList.getNearestSpecified(propId);
+        if (specProp != null) {
+            String specVal = specProp.getSpecifiedValue();
+            if (specVal != null) {
+                try {
+                    return make(propertyList, specVal,
+                            propertyList.getParentFObj());
+                } catch (FOPException e) {
+                    //getLogger()error("Error computing property value for "
+                    //                       + propName + " from "
+                    //                       + specVal);
+                    return null;
+                }
+            }
+        }
+        return null;
+    }
+    
+    protected Property convertPropertyDatatype(Property p, 
+                                               PropertyList propertyList,
+                                               FObj fo) {
+        Number numval = p.getNumber();
+        if (numval != null) {
+            return new LengthProperty(
+                    new PercentLength(numval.doubleValue(), getPercentBase(fo,propertyList)));
+        }
+        return super.convertPropertyDatatype(p, propertyList, fo);
+    }
+}
\ No newline at end of file
