pbwest      2002/06/09 03:22:47

  Modified:    src/org/apache/fop/fo Tag: FOP_0-20-0_Alt-Design
                        Properties.java
  Log:
  Initial shorthand support - BackgroundPosition
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.3   +333 -8    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.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- Properties.java   9 May 2002 04:08:39 -0000       1.1.2.2
  +++ Properties.java   9 Jun 2002 10:22:46 -0000       1.1.2.3
  @@ -1,11 +1,11 @@
   /*
  - * $Id: Properties.java,v 1.1.2.2 2002/05/09 04:08:39 pbwest Exp $
  + * $Id: Properties.java,v 1.1.2.3 2002/06/09 10:22:46 pbwest Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Peter B. West</a>
  - * @version $Revision: 1.1.2.2 $ $Name:  $
  + * @version $Revision: 1.1.2.3 $ $Name:  $
    */
   
   package org.apache.fop.fo;
  @@ -225,7 +225,8 @@
                         ,COMPUTED = 1
                        ,SPECIFIED = 2
                         ,COMPOUND = 3
  -                ,VALUE_SPECIFIC = 4
  +                 ,SHORTHAND_INH = 4
  +                ,VALUE_SPECIFIC = 5
                                 ;
   
   
  @@ -577,7 +578,7 @@
       }
   
       public static class Background extends Properties {
  -        public static final int dataTypes = SHORTHAND;
  +        public static final int dataTypes = SHORTHAND | INHERIT;
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
           public static final int inherited = NO;
  @@ -647,6 +648,330 @@
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
           public static final int inherited = NO;
  +
  +        public static final int
  +                                LEFT = 1
  +                             ,CENTER = 2
  +                              ,RIGHT = 3
  +                                ,TOP = 4
  +                            ,CENTERV = 5
  +                             ,BOTTOM = 6
  +                                     ;
  +
  +        private static final String[] rwEnums = {
  +            null
  +            ,"left"
  +            ,"center"
  +            ,"right"
  +            ,"top"
  +            ,"center"
  +            ,"bottom"
  +        };
  +
  +        private static final ROStringArray enums = new ROStringArray(rwEnums);
  +
  +        /**
  +         * 'value' is a PropertyValueList or an individual PropertyValue.
  +         *
  +         * <p>If 'value' is an individual PropertyValue, it must contain
  +         * either a single distance measurement, a single NCName enumeration
  +         * token, 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
  +         * distance measurement (length or percentage) or a pair of
  +         * enumeration tokens representing the background position offset
  +         * in the "height" and "width" dimensions.
  +         *
  +         * <p>The value(s) provided, if valid, are converted into a list
  +         * containing the expansion of the shorthand.  I.e. the first
  +         * element is a value for BackgroundPositionHorizontal, and the
  +         * second is for BackgroundPositionVertical.
  +         */
  +        public static PropertyValue complex
  +            (int property, PropertyValue value) throws PropertyException
  +        {
  +            if ( ! (value instanceof PropertyValueList)) {
  +                return processValue(property, value);
  +            } else {
  +                return processList(property, (PropertyValueList)value);
  +            }
  +        }
  +
  +        private static PropertyValueList processValue
  +            (int property, PropertyValue value) throws PropertyException
  +        {
  +            PropertyValueList newlist = new PropertyValueList(property);
  +            // Can only be Inherit, NCName (i.e. enum token)
  +            // or Numeric (i.e. Length or Percentage)
  +            if (value instanceof Inherit) {
  +                // Construct a list of two Inherit values
  +                newlist.add(new Inherit(
  +                            PropNames.BACKGROUND_POSITION_HORIZONTAL));
  +                newlist.add(new Inherit(
  +                            PropNames.BACKGROUND_POSITION_VERTICAL));
  +            } else if (value instanceof Numeric) {
  +                // Single horizontal value given
  +                Numeric newNum;
  +                try {
  +                    newNum = (Numeric)(value.clone());
  +                } catch (CloneNotSupportedException cnse) {
  +                    throw new PropertyException(cnse.getMessage());
  +                }
  +                newNum.setProperty(
  +                            PropNames.BACKGROUND_POSITION_HORIZONTAL);
  +                newlist.add(newNum);
  +                newlist.add(Percentage.makePercentage(
  +                            PropNames.BACKGROUND_POSITION_VERTICAL,
  +                            50.0d));
  +            } else if (value instanceof NCName) {
  +                String enumval = ((NCName)value).getNCName();
  +                int enumIndex;
  +                try {
  +                    enumIndex = PropertyConsts.enumValueToIndex(
  +                                    enumval, enums);
  +                } catch (PropertyException e) {
  +                    throw new PropertyException(
  +                            "Invalid enum value for BackgroundPosition: "
  +                            + enumval);
  +                }
  +                // Found an enum
  +                double horiz = 50.0, vert = 50.0;
  +                switch (enumIndex) {
  +                case LEFT:
  +                    horiz = 0.0;
  +                    break;
  +                case RIGHT:
  +                    horiz = 100.0;
  +                    break;
  +                case TOP:
  +                    vert = 0.0;
  +                    break;
  +                case BOTTOM:
  +                    vert = 100.0;
  +                    break;
  +                }
  +                newlist.add(Percentage.makePercentage(
  +                            PropNames.BACKGROUND_POSITION_HORIZONTAL,
  +                            horiz));
  +                newlist.add(Percentage.makePercentage(
  +                            PropNames.BACKGROUND_POSITION_VERTICAL,
  +                            vert));
  +            } else {
  +                throw new PropertyException
  +                ("Invalid single property value for BackgroundPosition: "
  +                + value.toString());
  +            }
  +            return newlist;
  +        }
  +
  +        private static PropertyValueList processList
  +            (int property, PropertyValueList value) throws PropertyException
  +        {
  +            PropertyValueList newlist = new PropertyValueList(property);
  +            // This is a list
  +            if (((PropertyValueList)value).size() == 0)
  +                throw new PropertyException
  +                                ("Empty list for BackgroundPosition");
  +            // Only two Numerics allowed
  +            if (((PropertyValueList)value).size() != 2)
  +                throw new PropertyException
  +                        ("More that 2 elements in BackgroundPosition list.");
  +            // Analyse the list data.
  +            // Can be a pair of Numeric values, Length or Percentage,
  +            // or a pair of enum tokens.  One is from the set
  +            // [top center bottom]; the other is from the set
  +            // [left center right].
  +            Iterator positions = ((PropertyValueList)value).iterator();
  +            PropertyValue posn = (PropertyValue)(positions.next());
  +            PropertyValue posn2 = (PropertyValue)(positions.next());
  +
  +            if (posn instanceof Numeric) {
  +                Numeric num1;
  +                try {
  +                    num1 = (Numeric)(posn.clone());
  +                } catch (CloneNotSupportedException cnse) {
  +                    throw new PropertyException(cnse.getMessage());
  +                }
  +                num1.setProperty(
  +                            PropNames.BACKGROUND_POSITION_HORIZONTAL);
  +                // Now check the type of the second element
  +                if ( ! (posn2 instanceof Numeric))
  +                    throw new PropertyException
  +                        ("Numeric not followed by Numeric in "
  +                        + "BackgroundPosition list: " + posn2.toString());
  +                Numeric num2;
  +                try {
  +                    num2 = (Numeric)(posn2.clone());
  +                } catch (CloneNotSupportedException cnse) {
  +                    throw new PropertyException(cnse.getMessage());
  +                }
  +                num2.setProperty(
  +                            PropNames.BACKGROUND_POSITION_VERTICAL);
  +                if ( ! (num1.isDistance() && num2.isDistance()))
  +                    throw new PropertyException
  +                        ("Numerics not distances in BackgroundPosition list");
  +
  +                newlist.add(num1);
  +                newlist.add(num2);
  +
  +            } else if (posn instanceof NCName) {
  +                // Now check the type of the second element
  +                if ( ! (posn2 instanceof NCName))
  +                    throw new PropertyException
  +                        ("NCName not followed by NCName in BackgroundPosition"
  +                        + " list: " + posn2.toString());
  +                int enum1, enum2;
  +                String enumval1 = ((NCName)posn ).getNCName();
  +                String enumval2 = ((NCName)posn2).getNCName();
  +                double percent1 = 50.0d, percent2 = 50.0d;
  +                try {
  +                    enum1 = PropertyConsts.enumValueToIndex(
  +                                    enumval1,
  +                                    BackgroundPositionHorizontal.enumValues);
  +                } catch (PropertyException e) {
  +                    // Not a horizontal element - try vertical
  +                    try {
  +                        enum1 = PropertyConsts.enumValueToIndex(
  +                                    enumval1,
  +                                    BackgroundPositionVertical.enumValues);
  +                        enum1 += RIGHT;
  +                    } catch (PropertyException e2) {
  +                        throw new PropertyException
  +                            ("Unrecognised value for BackgroundPosition: "
  +                            + enumval1);
  +                    }
  +                }
  +                try {
  +                    enum2 = PropertyConsts.enumValueToIndex(
  +                                    enumval2,
  +                                    BackgroundPositionVertical.enumValues);
  +                    enum2 += RIGHT;
  +                } catch (PropertyException e) {
  +                    try {
  +                        enum2 = PropertyConsts.enumValueToIndex(
  +                                    enumval2,
  +                                    BackgroundPositionHorizontal.enumValues);
  +                    } catch (PropertyException e2) {
  +                        throw new PropertyException
  +                            ("Unrecognised value for BackgroundPosition: "
  +                            + enumval2);
  +                    }
  +                }
  +                if (enum1 == CENTERV) enum1 = CENTER;
  +                if (enum2 == CENTERV) enum2 = CENTER;
  +                switch (enum1) {
  +                case LEFT:
  +                    percent1 = 0.0d;
  +                    switch (enum2) {
  +                    case CENTER:
  +                        percent2 = 50.0d;
  +                        break;
  +                    case TOP:
  +                        percent2 = 0.0d;
  +                        break;
  +                    case BOTTOM:
  +                        percent2 = 100.0d;
  +                        break;
  +                    default:
  +                        throw new PropertyException
  +                            ("Incompatible values for BackgroundPosition: "
  +                            + enumval1 + " " + enumval2);
  +                    }
  +                case CENTER:
  +                    switch (enum2) {
  +                    case LEFT:
  +                        percent1 = 0.0d;
  +                        percent2 = 50.0d;
  +                        break;
  +                    case CENTER:
  +                        percent1 = 50.0d;
  +                        percent2 = 50.0d;
  +                        break;
  +                    case RIGHT:
  +                        percent1 = 100.0d;
  +                        percent2 = 50.0d;
  +                        break;
  +                    case TOP:
  +                        percent1 = 50.0d;
  +                        percent2 = 0.0d;
  +                        break;
  +                    case BOTTOM:
  +                        percent1 = 50.0d;
  +                        percent2 = 100.0d;
  +                        break;
  +                    default:
  +                        throw new PropertyException
  +                            ("Incompatible values for BackgroundPosition: "
  +                            + enumval1 + " " + enumval2);
  +                    }
  +                case RIGHT:
  +                    percent1 = 100.0d;
  +                    switch (enum2) {
  +                    case CENTER:
  +                        percent2 = 50.0d;
  +                        break;
  +                    case TOP:
  +                        percent2 = 0.0d;
  +                        break;
  +                    case BOTTOM:
  +                        percent2 = 100.0d;
  +                        break;
  +                    default:
  +                        throw new PropertyException
  +                            ("Incompatible values for BackgroundPosition: "
  +                            + enumval1 + " " + enumval2);
  +                    }
  +                case TOP:
  +                    percent2 = 0.0d;
  +                    switch (enum2) {
  +                    case LEFT:
  +                        percent1 = 0.0d;
  +                        break;
  +                    case CENTER:
  +                        percent1 = 50.0d;
  +                        break;
  +                    case RIGHT:
  +                        percent1 = 100.0d;
  +                        break;
  +                    default:
  +                        throw new PropertyException
  +                            ("Incompatible values for BackgroundPosition: "
  +                            + enumval1 + " " + enumval2);
  +                    }
  +                case BOTTOM:
  +                    percent2 = 100.0d;
  +                    switch (enum2) {
  +                    case LEFT:
  +                        percent1 = 0.0d;
  +                        break;
  +                    case CENTER:
  +                        percent1 = 50.0d;
  +                        break;
  +                    case RIGHT:
  +                        percent1 = 100.0d;
  +                        break;
  +                    default:
  +                        throw new PropertyException
  +                            ("Incompatible values for BackgroundPosition: "
  +                            + enumval1 + " " + enumval2);
  +                    }
  +                }
  +
  +                newlist.add(Percentage.makePercentage(
  +                            PropNames.BACKGROUND_POSITION_HORIZONTAL,
  +                            percent1));
  +                newlist.add(Percentage.makePercentage(
  +                            PropNames.BACKGROUND_POSITION_VERTICAL,
  +                            percent2));
  +
  +            } else throw new PropertyException
  +                        ("Invalid element in BackgroundPosition list: "
  +                        + posn.toString());
  +
  +            return newlist;
  +        }
  +
       }
   
       public static class BackgroundPositionHorizontal extends Properties {
  @@ -1427,7 +1752,7 @@
           public static final int dataTypes = SHORTHAND;
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
  -        public static final int inherited = COMPUTED;
  +        public static final int inherited = SHORTHAND_INH;
       }
   
       public static class BorderStartColor extends Properties {
  @@ -2208,7 +2533,7 @@
           public static final int dataTypes = SHORTHAND;
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
  -        public static final int inherited = COMPUTED;
  +        public static final int inherited = SHORTHAND_INH;
       }
   
       public static class FontFamily extends Properties {
  @@ -5924,7 +6249,7 @@
                                       ("PropertyException: " + e.getMessage());
               }
           }
  -        public static final int inherited = COMPUTED;
  +        public static final int inherited = SHORTHAND_INH;
   
           private static final String[] rwEnums = {
               null
  @@ -6125,7 +6450,7 @@
           public static final int dataTypes = SHORTHAND;
           public static final int traitMapping = SHORTHAND_MAP;
           public static final int initialValueType = NOTYPE_IT;
  -        public static final int inherited = COMPUTED;
  +        public static final int inherited = SHORTHAND_INH;
       }
   
       public static class ZIndex extends Properties {
  
  
  

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

Reply via email to