Browse Source

Phase 1 of 26434.

- Unnest Property.Maker into fop.fo.properties.PropertyMaker.
- Move the handmade makers into package fop.fo.properties.

PR: 26434


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197310 13f79535-47bb-0310-9956-ffa450edef68
tags/Root_Temp_KnuthStylePageBreaking
Finn Bock 20 years ago
parent
commit
379b256739
28 changed files with 936 additions and 741 deletions
  1. 2
    1
      src/java/org/apache/fop/datatypes/ToBeImplementedProperty.java
  2. 3
    1
      src/java/org/apache/fop/fo/BoxPropShorthandParser.java
  3. 3
    1
      src/java/org/apache/fop/fo/CharacterProperty.java
  4. 2
    1
      src/java/org/apache/fop/fo/ColorTypeProperty.java
  5. 1
    0
      src/java/org/apache/fop/fo/CondLengthProperty.java
  6. 0
    67
      src/java/org/apache/fop/fo/DimensionPropertyMaker.java
  7. 2
    1
      src/java/org/apache/fop/fo/EnumProperty.java
  8. 49
    44
      src/java/org/apache/fop/fo/FOPropertyMapping.java
  9. 4
    3
      src/java/org/apache/fop/fo/FObj.java
  10. 4
    2
      src/java/org/apache/fop/fo/GenericShorthandParser.java
  11. 1
    0
      src/java/org/apache/fop/fo/KeepProperty.java
  12. 1
    0
      src/java/org/apache/fop/fo/LengthPairProperty.java
  13. 2
    1
      src/java/org/apache/fop/fo/LengthProperty.java
  14. 1
    0
      src/java/org/apache/fop/fo/LengthRangeProperty.java
  15. 3
    1
      src/java/org/apache/fop/fo/ListProperty.java
  16. 2
    1
      src/java/org/apache/fop/fo/NumberProperty.java
  17. 0
    580
      src/java/org/apache/fop/fo/Property.java
  18. 9
    9
      src/java/org/apache/fop/fo/PropertyList.java
  19. 3
    1
      src/java/org/apache/fop/fo/ShorthandParser.java
  20. 1
    0
      src/java/org/apache/fop/fo/SpaceProperty.java
  21. 3
    1
      src/java/org/apache/fop/fo/StringProperty.java
  22. 3
    3
      src/java/org/apache/fop/fo/expr/PropertyInfo.java
  23. 19
    14
      src/java/org/apache/fop/fo/properties/CompoundPropertyMaker.java
  24. 53
    6
      src/java/org/apache/fop/fo/properties/CorrespondingPropertyMaker.java
  25. 114
    0
      src/java/org/apache/fop/fo/properties/DimensionPropertyMaker.java
  26. 6
    2
      src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java
  27. 5
    1
      src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java
  28. 640
    0
      src/java/org/apache/fop/fo/properties/PropertyMaker.java

+ 2
- 1
src/java/org/apache/fop/datatypes/ToBeImplementedProperty.java View File

@@ -53,10 +53,11 @@ package org.apache.fop.datatypes;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.properties.PropertyMaker;

