pbwest 2002/09/23 22:26:42
Modified: src/org/apache/fop/fo/expr Tag: FOP_0-20-0_Alt-Design
PropertyParser.java
Log:
Invoke parser with FONode arg.
Call fromParent() and fromNearestSpecified() methods in FONode.
Revision Changes Path
No revision
No revision
1.5.2.11 +200 -155 xml-fop/src/org/apache/fop/fo/expr/PropertyParser.java
Index: PropertyParser.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/expr/PropertyParser.java,v
retrieving revision 1.5.2.10
retrieving revision 1.5.2.11
diff -u -r1.5.2.10 -r1.5.2.11
--- PropertyParser.java 18 Sep 2002 15:35:03 -0000 1.5.2.10
+++ PropertyParser.java 24 Sep 2002 05:26:42 -0000 1.5.2.11
@@ -11,6 +11,7 @@
import org.apache.fop.fo.Properties;
import org.apache.fop.fo.PropNames;
import org.apache.fop.fo.FOTree;
+import org.apache.fop.fo.FONode;
import org.apache.fop.fo.expr.SystemFontFunction;
import org.apache.fop.datatypes.PropertyValue;
@@ -56,6 +57,8 @@
/** The FO tree which has initiated this parser */
private FOTree foTree;
+ /** The FONode which has initiated this parser */
+ private FONode node;
public PropertyParser(FOTree foTree) {
super();
@@ -112,14 +115,16 @@
*
* <p>Note: If the property expression String is empty, a StringProperty
* object holding an empty String is returned.
- * @param property an <tt>int</tt> containing the property index.
+ * @param node - the <tt>FONode</tt> for which the property expression
+ * is being resolved.
+ * @param property - an <tt>int</tt> containing the property index.
* which the property expression is to be evaluated.
- * @param expr The specified value (attribute on the xml element).
- * @return A PropertyValue holding the parsed result.
- * @throws PropertyException If the "expr" cannot be parsed as a
+ * @param expr - the specified value (attribute on the xml element).
+ * @return a PropertyValue holding the parsed result.
+ * @throws PropertyException if the "expr" cannot be parsed as a
* PropertyValue.
*/
- public PropertyValue parse(int property, String expr)
+ public PropertyValue parse(FONode node, int property, String expr)
throws PropertyException
{
synchronized (this) {
@@ -128,6 +133,7 @@
throw new PropertyException
("PropertyParser is currently active.");
initialize(property, expr);
+ this.node = node;
}
next();
@@ -167,8 +173,8 @@
/**
* <p>Parse a property values sublist - a list of whitespace separated
* <tt>PropertyValue</tt>s.
- * </p><p>
- * Property value expressions for various properties may contaiin lists
+ * <p>
+ * Property value expressions for various properties may contain lists
* of values, which may be separated by whitespace or by commas. See,
* e.g., 7.6.17 "voice-family" and 7.8.2 "font-family". The shorthands
* may also contain lists of elements, generally (or exclusively)
@@ -404,164 +410,203 @@
// processing, so, like LPAR processing, next() is not called
// and the return from this method must be premature
prop = null;
- // Numeric functions
- if (currentTokenValue.equals("floor")) {
- PropertyValue[] args = parseArgs(1);
- prop = new Numeric
- (property, ((Numeric)args[0]).floor());
- }
- else if (currentTokenValue.equals("ceiling")) {
- PropertyValue[] args = parseArgs(1);
- prop = new Numeric
- (property, ((Numeric)args[0]).ceiling());
- }
- else if (currentTokenValue.equals("round")) {
- PropertyValue[] args = parseArgs(1);
- prop = new Numeric
- (property, ((Numeric)args[0]).round());
- }
- else if (currentTokenValue.equals("min")) {
- PropertyValue[] args = parseArgs(2);
- prop = new Numeric
+ int funcType = PropertyValue.NO_TYPE;
+ do {
+ // Numeric functions
+ if (currentTokenValue.equals("floor")) {
+ PropertyValue[] args = parseArgs(1);
+ prop = new Numeric
+ (property, ((Numeric)args[0]).floor());
+ break;
+ }
+ if (currentTokenValue.equals("ceiling")) {
+ PropertyValue[] args = parseArgs(1);
+ prop = new Numeric
+ (property, ((Numeric)args[0]).ceiling());
+ break;
+ }
+ if (currentTokenValue.equals("round")) {
+ PropertyValue[] args = parseArgs(1);
+ prop = new Numeric
+ (property, ((Numeric)args[0]).round());
+ break;
+ }
+ if (currentTokenValue.equals("min")) {
+ PropertyValue[] args = parseArgs(2);
+ prop = new Numeric
(property, ((Numeric)args[0]).min((Numeric)args[1]));
- }
- else if (currentTokenValue.equals("max")) {
- PropertyValue[] args = parseArgs(2);
- prop = new Numeric
+ break;
+ }
+ if (currentTokenValue.equals("max")) {
+ PropertyValue[] args = parseArgs(2);
+ prop = new Numeric
(property, ((Numeric)args[0]).max((Numeric)args[1]));
- }
- else if (currentTokenValue.equals("abs")) {
- PropertyValue[] args = parseArgs(1);
- prop = new Numeric
- (property, ((Numeric)args[0]).abs());
- }
+ break;
+ }
+ if (currentTokenValue.equals("abs")) {
+ PropertyValue[] args = parseArgs(1);
+ prop = new Numeric
+ (property, ((Numeric)args[0]).abs());
+ break;
+ }
- // Color functions
- else if (currentTokenValue.equals("rgb")) {
- PropertyValue[] args = parseArgs(3);
- prop = new ColorType
- (property, ((Numeric)args[0]).asInt(),
- ((Numeric)args[1]).asInt(),
- ((Numeric)args[2]).asInt());
- }
- else if (currentTokenValue.equals("rgb-icc")) {
- PropertyValue[] args = parseArgs(6);
- throw new FunctionNotImplementedException("rgb-icc");
- }
- else if (currentTokenValue.equals("system-color")) {
- PropertyValue[] args = parseArgs(1);
- prop = new ColorType
- (property, ((StringType)args[0]).getString());
- }
+ // Color functions
+ if (currentTokenValue.equals("rgb")) {
+ PropertyValue[] args = parseArgs(3);
+ prop = new ColorType
+ (property, ((Numeric)args[0]).asInt(),
+ ((Numeric)args[1]).asInt(),
+ ((Numeric)args[2]).asInt());
+ break;
+ }
+ if (currentTokenValue.equals("rgb-icc")) {
+ PropertyValue[] args = parseArgs(6);
+ throw new FunctionNotImplementedException("rgb-icc");
+ //break;
+ }
+ if (currentTokenValue.equals("system-color")) {
+ PropertyValue[] args = parseArgs(1);
+ prop = new ColorType
+ (property, ((StringType)args[0]).getString());
+ break;
+ }
- // Font function
- else if (currentTokenValue.equals("system-font")) {
- PropertyValue[] args = parseArgs(1, 2);
- if (args.length == 1) {
- prop = SystemFontFunction.systemFontCharacteristic
- (property,
- ((StringType)args[0]).getString());
- } else {
- // 2 args
- prop = SystemFontFunction.systemFontCharacteristic
- (property,
- ((StringType)args[0]).getString(),
- ((StringType)args[1]).getString());
+ // Font function
+ if (currentTokenValue.equals("system-font")) {
+ PropertyValue[] args = parseArgs(1, 2);
+ if (args.length == 1) {
+ prop = SystemFontFunction.systemFontCharacteristic
+ (property,
+ ((StringType)args[0]).getString());
+ } else {
+ // 2 args
+ prop = SystemFontFunction.systemFontCharacteristic
+ (property,
+ ((StringType)args[0]).getString(),
+ ((StringType)args[1]).getString());
+ }
+ break;
}
- }
- // Property value functions
- else if (currentTokenValue.equals("inherited-property-value")) {
- int propindex = property;
- PropertyValue[] args = parseArgs(0, 1);
- if (args.length != 0)
- propindex = PropertyConsts.getPropertyIndex(
- ((StringType)args[0]).getString());
- if (PropertyConsts.inheritance(propindex) == Properties.NO)
- throw new PropertyException
- ("inherited-property-value: "
- + PropNames.getPropertyName(propindex)
- + " is not inherited.");
- prop = new InheritedValue(property, propindex);
- }
- else if (currentTokenValue.equals("label-end")) {
- PropertyValue[] args = parseArgs(0);
- throw new FunctionNotImplementedException("label-end");
- }
- else if (currentTokenValue.equals("body-start")) {
- PropertyValue[] args = parseArgs(0);
- throw new FunctionNotImplementedException("body-start");
- }
- // N.B. see comments on classes FromNearestSpecified and
- // FromParent for explanation of this section
- else if (currentTokenValue.equals("from-parent") ||
- currentTokenValue.equals("from-nearest-specified-value"))
- {
- // Preset the return value in case of a shorthand property
+ // Property value functions
+ if (currentTokenValue.equals("inherited-property-value")) {
+ int propindex = property;
+ PropertyValue[] args = parseArgs(0, 1);
+ if (args.length != 0)
+ propindex = PropertyConsts.getPropertyIndex(
+ ((StringType)args[0]).getString());
+ if (PropertyConsts.inheritance(propindex) == Properties.NO)
+ throw new PropertyException
+ ("inherited-property-value: "
+ + PropNames.getPropertyName(propindex)
+ + " is not inherited.");
+ prop = new InheritedValue(property, propindex);
+ break;
+ }
+ if (currentTokenValue.equals("label-end")) {
+ PropertyValue[] args = parseArgs(0);
+ throw new FunctionNotImplementedException("label-end");
+ //break;
+ }
+ if (currentTokenValue.equals("body-start")) {
+ PropertyValue[] args = parseArgs(0);
+ throw new FunctionNotImplementedException("body-start");
+ //break;
+ }
+ // N.B. see comments on classes FromNearestSpecified and
+ // FromParent for explanation of this section
if (currentTokenValue.equals("from-parent"))
- prop = new FromParent(property);
- else
- prop = new FromNearestSpecified(property);
-
- PropertyValue[] args = parseArgs(0, 1);
- if (args.length == 0) {
- if (! PropertyConsts.isShorthand(property)) {
- // develop the function value and return it as
- // a property.
- throw new FunctionNotImplementedException
- (currentTokenValue);
+ funcType = PropertyValue.FROM_PARENT;
+ if (currentTokenValue.equals("from-nearest-specified-value"))
+ funcType = PropertyValue.FROM_NEAREST_SPECIFIED;
+ if (funcType == PropertyValue.FROM_PARENT
+ || funcType == PropertyValue.FROM_NEAREST_SPECIFIED)
+ {
+ // Preset the return value in case of a shorthand property
+ switch (funcType) {
+ case PropertyValue.FROM_PARENT:
+ prop = new FromParent(property);
+ case PropertyValue.FROM_NEAREST_SPECIFIED:
+ prop = new FromNearestSpecified(property);
}
- // else a shorthand - do nothing; prop has been set
- // to the appropriate pseudo-propertyValue
- } else { // one argument - it must be a property name
- if ( ! (args[0] instanceof NCName))
- throw new PropertyException
- (currentTokenValue + " function requires"
- + " property name arg.");
- // else arg[0] is an NCName
- NCName ncname = (NCName)args[0];
- String propname = ncname.getNCName();
- int nameindex = PropertyConsts.getPropertyIndex(propname);
- if (PropertyConsts.isShorthand(nameindex)) {
- // the argument is a shorthand property -
- // it must be the same as the property being
- // assigned to.
- // see 5.10.4 Property Value Functions
- if ( ! (nameindex == property))
+
+ PropertyValue[] args = parseArgs(0, 1);
+ if (args.length == 0) {
+ if (! (PropertyConsts.isShorthand(property)
+ || PropertyConsts.isCompound(property))) {
+ // develop the function value and return it as
+ // a property.
+ switch (funcType) {
+ case PropertyValue.FROM_PARENT:
+ prop = node.fromParent(property);
+ case PropertyValue.FROM_NEAREST_SPECIFIED:
+ prop = node.fromNearestSpecified(property);
+ }
+ }
+ // else a shorthand/compound - do nothing;
+ // prop has been
+ // set to the appropriate pseudo-propertyValue
+ } else { // one argument - it must be a property name
+ if ( ! (args[0] instanceof NCName))
throw new PropertyException
- (currentTokenValue +
- " argument " + propname +
- " does not match property " +
- PropNames.getPropertyName(property));
- // else perform shorthand processing
- // i.e. do nothing; prop has been set to the correct
- // pseudo-propertyValue
- }
- else { // An NCName but not a shorthand
- // Perform normal from-? processing
- throw new FunctionNotImplementedException
- (currentTokenValue);
+ (currentTokenValue + " function requires"
+ + " property name arg.");
+ // else arg[0] is an NCName
+ NCName ncname = (NCName)args[0];
+ String propname = ncname.getNCName();
+ int nameindex =
+ PropertyConsts.getPropertyIndex(propname);
+ if (PropertyConsts.isShorthand(nameindex)
+ || PropertyConsts.isCompound(nameindex)) {
+ // the argument is a shorthand/compound property -
+ // it must be the same as the property being
+ // assigned to.
+ // see 5.10.4 Property Value Functions
+ if ( ! (nameindex == property))
+ throw new PropertyException
+ (currentTokenValue +
+ " argument " + propname +
+ " does not match property " +
+ PropNames.getPropertyName(property));
+ // else perform shorthand/compound processing
+ // i.e. do nothing;
+ // prop has been set to the correct
+ // pseudo-propertyValue
+ }
+ else { // An NCName but not a shorthand/compound
+ // Perform normal from-? processing
+ switch (funcType) {
+ case PropertyValue.FROM_PARENT:
+ prop = node.fromParent(property, nameindex);
+ case PropertyValue.FROM_NEAREST_SPECIFIED:
+ prop = node.fromNearestSpecified
+ (property, nameindex);
+ }
+ }
}
+ break;
+ }
+ if (currentTokenValue.equals("from-table-column")) {
+ PropertyValue[] args = parseArgs(0, 1);
+ throw new FunctionNotImplementedException
+ ("from-table-column");
+ //break;
+ }
+ if (currentTokenValue.equals("proportional-column-width")) {
+ PropertyValue[] args = parseArgs(1);
+ throw new FunctionNotImplementedException
+ ("proportional-column-width");
+ //break;
+ }
+ if (currentTokenValue.equals("merge-property-values")) {
+ PropertyValue[] args = parseArgs(0, 1);
+ throw new FunctionNotImplementedException
+ ("merge-property-values");
+ //break;
}
- }
- else if (currentTokenValue.equals("from-table-column")) {
- PropertyValue[] args = parseArgs(0, 1);
- throw new FunctionNotImplementedException
- ("from-table-column");
- }
- else if (currentTokenValue.equals("proportional-column-width")) {
- PropertyValue[] args = parseArgs(1);
- throw new FunctionNotImplementedException
- ("proportional-column-width");
- }
- else if (currentTokenValue.equals("merge-property-values")) {
- PropertyValue[] args = parseArgs(0, 1);
- throw new FunctionNotImplementedException
- ("merge-property-values");
- }
- else
throw new PropertyException("no such function: "
- + currentTokenValue);
+ + currentTokenValue);
+ } while (false);
return prop;
}
default:
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]