2. Creating a property value

2.1. General

A property value is created by the maker for the property type, in its method PropertyMaker.make(PropertyList, String, FObj), where the second argument is the property value as a string:

  • If the specified value is inherit, get the property value from the parent FObj.

  • Else if the value is an enumerated value, the corresponding property value is retrieved (for each possible enumerated value only one property value object exists, of type EnumProperty).

  • If this does not retrieve a property value,

    • If the value is a shorthand keyword, it is converted to the corresponding value.

    • The value is parsed, and a property value is created.

    • The method PropertyMaker.convertProperty is called, which is overridden in subclasses of PropertyMaker. CompoundPropertyMaker uses this method to convert the simple property value constructed to a compound property value:

      • Make a compound property value based on default values: PropertyMaker.makeCompound, overridden in CompoundPropertyMaker.

      • Set all components equal to the simple property value that is being converted.

  • If this is a compound property maker, convert it to a compound property as above. (Is this the second time the property value is converted?)

The property may also record the value as specified in the fo element, as this may influence the traits of the areas created by this FO node and FO nodes in the subtree.

Subclasses of PropertyMaker may override this method. For example, StringProperty.Maker has a much simpler method.

Attributes of the fo elements are converted to property value objects in PropertyList.convertAttributeToProperty:

  • If the property is not a component of a compound property,

    • Ask the maker for the property to create the property value.

  • Else if the property is a component of a compound property,

    • Find the base property by a call to Propertylist.findBaseProperty:

      • If the base property value already exists, return it to convertAttributeToProperty.

      • If the base attribute is also specified (later) in the list of attributes, retrieve it, ask the maker for the base property to create the base property value, and return it to convertAttributeToProperty.

      • Return null to convertAttributeToProperty.

    • Ask the maker for the subproperty to create the subproperty value by a call to PropertyMaker.make(Property, int, PropertyList, String, FObj), where the second argument is the subproperty ID and the fourth argument is the specified value. This method is overridden in CompoundPropertyMaker:

      • If the base property value does not yet exist, ask its maker to create it with default values for the components: PropertyMaker.makeCompound, which is overridden in CompoundPropertyMaker:

        • Create an empty property value.

        • Create property values for the subproperties with default values, and insert them into the compound property value.

      • Create the specified subproperty value and insert it into the compound property value, where it replaces the default subproperty value.

  • Add the property to the property list.