From b4473242b43dc69c0faa175e462c2ccc4cbf922f Mon Sep 17 00:00:00 2001 From: "Andreas L. Delmelle" Date: Thu, 29 Dec 2005 21:09:07 +0000 Subject: [PATCH] 1) Added support for the page-break-* shorthands 2) Minor tweak: added validity check for reference-orientation git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@359890 13f79535-47bb-0310-9956-ffa450edef68 --- .../content/xdocs/compliance.ihtml | 12 +-- .../org/apache/fop/fo/FOPropertyMapping.java | 30 ++++++- .../properties/PageBreakShorthandParser.java | 65 +++++++++++++++ .../properties/ReferenceOrientationMaker.java | 62 ++++++++++++++ .../page-break_shorthand-expansion.fo | 83 +++++++++++++++++++ 5 files changed, 242 insertions(+), 10 deletions(-) create mode 100644 src/java/org/apache/fop/fo/properties/PageBreakShorthandParser.java create mode 100644 src/java/org/apache/fop/fo/properties/ReferenceOrientationMaker.java create mode 100644 test/fotree/testcases/page-break_shorthand-expansion.fo diff --git a/src/documentation/content/xdocs/compliance.ihtml b/src/documentation/content/xdocs/compliance.ihtml index 9261e3ac6..2a67a4a6f 100644 --- a/src/documentation/content/xdocs/compliance.ihtml +++ b/src/documentation/content/xdocs/compliance.ihtml @@ -6673,8 +6673,8 @@ no - - no + + yes   @@ -6693,8 +6693,8 @@ no - - no + + yes   @@ -6713,8 +6713,8 @@ no - - no + + yes   diff --git a/src/java/org/apache/fop/fo/FOPropertyMapping.java b/src/java/org/apache/fop/fo/FOPropertyMapping.java index 168658a29..29eb28584 100644 --- a/src/java/org/apache/fop/fo/FOPropertyMapping.java +++ b/src/java/org/apache/fop/fo/FOPropertyMapping.java @@ -45,10 +45,12 @@ import org.apache.fop.fo.properties.LengthRangeProperty; import org.apache.fop.fo.properties.LineHeightPropertyMaker; import org.apache.fop.fo.properties.ListProperty; import org.apache.fop.fo.properties.NumberProperty; +import org.apache.fop.fo.properties.PageBreakShorthandParser; import org.apache.fop.fo.properties.PageDimensionMaker; import org.apache.fop.fo.properties.PositionShorthandParser; import org.apache.fop.fo.properties.Property; import org.apache.fop.fo.properties.PropertyMaker; +import org.apache.fop.fo.properties.ReferenceOrientationMaker; import org.apache.fop.fo.properties.SpaceProperty; import org.apache.fop.fo.properties.SpacePropertyMaker; import org.apache.fop.fo.properties.SpacingPropertyMaker; @@ -1877,11 +1879,13 @@ public class FOPropertyMapping implements Constants { // break-after m = new EnumProperty.Maker(PR_BREAK_AFTER); m.useGeneric(genericBreak); + m.addShorthand(s_generics[PR_PAGE_BREAK_AFTER]); addPropertyMaker("break-after", m); // break-before m = new EnumProperty.Maker(PR_BREAK_BEFORE); m.useGeneric(genericBreak); + m.addShorthand(s_generics[PR_PAGE_BREAK_BEFORE]); addPropertyMaker("break-before", m); // keep-together @@ -1889,6 +1893,7 @@ public class FOPropertyMapping implements Constants { m.useGeneric(genericKeep); m.setInherited(false); m.setDefault("auto"); + m.addShorthand(s_generics[PR_PAGE_BREAK_INSIDE]); addPropertyMaker("keep-together", m); // keep-with-next @@ -1896,6 +1901,7 @@ public class FOPropertyMapping implements Constants { m.useGeneric(genericKeep); m.setInherited(false); m.setDefault("auto"); + m.addShorthand(s_generics[PR_PAGE_BREAK_AFTER]); addPropertyMaker("keep-with-next", m); // keep-with-previous @@ -1903,6 +1909,7 @@ public class FOPropertyMapping implements Constants { m.useGeneric(genericKeep); m.setInherited(false); m.setDefault("auto"); + m.addShorthand(s_generics[PR_PAGE_BREAK_BEFORE]); addPropertyMaker("keep-with-previous", m); // orphans @@ -1939,7 +1946,7 @@ public class FOPropertyMapping implements Constants { addPropertyMaker("overflow", m); // reference-orientation - m = new NumberProperty.Maker(PR_REFERENCE_ORIENTATION); + m = new ReferenceOrientationMaker(PR_REFERENCE_ORIENTATION); m.setInherited(true); m.setDefault("0"); addPropertyMaker("reference-orientation", m); @@ -2686,21 +2693,36 @@ public class FOPropertyMapping implements Constants { addPropertyMaker("padding", m); // page-break-after - m = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_AFTER); + m = new EnumProperty.Maker(PR_PAGE_BREAK_AFTER); m.setInherited(false); + m.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO")); + m.addEnum("always", getEnumProperty(EN_ALWAYS, "ALWAYS")); + m.addEnum("avoid", getEnumProperty(EN_AVOID, "AVOID")); + m.addEnum("left", getEnumProperty(EN_LEFT, "LEFT")); + m.addEnum("right", getEnumProperty(EN_RIGHT, "RIGHT")); m.setDefault("auto"); + m.setDatatypeParser(new PageBreakShorthandParser()); addPropertyMaker("page-break-after", m); // page-break-before - m = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_BEFORE); + m = new EnumProperty.Maker(PR_PAGE_BREAK_BEFORE); m.setInherited(false); + m.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO")); + m.addEnum("always", getEnumProperty(EN_ALWAYS, "ALWAYS")); + m.addEnum("avoid", getEnumProperty(EN_AVOID, "AVOID")); + m.addEnum("left", getEnumProperty(EN_LEFT, "LEFT")); + m.addEnum("right", getEnumProperty(EN_RIGHT, "RIGHT")); m.setDefault("auto"); + m.setDatatypeParser(new PageBreakShorthandParser()); addPropertyMaker("page-break-before", m); // page-break-inside - m = new ToBeImplementedProperty.Maker(PR_PAGE_BREAK_INSIDE); + m = new EnumProperty.Maker(PR_PAGE_BREAK_INSIDE); m.setInherited(true); + m.addEnum("auto", getEnumProperty(EN_AUTO, "AUTO")); + m.addEnum("avoid", getEnumProperty(EN_AVOID, "AVOID")); m.setDefault("auto"); + m.setDatatypeParser(new PageBreakShorthandParser()); addPropertyMaker("page-break-inside", m); // pause diff --git a/src/java/org/apache/fop/fo/properties/PageBreakShorthandParser.java b/src/java/org/apache/fop/fo/properties/PageBreakShorthandParser.java new file mode 100644 index 000000000..f139b2999 --- /dev/null +++ b/src/java/org/apache/fop/fo/properties/PageBreakShorthandParser.java @@ -0,0 +1,65 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.fo.properties; + +import org.apache.fop.fo.Constants; +import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.expr.PropertyException; + +/** + * Shorthand parser for page-break-before, page-break-after and page-break-inside. + * Used to set the corresponding keep-* and break-* properties. + */ +public class PageBreakShorthandParser implements ShorthandParser { + + /** + * @see org.apache.fop.fo.properties.ShorthandParser#getValueForProperty() + */ + public Property getValueForProperty(int propId, + Property property, + PropertyMaker maker, + PropertyList propertyList) + throws PropertyException { + + if (propId == Constants.PR_KEEP_WITH_PREVIOUS + || propId == Constants.PR_KEEP_WITH_NEXT + || propId == Constants.PR_KEEP_TOGETHER) { + if (property.getEnum() == Constants.EN_AVOID) { + return new EnumProperty(Constants.EN_ALWAYS, "ALWAYS"); + } else { + return new EnumProperty(Constants.EN_AUTO, "AUTO"); + } + } else if (propId == Constants.PR_BREAK_BEFORE + || propId == Constants.PR_BREAK_AFTER) { + switch (property.getEnum()) { + case Constants.EN_ALWAYS: + return new EnumProperty(Constants.EN_PAGE, "PAGE"); + case Constants.EN_LEFT: + return new EnumProperty(Constants.EN_EVEN_PAGE, "EVEN-PAGE"); + case Constants.EN_RIGHT: + return new EnumProperty(Constants.EN_ODD_PAGE, "ODD-PAGE"); + case Constants.EN_AVOID: + default: + return new EnumProperty(Constants.EN_AUTO, "AUTO"); + } + } + return null; + } + +} diff --git a/src/java/org/apache/fop/fo/properties/ReferenceOrientationMaker.java b/src/java/org/apache/fop/fo/properties/ReferenceOrientationMaker.java new file mode 100644 index 000000000..e246a033a --- /dev/null +++ b/src/java/org/apache/fop/fo/properties/ReferenceOrientationMaker.java @@ -0,0 +1,62 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.fo.properties; + +import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.expr.PropertyException; +import org.apache.fop.fo.properties.NumberProperty.Maker; + +/** + * Custom Maker adding validity check for reference-orientation + */ +public class ReferenceOrientationMaker extends Maker { + + /** + * Constructor + * @param propId the Constant Id for the property to be made + * @see org.apache.fop.fo.properties.PropertyMaker#PropertyMaker(propId) + */ + public ReferenceOrientationMaker(int propId) { + super(propId); + } + + /** + * Check the value of the reference-orientation property. + * + * @see org.apache.fop.fo.properties.PropertyMaker#get(int, PropertyList, boolean, boolean) + */ + public Property get(int subpropId, PropertyList propertyList, + boolean tryInherit, boolean tryDefault) + throws PropertyException { + + Property p = super.get(0, propertyList, tryInherit, tryDefault); + int ro = 0; + if (p != null) { + ro = p.getNumeric().getValue(); + } + if ((Math.abs(ro) % 90) == 0 && (Math.abs(ro) / 90) <= 3) { + return p; + } else { + throw new PropertyException("Illegal property value: " + + "reference-orientation=\"" + ro + "\" " + + "on " + propertyList.getFObj().getName()); + } + } + +} \ No newline at end of file diff --git a/test/fotree/testcases/page-break_shorthand-expansion.fo b/test/fotree/testcases/page-break_shorthand-expansion.fo new file mode 100644 index 000000000..5643e6bd8 --- /dev/null +++ b/test/fotree/testcases/page-break_shorthand-expansion.fo @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + Block 1: testing page-break-before="avoid" + + + + + Block 2: testing page-break-before="always" + + + + + Block 3: testing page-break-before="left" + + + + + Block 4: testing page-break-before="right" + + + + + Block 5: testing page-break-after="avoid" + + + + + Block 6: testing page-break-after="always" + + + + + Block 7: testing page-break-after="left" + + + + + Block 8: testing page-break-after="right" + + + + Block 9: testing page-break-inside="avoid" + + + + + + + + Block 10: testing page-break-before="left", page-break-inside="avoid" + and page-break-after="right" + + + + + -- 2.39.5