]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Add keep properties as compound; handle enumeration types in subproperties; add corre...
authorKaren Lease <klease@apache.org>
Tue, 2 Jan 2001 21:45:33 +0000 (21:45 +0000)
committerKaren Lease <klease@apache.org>
Tue, 2 Jan 2001 21:45:33 +0000 (21:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193944 13f79535-47bb-0310-9956-ffa450edef68

src/codegen/enumgen.xsl
src/codegen/foproperties.xml
src/codegen/properties.dtd
src/codegen/properties.xsl
src/codegen/propinc.xsl

index 12d2cde716802e5ae82419fc3ee44284c0889740..e86a5fc27d7a552d9bb200185b82fa0227ea8a43 100644 (file)
   </xsl:choose>
   </xsl:variable>
    <xsl:variable name="bEnum">
-       <xsl:call-template name="isEnum"/>
+       <xsl:call-template name="hasEnum"/>
    </xsl:variable>
-   <xsl:if test="$bEnum='true'">
+   <xsl:variable name="bSubpropEnum">
+       <xsl:call-template name="hasSubpropEnum"/>
+   </xsl:variable>
+
+   <xsl:if test="$bEnum='true' or contains($bSubpropEnum, 'true')">
 <redirect:write select="concat('@org/apache/fop@/fo/properties/', $classname, '.java')">
 package org.apache.fop.fo.properties;
 
 <!-- Handle enumeration values -->
     public interface <xsl:value-of select="$classname"/>
-    <xsl:if test="use-generic">
+    <xsl:if test="use-generic and $bEnum='true'">
        extends  <xsl:value-of select="use-generic"/>.Enums
     </xsl:if>{
    <xsl:for-each select="enumeration/value">
      public final static int <xsl:value-of select="@const"/> = <xsl:number/>;
 </xsl:for-each>
+<xsl:if test="contains($bSubpropEnum, 'true')">
+    <xsl:call-template name="genSubpropEnum"/>
+</xsl:if>
     }
 </redirect:write>
    </xsl:if>
 </xsl:template>
 
+<xsl:template name="genSubpropEnum">
+  <xsl:param name="prop" select="."/>
+  <xsl:choose>
+    <xsl:when test="$prop/compound/subproperty/enumeration">
+      <xsl:for-each select="compound/subproperty[enumeration]">
+      public interface <xsl:value-of select="name"/> {
+        <xsl:for-each select="enumeration/value">
+        public final static int <xsl:value-of select="@const"/> = <xsl:number/>;
+        </xsl:for-each>
+      }
+      </xsl:for-each>
+    </xsl:when>
+    <xsl:when test="$prop/use-generic">
+      <xsl:call-template name="inhspenums">
+         <xsl:with-param name="prop" select="key('genericref', $prop/use-generic)"/>
+      </xsl:call-template>
+    </xsl:when>
+    <xsl:when test="$prop/compound/subproperty/use-generic">
+       <!-- generate "interface <subprop> extends <gensubprop>.Enums" -->
+       <xsl:for-each select="$prop/compound/subproperty[use-generic]">
+         <xsl:variable name="bSpEnum">
+           <xsl:call-template name="hasEnum">
+             <xsl:with-param name="prop"
+               select="key('genericref', use-generic)"/>
+            </xsl:call-template>
+         </xsl:variable>
+         <xsl:if test="$bSpEnum='true'">
+         public interface  <xsl:value-of select="name"/> extends  <xsl:value-of select="use-generic"/>.Enums { }
+         </xsl:if>
+       </xsl:for-each>
+    </xsl:when>
+    <xsl:otherwise>false</xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inhspenums">
+  <xsl:param name="prop"/>
+      <xsl:variable name="generic_name">
+  <xsl:choose>
+    <xsl:when test="$prop/class-name">
+      <xsl:value-of select="$prop/class-name"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="makeClassName">
+        <xsl:with-param name="propstr" select="$prop/name"/>
+      </xsl:call-template>
+    </xsl:otherwise>
+  </xsl:choose>
+      </xsl:variable>
+       <!-- generate "interface <subprop> extends <genprop>.<subprop>" -->
+      <xsl:for-each select="$prop/compound/subproperty[enumeration]">
+      <xsl:variable name="spname">
+        <xsl:call-template name="makeClassName">
+          <xsl:with-param name="propstr" select="name"/>
+        </xsl:call-template>
+      </xsl:variable>
+      public interface <xsl:value-of select="$spname"/> extends <xsl:value-of select="$generic_name"/>.Enums.<xsl:value-of select="$spname"/> {
+      }
+      </xsl:for-each>
+      
+    <xsl:if test="$prop/use-generic">
+      <xsl:call-template name="inhspenums">
+         <xsl:with-param name="prop" select="key('genericref', $prop/use-generic)"/>
+      </xsl:call-template>
+    </xsl:if>
+</xsl:template>
 
 </xsl:stylesheet>
index 1cc4e892194e2527c7ef72086815bb4533c178f2..e6f7549d9cafeb34fefdd934f75c638343963876 100644 (file)
   <property type="generic">
     <name>generic-keep</name>
     <class-name>GenericKeep</class-name>
-    <datatype>Number</datatype>
-    <keyword-equiv match="auto" eval="true">0</keyword-equiv>
-    <keyword-equiv match="always" eval="true">-1</keyword-equiv>
-<!--      <compound>
-      <subproperty>
+    <datatype>Keep</datatype> <!-- CompoundDatatype -->
+    <compound>
+      <subproperty set-by-shorthand="true">
         <name>within-page</name>
-        <datatype>Number</datatype>
+    <datatype>Number</datatype>
+    <default>auto</default>
+      <enumeration>
+        <value const="AUTO">auto</value>
+        <value const="ALWAYS">always</value>
+      </enumeration>
       </subproperty>
-      <subproperty>
+      <subproperty set-by-shorthand="true">
         <name>within-line</name>
-        <datatype>Number</datatype>
+    <datatype>Number</datatype>
+    <default>auto</default>
+      <enumeration>
+        <value const="AUTO">auto</value>
+        <value const="ALWAYS">always</value>
+      </enumeration>
       </subproperty>
-      <subproperty>
+      <subproperty set-by-shorthand="true">
         <name>within-column</name>
-        <datatype>Number</datatype>
+    <datatype>Number</datatype>
+    <default>auto</default>
+      <enumeration>
+        <value const="AUTO">auto</value>
+        <value const="ALWAYS">always</value>
+      </enumeration>
       </subproperty>
-    </compound>-->
+    </compound>
   </property>
   <property type="generic">
     <name>conditional-length-template</name>
       </subproperty>
       <subproperty>
         <name>conditionality</name>
-        <datatype>String</datatype>  <!-- NCName or Enum ??? -->
+        <datatype>Enum</datatype>
+        <enumeration>
+          <value const="DISCARD">discard</value>
+          <value const="RETAIN">retain</value>
+        </enumeration>
       </subproperty>
     </compound>
   </property>
         <default>medium</default>
       </subproperty>
       <subproperty>
+        <datatype>Enum</datatype>
         <name>conditionality</name>
-        <datatype>String</datatype>  <!-- NCName or Enum ??? -->
+        <enumeration>
+          <value const="DISCARD">discard</value>
+          <value const="RETAIN">retain</value>
+        </enumeration>
       </subproperty>
     </compound>
   </property>
       <subproperty>
         <name>precedence</name>
         <datatype>Number</datatype>
+        <enumeration>
+          <value const="FORCE">force</value>
+        </enumeration>
         <default>0</default>
       </subproperty>
       <subproperty>
         <name>conditionality</name>
-        <datatype>String</datatype>  <!-- NCName or Enum ??? -->
+        <datatype>Enum</datatype>
+        <enumeration>
+          <value const="DISCARD">discard</value>
+          <value const="RETAIN">retain</value>
+        </enumeration>
         <default>discard</default>
       </subproperty>
     </compound>
     <inherited>true</inherited>
     <datatype>Length</datatype>
     <default>0pt</default>
+    <corresponding use-if-specified="true">
+      <propval>margin-<wmrel2abs dir="START"/></propval>
+      <propexpr>
+      <propval>margin-<wmrel2abs dir="START"/></propval>+
+      <propval>padding-<wmrel2abs dir="START"/></propval>+
+      <propval>border-<wmrel2abs dir="START"/>-width</propval>
+      </propexpr>
+    </corresponding>
   </property>
   <property>
     <name>font-style</name>
     <inherited>true</inherited>
     <datatype>Length</datatype>
     <default>0pt</default>
+    <corresponding use-if-specified="true">
+      <propval>margin-<wmrel2abs dir="END"/></propval>
+      <propexpr>
+      <propval>margin-<wmrel2abs dir="END"/></propval>+
+      <propval>padding-<wmrel2abs dir="END"/></propval>+
+      <propval>border-<wmrel2abs dir="END"/>-width</propval>
+      </propexpr>
+    </corresponding>
   </property>
   <property>
     <name>color</name>
     <name>padding-before</name>
     <use-generic>GenericCondPadding</use-generic>
     <default subproperty="conditionality">retain</default>
+    <corresponding use-if-specified="true">
+      <propval>padding-<wmrel2abs dir="BEFORE"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-after</name>
     <use-generic>GenericCondPadding</use-generic>
     <default subproperty="conditionality">retain</default>
+    <corresponding use-if-specified="true">
+      <propval>padding-<wmrel2abs dir="AFTER"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-start</name>
     <use-generic>GenericCondPadding</use-generic>
     <default subproperty="conditionality">discard</default>
+    <corresponding use-if-specified="true">
+      <propval>padding-<wmrel2abs dir="START"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-end</name>
     <use-generic>GenericCondPadding</use-generic>
     <default subproperty="conditionality">discard</default>
+    <corresponding use-if-specified="true">
+      <propval>padding-<wmrel2abs dir="END"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-top</name>
     <use-generic>GenericPadding</use-generic>
+    <corresponding>
+      <propval>padding-<wmabs2rel dir="TOP"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-left</name>
     <use-generic>GenericPadding</use-generic>
+    <corresponding>
+      <propval>padding-<wmabs2rel dir="LEFT"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-bottom</name>
     <use-generic>GenericPadding</use-generic>
+    <corresponding>
+      <propval>padding-<wmabs2rel dir="BOTTOM"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>padding-right</name>
     <use-generic>GenericPadding</use-generic>
+    <corresponding>
+      <propval>padding-<wmabs2rel dir="RIGHT"/></propval>
+    </corresponding>
   </property>
   <property>
     <name>external-destination</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="BEFORE"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-before-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="BEFORE"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-before-width</name>
     <use-generic>GenericCondBorderWidth</use-generic>
     <default subproperty="conditionality">retain</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="BEFORE"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-after-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="AFTER"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-after-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="AFTER"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-after-width</name>
     <use-generic>GenericCondBorderWidth</use-generic>
     <default subproperty="conditionality">retain</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="AFTER"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-start-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="START"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-start-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="START"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-start-width</name>
     <use-generic>GenericCondBorderWidth</use-generic>
     <default subproperty="conditionality">discard</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="START"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-end-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="END"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-end-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="END"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-end-width</name>
     <use-generic>GenericCondBorderWidth</use-generic>
     <default subproperty="conditionality">discard</default>
+    <corresponding use-if-specified="true">
+      <propval>border-<wmrel2abs dir="END"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-top-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="TOP"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-top-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="TOP"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-top-width</name>
     <use-generic>GenericBorderWidth</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="TOP"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-bottom-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="BOTTOM"/>-color</propval>
+    </corresponding>
     <default>black</default>
   </property>
   <property>
     <name>border-bottom-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="BOTTOM"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-bottom-width</name>
     <use-generic>GenericBorderWidth</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="BOTTOM"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-left-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="LEFT"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-left-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="LEFT"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-left-width</name>
     <use-generic>GenericBorderWidth</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="LEFT"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-right-color</name>
     <inherited>false</inherited>
     <use-generic>GenericColor</use-generic>
     <default>black</default>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="RIGHT"/>-color</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-right-style</name>
     <use-generic>GenericBorderStyle</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="RIGHT"/>-style</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-right-width</name>
     <use-generic>GenericBorderWidth</use-generic>
+    <corresponding>
+      <propval>border-<wmabs2rel dir="RIGHT"/>-width</propval>
+    </corresponding>
   </property>
   <property>
     <name>border-color</name>
     <default>none</default>
   </property>
 
+  <property>
+    <name>writing-mode</name>
+    <inherited>true</inherited>
+    <datatype>Enum</datatype>
+    <default>lr-tb</default>
+    <enumeration>
+      <value const="LR_TB">lr-tb</value>
+      <value const="RL_TB">rl-tb</value>
+      <value const="TB_RL">tb-rl</value>
+    </enumeration>
+  </property>
+  
+  <property>
+    <name>block-progression-dimension</name>
+    <inherited>false</inherited>
+    <datatype>LengthRange</datatype>
+    <corresponding use-if-specified="true">
+      <propval><wmrel2abs dir="BLOCKPROGDIM"/></propval>
+    </corresponding>>
+    <compound>
+      <subproperty set-by-shorthand="true">
+        <name>minimum</name>
+        <datatype>Length</datatype>
+       <default>auto</default>
+       <auto-ok/>
+       <percent-ok base="CONTAINING_BOX"/>
+        <corresponding>
+          <propval>min-<wmrel2abs dir="BLOCKPROGDIM"/></propval>
+        </corresponding>>
+      </subproperty>
+      <subproperty set-by-shorthand="true">
+        <name>optimum</name>
+        <datatype>Length</datatype>
+       <default>auto</default> 
+       <auto-ok/>
+       <percent-ok base="CONTAINING_BOX"/>
+      </subproperty>
+      <subproperty set-by-shorthand="true">
+        <name>maximum</name>
+        <datatype>Length</datatype>
+       <auto-ok/>
+       <default>auto</default>
+       <percent-ok base="CONTAINING_BOX"/>
+        <corresponding>
+          <propval>max-<wmrel2abs dir="BLOCKPROGDIM"/></propval>
+        </corresponding>>
+      </subproperty>
+    </compound>
+  </property>
+
  </generic-property-list>
 </property-list>
 
index 7d5c3b4c42aae92fc2a9995c318e38d0a59bfa12..a8a6a9d79ebc4c24cb2f8c764cd935ef63c18d93 100644 (file)
@@ -1,3 +1,4 @@
+<!-- $Id$ -->
 <!--
 DTD for foproperties.xml and svgproperties.xml
 -->
@@ -22,7 +23,7 @@ DTD for foproperties.xml and svgproperties.xml
 <!-- Define a single property in the current namespace -->
 <!ELEMENT property (name, (use-generic | datatype), class-name?, inherited?,
         default?, enumeration?, datatype-conversion*, compound?,
-        keyword-equiv*, percent-ok?, auto-ok? ) >
+        keyword-equiv*, percent-ok?, auto-ok?, derive?, corresponding? ) >
      
 <!-- If type is set to "ref", then this is not a new property definition,
      but rather a reference to a property allready defined (should be in
@@ -111,6 +112,12 @@ DTD for foproperties.xml and svgproperties.xml
           
 <!-- This gives the default value for a property if it is not specified on
      a given FO. (The spec calls this the "initial" value.)
+
+     It may also be used to specify a default value for a particular
+     component of a compound property. This is used to give each component
+     its initial value if components are only partially specified in the
+     FO file.
+
      NOTE: It should be an expression which can be parsed to give a legal
      value for the property! This can't be checked by the generating
      script, so if there is a problem, it will only be seen at runtime.
@@ -120,10 +127,17 @@ DTD for foproperties.xml and svgproperties.xml
      case), it will only make one Property object with the default value
      and return it on each call. Context-dependent default values include
      those specified with relative units (eg. 1em).