public class ToBeImplementedProperty extends Property {

public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

public Maker(int propId) {
super(propId);

+ 3
- 1
src/java/org/apache/fop/fo/BoxPropShorthandParser.java View File

@@ -50,6 +50,8 @@
*/
package org.apache.fop.fo;

import org.apache.fop.fo.properties.PropertyMaker;

/**
* Shorthand property parser for Box properties
*/
@@ -70,7 +72,7 @@ public class BoxPropShorthandParser extends GenericShorthandParser {
*/
protected Property convertValueForProperty(int propId,
ListProperty listProperty,
Property.Maker maker,
PropertyMaker maker,
PropertyList propertyList) {
String name = FOPropertyMapping.getPropertyName(propId);
Property p = null;

+ 3
- 1
src/java/org/apache/fop/fo/CharacterProperty.java View File

@@ -50,6 +50,8 @@
*/
package org.apache.fop.fo;

import org.apache.fop.fo.properties.PropertyMaker;

/**
* Superclass for properties that wrap a character value
*/
@@ -58,7 +60,7 @@ public class CharacterProperty extends Property {
/**
* Inner class for creating instances of CharacterProperty
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* @param propName name of property for which a Maker should be created

+ 2
- 1
src/java/org/apache/fop/fo/ColorTypeProperty.java View File

@@ -51,6 +51,7 @@
package org.apache.fop.fo;

import org.apache.fop.datatypes.ColorType;
import org.apache.fop.fo.properties.PropertyMaker;

/**
* Superclass for properties that wrap ColorType values
@@ -60,7 +61,7 @@ public class ColorTypeProperty extends Property {
/**
* Inner class for creating instances of ColorTypeProperty
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* @param propName name of property for which a Maker should be created

+ 1
- 0
src/java/org/apache/fop/fo/CondLengthProperty.java View File

@@ -53,6 +53,7 @@ package org.apache.fop.fo;
import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.CondLength;
import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.properties.CompoundPropertyMaker;

/**
* Superclass for properties that have conditional lengths

+ 0
- 67
src/java/org/apache/fop/fo/DimensionPropertyMaker.java View File

@@ -1,67 +0,0 @@
/*
* Created on Jan 1, 2004
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.apache.fop.fo;

import org.apache.fop.apps.FOPException;

/**
* @author me
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class DimensionPropertyMaker extends CorrespondingPropertyMaker {
int[][] extraCorresponding = null;

public DimensionPropertyMaker(Property.Maker baseMaker) {
super(baseMaker);
}
public void setExtraCorresponding(int[][] extraCorresponding) {
this.extraCorresponding = extraCorresponding;
}

public boolean isCorrespondingForced(PropertyList propertyList) {
if (super.isCorrespondingForced(propertyList))
return true;
for (int i = 0; i < extraCorresponding.length; i++) {
int wmcorr = extraCorresponding[i][0]; //propertyList.getWritingMode()];
if (propertyList.getExplicit(wmcorr) != null)
return true;
}
return false;
}

public Property compute(PropertyList propertyList) throws FOPException {
// Based on [width|height]
Property p = super.compute(propertyList);
if (p == null) {
p = baseMaker.make(propertyList);
}

// Based on min-[width|height]
int wmcorr = propertyList.wmMap(extraCorresponding[0][0],
extraCorresponding[0][1],
extraCorresponding[0][2]);
Property subprop = propertyList.getExplicitOrShorthand(wmcorr);
if (subprop != null) {
baseMaker.setSubprop(p, Constants.CP_MINIMUM, subprop);
}

// Based on max-[width|height]
wmcorr = propertyList.wmMap(extraCorresponding[1][0],
extraCorresponding[1][1],
extraCorresponding[1][2]);
subprop = propertyList.getExplicitOrShorthand(wmcorr);
// TODO: Don't set when NONE.
if (subprop != null) {
baseMaker.setSubprop(p, Constants.CP_MAXIMUM, subprop);
}

return p;
}
}

+ 2
- 1
src/java/org/apache/fop/fo/EnumProperty.java View File

@@ -51,6 +51,7 @@
package org.apache.fop.fo;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.properties.PropertyMaker;

/**
* Superclass for properties that wrap an enumeration value
@@ -60,7 +61,7 @@ public class EnumProperty extends Property {
/**
* Inner class for creating EnumProperty instances
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* @param propName name of property for which a Maker should be created

+ 49
- 44
src/java/org/apache/fop/fo/FOPropertyMapping.java View File

@@ -56,6 +56,11 @@ import java.util.Map;
import org.apache.fop.datatypes.ColorType;
import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.ToBeImplementedProperty;
import org.apache.fop.fo.properties.CorrespondingPropertyMaker;
import org.apache.fop.fo.properties.DimensionPropertyMaker;
import org.apache.fop.fo.properties.IndentPropertyMaker;
import org.apache.fop.fo.properties.LineHeightPropertyMaker;
import org.apache.fop.fo.properties.PropertyMaker;

/**
* This class creates and returns an array of Property.Maker instances
@@ -66,30 +71,30 @@ public class FOPropertyMapping implements Constants {
private static Map s_htSubPropNames = new HashMap();
private static Map s_htPropIds = new HashMap();
private static Property.Maker[] s_generics =
new Property.Maker[PROPERTY_COUNT + 1];
private static PropertyMaker[] s_generics =
new PropertyMaker[PROPERTY_COUNT + 1];
// The rest is only used during the building of the s_generics array.
private Property[] enums = null;
private Property.Maker genericColor = null;
private Property.Maker genericBoolean = null;
private Property.Maker genericKeep = null;
private Property.Maker genericCondLength = null;
private Property.Maker genericCondPadding = null;
private Property.Maker genericPadding = null;
private Property.Maker genericCondBorderWidth = null;
private Property.Maker genericBorderWidth = null;
private Property.Maker genericBorderStyle = null;
private Property.Maker genericBreak = null;
private Property.Maker genericSpace = null;
private PropertyMaker genericColor = null;
private PropertyMaker genericBoolean = null;
private PropertyMaker genericKeep = null;
private PropertyMaker genericCondLength = null;
private PropertyMaker genericCondPadding = null;
private PropertyMaker genericPadding = null;
private PropertyMaker genericCondBorderWidth = null;
private PropertyMaker genericBorderWidth = null;
private PropertyMaker genericBorderStyle = null;
private PropertyMaker genericBreak = null;
private PropertyMaker genericSpace = null;
/**
* Create the generic property maker templates. These templates
* are used be the actual makers as a parameter to .useGeneric(...).
*/
public void createGenerics() {
Property.Maker sub;
PropertyMaker sub;
genericColor = new ColorTypeProperty.Maker(0);
genericColor.addKeyword("aliceblue", "#f0f8ff");
@@ -375,7 +380,7 @@ public class FOPropertyMapping implements Constants {
* @param name the name of the property maker.
* @param maker the maker.
*/
private static void addPropertyMaker(String name, Property.Maker maker) {
private static void addPropertyMaker(String name, PropertyMaker maker) {
s_generics[maker.getPropId()] = maker;
s_htPropNames.put(name, new Integer(maker.getPropId()));
s_htPropIds.put(new Integer(maker.getPropId()), name);
@@ -410,7 +415,7 @@ public class FOPropertyMapping implements Constants {
* Return the array of Makers.
* @return the maker array.
*/
public static Property.Maker[] getGenericMappings() {
public static PropertyMaker[] getGenericMappings() {
FOPropertyMapping gp = new FOPropertyMapping();
// Create the shorthand first, they are referenced by the real properties.
gp.createShorthandProperties();
@@ -494,7 +499,7 @@ public class FOPropertyMapping implements Constants {
}
private void createAccessibilityProperties() {
Property.Maker m;
PropertyMaker m;

// source-document
m = new StringProperty.Maker(PR_SOURCE_DOCUMENT);
@@ -510,7 +515,7 @@ public class FOPropertyMapping implements Constants {
}
private void createAbsolutePositionProperties() {
Property.Maker m;
PropertyMaker m;
LengthProperty.Maker l;
// absolute-position
@@ -552,7 +557,7 @@ public class FOPropertyMapping implements Constants {
}
private void createAuralProperties() {
Property.Maker m;
PropertyMaker m;
// azimuth
m = new ToBeImplementedProperty.Maker(PR_AZIMUTH);
@@ -664,7 +669,7 @@ public class FOPropertyMapping implements Constants {
}
private void createBorderPaddingBackgroundProperties() {
Property.Maker m;
PropertyMaker m;
BorderWidthPropertyMaker bwm;
CorrespondingPropertyMaker corr;
@@ -1056,7 +1061,7 @@ public class FOPropertyMapping implements Constants {
}
private void createFontProperties() {
Property.Maker m;
PropertyMaker m;

// font-family
m = new StringProperty.Maker(PR_FONT_FAMILY);
@@ -1113,7 +1118,7 @@ public class FOPropertyMapping implements Constants {
}
private void createHyphenationProperties() {
Property.Maker m;
PropertyMaker m;
// country
m = new StringProperty.Maker(PR_COUNTRY);
@@ -1161,7 +1166,7 @@ public class FOPropertyMapping implements Constants {
}
private void createMarginBlockProperties() {
Property.Maker m;
PropertyMaker m;
CorrespondingPropertyMaker corr;
// margin-top
@@ -1238,7 +1243,7 @@ public class FOPropertyMapping implements Constants {
}
private void createMarginInlineProperties() {
Property.Maker m;
PropertyMaker m;
// space-end
m = new SpaceProperty.Maker(PR_SPACE_END);
@@ -1252,7 +1257,7 @@ public class FOPropertyMapping implements Constants {
}
private void createRelativePosProperties() {
Property.Maker m;
PropertyMaker m;
// relative-position
m = new ToBeImplementedProperty.Maker(PR_RELATIVE_POSITION);
@@ -1262,7 +1267,7 @@ public class FOPropertyMapping implements Constants {
}
private void createAreaAlignmentProperties() {
Property.Maker m;
PropertyMaker m;
// alignment-adjust
m = new ToBeImplementedProperty.Maker(PR_ALIGNMENT_ADJUST);
@@ -1311,7 +1316,7 @@ public class FOPropertyMapping implements Constants {
}
private void createAreaDimensionProperties() {
Property.Maker m;
PropertyMaker m;
LengthProperty.Maker l;
DimensionPropertyMaker pdim;
CorrespondingPropertyMaker corr;
@@ -1453,7 +1458,7 @@ public class FOPropertyMapping implements Constants {
}
private void createBlockAndLineProperties() {
Property.Maker m;
PropertyMaker m;
// hyphenation-keep
m = new ToBeImplementedProperty.Maker(PR_HYPHENATION_KEEP);
@@ -1573,7 +1578,7 @@ public class FOPropertyMapping implements Constants {
}
private void createCharacterProperties() {
Property.Maker m;
PropertyMaker m;
// character
m = new CharacterProperty.Maker(PR_CHARACTER);
@@ -1641,7 +1646,7 @@ public class FOPropertyMapping implements Constants {
}
private void createColorProperties() {
Property.Maker m;
PropertyMaker m;
// color
m = new ColorTypeProperty.Maker(PR_COLOR);
@@ -1669,7 +1674,7 @@ public class FOPropertyMapping implements Constants {
}
private void createFloatProperties() {
Property.Maker m;
PropertyMaker m;
// clear
m = new ToBeImplementedProperty.Maker(PR_CLEAR);
@@ -1685,7 +1690,7 @@ public class FOPropertyMapping implements Constants {
}
private void createKeepsAndBreaksProperties() {
Property.Maker m;
PropertyMaker m;
// break-after
m = new EnumProperty.Maker(PR_BREAK_AFTER);
@@ -1732,7 +1737,7 @@ public class FOPropertyMapping implements Constants {
}
private void createLayoutProperties() {
Property.Maker m;
PropertyMaker m;
// clip
m = new ToBeImplementedProperty.Maker(PR_CLIP);
@@ -1767,8 +1772,8 @@ public class FOPropertyMapping implements Constants {
}
private void createLeaderAndRuleProperties() {
Property.Maker m;
Property.Maker sub;
PropertyMaker m;
PropertyMaker sub;
// leader-alignment
m = new EnumProperty.Maker(PR_LEADER_ALIGNMENT);
@@ -1842,7 +1847,7 @@ public class FOPropertyMapping implements Constants {
}
private void createDynamicProperties() {
Property.Maker m;
PropertyMaker m;
// active-state
m = new ToBeImplementedProperty.Maker(PR_ACTIVE_STATE);
@@ -1930,7 +1935,7 @@ public class FOPropertyMapping implements Constants {
}
private void createMarkersProperties() {
Property.Maker m;
PropertyMaker m;
// marker-class-name
m = new StringProperty.Maker(PR_MARKER_CLASS_NAME);
@@ -1965,7 +1970,7 @@ public class FOPropertyMapping implements Constants {
}
private void createNumberToStringProperties() {
Property.Maker m;
PropertyMaker m;
// format
m = new StringProperty.Maker(PR_FORMAT);
@@ -1996,7 +2001,7 @@ public class FOPropertyMapping implements Constants {
}
private void createPaginationAndLayoutProperties() {
Property.Maker m;
PropertyMaker m;
LengthProperty.Maker l;
// blank-or-not-blank
@@ -2124,8 +2129,8 @@ public class FOPropertyMapping implements Constants {
}
private void createTableProperties() {
Property.Maker m;
Property.Maker sub;
PropertyMaker m;
PropertyMaker sub;
// border-after-precedence
m = new ToBeImplementedProperty.Maker(PR_BORDER_AFTER_PRECEDENCE);
@@ -2258,7 +2263,7 @@ public class FOPropertyMapping implements Constants {
}
private void createWritingModeProperties() {
Property.Maker m;
PropertyMaker m;
// direction
m = new ToBeImplementedProperty.Maker(PR_DIRECTION);
@@ -2307,7 +2312,7 @@ public class FOPropertyMapping implements Constants {
}
private void createMiscProperties() {
Property.Maker m;
PropertyMaker m;
// content-type
m = new ToBeImplementedProperty.Maker(PR_CONTENT_TYPE);
@@ -2365,7 +2370,7 @@ public class FOPropertyMapping implements Constants {
}
private void createShorthandProperties() {
Property.Maker m;
PropertyMaker m;
// background
m = new ToBeImplementedProperty.Maker(PR_BACKGROUND);

+ 4
- 3
src/java/org/apache/fop/fo/FObj.java View File

@@ -59,6 +59,7 @@ import java.util.Set;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.flow.Marker;
import org.apache.fop.fo.properties.PropertyMaker;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;

@@ -67,7 +68,7 @@ import org.xml.sax.Locator;
*/
public class FObj extends FONode implements Constants {
private static final String FO_URI = "http://www.w3.org/1999/XSL/Format";
public static Property.Maker[] propertyListTable = null;
public static PropertyMaker[] propertyListTable = null;
/**
* Formatting properties for this fo element.
@@ -104,8 +105,8 @@ public class FObj extends FONode implements Constants {
super(parent);

if (propertyListTable == null) {
propertyListTable = new Property.Maker[Constants.PROPERTY_COUNT+1];
Property.Maker[] list = FOPropertyMapping.getGenericMappings();
propertyListTable = new PropertyMaker[Constants.PROPERTY_COUNT+1];
PropertyMaker[] list = FOPropertyMapping.getGenericMappings();
for (int i = 1; i < list.length; i++) {
if (list[i] != null)
propertyListTable[i] = list[i];

+ 4
- 2
src/java/org/apache/fop/fo/GenericShorthandParser.java View File

@@ -52,6 +52,8 @@ package org.apache.fop.fo;

import java.util.Enumeration;

import org.apache.fop.fo.properties.PropertyMaker;

public class GenericShorthandParser implements ShorthandParser {

/**
@@ -76,7 +78,7 @@ public class GenericShorthandParser implements ShorthandParser {
// Used for: border, border-top, border-right etc
public Property getValueForProperty(int propId,
ListProperty listProperty,
Property.Maker maker,
PropertyMaker maker,
PropertyList propertyList) {
Property prop = null;
// Check for keyword "inherit"
@@ -100,7 +102,7 @@ public class GenericShorthandParser implements ShorthandParser {
*/
protected Property convertValueForProperty(int propId,
ListProperty listProperty,
Property.Maker maker,
PropertyMaker maker,
PropertyList propertyList) {
Property prop = null;
// Try each of the stored values in turn

+ 1
- 0
src/java/org/apache/fop/fo/KeepProperty.java View File

@@ -52,6 +52,7 @@ package org.apache.fop.fo;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.Keep;
import org.apache.fop.fo.properties.CompoundPropertyMaker;

/**
* Superclass for properties that wrap Keep values

+ 1
- 0
src/java/org/apache/fop/fo/LengthPairProperty.java View File

@@ -52,6 +52,7 @@ package org.apache.fop.fo;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.LengthPair;
import org.apache.fop.fo.properties.CompoundPropertyMaker;

/**
* Superclass for properties wrapping a LengthPair value

+ 2
- 1
src/java/org/apache/fop/fo/LengthProperty.java View File

@@ -53,6 +53,7 @@ package org.apache.fop.fo;
import org.apache.fop.datatypes.Length;
import org.apache.fop.datatypes.AutoLength;
import org.apache.fop.fo.expr.Numeric;
import org.apache.fop.fo.properties.PropertyMaker;
import org.apache.fop.apps.FOPException;

/**
@@ -63,7 +64,7 @@ public class LengthProperty extends Property {
/**
* Inner class for making instances of LengthProperty
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {
private boolean autoOk = false;

/**

+ 1
- 0
src/java/org/apache/fop/fo/LengthRangeProperty.java View File

@@ -51,6 +51,7 @@
package org.apache.fop.fo;

import org.apache.fop.datatypes.LengthRange;
import org.apache.fop.fo.properties.CompoundPropertyMaker;
import org.apache.fop.apps.FOPException;

/**

+ 3
- 1
src/java/org/apache/fop/fo/ListProperty.java View File

@@ -52,6 +52,8 @@ package org.apache.fop.fo;

import java.util.Vector;

import org.apache.fop.fo.properties.PropertyMaker;

/**
* Superclass for properties that are lists of other properties
*/
@@ -60,7 +62,7 @@ public class ListProperty extends Property {
/**
* Inner class for creating instances of ListProperty
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* @param name name of property for which Maker should be created

+ 2
- 1
src/java/org/apache/fop/fo/NumberProperty.java View File

@@ -52,6 +52,7 @@ package org.apache.fop.fo;

import org.apache.fop.datatypes.ColorType;
import org.apache.fop.fo.expr.Numeric;
import org.apache.fop.fo.properties.PropertyMaker;

/**
* Class for handling numeric properties
@@ -61,7 +62,7 @@ public class NumberProperty extends Property {
/**
* Inner class for making NumberProperty objects
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* Constructor for NumberProperty.Maker

+ 0
- 580
src/java/org/apache/fop/fo/Property.java View File

@@ -52,21 +52,13 @@ package org.apache.fop.fo;

import org.apache.fop.datatypes.ColorType;
import org.apache.fop.datatypes.CondLength;
import org.apache.fop.datatypes.CompoundDatatype;
import org.apache.fop.datatypes.Keep;
import org.apache.fop.datatypes.Length;
import org.apache.fop.datatypes.LengthPair;
import org.apache.fop.datatypes.LengthRange;
import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.Space;
import org.apache.fop.fo.expr.Numeric;
import org.apache.fop.fo.expr.PropertyParser;
import org.apache.fop.fo.expr.PropertyInfo;
import org.apache.fop.apps.FOPException;
import java.util.Vector;
import java.util.HashMap;
import java.util.Map;

/**
* Base class for all property objects
@@ -74,578 +66,6 @@ import java.util.Map;
*/
public class Property {

/**
* Base class for all property makers
* @author unascribed
*/
public static class Maker implements Cloneable {
protected int propId;
private boolean inherited = true;
private Map enums = null;
private Map keywords = null;
protected String defaultValue = null;
protected boolean contextDep = false;
protected boolean setByShorthand = false;
private int percentBase = -1;
private Property.Maker[] shorthands = null;
private ShorthandParser datatypeParser;

protected Property defaultProperty;
protected CorrespondingPropertyMaker corresponding;

/**
* @return the name of the property for this Maker
*/
protected int getPropId() {
return propId;
}

/**
* Construct an instance of a Property.Maker for the given property.
* @param propId The Constant ID of the property to be made.
*/
public Maker(int propId) {
this.propId = propId;
}

/**
* Copy all the values from the generic maker to this maker.
* @param generic a generic property maker.
*/
public void useGeneric(Property.Maker generic) {
contextDep = generic.contextDep;
inherited = generic.inherited;
defaultValue = generic.defaultValue;
percentBase = generic.percentBase;
if (generic.shorthands != null) {
shorthands = new Property.Maker[generic.shorthands.length];
System.arraycopy(shorthands, 0, generic.shorthands, 0, shorthands.length);
}
if (generic.enums != null) {
enums = new HashMap(generic.enums);
}
if (generic.keywords != null) {
keywords = new HashMap(generic.keywords);
}
}

/**
* Set the inherited flag.
* @param inherited
*/
public void setInherited(boolean inherited) {
this.inherited = inherited;
}

/**
* Add a keyword-equiv to the maker.
* @param keyword
* @param value
*/
public void addKeyword(String keyword, String value) {
if (keywords == null) {
keywords = new HashMap();
}
keywords.put(keyword, value);
}

/**
* Add a enum constant.
* @param constant
* @param value
*/
public void addEnum(String constant, Property value) {
if (enums == null) {
enums = new HashMap();
}
enums.put(constant, value);
}

/**
* Add a subproperty to this maker.
* @param subproperty
*/
public void addSubpropMaker(Property.Maker subproperty) {
throw new RuntimeException("Unable to add subproperties " + getClass());
}

/**
* Return a subproperty maker for the subpropId.
* @param subpropId The subpropId of the maker.
* @return The subproperty maker.
*/
public Property.Maker getSubpropMaker(int subpropId) {
throw new RuntimeException("Unable to add subproperties");
}

/**
* Add a shorthand to this maker. Only an Integer is added to the
* shorthands list. Later the Integers are replaced with references
* to the actual shorthand property makers.
* @param shorthand a property maker thar is that is checked for
* shorthand values.
*/
public void addShorthand(Property.Maker shorthand) {
if (shorthands == null) {
shorthands = new Property.Maker[3];
}
for (int i = 0; i < shorthands.length; i++) {
if (shorthands[i] == null) {
shorthands[i] = shorthand;
break;
}
}
}

/**
* Set the shorthand datatype parser.
* @param subproperty
*/
public void setDatatypeParser(ShorthandParser parser) {
datatypeParser = parser;
}

/**
* Set the default value for this maker.
* @param defaultValue the default value.
*/
public void setDefault(String defaultValue) {
this.defaultValue = defaultValue;
}

/**
* Set the default value for this maker.
* @param defaultValue
* @param contextDep true when the value context dependent and
* must not be cached.
*/
public void setDefault(String defaultValue, boolean contextDep) {
this.defaultValue = defaultValue;
this.contextDep = contextDep;
}

/**
* Set the percent base identifier for this maker.
* @param percentBase
*/
public void setPercentBase(int percentBase) {
this.percentBase = percentBase;
}

/**
* Set the byShorthand flag which only is applicable for subproperty
* makers. It should be true for the subproperties which must be
* assigned a value when the base property is assigned a attribute
* value directly.
* @param defaultValue
*/
public void setByShorthand(boolean setByShorthand) {
this.setByShorthand = setByShorthand;
}

/**
* Set the correspoding property information.
* @param corresponding a corresponding maker where the
* isForcedCorresponding and compute methods are delegated to.
*/
public void setCorresponding(CorrespondingPropertyMaker corresponding) {
this.corresponding = corresponding;
}

/**
* Create a new empty property. Must be overriden in compound
* subclasses.
* @return a new instance of the Property for which this is a maker.
*/
public Property makeNewProperty() {
return null;
}

/*
* If the property is a relative property with a corresponding absolute
* value specified, the absolute value is used. This is also true of
* the inheritance priority (I think...)
* If the property is an "absolute" property and it isn't specified, then
* we try to compute it from the corresponding relative property: this
* happens in computeProperty.
*/
protected Property findProperty(PropertyList propertyList,
boolean bTryInherit)
throws FOPException
{
Property p = null;

if (corresponding != null && corresponding.isCorrespondingForced(propertyList)) {
p = corresponding.compute(propertyList);
} else {
p = propertyList.getExplicitBaseProp(propId);
if (p == null) {
p = this.compute(propertyList);
}
if (p == null) { // check for shorthand specification
p = getShorthand(propertyList);
}
if (p == null && bTryInherit) {
// else inherit (if has parent and is inheritable)
PropertyList parentPropertyList = propertyList.getParentPropertyList();
if (parentPropertyList != null && isInherited()) {
p = findProperty(parentPropertyList, true);
}
}
}
return p;
}

/**
* Return the property on the current FlowObject. Depending on the passed flags,
* this will try to compute it based on other properties, or if it is
* inheritable, to return the inherited value. If all else fails, it returns
* the default value.
* @param subpropId The subproperty id of the property being retrieved.
* Is 0 when retriving a base property.
* @param propertylist The PropertyList object being built for this FO.
* @param bTryInherit true if inherited properties should be examined.
* @param bTryDefault true if the default value should be returned.
*/
public Property get(int subpropId, PropertyList propertyList,
boolean bTryInherit, boolean bTryDefault)
throws FOPException
{
Property p = findProperty(propertyList, bTryInherit);
if (p == null && bTryDefault) { // default value for this FO!
try {
p = make(propertyList);
} catch (FOPException e) {
// don't know what to do here
}
}
return p;
}

/**
* Default implementation of isInherited.
* @return A boolean indicating whether this property is inherited.
*/
public boolean isInherited() {
return inherited;
}

/**
* This is used to handle properties specified as a percentage of
* some "base length", such as the content width of their containing
* box.
* Overridden by subclasses which allow percent specifications. See
* the documentation on properties.xsl for details.
* @param fo the FObj containing the PercentBase
* @param pl the PropertyList containing the property. (TODO: explain
* what this is used for, or remove it from the signature.)
* @return an object implementing the PercentBase interface.
*/
public PercentBase getPercentBase(FObj fo, PropertyList pl) {
if (percentBase == -1)
return null;
return new LengthBase(fo, pl, percentBase);
}

/**
* Return a property value for the given component of a compound
* property.
* @param p A property value for a compound property type such as
* SpaceProperty.
* @param subprop The Constants ID of the component whose value is to be
* returned.
* NOTE: this is only to ease porting when calls are made to
* PropertyList.get() using a component name of a compound property,
* such as get("space.optimum"). The recommended technique is:
* get("space").getOptimum().
* Overridden by property maker subclasses which handle
* compound properties.
* @return the Property containing the subproperty
*/
public Property getSubprop(Property p, int subpropId) {
CompoundDatatype val = (CompoundDatatype) p.getObject();
return val.getComponent(subpropId);
}

/**
* Set a component in a compound property and return the modified
* compound property object.
* This default implementation returns the original base property
* without modifying it.
* It is overridden by property maker subclasses which handle
* compound properties.
* @param baseProp The Property object representing the compound property,
* such as SpaceProperty.
* @param partId The ID of the component whose value is specified.
* @param subProp A Property object holding the specified value of the
* component to be set.
* @return The modified compound property object.
*/
protected Property setSubprop(Property baseProp, int partId,
Property subProp) {
CompoundDatatype val = (CompoundDatatype) baseProp.getObject();
val.setComponent(partId, subProp, false);
return baseProp;
}

/**
* Return the default value.
* @param propertyList The PropertyList object being built for this FO.
* @return the Property object corresponding to the parameters
* @throws FOPException for invalid or inconsisten FO input
*/
public Property make(PropertyList propertyList) throws FOPException {
if (defaultProperty != null) {
return defaultProperty;
}
Property p = make(propertyList, defaultValue, propertyList.getParentFObj());
if (!contextDep) {
defaultProperty = p;
}
return p;
}

/**
* Create a Property object from an attribute specification.
* @param propertyList The PropertyList object being built for this FO.
* @param value The attribute value.
* @param fo The current FO whose properties are being set.
* @return The initialized Property object.
* @throws FOPException for invalid or inconsistent FO input
*/
public Property make(PropertyList propertyList, String value,
FObj fo) throws FOPException {
try {
Property newProp = null;
String pvalue = value;
if ("inherit".equals(value)) {
newProp = propertyList.getFromParent(this.propId);
} else {
newProp = checkEnumValues(value);
}
if (newProp == null) {
/* Check for keyword shorthand values to be substituted. */
pvalue = checkValueKeywords(value);
// Override parsePropertyValue in each subclass of Property.Maker
Property p = PropertyParser.parse(pvalue,
new PropertyInfo(this,
propertyList, fo));
newProp = convertProperty(p, propertyList, fo);
}
if (newProp == null) {
throw new org.apache.fop.fo.expr.PropertyException("No conversion defined");
}
return newProp;
} catch (org.apache.fop.fo.expr.PropertyException propEx) {
String propName = FOPropertyMapping.getPropertyName(this.propId);
throw new FOPException("Error in " + propName
+ " property value '" + value + "': "
+ propEx);
}
}

/**
* Make a property value for a compound property. If the property
* value is already partially initialized, this method will modify it.
* @param baseProp The Property object representing the compound property,
* for example: SpaceProperty.
* @param subpropId The Constants ID of the subproperty (component)
* whose value is specified.
* @param propertyList The propertyList being built.
* @param fo The FO whose properties are being set.
* @param value the value of the
* @return baseProp (or if null, a new compound property object) with
* the new subproperty added
* @throws FOPException for invalid or inconsistent FO input
*/
public Property make(Property baseProp, int subpropId,
PropertyList propertyList, String value,
FObj fo) throws FOPException {
//getLogger().error("compound property component "
// + partName + " unknown.");
return baseProp;
}

public Property convertShorthandProperty(PropertyList propertyList,
Property prop, FObj fo) {
Property pret = null;
try {
pret = convertProperty(prop, propertyList, fo);
if (pret == null) {
// If value is a name token, may be keyword or Enum
String sval = prop.getNCname();
if (sval != null) {
// System.err.println("Convert shorthand ncname " + sval);
pret = checkEnumValues(sval);
if (pret == null) {
/* Check for keyword shorthand values to be substituted. */
String pvalue = checkValueKeywords(sval);
if (!pvalue.equals(sval)) {
// System.err.println("Convert shorthand keyword" + pvalue);
// Substituted a value: must parse it
Property p =
PropertyParser.parse(pvalue,
new PropertyInfo(this,
propertyList,
fo));
pret = convertProperty(p, propertyList, fo);
}
}
}
}
} catch (FOPException e) {

//getLogger().error("convertShorthandProperty caught FOPException "
// + e);
} catch (org.apache.fop.fo.expr.PropertyException propEx) {
//getLogger().error("convertShorthandProperty caught PropertyException "
// + propEx);
}
if (pret != null) {
/*
* System.err.println("Return shorthand value " + pret.getString() +
* " for " + getPropName());
*/
}
return pret;
}

/**
* For properties that contain enumerated values.
* This method should be overridden by subclasses.
* @param value the string containing the property value
* @return the Property encapsulating the enumerated equivalent of the
* input value
*/
protected Property checkEnumValues(String value) {
if (enums != null) {
return (Property) enums.get(value);
}
return null;
}

/**
* Return a String to be parsed if the passed value corresponds to
* a keyword which can be parsed and used to initialize the property.
* For example, the border-width family of properties can have the
* initializers "thin", "medium", or "thick". The FOPropertyMapping
* file specifies a length value equivalent for these keywords,
* such as "0.5pt" for "thin".
* @param value The string value of property attribute.
* @return A String containging a parseable equivalent or null if
* the passed value isn't a keyword initializer for this Property.
*/
protected String checkValueKeywords(String keyword) {
if (keywords != null) {
String value = (String)keywords.get(keyword);
if (value != null) {
return value;
}
}
return keyword;
}

/**
* Return a Property object based on the passed Property object.
* This method is called if the Property object built by the parser
* isn't the right type for this property.
* It is overridden by subclasses.
* @param p The Property object return by the expression parser
* @param propertyList The PropertyList object being built for this FO.
* @param fo The current FO whose properties are being set.
* @return A Property of the correct type or null if the parsed value
* can't be converted to the correct type.
* @throws FOPException for invalid or inconsistent FO input
*/
protected Property convertProperty(Property p,
PropertyList propertyList,
FObj fo) throws FOPException {
return null;
}

/**
* For properties that have more than one legal way to be specified,
* this routine should be overridden to attempt to set them based upon
* the other methods. For example, colors may be specified using an RGB
* model, or they may be specified using an NCname.
* @param p property whose datatype should be converted
* @param propertyList collection of properties. (TODO: explain why
* this is needed, or remove it from the signature.)
* @param fo the FObj to which this property is attached. (TODO: explain
* why this is needed, or remove it from the signature).
* @return an Property with the appropriate datatype used
*/
protected Property convertPropertyDatatype(Property p,
PropertyList propertyList,
FObj fo) {
return null;
}

/**
* Return a Property object representing the value of this property,
* based on other property values for this FO.
* A special case is properties which inherit the specified value,
* rather than the computed value.
* @param propertyList The PropertyList for the FO.
* @return Property A computed Property value or null if no rules
* are specified to compute the value.
* @throws FOPException for invalid or inconsistent FO input
*/
protected Property compute(PropertyList propertyList)
throws FOPException {
if (corresponding != null) {
return corresponding.compute(propertyList);
}
return null; // standard
}

/**
* For properties that can be set by shorthand properties, this method
* should return the Property, if any, that is parsed from any
* shorthand properties that affect this property.
* This method expects to be overridden by subclasses.
* For example, the border-right-width property could be set implicitly
* from the border shorthand property, the border-width shorthand
* property, or the border-right shorthand property. This method should
* be overridden in the appropriate subclass to check each of these, and
* return an appropriate border-right-width Property object.
* @param propertyList the collection of properties to be considered
* @return the Property, if found, the correspons, otherwise, null
*/
protected Property getShorthand(PropertyList propertyList) {
if (shorthands == null) {
return null;
}
ListProperty listprop;
int n = shorthands.length;
for (int i = 0; i < n && shorthands[i] != null; i++) {
Property.Maker shorthand = shorthands[i];
listprop = (ListProperty)propertyList.getExplicit(shorthand.propId);
if (listprop != null) {
ShorthandParser parser = shorthand.datatypeParser;
Property p = parser.getValueForProperty(getPropId(),
listprop, this, propertyList);
if (p != null) {
return p;
}
}
}
return null;
}

/**
* Return a clone of the makers. Used by useGeneric() to clone the
* subproperty makers of the generic compound makers.
*/
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException exc) {
return null;
}
}
} // end of nested Maker class

/**
* The original specified value for properties which inherit
* specified values.

+ 9
- 9
src/java/org/apache/fop/fo/PropertyList.java View File

@@ -56,7 +56,7 @@ import org.xml.sax.Attributes;

// FOP
import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.Property.Maker;
import org.apache.fop.fo.properties.PropertyMaker;

/**
* Class containing the collection of properties for a given FObj.
@@ -276,7 +276,7 @@ public class PropertyList extends HashMap {
private Property get(int propId, boolean bTryInherit,
boolean bTryDefault) {

Property.Maker propertyMaker = findMaker(propId & Constants.PROPERTY_MASK);
PropertyMaker propertyMaker = findMaker(propId & Constants.PROPERTY_MASK);
try {
return propertyMaker.get(propId & Constants.COMPOUND_MASK, this,
bTryInherit, bTryDefault);
@@ -415,7 +415,7 @@ public class PropertyList extends HashMap {
String attributeName,
String attributeValue) {
Property.Maker propertyMaker = null;
PropertyMaker propertyMaker = null;
FObj parentFO = fobj.findNearestAncestorFObj();
/* Handle "compound" properties, ex. space-before.minimum */
@@ -464,7 +464,7 @@ public class PropertyList extends HashMap {
private Property findBaseProperty(Attributes attributes,
FObj parentFO,
String basePropName,
Maker propertyMaker)
PropertyMaker propertyMaker)
throws FOPException {

/* If the baseProperty has already been created, return it
@@ -537,7 +537,7 @@ public class PropertyList extends HashMap {
*/
private Property getSubpropValue(Property p, int propId) {

Property.Maker maker = findMaker(propId & Constants.PROPERTY_MASK);
PropertyMaker maker = findMaker(propId & Constants.PROPERTY_MASK);

if (maker != null) {
return maker.getSubprop(p, propId & Constants.COMPOUND_MASK);
@@ -551,7 +551,7 @@ public class PropertyList extends HashMap {
* @return new Property object
*/
private Property getShorthand(int propId) {
Property.Maker propertyMaker = findMaker(propId);
PropertyMaker propertyMaker = findMaker(propId);
if (propertyMaker != null) {
return propertyMaker.getShorthand(this);
@@ -569,7 +569,7 @@ public class PropertyList extends HashMap {
private Property makeProperty(int propId) throws FOPException {

Property p = null;
Property.Maker propertyMaker = findMaker(propId);
PropertyMaker propertyMaker = findMaker(propId);

if (propertyMaker != null) {
p = propertyMaker.make(this);
@@ -587,7 +587,7 @@ public class PropertyList extends HashMap {
private boolean isInherited(int propId) {
if (inheritableProperty == null) {
inheritableProperty = new boolean[Constants.PROPERTY_COUNT + 1];
Property.Maker maker = null;
PropertyMaker maker = null;
for (int prop = 1; prop <= Constants.PROPERTY_COUNT; prop++) {
maker = findMaker(prop);
inheritableProperty[prop] = (maker != null && maker.isInherited());
@@ -601,7 +601,7 @@ public class PropertyList extends HashMap {
* @param propId Id of property
* @return the Property.Maker for this property
*/
private Property.Maker findMaker(int propId) {
private PropertyMaker findMaker(int propId) {

if (propId < 1 || propId > Constants.PROPERTY_COUNT) {
return null;

+ 3
- 1
src/java/org/apache/fop/fo/ShorthandParser.java View File

@@ -50,6 +50,8 @@
*/
package org.apache.fop.fo;

import org.apache.fop.fo.properties.PropertyMaker;

/**
* Interface used to provide parsing capabilities to Properties with shorthand
* characteristics (those with multiple components).
@@ -64,6 +66,6 @@ public interface ShorthandParser {
*/
Property getValueForProperty(int propId,
ListProperty listProperty,
Property.Maker maker,
PropertyMaker maker,
PropertyList propertyList);
}

+ 1
- 0
src/java/org/apache/fop/fo/SpaceProperty.java View File

@@ -53,6 +53,7 @@ package org.apache.fop.fo;
import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.LengthRange;
import org.apache.fop.datatypes.Space;
import org.apache.fop.fo.properties.CompoundPropertyMaker;

/**
* Base class used for handling properties of the fo:space-before and

+ 3
- 1
src/java/org/apache/fop/fo/StringProperty.java View File

@@ -50,6 +50,8 @@
*/
package org.apache.fop.fo;

import org.apache.fop.fo.properties.PropertyMaker;

/**
* Exists primarily as a container for its Maker inner class, which is
* extended by many string-based FO property classes.
@@ -59,7 +61,7 @@ public class StringProperty extends Property {
/**
* Inner class for making instances of StringProperty
*/
public static class Maker extends Property.Maker {
public static class Maker extends PropertyMaker {

/**
* @param propName name of property for which to create a Maker

+ 3
- 3
src/java/org/apache/fop/fo/expr/PropertyInfo.java View File

@@ -53,9 +53,9 @@ package org.apache.fop.fo.expr;
import java.util.Stack;

import org.apache.fop.fo.Constants;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.properties.PropertyMaker;
import org.apache.fop.datatypes.PercentBase;


@@ -66,7 +66,7 @@ import org.apache.fop.datatypes.PercentBase;
* built, and the FObj parent of the FObj for which the property is being set.
*/
public class PropertyInfo {
private Property.Maker maker;
private PropertyMaker maker;
private PropertyList plist;
private FObj fo;
private Stack stkFunction; // Stack of functions being evaluated
@@ -77,7 +77,7 @@ public class PropertyInfo {
* @param plist PropertyList object
* @param fo FObj
*/
public PropertyInfo(Property.Maker maker, PropertyList plist, FObj fo) {
public PropertyInfo(PropertyMaker maker, PropertyList plist, FObj fo) {
this.maker = maker;
this.plist = plist;
this.fo = fo;

src/java/org/apache/fop/fo/CompoundPropertyMaker.java → src/java/org/apache/fop/fo/properties/CompoundPropertyMaker.java View File

@@ -4,7 +4,7 @@
* The Apache Software License, Version 1.1
* ============================================================================
*
* Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
* Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
@@ -48,10 +48,15 @@
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo;
package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.CompoundDatatype;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.EnumProperty;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;

/**
* @author me
@@ -62,17 +67,17 @@ import org.apache.fop.datatypes.CompoundDatatype;
/**
* This class extends Property.Maker with support for sub-properties.
*/
public class CompoundPropertyMaker extends Property.Maker {
public class CompoundPropertyMaker extends PropertyMaker {
/**
* The list of subproperty makers supported by this compound maker.
*/
private Property.Maker[] subproperties =
new Property.Maker[Constants.COMPOUND_COUNT];
private PropertyMaker[] subproperties =
new PropertyMaker[Constants.COMPOUND_COUNT];

/**
* The first subproperty maker which has a setByShorthand of true.
*/
private Property.Maker shorthandMaker = null;
private PropertyMaker shorthandMaker = null;

/**
* Construct an instance of a CompoundPropertyMaker for the given property.
@@ -85,14 +90,14 @@ public class CompoundPropertyMaker extends Property.Maker {
/**
* @see org.apache.fop.fo.Property.Maker#useGeneric(Property.Maker)
*/
public void useGeneric(Property.Maker generic) {
public void useGeneric(PropertyMaker generic) {
super.useGeneric(generic);
if (generic instanceof CompoundPropertyMaker) {
CompoundPropertyMaker compoundGeneric = (CompoundPropertyMaker) generic;
for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
Property.Maker submaker = compoundGeneric.subproperties[i];
PropertyMaker submaker = compoundGeneric.subproperties[i];
if (submaker != null) {
addSubpropMaker((Property.Maker) submaker.clone());
addSubpropMaker((PropertyMaker) submaker.clone());
}
}
}
@@ -102,7 +107,7 @@ public class CompoundPropertyMaker extends Property.Maker {
* Add a subproperty to this maker.
* @param subproperty
*/
public void addSubpropMaker(Property.Maker subproperty) {
public void addSubpropMaker(PropertyMaker subproperty) {
// Place the base propId in the propId of the subproperty.
subproperty.propId &= Constants.COMPOUND_MASK;
subproperty.propId |= this.propId;
@@ -127,7 +132,7 @@ public class CompoundPropertyMaker extends Property.Maker {
* space.optimum='10pt'.
* @return the Maker object specified
*/
public Property.Maker getSubpropMaker(int subpropId) {
public PropertyMaker getSubpropMaker(int subpropId) {
return subproperties[getSubpropIndex(subpropId)];
}
@@ -202,7 +207,7 @@ public class CompoundPropertyMaker extends Property.Maker {
Property prop = makeCompound(propertyList, fo);
CompoundDatatype pval = (CompoundDatatype) prop.getObject();
for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
Property.Maker submaker = subproperties[i];
PropertyMaker submaker = subproperties[i];
if (submaker != null && submaker.setByShorthand) {
pval.setComponent(submaker.getPropId() & Constants.COMPOUND_MASK, p, false);
}
@@ -258,7 +263,7 @@ public class CompoundPropertyMaker extends Property.Maker {
baseProp = makeCompound(propertyList, fo);
}

Property.Maker spMaker = getSubpropMaker(subpropId);
PropertyMaker spMaker = getSubpropMaker(subpropId);

if (spMaker != null) {
Property p = spMaker.make(propertyList, value, fo);
@@ -287,7 +292,7 @@ public class CompoundPropertyMaker extends Property.Maker {
Property p = makeNewProperty();
CompoundDatatype data = (CompoundDatatype) p.getObject();
for (int i = 0; i < Constants.COMPOUND_COUNT; i++) {
Property.Maker submaker = subproperties[i];
PropertyMaker submaker = subproperties[i];
if (submaker != null) {
Property subprop = submaker.make(propertyList, submaker.defaultValue, parentFO);
data.setComponent(submaker.getPropId() & Constants.COMPOUND_MASK, subprop, true);

src/java/org/apache/fop/fo/CorrespondingPropertyMaker.java → src/java/org/apache/fop/fo/properties/CorrespondingPropertyMaker.java View File

@@ -1,24 +1,71 @@
/*
* Created on Jan 12, 2004
* $Id$
* ============================================================================
* The Apache Software License, Version 1.1
* ============================================================================
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
* Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by the Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "FOP" and "Apache Software Foundation" must not be used to
* endorse or promote products derived from this software without prior
* written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache", nor may
* "Apache" appear in their name, without prior written permission of the
* Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ============================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Apache Software Foundation and was originally created by
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo;
package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;

/**
*/
public class CorrespondingPropertyMaker {
protected Property.Maker baseMaker;
protected PropertyMaker baseMaker;
protected int lr_tb;
protected int rl_tb;
protected int tb_rl;
private boolean useParent;
private boolean relative;
CorrespondingPropertyMaker(Property.Maker baseMaker) {
public CorrespondingPropertyMaker(PropertyMaker baseMaker) {
this.baseMaker = baseMaker;
baseMaker.setCorresponding(this);
}

+ 114
- 0
src/java/org/apache/fop/fo/properties/DimensionPropertyMaker.java View File

@@ -0,0 +1,114 @@
/*
* $Id$
* ============================================================================
* The Apache Software License, Version 1.1
* ============================================================================
*
* Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by the Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "FOP" and "Apache Software Foundation" must not be used to
* endorse or promote products derived from this software without prior
* written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache", nor may
* "Apache" appear in their name, without prior written permission of the
* Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ============================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Apache Software Foundation and was originally created by
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;

/**
* @author me
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class DimensionPropertyMaker extends CorrespondingPropertyMaker {
int[][] extraCorresponding = null;

public DimensionPropertyMaker(PropertyMaker baseMaker) {
super(baseMaker);
}
public void setExtraCorresponding(int[][] extraCorresponding) {
this.extraCorresponding = extraCorresponding;
}

public boolean isCorrespondingForced(PropertyList propertyList) {
if (super.isCorrespondingForced(propertyList))
return true;
for (int i = 0; i < extraCorresponding.length; i++) {
int wmcorr = extraCorresponding[i][0]; //propertyList.getWritingMode()];
if (propertyList.getExplicit(wmcorr) != null)
return true;
}
return false;
}

public Property compute(PropertyList propertyList) throws FOPException {
// Based on [width|height]
Property p = super.compute(propertyList);
if (p == null) {
p = baseMaker.make(propertyList);
}

// Based on min-[width|height]
int wmcorr = propertyList.wmMap(extraCorresponding[0][0],
extraCorresponding[0][1],
extraCorresponding[0][2]);
Property subprop = propertyList.getExplicitOrShorthand(wmcorr);
if (subprop != null) {
baseMaker.setSubprop(p, Constants.CP_MINIMUM, subprop);
}

// Based on max-[width|height]
wmcorr = propertyList.wmMap(extraCorresponding[1][0],
extraCorresponding[1][1],
extraCorresponding[1][2]);
subprop = propertyList.getExplicitOrShorthand(wmcorr);
// TODO: Don't set when NONE.
if (subprop != null) {
baseMaker.setSubprop(p, Constants.CP_MAXIMUM, subprop);
}

return p;
}
}

src/java/org/apache/fop/fo/IndentPropertyMaker.java → src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java View File

@@ -48,10 +48,14 @@
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo;
package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.FixedLength;
import org.apache.fop.fo.FOPropertyMapping;
import org.apache.fop.fo.LengthProperty;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.expr.Numeric;

/**
@@ -74,7 +78,7 @@ public class IndentPropertyMaker extends CorrespondingPropertyMaker {
* Create a start-indent or end-indent property maker.
* @param baseMaker
*/
public IndentPropertyMaker(Property.Maker baseMaker) {
public IndentPropertyMaker(PropertyMaker baseMaker) {
super(baseMaker);
}


src/java/org/apache/fop/fo/LineHeightPropertyMaker.java → src/java/org/apache/fop/fo/properties/LineHeightPropertyMaker.java View File

@@ -48,10 +48,14 @@
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo;
package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.PercentLength;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.LengthProperty;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;

/**
* A maker which calculates the line-height property.

+ 640
- 0
src/java/org/apache/fop/fo/properties/PropertyMaker.java View File

@@ -0,0 +1,640 @@
/*
* $Id$
* ============================================================================
* The Apache Software License, Version 1.1
* ============================================================================
*
* Copyright (C) 1999-2004 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by the Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "FOP" and "Apache Software Foundation" must not be used to
* endorse or promote products derived from this software without prior
* written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache", nor may
* "Apache" appear in their name, without prior written permission of the
* Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ============================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Apache Software Foundation and was originally created by
* James Tauber <jtauber@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.fo.properties;

import java.util.HashMap;
import java.util.Map;

import org.apache.fop.apps.FOPException;
import org.apache.fop.datatypes.CompoundDatatype;
import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.datatypes.PercentBase;
import org.apache.fop.fo.FOPropertyMapping;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.ListProperty;
import org.apache.fop.fo.Property;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ShorthandParser;
import org.apache.fop.fo.expr.PropertyInfo;
import org.apache.fop.fo.expr.PropertyParser;


/**
* Base class for all property makers
* @author unascribed
*/
public class PropertyMaker implements Cloneable {
protected int propId;
private boolean inherited = true;
private Map enums = null;
private Map keywords = null;
protected String defaultValue = null;
protected boolean contextDep = false;
protected boolean setByShorthand = false;
private int percentBase = -1;
private PropertyMaker[] shorthands = null;
private ShorthandParser datatypeParser;

protected Property defaultProperty;
protected CorrespondingPropertyMaker corresponding;

/**
* @return the name of the property for this Maker
*/
public int getPropId() {
return propId;
}

/**
* Construct an instance of a Property.Maker for the given property.
* @param propId The Constant ID of the property to be made.
*/
public PropertyMaker(int propId) {
this.propId = propId;
}

/**
* Copy all the values from the generic maker to this maker.
* @param generic a generic property maker.
*/
public void useGeneric(PropertyMaker generic) {
contextDep = generic.contextDep;
inherited = generic.inherited;
defaultValue = generic.defaultValue;
percentBase = generic.percentBase;
if (generic.shorthands != null) {
shorthands = new PropertyMaker[generic.shorthands.length];
System.arraycopy(shorthands, 0, generic.shorthands, 0, shorthands.length);
}
if (generic.enums != null) {
enums = new HashMap(generic.enums);
}
if (generic.keywords != null) {
keywords = new HashMap(generic.keywords);
}
}

/**
* Set the inherited flag.
* @param inherited
*/
public void setInherited(boolean inherited) {
this.inherited = inherited;
}

/**
* Add a keyword-equiv to the maker.
* @param keyword
* @param value
*/
public void addKeyword(String keyword, String value) {
if (keywords == null) {
keywords = new HashMap();
}
keywords.put(keyword, value);
}

/**
* Add a enum constant.
* @param constant
* @param value
*/
public void addEnum(String constant, Property value) {
if (enums == null) {
enums = new HashMap();
}
enums.put(constant, value);
}

/**
* Add a subproperty to this maker.
* @param subproperty
*/
public void addSubpropMaker(PropertyMaker subproperty) {
throw new RuntimeException("Unable to add subproperties " + getClass());
}

/**
* Return a subproperty maker for the subpropId.
* @param subpropId The subpropId of the maker.
* @return The subproperty maker.
*/
public PropertyMaker getSubpropMaker(int subpropId) {
throw new RuntimeException("Unable to add subproperties");
}

/**
* Add a shorthand to this maker. Only an Integer is added to the
* shorthands list. Later the Integers are replaced with references
* to the actual shorthand property makers.
* @param shorthand a property maker thar is that is checked for
* shorthand values.
*/
public void addShorthand(PropertyMaker shorthand) {
if (shorthands == null) {
shorthands = new PropertyMaker[3];
}
for (int i = 0; i < shorthands.length; i++) {
if (shorthands[i] == null) {
shorthands[i] = shorthand;
break;
}
}
}

/**
* Set the shorthand datatype parser.
* @param subproperty
*/
public void setDatatypeParser(ShorthandParser parser) {
datatypeParser = parser;
}

/**
* Set the default value for this maker.
* @param defaultValue the default value.
*/
public void setDefault(String defaultValue) {
this.defaultValue = defaultValue;
}

/**
* Set the default value for this maker.
* @param defaultValue
* @param contextDep true when the value context dependent and
* must not be cached.
*/
public void setDefault(String defaultValue, boolean contextDep) {
this.defaultValue = defaultValue;
this.contextDep = contextDep;
}

/**
* Set the percent base identifier for this maker.
* @param percentBase
*/
public void setPercentBase(int percentBase) {
this.percentBase = percentBase;
}

/**
* Set the byShorthand flag which only is applicable for subproperty
* makers. It should be true for the subproperties which must be
* assigned a value when the base property is assigned a attribute
* value directly.
* @param defaultValue
*/
public void setByShorthand(boolean setByShorthand) {
this.setByShorthand = setByShorthand;
}

/**
* Set the correspoding property information.
* @param corresponding a corresponding maker where the
* isForcedCorresponding and compute methods are delegated to.
*/
public void setCorresponding(CorrespondingPropertyMaker corresponding) {
this.corresponding = corresponding;
}

/**
* Create a new empty property. Must be overriden in compound
* subclasses.
* @return a new instance of the Property for which this is a maker.
*/
public Property makeNewProperty() {
return null;
}

/*
* If the property is a relative property with a corresponding absolute
* value specified, the absolute value is used. This is also true of
* the inheritance priority (I think...)
* If the property is an "absolute" property and it isn't specified, then
* we try to compute it from the corresponding relative property: this
* happens in computeProperty.
*/
protected Property findProperty(PropertyList propertyList,
boolean bTryInherit)
throws FOPException
{
Property p = null;

if (corresponding != null && corresponding.isCorrespondingForced(propertyList)) {
p = corresponding.compute(propertyList);
} else {
p = propertyList.getExplicitBaseProp(propId);
if (p == null) {
p = this.compute(propertyList);
}
if (p == null) { // check for shorthand specification
p = getShorthand(propertyList);
}
if (p == null && bTryInherit) {
// else inherit (if has parent and is inheritable)
PropertyList parentPropertyList = propertyList.getParentPropertyList();
if (parentPropertyList != null && isInherited()) {
p = findProperty(parentPropertyList, true);
}
}
}
return p;
}

/**
* Return the property on the current FlowObject. Depending on the passed flags,
* this will try to compute it based on other properties, or if it is
* inheritable, to return the inherited value. If all else fails, it returns
* the default value.
* @param subpropId The subproperty id of the property being retrieved.
* Is 0 when retriving a base property.
* @param propertylist The PropertyList object being built for this FO.
* @param bTryInherit true if inherited properties should be examined.
* @param bTryDefault true if the default value should be returned.
*/
public Property get(int subpropId, PropertyList propertyList,
boolean bTryInherit, boolean bTryDefault)
throws FOPException
{
Property p = findProperty(propertyList, bTryInherit);
if (p == null && bTryDefault) { // default value for this FO!
try {
p = make(propertyList);
} catch (FOPException e) {
// don't know what to do here
}
}
return p;
}

/**
* Default implementation of isInherited.
* @return A boolean indicating whether this property is inherited.
*/
public boolean isInherited() {
return inherited;
}

/**
* This is used to handle properties specified as a percentage of
* some "base length", such as the content width of their containing
* box.
* Overridden by subclasses which allow percent specifications. See
* the documentation on properties.xsl for details.
* @param fo the FObj containing the PercentBase
* @param pl the PropertyList containing the property. (TODO: explain
* what this is used for, or remove it from the signature.)
* @return an object implementing the PercentBase interface.
*/
public PercentBase getPercentBase(FObj fo, PropertyList pl) {
if (percentBase == -1)
return null;
return new LengthBase(fo, pl, percentBase);
}

/**
* Return a property value for the given component of a compound
* property.
* @param p A property value for a compound property type such as
* SpaceProperty.
* @param subprop The Constants ID of the component whose value is to be
* returned.
* NOTE: this is only to ease porting when calls are made to
* PropertyList.get() using a component name of a compound property,
* such as get("space.optimum"). The recommended technique is:
* get("space").getOptimum().
* Overridden by property maker subclasses which handle
* compound properties.
* @return the Property containing the subproperty
*/
public Property getSubprop(Property p, int subpropId) {
CompoundDatatype val = (CompoundDatatype) p.getObject();
return val.getComponent(subpropId);
}

/**
* Set a component in a compound property and return the modified
* compound property object.
* This default implementation returns the original base property
* without modifying it.
* It is overridden by property maker subclasses which handle
* compound properties.
* @param baseProp The Property object representing the compound property,
* such as SpaceProperty.
* @param partId The ID of the component whose value is specified.
* @param subProp A Property object holding the specified value of the
* component to be set.
* @return The modified compound property object.
*/
protected Property setSubprop(Property baseProp, int partId,
Property subProp) {
CompoundDatatype val = (CompoundDatatype) baseProp.getObject();
val.setComponent(partId, subProp, false);
return baseProp;
}

/**
* Return the default value.
* @param propertyList The PropertyList object being built for this FO.
* @return the Property object corresponding to the parameters
* @throws FOPException for invalid or inconsisten FO input
*/
public Property make(PropertyList propertyList) throws FOPException {
if (defaultProperty != null) {
return defaultProperty;
}
Property p = make(propertyList, defaultValue, propertyList.getParentFObj());
if (!contextDep) {
defaultProperty = p;
}
return p;
}

/**
* Create a Property object from an attribute specification.
* @param propertyList The PropertyList object being built for this FO.
* @param value The attribute value.
* @param fo The current FO whose properties are being set.
* @return The initialized Property object.
* @throws FOPException for invalid or inconsistent FO input
*/
public Property make(PropertyList propertyList, String value,
FObj fo) throws FOPException {
try {
Property newProp = null;
String pvalue = value;
if ("inherit".equals(value)) {
newProp = propertyList.getFromParent(this.propId);
} else {
newProp = checkEnumValues(value);
}
if (newProp == null) {
/* Check for keyword shorthand values to be substituted. */
pvalue = checkValueKeywords(value);
// Override parsePropertyValue in each subclass of Property.Maker
Property p = PropertyParser.parse(pvalue,
new PropertyInfo(this,
propertyList, fo));
newProp = convertProperty(p, propertyList, fo);
}
if (newProp == null) {
throw new org.apache.fop.fo.expr.PropertyException("No conversion defined");
}
return newProp;
} catch (org.apache.fop.fo.expr.PropertyException propEx) {
String propName = FOPropertyMapping.getPropertyName(this.propId);
throw new FOPException("Error in " + propName
+ " property value '" + value + "': "
+ propEx);
}
}

/**
* Make a property value for a compound property. If the property
* value is already partially initialized, this method will modify it.
* @param baseProp The Property object representing the compound property,
* for example: SpaceProperty.
* @param subpropId The Constants ID of the subproperty (component)
* whose value is specified.
* @param propertyList The propertyList being built.
* @param fo The FO whose properties are being set.
* @param value the value of the
* @return baseProp (or if null, a new compound property object) with
* the new subproperty added
* @throws FOPException for invalid or inconsistent FO input
*/
public Property make(Property baseProp, int subpropId,
PropertyList propertyList, String value,
FObj fo) throws FOPException {
//getLogger().error("compound property component "
// + partName + " unknown.");
return baseProp;
}

public Property convertShorthandProperty(PropertyList propertyList,
Property prop, FObj fo) {
Property pret = null;
try {
pret = convertProperty(prop, propertyList, fo);
if (pret == null) {
// If value is a name token, may be keyword or Enum
String sval = prop.getNCname();
if (sval != null) {
// System.err.println("Convert shorthand ncname " + sval);
pret = checkEnumValues(sval);
if (pret == null) {
/* Check for keyword shorthand values to be substituted. */
String pvalue = checkValueKeywords(sval);
if (!pvalue.equals(sval)) {
// System.err.println("Convert shorthand keyword" + pvalue);
// Substituted a value: must parse it
Property p =
PropertyParser.parse(pvalue,
new PropertyInfo(this,
propertyList,
fo));
pret = convertProperty(p, propertyList, fo);
}
}
}
}
} catch (FOPException e) {

//getLogger().error("convertShorthandProperty caught FOPException "
// + e);
} catch (org.apache.fop.fo.expr.PropertyException propEx) {
//getLogger().error("convertShorthandProperty caught PropertyException "
// + propEx);
}
if (pret != null) {
/*
* System.err.println("Return shorthand value " + pret.getString() +
* " for " + getPropName());
*/
}
return pret;
}

/**
* For properties that contain enumerated values.
* This method should be overridden by subclasses.
* @param value the string containing the property value
* @return the Property encapsulating the enumerated equivalent of the
* input value
*/
protected Property checkEnumValues(String value) {
if (enums != null) {
return (Property) enums.get(value);
}
return null;
}

/**
* Return a String to be parsed if the passed value corresponds to
* a keyword which can be parsed and used to initialize the property.
* For example, the border-width family of properties can have the
* initializers "thin", "medium", or "thick". The FOPropertyMapping
* file specifies a length value equivalent for these keywords,
* such as "0.5pt" for "thin".
* @param value The string value of property attribute.
* @return A String containging a parseable equivalent or null if
* the passed value isn't a keyword initializer for this Property.
*/
protected String checkValueKeywords(String keyword) {
if (keywords != null) {
String value = (String)keywords.get(keyword);
if (value != null) {
return value;
}
}
return keyword;
}

/**
* Return a Property object based on the passed Property object.
* This method is called if the Property object built by the parser
* isn't the right type for this property.
* It is overridden by subclasses.
* @param p The Property object return by the expression parser
* @param propertyList The PropertyList object being built for this FO.
* @param fo The current FO whose properties are being set.
* @return A Property of the correct type or null if the parsed value
* can't be converted to the correct type.
* @throws FOPException for invalid or inconsistent FO input
*/
protected Property convertProperty(Property p,
PropertyList propertyList,
FObj fo) throws FOPException {
return null;
}

/**
* For properties that have more than one legal way to be specified,
* this routine should be overridden to attempt to set them based upon
* the other methods. For example, colors may be specified using an RGB
* model, or they may be specified using an NCname.
* @param p property whose datatype should be converted
* @param propertyList collection of properties. (TODO: explain why
* this is needed, or remove it from the signature.)
* @param fo the FObj to which this property is attached. (TODO: explain
* why this is needed, or remove it from the signature).
* @return an Property with the appropriate datatype used
*/
protected Property convertPropertyDatatype(Property p,
PropertyList propertyList,
FObj fo) {
return null;
}

/**
* Return a Property object representing the value of this property,
* based on other property values for this FO.
* A special case is properties which inherit the specified value,
* rather than the computed value.
* @param propertyList The PropertyList for the FO.
* @return Property A computed Property value or null if no rules
* are specified to compute the value.
* @throws FOPException for invalid or inconsistent FO input
*/
protected Property compute(PropertyList propertyList)
throws FOPException {
if (corresponding != null) {
return corresponding.compute(propertyList);
}
return null; // standard
}

/**
* For properties that can be set by shorthand properties, this method
* should return the Property, if any, that is parsed from any
* shorthand properties that affect this property.
* This method expects to be overridden by subclasses.
* For example, the border-right-width property could be set implicitly
* from the border shorthand property, the border-width shorthand
* property, or the border-right shorthand property. This method should
* be overridden in the appropriate subclass to check each of these, and
* return an appropriate border-right-width Property object.
* @param propertyList the collection of properties to be considered
* @return the Property, if found, the correspons, otherwise, null
*/
public Property getShorthand(PropertyList propertyList) {
if (shorthands == null) {
return null;
}
ListProperty listprop;
int n = shorthands.length;
for (int i = 0; i < n && shorthands[i] != null; i++) {
PropertyMaker shorthand = shorthands[i];
listprop = (ListProperty)propertyList.getExplicit(shorthand.propId);
if (listprop != null) {
ShorthandParser parser = shorthand.datatypeParser;
Property p = parser.getValueForProperty(getPropId(),
listprop, this, propertyList);
if (p != null) {
return p;
}
}
}
return null;
}

/**
* Return a clone of the makers. Used by useGeneric() to clone the
* subproperty makers of the generic compound makers.
*/
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException exc) {
return null;
}
}
}

Loading…
Cancel
Save