- 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-ffa450edef68tags/Root_Temp_KnuthStylePageBreaking
@@ -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); |
@@ -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; |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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; | |||
} | |||
} |
@@ -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 |
@@ -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); |
@@ -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]; |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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; | |||
/** |
@@ -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; | |||
/** |
@@ -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 |
@@ -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 |
@@ -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. |
@@ -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; |
@@ -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); | |||
} |
@@ -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 |
@@ -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 |
@@ -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; |
@@ -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); |
@@ -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); | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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); | |||
} | |||
@@ -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. |
@@ -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; | |||
} | |||
} | |||
} |