+
+     The "subproperty" attribute can be used on properties which are
+     based on generic property specifications to specify a default value
+     for a particular component. For example, the border-end-width property
+     is based on GenericCondBorderWidth and specifies a specific default
+     for the "conditionality" component.
 -->     
 <!ELEMENT default (#PCDATA) >
-<!ELEMENT default
+<!ATTLIST default
        contextdep      (true | false) "false"
+       subproperty     CDATA #IMPLIED
 >
        
 
@@ -144,7 +158,23 @@ DTD for foproperties.xml and svgproperties.xml
      and not to a ColorType, the datatype-conversion just uses it to
      directly initialize a ColorType object.
 -->
-<!ELEMENT datatype-conversion >
+<!ELEMENT datatype-conversion (#PCDATA) >
+
+<!-- The attribute from-type gives a possible property datatype, such as
+     Number or String. The varname gives the name of a variable which can
+     be used in the content of the datatype-conversion element. If the type
+     of the variable is not the same as from-type, it may be specified with
+     the attribute vartype.
+
+     An example of usage is from the line-height property. This should be
+     a Length object, but may be specified as a Number, which is interpreted
+     as though it were a percentage of the current font-size.
+-->
+<!ATTLIST datatype-conversion
+    from-type    CDATA   #REQUIRED
+    vartype      CDATA   #IMPLIED
+    varname      CDATA   #REQUIRED
+>
 
 <!-- The compound element indicates that the property is a "compound"
      property as defined in the XSL specification. It is specified as one
@@ -160,7 +190,8 @@ DTD for foproperties.xml and svgproperties.xml
      property, the optimum component has the name optimum and the datatype
      Length.
 -->
-<!ELEMENT subproperty (name, datatype) >
+<!ELEMENT subproperty (name, datatype, auto-ok?, default?, corresponding?,
+   enumeration?, keyword-equiv? ) >
 
 <!-- This element which may be repeated, specifies keyword shorthands for
      non-enumerated properties. For example, the border-width family of
@@ -228,3 +259,54 @@ DTD for foproperties.xml and svgproperties.xml
 <!ATTLIST   if
        match   CDATA   #REQUIRED
 >
+
+<!-- This element indicates that the value of the property is the same as
+     that of a "corresponding" absolute or writing-mode-relative property.
+     if the "use-if-specified" attribute has the value "true", then the
+     corresponding property value takes precedence over the property on
+     which it is specified. To be conformant to the specification, all the
+     the "absolute" versions of properties have precedence.
+     Example: if a get() call is made on padding-end for a FO using lr-tb
+     writing-mode, then the padding-right property will be used if it is
+     specified, even if padding-end is actually specified.
+     However, if a get() is made on padding-right, the value of padding-end
+     will only be used if padding-right isn't specified on the FO.
+-->
+
+<!ELEMENT   corresponding (propval, propexpr?) >
+<!ATTLIST   corresponding
+    use-if-specified (true|false) "false"
+>
+
+<!-- If the value must be calculated using several other properties, the
+     propexpr element may be used. Then only example I know of are the
+     indent properties which are calculated based on the margin-* values
+     if those are specified, plus the corresponding padding and border-width
+     values.
+-->
+<!ELEMENT   propexpr (propval | #PCDATA)+ >
+
+<!-- The name of the corresponding property is given in the propval element.
+     The conversion between absolute and relative property names is
+     made using wmrel2abs or wm2bs2rel elements, intermixed with text.
+     For example, for the property "padding-left", the corresponding
+     property is "padding-start" if the inline progression direction is
+     left to right. This is expressed in the properties file with the
+     expression "padding-<wmabs2rel dir='LEFT'/>". The wmabs2rel element
+     is replaced by the writing-mode relative direction which corresponds
+     to the absolute direction LEFT using the writing-mode in effect for the
+     flow object where this property is specified.
+-->
+<!ELEMENT   propval (wmrel2abs | wmabs2rel | #PCDATA)+ >
+
+<!ELEMENT   wmrel2abs EMPTY>
+<!ATTLIST   wmrel2abs 
+  dir (BEFORE | AFTER | START | END | BLOCKPROGDIM | INLINEPROGDIM)
+  #REQUIRED
+>
+
+<!ELEMENT   wmabs2rel EMPTY>
+<!ATTLIST   wmabs2rel
+  dir (TOP | BOTTOM | LEFT | RIGHT | HEIGHT | WIDTH )  #REQUIRED
+>
+
index 95f768a607486cba957a15eb3ff7b0667b686636..aae85444d24c1029a591b5ca72f6ace2a7bed08b 100644 (file)
     }
 </xsl:template>
 
+<xsl:template match="enumeration">
+    public Property checkEnumValues(String value) {
+    <xsl:for-each select="value">
+      if (value.equals("<xsl:value-of select="."/>")) { return s_prop<xsl:value-of select="@const"/>; }
+    </xsl:for-each>
+       return super.checkEnumValues(value);
+    }
+</xsl:template>
+
+
 <!-- Look for keyword equivalents. Value is the new expression  -->
 <xsl:template match="keyword-equiv[1]">
     protected String checkValueKeywords(String value) {
@@ -193,14 +203,27 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
 
 <!-- If has enumerated values and is a generic class, create a nested
   interface defining the enumeration constants -->
-<xsl:if test="enumeration/value and @type='generic'">
+<xsl:if test=".//enumeration and @type='generic'">
   public interface Enums {
 <xsl:for-each select="enumeration/value">
     int <xsl:value-of select="@const"/> = <xsl:number/>;
+</xsl:for-each>
+<xsl:for-each select="compound/subproperty[enumeration]">
+       <xsl:variable name="spname">
+       <xsl:call-template name="makeClassName">
+          <xsl:with-param name="propstr" select="name"/>
+        </xsl:call-template>
+      </xsl:variable>
+  public interface <xsl:value-of select="$spname"/> {
+<xsl:for-each select="enumeration/value">
+    int <xsl:value-of select="@const"/> = <xsl:number/>;
+</xsl:for-each>
+  }
 </xsl:for-each>
   }
 </xsl:if>
 
+
 <!-- Handle enumeration values -->
 <xsl:for-each select="enumeration/value">
   protected final static EnumProperty s_prop<xsl:value-of select="@const"/> = new EnumProperty(<xsl:if test="../../@type='generic'">Enums.</xsl:if><xsl:value-of select="@const"/>);
@@ -208,22 +231,43 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
 
 
 <!-- Look for compound properties -->
-<xsl:if test="compound">
+<xsl:if test="compound"> 
+      <xsl:variable name="enumclass">
+      <xsl:choose>
+        <xsl:when test="@type='generic'">Enums</xsl:when>
+        <xsl:otherwise><xsl:value-of select="$eclassname"/></xsl:otherwise>
+      </xsl:choose>
+      </xsl:variable>
     <xsl:for-each select="compound/subproperty">
       <xsl:variable name="spname">
        <xsl:call-template name="makeClassName">
           <xsl:with-param name="propstr" select="name"/>
         </xsl:call-template>
       </xsl:variable>
+      <xsl:variable name="sp_superclass">
+        <xsl:choose>
+          <xsl:when test="use-generic">
+            <xsl:value-of select="use-generic"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="datatype"/><xsl:text>Property.Maker</xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
 
       <xsl:choose>
-        <xsl:when test='*[local-name(.)!="name" and local-name(.)!="datatype"]'>
+        <xsl:when test='*[local-name(.)!="name" and local-name(.)!="datatype" and local-name(.)!="use-generic" and local-name(.)!="default"]'>
     static private class SP_<xsl:value-of select="$spname"/>Maker 
-       extends <xsl:value-of select="datatype"/>Property.Maker {
-          SP_<xsl:value-of select="$spname"/>Maker(String sPropName) {
+       extends <xsl:value-of select="$sp_superclass"/>
+<xsl:if test="enumeration"> implements <xsl:value-of select="$enumclass"/>.<xsl:value-of select="$spname"/></xsl:if> {
+       SP_<xsl:value-of select="$spname"/>Maker(String sPropName) {
             super(sPropName);
-           }
-       <xsl:apply-templates select="percent-ok|auto-ok|keyword-equiv|datatype-conversion"/>
+        }
+<xsl:for-each select="enumeration/value">
+       protected final static EnumProperty s_prop<xsl:value-of select="@const"/> = new EnumProperty(<xsl:value-of select="@const"/>);
+</xsl:for-each>
+
+       <xsl:apply-templates select="percent-ok|auto-ok|keyword-equiv|datatype-conversion|enumeration"/>
     }
     final private static Property.Maker s_<xsl:value-of select="$spname"/>Maker =
        new SP_<xsl:value-of select="$spname"/>Maker(
@@ -231,7 +275,7 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
         </xsl:when>
         <xsl:otherwise>
     final private static Property.Maker s_<xsl:value-of select="$spname"/>Maker =
-       new <xsl:value-of select="datatype"/>Property.Maker(
+       new <xsl:value-of select="$sp_superclass"/>(
             "<xsl:value-of select='../../name'/>.<xsl:value-of select='name'/>");
        </xsl:otherwise>
       </xsl:choose>
@@ -244,9 +288,22 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
 
     protected <xsl:value-of select="$classname"/>(String name) {
        super(name);
+<xsl:if test="compound">
+        m_shorthandMaker= getSubpropMaker("<xsl:value-of select='compound/subproperty[@set-by-shorthand="true"]/name'/>");
+</xsl:if>
     }
 
 <xsl:if test="compound">
+    Property.Maker m_shorthandMaker;
+
+    public Property checkEnumValues(String value) {
+       return m_shorthandMaker.checkEnumValues(value);
+    }
+
+    protected boolean isCompoundMaker() {
+      return true;
+    }
+
     protected Property.Maker getSubpropMaker(String subprop) {
     <xsl:for-each select="compound/subproperty">
       <xsl:variable name="spname">
@@ -262,36 +319,16 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
 
     protected Property setSubprop(Property baseProp, String subpropName,
        Property subProp) {
-      <xsl:value-of select="datatype"/> val = 
-       ((<xsl:value-of select="$propclass"/>)baseProp).get<xsl:value-of select="datatype"/>();
-    <xsl:for-each select="compound/subproperty">
-      <xsl:variable name="spname">
-       <xsl:call-template name="makeClassName">
-          <xsl:with-param name="propstr" select="name"/>
-        </xsl:call-template>
-      </xsl:variable>
-       if (subpropName.equals("<xsl:value-of select='name'/>"))
-         val.set<xsl:value-of select='$spname'/>(subProp.get<xsl:value-of select='datatype'/>(), false);
-       else
-    </xsl:for-each>
-         return super.setSubprop(baseProp, subpropName, subProp);
+        <xsl:value-of select="datatype"/> val = baseProp.get<xsl:value-of select="datatype"/>();
+       // Do some type checking???
+       // Check if one of our subproperties???
+       val.setComponent(subpropName, subProp, false);
        return baseProp;
     }
 
     public Property getSubpropValue(Property baseProp, String subpropName) {
-      <xsl:value-of select="datatype"/> val = 
-       ((<xsl:value-of select="$propclass"/>)baseProp).get<xsl:value-of select="datatype"/>();
-    <xsl:for-each select="compound/subproperty">
-      <xsl:variable name="spname">
-       <xsl:call-template name="makeClassName">
-          <xsl:with-param name="propstr" select="name"/>
-        </xsl:call-template>
-      </xsl:variable>
-       if (subpropName.equals("<xsl:value-of select='name'/>"))
-         return new <xsl:value-of select='datatype'/>Property(
-       val.get<xsl:value-of select='$spname'/>());
-    </xsl:for-each>
-        return super.getSubpropValue(baseProp, subpropName);
+      <xsl:value-of select="datatype"/> val = baseProp.get<xsl:value-of select="datatype"/>();
+      return val.getComponent(subpropName);
     }
 <xsl:choose>  
 <!-- some subproperty default is context dependent; don't cache default! -->  
@@ -323,7 +360,7 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
         // set default for subprop <xsl:value-of select="."/>
         subProp = getSubpropMaker("<xsl:value-of select='.'/>").make(pList,
          getDefaultFor<xsl:value-of select='$spname'/>(), fo);
-         p.set<xsl:value-of select='$spname'/>(subProp.get<xsl:value-of select='../datatype'/>(), true);
+         p.setComponent("<xsl:value-of select='.'/>", subProp, true);
     </xsl:for-each>
        return new <xsl:value-of select="$propclass"/>(p);
     }
@@ -338,6 +375,8 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
     protected String getDefaultFor<xsl:value-of  select='$spname'/>() {
       <xsl:choose><xsl:when test="default">
        return "<xsl:value-of  select='default'/>";
+        </xsl:when><xsl:when test="use-generic and key('genericref', use-generic)/default">
+       return "<xsl:value-of select='key(&apos;genericref&apos;, use-generic)/default'/>";
         </xsl:when><xsl:otherwise>
        return "";
        </xsl:otherwise>
@@ -346,43 +385,30 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
     </xsl:for-each>
 
     /** Set the appropriate components when the "base" property is set. */
-    protected Property convertProperty(Property p, PropertyList pList,FObj fo)
+    public Property convertProperty(Property p, PropertyList pList,FObj fo)
        throws FOPException
     {
-<xsl:variable name="spdt">
-  <xsl:call-template name="check-subprop-datatype">
-    <xsl:with-param name="dtlist"
-        select="compound/subproperty[@set-by-shorthand='true']/datatype"/>
-  </xsl:call-template>
-</xsl:variable>
-<!--
-        Property sub= getSubpropMaker("<xsl:value-of select='compound/subproperty[@set-by-shorthand="true"]/name'/>").convertProperty(p,pList,fo);
-       if (sub != null) {
-          <xsl:value-of select='$spdt'/> spval=sub.get<xsl:value-of select='$spdt'/>();
--->
-        <xsl:value-of select='$spdt'/> spval=p.get<xsl:value-of select='$spdt'/>();
-       if (spval == null) {
-         // NOTE: must convert to the component datatype, not compound!
-         Property pconv = convertPropertyDatatype(p, pList, fo);
-         if (pconv != null) {
-           spval=pconv.get<xsl:value-of select='$spdt'/>();
-          }
+        if (p instanceof <xsl:value-of select="$propclass"/>) return p;
+       if (! (p instanceof EnumProperty)) {
+         // delegate to the subprop maker to do conversions
+         p = m_shorthandMaker.convertProperty(p,pList,fo);
         }
-       if (spval != null) {
+       if (p != null) {
          Property prop = makeCompound(pList, fo);
-         <xsl:value-of select='datatype'/> pval = prop.get<xsl:value-of select='datatype'/>();
+
+         <xsl:value-of select="datatype"/> pval = prop.get<xsl:value-of select="datatype"/>();
 <xsl:for-each select="compound/subproperty[@set-by-shorthand='true']">
-      <xsl:variable name="spname"><xsl:call-template name="makeClassName">
-          <xsl:with-param name="propstr" select="name"/>
-        </xsl:call-template></xsl:variable>
-         pval.set<xsl:value-of select='$spname'/>(spval, false);
+         pval.setComponent("<xsl:value-of select='name'/>", p, false);
 </xsl:for-each>
           return prop;
         }
+       else return null;
+<!--
         else {
          // throw some kind of exception!
          throw new FOPException("Can't convert value to <xsl:value-of select='$spdt'/> type");
         }
+-->
     }
 
 </xsl:if> <!-- property/compound -->
@@ -399,14 +425,16 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
 </xsl:if>
 
 <!-- Handle enumerated values -->
+<!--
 <xsl:if test="enumeration/value">
-    protected Property findConstant(String value) {
+    public Property checkEnumValues(String value) {
     <xsl:for-each select="enumeration/value">
       if (value.equals("<xsl:value-of select="."/>")) { return s_prop<xsl:value-of select="@const"/>; }
     </xsl:for-each>
-       return super.findConstant(value);
+       return super.checkEnumValues(value);
     }
 </xsl:if>
+-->
 
 <!-- Currently only works for Enum values -->
 <xsl:if test="derive">
@@ -424,12 +452,86 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
       return computedProperty;
     }
 </xsl:if>
-<xsl:apply-templates select="percent-ok|auto-ok|default|keyword-equiv|datatype-conversion"/>
+
+<!-- If any corresponding element at property or subproperty levels -->
+<xsl:if test=".//corresponding">
+    <xsl:if test=".//corresponding/@use-if-specified='true'">
+    public boolean isCorrespondingForced(PropertyList propertyList) {
+      StringBuffer sbExpr=new StringBuffer();
+      <xsl:for-each select=".//corresponding/propval">
+      sbExpr.setLength(0);
+      <xsl:apply-templates select="."/>
+      if (propertyList.getExplicit(sbExpr.toString()) != null) return true;
+      </xsl:for-each> 
+      return false;
+    }
+    </xsl:if>
+    
+    public Property compute(PropertyList propertyList) throws FOPException {
+      FObj parentFO = propertyList.getParentFObj();
+      StringBuffer sbExpr=new StringBuffer();
+      Property p=null;
+      <xsl:choose><xsl:when test="corresponding/propexpr">
+      <xsl:apply-templates select="corresponding/propval"/>
+       // Make sure the property is set before calculating it!
+      if (propertyList.getExplicit(sbExpr.toString()) == null) return p;
+      sbExpr.setLength(0);
+      <xsl:apply-templates select="corresponding/propexpr"/>
+      p= make(propertyList, sbExpr.toString(), propertyList.getParentFObj());
+      </xsl:when><xsl:otherwise>
+      <xsl:apply-templates select="corresponding/propval"/>
+      p= propertyList.getExplicit(sbExpr.toString());
+      </xsl:otherwise></xsl:choose>
+      if (p != null) {
+          p = convertProperty(p, propertyList, parentFO );
+      }
+      <xsl:if test="compound">
+      else p= makeCompound(propertyList, parentFO);
+      
+      Property subprop;
+      <xsl:for-each select="compound/subproperty/corresponding">
+      sbExpr.setLength(0);
+      <xsl:choose><xsl:when test="propexpr">
+      <xsl:apply-templates select="propexpr"/>
+      subprop= getSubpropMaker("<xsl:value-of select='../name'/>").
+               make(propertyList, sbExpr.toString(), parentFO);
+      </xsl:when><xsl:otherwise>
+      <xsl:apply-templates select="propval"/>
+      subprop= propertyList.getExplicit(sbExpr.toString());
+      </xsl:otherwise></xsl:choose>
+      setSubprop(p, "<xsl:value-of select='../name'/>", subprop);
+      </xsl:for-each>
+      </xsl:if>
+      return p;
+    }
+</xsl:if>
+
+<xsl:apply-templates select="percent-ok|auto-ok|default|keyword-equiv|datatype-conversion|enumeration"/>
 }
 </redirect:write>
 </xsl:if> <!-- need to create a class -->
 </xsl:template>
 
+<xsl:template match="corresponding/propexpr/propval">
+   sbExpr.append("_fop-property-value("); <!-- Note: interpreted by property parser -->
+   <xsl:apply-templates/>
+   sbExpr.append(")");
+</xsl:template>
+
+
+<xsl:template match="corresponding//text()">
+   <xsl:variable name="tval" select='normalize-space(.)'/>
+   <xsl:if test="$tval != ''">sbExpr.append("<xsl:value-of select='$tval'/>");</xsl:if>
+</xsl:template>
+
+<xsl:template match="propval/wmrel2abs">
+   sbExpr.append(propertyList.wmRelToAbs(PropertyList.<xsl:value-of select="@dir"/>));
+</xsl:template>
+
+<xsl:template match="propval/wmabs2rel">
+   sbExpr.append(propertyList.wmAbsToRel(PropertyList.<xsl:value-of select="@dir"/>));
+</xsl:template>
+
 <!-- avoid unwanted output to placeholder file -->
 <xsl:template match="localname"/>
 
@@ -451,4 +553,5 @@ public class <xsl:value-of select="$classname"/> extends  <xsl:value-of select="
     <xsl:value-of select='$dt'/>
 </xsl:template>
 
+
 </xsl:stylesheet>
index e25755aa600635ca3060db01483f8cdbe90047e6..87f62e60a467aa63c24922461dd630814077b4e7 100644 (file)
 </xsl:template>
 
 <!-- return a boolean value -->
-<xsl:template name="isEnum">
+<xsl:template name="hasEnum">
   <xsl:param name="prop" select="."/>
   <xsl:choose>
-    <xsl:when test="$prop/datatype">
-       <xsl:value-of select="boolean($prop/datatype='Enum')"/>
+    <xsl:when test="$prop/enumeration">true</xsl:when>
+    <xsl:when test="$prop/use-generic">
+      <!-- If no datatype child, then the prop must use the same datatype as
+           its template. -->
+       <xsl:call-template name="hasEnum">
+         <xsl:with-param name="prop"
+          select="key('genericref', $prop/use-generic)"/>
+        </xsl:call-template>
     </xsl:when>
+    <xsl:otherwise>false</xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<!-- return a boolean value -->
+<xsl:template name="hasSubpropEnum">
+  <xsl:param name="prop" select="."/>
+  <xsl:choose>
+    <xsl:when test="$prop/compound/subproperty/enumeration">true</xsl:when>
     <xsl:when test="$prop/use-generic">
       <!-- If no datatype child, then the prop must use the same datatype as
            its template. -->
-       <xsl:call-template name="isEnum">
+       <xsl:call-template name="hasSubpropEnum">
          <xsl:with-param name="prop"
           select="key('genericref', $prop/use-generic)"/>
         </xsl:call-template>
     </xsl:when>
+    <xsl:when test="$prop/compound/subproperty/use-generic">
+       <xsl:for-each select="$prop/compound/subproperty[use-generic]">
+         <xsl:call-template name="hasEnum">
+           <xsl:with-param name="prop"
+               select="key('genericref', use-generic)"/>
+          </xsl:call-template>
+       </xsl:for-each>
+    </xsl:when>
     <xsl:otherwise>false</xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 
-</xsl:stylesheet>
\ No newline at end of file
+</xsl:stylesheet>