pbwest      2002/06/27 20:29:44

  Modified:    src/org/apache/fop/fo Tag: FOP_0-20-0_Alt-Design
                        Properties.java
  Log:
  Added FOTree arg to complex() method signature. Inital code for font shorthand 
support.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.11  +469 -51   xml-fop/src/org/apache/fop/fo/Attic/Properties.java
  
  Index: Properties.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/Attic/Properties.java,v
  retrieving revision 1.1.2.10
  retrieving revision 1.1.2.11
  diff -u -r1.1.2.10 -r1.1.2.11
  --- Properties.java   21 Jun 2002 04:54:59 -0000      1.1.2.10
  +++ Properties.java   28 Jun 2002 03:29:43 -0000      1.1.2.11
  @@ -26,6 +26,7 @@
   import org.apache.fop.fo.expr.PropertyValue;
   import org.apache.fop.fo.expr.PropertyValueList;
   import org.apache.fop.fo.expr.PropertyException;
  +import org.apache.fop.fo.expr.SystemFontFunction;
   import org.apache.fop.datastructs.ROStringArray;
   import org.apache.fop.datastructs.ROIntArray;
   import org.apache.fop.datatypes.Ints;
  @@ -58,6 +59,10 @@
    */
   
   public abstract class Properties {
  +
  +    private static final String tag = "$Name$";
  +    private static final String revision = "$Revision$";
  +
       /*
        * The list of property data types.  These are used to form a bitmap of
        * the property data types that are valid for values of each of the
  @@ -239,6 +244,31 @@
   
   
       /**
  +     * Check the PropertyValueList passed as an argument, to determine
  +     * whether it contains a space-separated list from the parser.
  +     * A space-separated list will be represented by a single
  +     * PropertyValueList as an element of the argument PropertyValueList.
  +     * @param list <tt>PropertyValueList</tt> the containing list.
  +     * @return <tt>PropertyValueList</tt> the contained space-separated list.
  +     * @exception <tt>PropertyException</tt>
  +     */
  +    private static PropertyValueList spaceSeparatedList
  +                                                    (PropertyValueList list)
  +            throws PropertyException
  +    {
  +        if (list.size() != 1)
  +                throw new PropertyException
  +                        (list.getClass().getName() + " list is not a "
  +                                + "single list of space-separated values");
  +        PropertyValue val2 = (PropertyValue)(list.getFirst());
  +        if ( ! (val2 instanceof PropertyValueList))
  +                throw new PropertyException
  +                        (list.getClass().getName() + " list is not a "
  +                                + "single list of space-separated values");
  +        return (PropertyValueList)val2;
  +    }
  +
  +    /**
        * Return the EnumType derived from the argument.
        * The argument must be an NCName whose string value is a
        * valid Enum for the property associated with the NCName.
  @@ -304,6 +334,8 @@
   
       /**
        * 'value' is a PropertyValueList or an individual PropertyValue.
  +     * If 'value' is a PropertyValueList, it must contain a single
  +     * PropertyValueList, which in turn contains the individual elements.
        *
        * 'value' can contain a parsed Inherit value,
        *  parsed FromParent value, parsed FromNearestSpecified value,
  @@ -335,7 +367,8 @@
               return processEdgeValue(value, styleProp, colorProp, widthProp);
           } else {
               return processEdgeList
  -                ((PropertyValueList)value, styleProp, colorProp, widthProp);
  +                (spaceSeparatedList((PropertyValueList)value),
  +                                            styleProp, colorProp, widthProp);
           }
       }
   
  @@ -784,6 +817,8 @@
   
           /**
            * 'value' is a PropertyValueList or an individual PropertyValue.
  +         * If 'value' is a PropertyValueList, it must contain a single
  +         * PropertyValueList, which in turn contains the individual elements.
            *
            * 'value' can contain a parsed Inherit value or, in any order;
            * background-color
  @@ -800,8 +835,9 @@
            *     one or two parsed NCNames containing enumeration tokens
            *
            * <p>The value(s) provided, if valid, are converted into a list
  -         * containing the expansion of the shorthand.  The elements may
  -         * be in any order.  A minimum of one value will be present.
  +         * containing the expansion of the shorthand.  Any subset of the
  +         * elements may be present, from minimum of one.  The elements
  +         * which are present will always occur in the following order:
            *
            *   a BackgroundColor ColorType or Inherit value
            *   a BackgroundImage UriType, None or Inherit value
  @@ -810,18 +846,19 @@
            *   a BackgroundPositionHorizontal Numeric or Inherit value
            *   a BackgroundPositionVertical Numeric or Inherit value
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                           throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  -                return processValue(value);
  +                return processValue(foTree, value);
               } else {
  -                return processList((PropertyValueList)value);
  +                return processList
  +                    (foTree, spaceSeparatedList((PropertyValueList)value));
               }
           }
   
           private static PropertyValueList processValue
  -            (PropertyValue value) throws PropertyException
  +            (FOTree foTree, PropertyValue value) throws PropertyException
           {
               // Can be Inherit, ColorType, UriType, None, Numeric, or an
               // NCName (i.e. enum token)
  @@ -836,11 +873,12 @@
                   PropertyValueList tmpList
                           = new PropertyValueList(value.getProperty());
                   tmpList.add(value);
  -                return processList(tmpList);
  +                return processList(foTree, tmpList);
               }
           }
   
  -        private static PropertyValueList processList(PropertyValueList value)
  +        private static PropertyValueList processList
  +                (FOTree foTree, PropertyValueList value)
                           throws PropertyException
           {
               int property = value.getProperty();
  @@ -904,7 +942,7 @@
                       if (position != null)
                               MessageHandler.log("background: duplicate" +
                               "position overrides previous position");
  -                    position = BackgroundPosition.complex(posnList);
  +                    position = BackgroundPosition.complex(foTree, posnList);
                       continue scanning_elements;
                   }
   
  @@ -980,7 +1018,8 @@
                           if (position != null)
                                   MessageHandler.log("background: duplicate" +
                                   "position overrides previous position");
  -                        position = BackgroundPosition.complex(posnList);
  +                        position =
  +                                BackgroundPosition.complex(foTree, posnList);
                           continue scanning_elements;
                       }
                       throw new PropertyException
  @@ -1124,7 +1163,8 @@
            *   or an Inherit value.
            * The distance measurement can be either a Length or a Percentage.
            *
  -         * <p>If 'value' is a PropertyValueList, it contains either a pair of
  +         * <p>If 'value' is a PropertyValueList, it contains a
  +         * PropertyValueList containing either a pair of
            * distance measurement (length or percentage) or a pair of
            * enumeration tokens representing the background position offset
            * in the "height" and "width" dimensions.
  @@ -1134,13 +1174,14 @@
            * element is a value for BackgroundPositionHorizontal, and the
            * second is for BackgroundPositionVertical.
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                           throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
                   return processValue(value);
               } else {
  -                return processList((PropertyValueList)value);
  +                return processList
  +                            (spaceSeparatedList((PropertyValueList)value));
               }
           }
   
  @@ -1840,7 +1881,7 @@
            *  N.B. this is the order of elements defined in
            *       PropertySets.borderRightExpansion
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               return Properties.borderEdge(value,
  @@ -1965,7 +2006,7 @@
            * the third element is a value for border-bottom-color,
            * the fourth element is a value for border-left-color.
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  @@ -1995,7 +2036,8 @@
                   // List may contain only multiple color specifiers
                   // i.e. ColorTypes or NCNames specifying a standard color or
                   // 'transparent'.
  -                PropertyValueList list = (PropertyValueList)value;
  +                PropertyValueList list =
  +                                spaceSeparatedList((PropertyValueList)value);
                   ColorType top, left, bottom, right;
                   int count = list.size();
                   if (count < 2 || count > 4)
  @@ -2184,7 +2226,7 @@
            *  N.B. this is the order of elements defined in
            *       PropertySets.borderRightExpansion
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               return Properties.borderEdge(value,
  @@ -2270,7 +2312,7 @@
            *  N.B. this is the order of elements defined in
            *       PropertySets.borderRightExpansion
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               return Properties.borderEdge(value,
  @@ -2400,7 +2442,7 @@
            *   Note: the Lengths cannot be percentages (what about relative
            *         lengths?)
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  @@ -2416,7 +2458,8 @@
                           " object for border-spacing");
               } else {
                   // Must be a pair of Lengths
  -                PropertyValueList list = (PropertyValueList)value;
  +                PropertyValueList list =
  +                                spaceSeparatedList((PropertyValueList)value);
                   if (list.size() != 2)
                       throw new PropertyException
                           ("List of " + list.size() + " for border-spacing");
  @@ -2566,7 +2609,7 @@
            * the third element is a value for border-bottom-style,
            * the fourth element is a value for border-left-style.
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  @@ -2594,7 +2637,8 @@
               } else {
                   // List may contain only multiple style specifiers
                   // i.e. NCNames specifying a standard style
  -                PropertyValueList list = (PropertyValueList)value;
  +                PropertyValueList list =
  +                                spaceSeparatedList((PropertyValueList)value);
                   EnumType top, left, bottom, right;
                   int count = list.size();
                   if (count < 2 || count > 4)
  @@ -2658,7 +2702,7 @@
            *  N.B. this is the order of elements defined in
            *       PropertySets.borderRightExpansion
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               return Properties.borderEdge(value,
  @@ -2746,7 +2790,8 @@
            *   a FromNearestSpecified value,
            *   or an Inherit value.
            *
  -         * <p>If 'value' is a PropertyValueList, it contains a list of
  +         * <p>If 'value' is a PropertyValueList, it contains a
  +         * PropertyValueList which in turn contains a list of
            * 2 to 4 NCName enum tokens representing border-widths.
            *
            * <p>The value(s) provided, if valid, are converted into a list
  @@ -2756,7 +2801,7 @@
            * the third element is a value for border-bottom-width,
            * the fourth element is a value for border-left-width.
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  @@ -2784,7 +2829,8 @@
               } else {
                   // List may contain only multiple width specifiers
                   // i.e. NCNames specifying a standard width
  -                PropertyValueList list = (PropertyValueList)value;
  +                PropertyValueList list =
  +                                spaceSeparatedList((PropertyValueList)value);
                   MappedEnumType top, left, bottom, right;
                   int count = list.size();
                   if (count < 2 || count > 4)
  @@ -3003,7 +3049,7 @@
           public static final int initialValueType = AUTO_IT;
           public static final int inherited = NO;
   
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                           throws PropertyException
           {
               // AUTO and INHERIT will have been normally processed
  @@ -3165,15 +3211,15 @@
            *   a FromNearestSpecified value,
            *   or an Inherit value.
            *
  -         * <p>If 'value' is a PropertyValueList, it contains a list of
  -         * 2 parsed UriType values.
  +         * <p>If 'value' is a PropertyValueList, it contains an inner
  +         * PropertyValueList of 2 parsed UriType values.
            *
            * <p>The value(s) provided, if valid, are converted into a list
            * containing the expansion of the shorthand.
            * The first element is a value for cue-before,
            * the second element is a value for cue-after.
            */
  -        public static PropertyValue complex(PropertyValue value)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                       throws PropertyException
           {
               if ( ! (value instanceof PropertyValueList)) {
  @@ -3188,7 +3234,8 @@
                           " object for cue");
               } else {
                   // List may contain only 2 uri specifiers
  -                PropertyValueList list = (PropertyValueList)value;
  +                PropertyValueList list =
  +                                spaceSeparatedList((PropertyValueList)value);
                   if (list.size() != 2)
                       throw new PropertyException
                           ("List of " + list.size() + " for cue");
  @@ -3485,6 +3532,377 @@
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
           public static final int inherited = SHORTHAND_INH;
  +
  +        public static final int
  +                   CAPTION = 1
  +                     ,ICON = 2
  +                     ,MENU = 3
  +              ,MESSAGE_BOX = 4
  +            ,SMALL_CAPTION = 5
  +               ,STATUS_BAR = 6
  +                           ;
  +
  +        private static final String[] rwEnums = {
  +            null
  +            ,"caption"
  +            ,"icon"
  +            ,"menu"
  +            ,"message-box"
  +            ,"small-caption"
  +            ,"status-bar"
  +        };
  +
  +        public static final ROStringArray enums = new ROStringArray(rwEnums);
  +        private static final HashMap rwEnumValues;
  +        public static final Map enumValues;
  +        static {
  +            rwEnumValues = new HashMap(rwEnums.length);
  +            for (int i = 1; i < rwEnums.length; i++ ) {
  +                rwEnumValues.put((Object)rwEnums[i],
  +                                    (Object) Ints.consts.get(i));
  +            }
  +            enumValues =
  +                Collections.unmodifiableMap((Map)rwEnumValues);
  +        }
  +
  +        /**
  +         * 'value' is a PropertyValueList or an individual PropertyValue.
  +         *
  +         * If 'value' is a PropertyValueList it may contain, in turn, a
  +         * PropertyValueList with the space-separated elements of the
  +         * original expression, or a list of comma-separated elements if
  +         * these were the only elements of the expression.
  +         *
  +         * If a top-level list occurs, i.e. if 'value' is a PropertyValueList
  +         * which contains multiple elements, it represents a comma-separated
  +         * list, which can only legitimately contain a <em>font-family</em>
  +         * specification.
  +         *
  +         * 'value' can contain a parsed Inherit value or
  +         * a parsed NCName value containing one of the system font
  +         *  enumeration tokens listed in rwEnums, above, or
  +         *  a <em>single</em> element from those noted below in the discussion
  +         *  of font specification elements.
  +         *
  +         * If 'value' is a space-separated list, it may contain:
  +         *   A trailing <em>font-family</em> specification, possibly
  +         *   preceded by an optional initial detailed font specification.
  +         *   The font-family specification may be comprised of a single
  +         *   element or a comma-separated list of specific or generic font
  +         *   names.  A single font name may be a space-separated name.
  +         *
  +         *   The optional initial detailed font specification may be
  +         *    comprised of a trailing dimension specifier, possibly preceded
  +         *    by an optional set of font descriptor elements.
  +         *
  +         *   The dimension specifier is comprised of a <em>font-size</em>
  +         *    specifier, possibly followed by an optional line height
  +         *    specifier.  The line height specifier is made up of a slash
  +         *    character followed by a <em>line-height</em> specifier proper.
  +         *
  +         *   The optional set of font descriptor elements may include,
  +         *    in any order, from one to three of
  +         *    a font-style element
  +         *    a font-variant element
  +         *    a font-weight element
  +         *
  +         * [ [&lt;font-style&gt;||&lt;font-variant&gt;||&lt;font-weight&gt;]?
  +         *    &lt;font-size&gt; [ / &lt;line-height&gt; ]?
  +         *    &lt;font-family&gt; ]
  +         *    |caption|icon|menu|message-box|small-caption|status-bar
  +         *    |inherit
  +         *
  +         *  In other words, this is one of the greatest parsing shambles
  +         *   ever conceived by the mind of man.
  +         *
  +         * <p>The value(s) provided, if valid, are converted into a list
  +         * containing the expansion of the shorthand.  A minimum of one
  +         * value will be present.
  +         *
  +         */
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
  +                        throws PropertyException
  +        {
  +            if ( ! (value instanceof PropertyValueList)) {
  +                return processValue(foTree, value);
  +            } else {
  +                PropertyValueList list = null;
  +                try {
  +                    list = spaceSeparatedList((PropertyValueList)value);
  +                } catch (PropertyException e) {}
  +                if (list == null) {
  +                    // Must be a comma-separated list
  +                    // i.e. a font-family list
  +                    return processCommaSepList((PropertyValueList)value);
  +                } else {
  +                    return processSpaceSepList(foTree, list);
  +                }
  +            }
  +        }
  +
  +        private static PropertyValueList processValue
  +            (FOTree foTree, PropertyValue value)
  +                        throws PropertyException
  +        {
  +            // Can be Inherit, FromParent, FromNearestSpecified, a
  +            // system font NCName or a single element font-family specifier
  +            if (value instanceof Inherit |
  +                    value instanceof FromParent |
  +                        value instanceof FromNearestSpecified)
  +            {
  +                return PropertySets.expandAndCopySHand(value);
  +            }
  +            // else not Inherit/From../From..
  +            FontFamilySet family = null;
  +            if (value instanceof NCName) {
  +                // Is it a system font enumeration?
  +                EnumType enum = null;
  +                String ncname = ((NCName)value).getNCName();
  +                try {
  +                    enum = new EnumType(value.getProperty(), ncname);
  +                } catch (PropertyException e) {}
  +                if (enum != null) {
  +                    // A system font enum
  +                    return SystemFontFunction.expandFontSHand
  +                                            (PropNames.FONT, ncname);
  +                } else {
  +                    // Not a system font enum
  +                    // Can only be a single-element font-family spec
  +                    // i.e. anything is possible
  +                    // Try for a FontFamilySet
  +                    family =
  +                        (FontFamilySet)(FontFamily.complex(foTree, value));
  +                }
  +            } else {
  +                // Not an NCName; is it a Literal?
  +                if (value instanceof StringType) {
  +                    family =
  +                        (FontFamilySet)(FontFamily.complex(foTree, value));
  +                } else {
  +                    // Not an NCName, not a StringType
  +                    throw new PropertyException
  +                        ("Invalid single element " +
  +                            value.getClass().getName() +
  +                                " for font shorthand");
  +                }
  +            }
  +            // Out of here we can only have a FontFamilySet
  +            PropertyValueList list =
  +                PropertySets.initialValueExpansion(foTree, PropNames.FONT);
  +            return PropertySets.overrideSHandElement(list, family);
  +        }
  +
  +
  +        /**
  +         * @param value a <tt>PropertyValueList</tt> containing the
  +         * comma-separated list; i.e. the top-level list returned by the
  +         * parser.  In this instance, this can only be a <em>font-family</em>
  +         * specification.
  +         * @return <tt>PropertyValueList</tt> containing a
  +         * <tt>PropertyValue</tt> for each property in the expansion of the
  +         * shorthand.
  +         * @exception PropertyValueException
  +         */
  +        private static PropertyValueList
  +                            processCommaSepList(PropertyValueList value)
  +                        throws PropertyException
  +        {
  +            // Pass this on to the procedure in the FontFamily property
  +            return value;
  +        }
  +
  +        /**
  +         * @param value a <tt>PropertyValueList</tt> containing the actual
  +         * space-separated list; i.e. the single inner list from the
  +         * outer list returned by the parser.
  +         * @return <tt>PropertyValueList</tt> containing a
  +         * <tt>PropertyValue</tt> for each property in the expansion of the
  +         * shorthand.
  +         * @exception PropertyValueException
  +         */
  +        private static PropertyValueList
  +                processSpaceSepList(FOTree foTree, PropertyValueList value)
  +                        throws PropertyException
  +        {
  +            int property = value.getProperty();
  +            PropertyValue color= null,
  +                            image = null,
  +                            repeat = null,
  +                            attachment = null,
  +                            position = null;
  +
  +            PropertyValueList newlist = new PropertyValueList(property);
  +            // This is a list
  +            if (value.size() == 0)
  +                throw new PropertyException
  +                                ("Empty list for Background");
  +            ListIterator elements = ((PropertyValueList)value).listIterator();
  +
  +            scanning_elements: while (elements.hasNext()) {
  +                PropertyValue pval = (PropertyValue)(elements.next());
  +                if (pval instanceof ColorType) {
  +                    if (color != null) MessageHandler.log("background: " +
  +                                "duplicate color overrides previous color");
  +                    color = pval;
  +                    continue scanning_elements;
  +                }
  +
  +                if (pval instanceof UriType) {
  +                    if (image != null) MessageHandler.log("background: " +
  +                        "duplicate image uri overrides previous image spec");
  +                    image = pval;
  +                    continue scanning_elements;
  +                }
  +
  +                if (pval instanceof None) {
  +                    if (image != null) MessageHandler.log("background: " +
  +                        "duplicate image spec overrides previous image spec");
  +                    image = pval;
  +                    continue scanning_elements;
  +                }
  +
  +                if (pval instanceof Numeric) {
  +                    // Must be one of the position values
  +                    // send it to BackgroundPosition.complex for processing
  +                    // If it is followed by another Numeric, form a list from
  +                    // the pair, else form a list from this element only
  +                    PropertyValueList posnList = new PropertyValueList
  +                                            (PropNames.BACKGROUND_POSITION);
  +                    posnList.add(pval);
  +                    // Is it followed by another Numeric?
  +                    if (elements.hasNext()) {
  +                        PropertyValue tmpval;
  +                        if ((tmpval = (PropertyValue)(elements.next()))
  +                                    instanceof Numeric) {
  +                            posnList.add(tmpval);
  +                        } else {
  +                            // Not a following Numeric, so restore the list
  +                            // cursor
  +                            tmpval = (PropertyValue)(elements.previous());
  +                        }
  +                    }
  +                    // Now send one or two Numerics to BackgroundPosition
  +                    if (position != null)
  +                            MessageHandler.log("background: duplicate" +
  +                            "position overrides previous position");
  +                    position = BackgroundPosition.complex(foTree, posnList);
  +                    continue scanning_elements;
  +                }
  +
  +                if (pval instanceof NCName) {
  +                    // NCName can be:
  +                    //  a standard color name
  +                    //  a background attachment mode
  +                    //  one or two position indicators
  +                    String ncname = ((NCName)pval).getNCName();
  +                    ColorType colorval = null;
  +                    try {
  +                        colorval = new ColorType
  +                                        (PropNames.BACKGROUND_COLOR, ncname);
  +                    } catch (PropertyException e) {};
  +                    if (colorval != null) {
  +                        if (color != null) MessageHandler.log("background: " +
  +                                "duplicate color overrides previous color");
  +                        color = colorval;
  +                        continue scanning_elements;
  +                    }
  +
  +                    // Is it an attachment mode?
  +                    EnumType enum = null;
  +                    try {
  +                        enum = new EnumType
  +                                (PropNames.BACKGROUND_ATTACHMENT, ncname);
  +                    } catch (PropertyException e) {};
  +                    if (enum != null) {
  +                        if (attachment != null)
  +                                MessageHandler.log("background: duplicate" +
  +                                "attachment overrides previous attachment");
  +                        attachment = enum;
  +                        continue scanning_elements;
  +                    }
  +
  +                    // Must be a position indicator
  +                    // send it to BackgroundPosition.complex for processing
  +                    // If it is followed by another NCName, form a list from
  +                    // the pair, else form a list from this element only
  +
  +                    // This is made messy by the syntax of the Background
  +                    // shorthand.  A following NCName need not be a second
  +                    // position indicator.  So we have to test this element
  +                    // and the following element individually.
  +                    PropertyValueList posnList = new PropertyValueList
  +                                            (PropNames.BACKGROUND_POSITION);
  +                    PropertyValue tmpval = null;
  +                    // Is the current NCName a position token?
  +                    boolean pos1ok = false, pos2ok = false;
  +                    try {
  +                        PropertyConsts.enumValueToIndex
  +                                        (ncname, BackgroundPosition.enums);
  +                        pos1ok = true;
  +                        if (elements.hasNext()) {
  +                            tmpval = (PropertyValue)(elements.next());
  +                            if (tmpval instanceof NCName) {
  +                                String ncname2 = ((NCName)tmpval).getString();
  +                                PropertyConsts.enumValueToIndex
  +                                        (ncname2, BackgroundPosition.enums);
  +                                pos2ok = true;
  +                            } else {
  +                                // Restore the listIterator cursor
  +                                Object tmpo = elements.previous();
  +                            }
  +                        }
  +                    } catch (PropertyException e) {};
  +
  +                    if (pos1ok) {
  +                        posnList.add(pval);
  +                        // Is it followed by another position NCName?
  +                        if (pos2ok) posnList.add(tmpval);
  +                        // Now send one or two NCNames to BackgroundPosition
  +                        if (position != null)
  +                                MessageHandler.log("background: duplicate" +
  +                                "position overrides previous position");
  +                        position =
  +                                BackgroundPosition.complex(foTree, posnList);
  +                        continue scanning_elements;
  +                    }
  +                    throw new PropertyException
  +                        ("Unknown NCName value for background: " + ncname);
  +                }
  +
  +                throw new PropertyException
  +                    ("Invalid " + pval.getClass().getName() +
  +                        " property value for background");
  +            }
  +
  +            // Now construct the list of PropertyValues with their
  +            // associated property indices, as expanded from the
  +            // Background shorthand.  Note that the position value is a list
  +            // containing the expansion of the BackgroundPosition shorthand.
  +
  +            if (color != null) {
  +                color.setProperty(PropNames.BACKGROUND_COLOR);
  +                newlist.add(color);
  +            }
  +            if (image != null) {
  +                image.setProperty(PropNames.BACKGROUND_IMAGE);
  +                newlist.add(image);
  +            }
  +            if (repeat != null) {
  +                repeat.setProperty(PropNames.BACKGROUND_REPEAT);
  +                newlist.add(repeat);
  +            }
  +            if (attachment != null) {
  +                attachment.setProperty(PropNames.BACKGROUND_ATTACHMENT);
  +                newlist.add(attachment);
  +            }
  +            if (position != null) {
  +                // position must have two elements
  +                Iterator positions = ((PropertyValueList)position).iterator();
  +                newlist.add(positions.next());
  +                newlist.add(positions.next());
  +            }
  +            return newlist;
  +        }
       }
   
       public static class FontFamily extends Properties {
  @@ -3519,7 +3937,7 @@
                   Collections.unmodifiableMap((Map)rwEnumValues);
           }
   
  -        public static PropertyValue complex(PropertyValue propvalue)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue value)
                           throws PropertyException
           {
               // There is no point in attempting to validate the enumeration
  @@ -3535,35 +3953,35 @@
               // be at the top level, and any font family names
               // that contained spaces will be in PropertyValueLists.
   
  -            int property = propvalue.getProperty();
  +            int property = value.getProperty();
               // First, check that we have a list
  -            if ( ! (propvalue instanceof PropertyValueList)) {
  -                if ( ! (propvalue instanceof StringType))
  +            if ( ! (value instanceof PropertyValueList)) {
  +                if ( ! (value instanceof StringType))
                       throw new PropertyException
  -                        ("Invalid " + propvalue.getClass().getName() +
  +                        ("Invalid " + value.getClass().getName() +
                               " PropertyValue for font-family");
                   return new FontFamilySet(property,
  -                        new String[] {((StringType)propvalue).getString() });
  +                        new String[] {((StringType)value).getString() });
               }
  -            PropertyValueList list = (PropertyValueList)propvalue;
  +            PropertyValueList list = (PropertyValueList)value;
               String[] strings = new String[list.size()];
               int i = 0;          // the strings index
               Iterator scan = list.iterator();
               while (scan.hasNext()) {
  -                Object value = scan.next();
  +                Object pvalue = scan.next();
                   String name = "";
  -                if (value instanceof PropertyValueList) {
  +                if (pvalue instanceof PropertyValueList) {
                       // build a font name according to
                       // 7.8.2 "font-family" <family-name>
  -                    Iterator font = ((PropertyValueList)value).iterator();
  +                    Iterator font = ((PropertyValueList)pvalue).iterator();
                       while (font.hasNext())
                           name = name + (name.length() == 0 ? "" : " ")
                                   + ((StringType)(font.next())).getString();
                   }
  -                else if (value instanceof StringType)
  -                            name = ((StringType)value).getString();
  +                else if (pvalue instanceof StringType)
  +                            name = ((StringType)pvalue).getString();
                   else throw new PropertyException
  -                        ("Invalid " + propvalue.getClass().getName() +
  +                        ("Invalid " + value.getClass().getName() +
                               " PropertyValue for font-family");
                   strings[i++] = name;
               }
  @@ -5933,7 +6351,7 @@
           public static final int initialValueType = NONE_IT;
           public static final int inherited = NO;
   
  -        public static PropertyValue complex(PropertyValue list)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue list)
                           throws PropertyException
           {
               // Confirm that the list contains only UriType elements
  @@ -6525,7 +6943,7 @@
           public static final ROStringArray enums = new ROStringArray(rwEnums);
           public static final ROStringArray enumValues = enums;
   
  -        public static PropertyValue complex(PropertyValue list)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue list)
                           throws PropertyException
           {
               // Assume that the enumeration has been checked for.  Look for
  @@ -6843,7 +7261,7 @@
                                       ,BLINK
                               });
   
  -        public static PropertyValue complex(PropertyValue list)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue list)
                           throws PropertyException
           {
               byte onMask = NO_DECORATION;
  @@ -6954,7 +7372,7 @@
            * <tt>Length</tt>s may be preceded or followed by a color
            * specifier.
            */
  -        public static PropertyValue complex(PropertyValue list)
  +        public static PropertyValue complex(FOTree foTree, PropertyValue list)
                           throws PropertyException
           {
               int property = list.getProperty();
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to