pbwest 2003/07/05 12:16:50 Added: src/java/org/apache/fop/fo/pagination Tag: FOP_0-20-0_Alt-Design FoRegionEnd.java FoRegionStartEnd.java FoRegionBefore.java FoRegionStart.java FoPageSequenceMaster.java FoSimplePageMaster.java FoLayoutMasterSet.java FoRegionBeforeAfter.java FoRegionAfter.java PageSequenceMaster.java FoRegionBody.java Log: Moved from src to src/java. Revision Changes Path No revision No revision 1.1.2.1 +87 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionEnd.java 1.1.2.1 +136 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionStartEnd.java 1.1.2.1 +86 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionBefore.java 1.1.2.1 +86 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionStart.java 1.1.2.1 +394 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoPageSequenceMaster.java 1.1.2.1 +203 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoSimplePageMaster.java 1.1.2.1 +268 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoLayoutMasterSet.java 1.1.2.1 +137 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionBeforeAfter.java 1.1.2.1 +86 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionAfter.java 1.1.2.1 +353 -133 xml-fop/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java Index: PageSequenceMaster.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -r1.1 -r1.1.2.1 --- PageSequenceMaster.java 11 Mar 2003 13:05:31 -0000 1.1 +++ PageSequenceMaster.java 5 Jul 2003 19:16:49 -0000 1.1.2.1 @@ -1,7 +1,8 @@ /* * $Id$ + * * ============================================================================ - * The Apache Software License, Version 1.1 + * The Apache Software License, Version 1.1 * ============================================================================ * * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. @@ -9,7 +10,7 @@ * 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, + * 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, @@ -17,184 +18,403 @@ * 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 + * 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 + * 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 * [EMAIL PROTECTED] * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the + * 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 + * 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 <[EMAIL PROTECTED]>. For more information on the Apache + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation and was originally created by + * James Tauber <[EMAIL PROTECTED]>. For more information on the Apache * Software Foundation, please see <http://www.apache.org/>. - */ -package org.apache.fop.fo.pagination; + * + * + * @author <a href="mailto:[EMAIL PROTECTED]">Peter B. West</a> + */ -// Java -import java.util.List; +package org.apache.fop.fo.pagination; -// SAX -import org.xml.sax.Attributes; +import java.util.ArrayList; +import java.util.HashMap; -// FOP -import org.apache.fop.fo.FONode; -import org.apache.fop.fo.FObj; import org.apache.fop.apps.FOPException; +import org.apache.fop.datatypes.EnumType; +import org.apache.fop.datatypes.IntegerType; +import org.apache.fop.datatypes.NCName; +import org.apache.fop.datatypes.Numeric; +import org.apache.fop.datatypes.PropertyValue; +import org.apache.fop.fo.FONode; +import org.apache.fop.fo.FObjectNames; +import org.apache.fop.fo.PropNames; +import org.apache.fop.fo.expr.PropertyException; +import org.apache.fop.fo.pagination.FoPageSequenceMaster.FoRepeatablePageMasterAlternatives.FoConditionalPageMasterReference; +import org.apache.fop.fo.properties.BlankOrNotBlank; +import org.apache.fop.fo.properties.MaximumRepeats; +import org.apache.fop.fo.properties.OddOrEven; +import org.apache.fop.fo.properties.PagePosition; /** - * The page-sequence-master formatting object. - * This class handles a list of subsequence specifiers - * which are simple or complex references to page-masters. + * Encodes an <b>fo:page-sequence-master</b> and associated + * conditions. All <i>page-sequence-master</i> specifications are converted + * into <i>repeatable-page-master-alternative</i>s. + * For a <i>simple-page-master</i>, a <i>PageSequenceMaster</i> object is + * created which shares a name with its target <i>simple-page-master</i>. + * This procedure results in a single common structure and manner of access + * for all page masters. */ -public class PageSequenceMaster extends FObj { - - private LayoutMasterSet layoutMasterSet; - private List subSequenceSpecifiers; - private SubSequenceSpecifier currentSubSequence; - private int currentSubSequenceNumber; +public class PageSequenceMaster { + + private static final String tag = "$Name$"; + private static final String revision = "$Revision$"; + + /** Constant representing the <i>no-limit</i> value of the + maximum-repeats property. */ + public static final int NO_LIMIT = -1; + private String masterName; - // The terminology may be confusing. A 'page-sequence-master' consists - // of a sequence of what the XSL spec refers to as - // 'sub-sequence-specifiers'. These are, in fact, simple or complex - // references to page-masters. So the methods use the former - // terminology ('sub-sequence-specifiers', or SSS), - // but the actual FO's are MasterReferences. - + private ArrayList masters = new ArrayList(1); + /** - * @see org.apache.fop.fo.FONode#FONode(FONode) + * Create a <i>PageSequenceMaster</i> from an + * <tt>FoSimplePageMaster</tt>. + * @param simplePM - the <tt>FoSimplePageMaster</tt> from which this + * <i>PageSequenceMaster</i> is derived. */ - public PageSequenceMaster(FONode parent) { - super(parent); + public PageSequenceMaster(FoSimplePageMaster simplePM) + throws PropertyException, FOPException + { + PageMasterAlternatives masterAlt; + masterName = simplePM.getMasterName(); + masterAlt = new PageMasterAlternatives(1, NO_LIMIT); + // Create and add a single default PageCondition + masterAlt.addCondition + (masterAlt.new PageCondition(simplePM, + BlankOrNotBlank.ANY, + OddOrEven.ANY, + PagePosition.ANY)); + masters.add(masterAlt); } /** - * @see org.apache.fop.fo.FONode#handleAttrs(Attributes) + * Create a <i>PageSequenceMaster</i> from an + * <tt>FoPageSequenceMaster</tt>. + * @param pageSeq - the <tt>FoPageSequenceMaster</tt> from which this + * <i>PageSequenceMaster</i> is derived. + * @param simplePageMasters - a <tt>HashMap</tt> of + * <tt>FoSimplePageMaster</tt>s indexed by master-name. */ - public void handleAttrs(Attributes attlist) throws FOPException { - super.handleAttrs(attlist); - - subSequenceSpecifiers = new java.util.ArrayList(); - - if (parent.getName().equals("fo:layout-master-set")) { - this.layoutMasterSet = (LayoutMasterSet)parent; - String pm = this.properties.get("master-name").getString(); - if (pm == null) { - getLogger().warn("page-sequence-master does not have " - + "a master-name and so is being ignored"); - } else { - this.layoutMasterSet.addPageSequenceMaster(pm, this); + public PageSequenceMaster + (FoPageSequenceMaster pageSeq, HashMap simplePageMasters) + throws PropertyException, FOPException + { + String masterRef; + FoSimplePageMaster simplePM; + PageMasterAlternatives masterAlt; + int maxRepeats = 1; + int enumValue; + PropertyValue pv; + Numeric npv; + masterName = pageSeq.getMasterName(); + // Process the sequence of masters. + int numChildren = pageSeq.numChildren(); + for (int child = 0; child < numChildren; child++) { + FONode masterReference = (FONode)(pageSeq.getChild(child)); + switch (masterReference.type) { + case FObjectNames.SINGLE_PAGE_MASTER_REFERENCE: + // Get the master-reference property value + simplePM = getMasterReference + (masterReference, simplePageMasters); + // Create and add a PageMasterAlternatives + masterAlt = new PageMasterAlternatives(1, 1); + // Create and add a single default PageCondition + masterAlt.addCondition + (masterAlt.new PageCondition(simplePM, + BlankOrNotBlank.ANY, + OddOrEven.ANY, + PagePosition.ANY)); + masters.add(masterAlt); + break; + case FObjectNames.REPEATABLE_PAGE_MASTER_REFERENCE: + // Get the master-reference property value + simplePM = getMasterReference + (masterReference, simplePageMasters); + // Get the maximum-repeats + pv = masterReference.getPropertyValue + (PropNames.MAXIMUM_REPEATS); + switch (pv.getType()) { + case PropertyValue.ENUM: + enumValue = ((EnumType)pv).getEnumValue(); + if (enumValue == MaximumRepeats.NO_LIMIT) { + maxRepeats = NO_LIMIT; + break; + } + throw new FOPException + ("Unrecognized maximum-repeats enum: " + + enumValue); + case PropertyValue.INTEGER: + maxRepeats = ((IntegerType)pv).getInt(); + break; + case PropertyValue.NUMERIC: + npv = (Numeric)pv; + if (npv.isInteger()) maxRepeats = npv.asInt(); + break; + // else fall through to exception + default: + throw new FOPException + ("MAXIMUM_REPEATS not an integer."); + } + // Create and add a PageMasterAlternatives + masterAlt = new PageMasterAlternatives(0, maxRepeats); + // Create and add a single default PageCondition + masterAlt.addCondition + (masterAlt.new PageCondition(simplePM, + BlankOrNotBlank.ANY, + OddOrEven.ANY, + PagePosition.ANY)); + masters.add(masterAlt); + break; + case FObjectNames.REPEATABLE_PAGE_MASTER_ALTERNATIVES: + // Get the maximum-repeats + pv = masterReference.getPropertyValue + (PropNames.MAXIMUM_REPEATS); + switch (pv.getType()) { + case PropertyValue.ENUM: + enumValue = ((EnumType)pv).getEnumValue(); + if (enumValue == MaximumRepeats.NO_LIMIT) { + maxRepeats = NO_LIMIT; + break; + } + throw new FOPException + ("Unrecognized maximum-repeats enum: " + + enumValue); + case PropertyValue.INTEGER: + maxRepeats = ((IntegerType)pv).getInt(); + break; + case PropertyValue.NUMERIC: + npv = (Numeric)pv; + if (npv.isInteger()) maxRepeats = npv.asInt(); + break; + // else fall through to exception + default: + throw new FOPException + ("MAXIMUM_REPEATS not an integer."); + } + // Create and add a PageMasterAlternatives + masterAlt = new PageMasterAlternatives(0, maxRepeats); + // Process the conditional-page-master-alternatives children + int numConds = masterReference.numChildren(); + for (int cond = 0; cond < numConds; cond++) { + FoConditionalPageMasterReference foCond; + int blankOrNot, oddOrEven, pagePosition; + EnumType enum; + + foCond = (FoConditionalPageMasterReference) + (masterReference.getChild(cond)); + // Get the master-reference property value + simplePM = getMasterReference(foCond, simplePageMasters); + enum = (EnumType) + (foCond.getPropertyValue + (PropNames.BLANK_OR_NOT_BLANK)); + blankOrNot = enum.getEnumValue(); + enum = (EnumType) + (foCond.getPropertyValue + (PropNames.ODD_OR_EVEN)); + oddOrEven = enum.getEnumValue(); + enum = (EnumType) + (foCond.getPropertyValue + (PropNames.PAGE_POSITION)); + pagePosition = enum.getEnumValue(); + // Create and add a single default PageCondition + masterAlt.addCondition + (masterAlt.new PageCondition + (simplePM, + blankOrNot, oddOrEven, pagePosition)); + } + masters.add(masterAlt); + break; + default: + throw new FOPException + ("Unknown master reference type: " + + masterReference.type); } - } else { - throw new FOPException("fo:page-sequence-master must be child " - + "of fo:layout-master-set, not " - + parent.getName()); } } /** - * Adds a new suqsequence specifier to the page sequence master. - * @param pageMasterReference the subsequence to add + * Get the master-name of this <i>PageSequenceMaster</i>. This is the + * name by which <i>fo:page-sequence</i>s will reference the master + * through their <i>master-reference</i> property. + * @return the name. */ - protected void addSubsequenceSpecifier(SubSequenceSpecifier pageMasterReference) { - subSequenceSpecifiers.add(pageMasterReference); + public String getMasterName() { + return masterName; } /** - * Returns the next subsequence specifier - * @return a subsequence specifier + * Get the <tt>FoSimplePageMaster</tt> referred to by the + * <i>master-reference</i> property in the argument <tt>FONode</tt>. + * @param node. + * @return the <tt>FoSimplePageMaster</tt>. */ - private SubSequenceSpecifier getNextSubSequence() { - currentSubSequenceNumber++; - if (currentSubSequenceNumber >= 0 - && currentSubSequenceNumber < subSequenceSpecifiers.size()) { - return (SubSequenceSpecifier)subSequenceSpecifiers - .get(currentSubSequenceNumber); - } - return null; + private FoSimplePageMaster getMasterReference + (FONode node, HashMap simplePageMasters) + throws FOPException, PropertyException + { + FoSimplePageMaster simplePM; + // Get the master-reference property value + String masterRef = + ((NCName) + (node.getPropertyValue(PropNames.MASTER_REFERENCE))).getNCName(); + // Valid reference? + if ((simplePM = (FoSimplePageMaster)(simplePageMasters.get(masterRef))) + != null) + return simplePM; + throw new FOPException + ("No simple-page-master referent for " + + FObjectNames.getFOName(node.type) + ": " + masterRef); } /** - * Resets the subsequence specifiers subsystem. + * Add a new alternatives master to the sequence. + * @param master - a <tt>PageMasterAlternatives</tt>. */ - public void reset() { - currentSubSequenceNumber = -1; - currentSubSequence = null; - for (int i = 0; i < subSequenceSpecifiers.size(); i++) { - ((SubSequenceSpecifier)subSequenceSpecifiers.get(i)).reset(); - } + public void addMaster(PageMasterAlternatives master) { + masters.add(master); } /** - * Returns the next simple-page-master. - * @param isOddPage True if the next page number is odd - * @param isFirstPage True if the next page is the first - * @param isBlankPage True if the next page is blank - * @return the requested page master - * @throws FOPException if there's a problem determining the next page master + * Get the length of the <i>masters</i> <tt>ArrayList</tt>. + * @return - the length. */ - public SimplePageMaster getNextSimplePageMaster(boolean isOddPage, - boolean isFirstPage, - boolean isBlankPage) - throws FOPException { - if (currentSubSequence == null) { - currentSubSequence = getNextSubSequence(); - if (currentSubSequence == null) { - throw new FOPException("no subsequences in page-sequence-master '" - + masterName + "'"); - } + public int getMastersLength() { + return masters.size(); + } + + /** + * Get the indexed <tt>PageMasterAlternatives</tt> master. + * @param i - the index of the master to retrieve. + * @return - the indexed <tt>PageMasterAlternatives</tt> master. + */ + public PageMasterAlternatives getMaster(int i) { + return (PageMasterAlternatives)(masters.get(i)); + } + + /** + * Encodes an fo:repeatable-page-master-alternatives and associated + * conditions. + */ + public class PageMasterAlternatives { + + private static final String tag = "$Name$"; + private static final String revision = "$Revision$"; + + /** The minumum number of repeats for this set of alternatives. */ + public final int minRepeats; + /** The maximum-repeats value for this set of alternatives. */ + public final int maxRepeats; + + private ArrayList alternatives = new ArrayList(1); + + /** + * @param minRepeats - the <tt>int</tt> minimum number of repeats for + * this alternative. + * @param maxRepeats - the <tt>int</tt> maximum number of repeats for + * this alternative. Set from the <i>maximum-repeats</i> property. + */ + public PageMasterAlternatives(int minRepeats, int maxRepeats) { + this.minRepeats = minRepeats; + this.maxRepeats = maxRepeats; + //System.out.println("New PMA: " + minRepeats + " " + maxRepeats); } - String pageMasterName = currentSubSequence - .getNextPageMasterName(isOddPage, isFirstPage, isBlankPage); - boolean canRecover = true; - while (pageMasterName == null) { - SubSequenceSpecifier nextSubSequence = getNextSubSequence(); - if (nextSubSequence == null) { - if (!canRecover) { - throw new FOPException("subsequences exhausted in page-sequence-master '" - + masterName - + "', cannot recover"); - } - getLogger().warn("subsequences exhausted in page-sequence-master '" - + masterName - + "', use previous subsequence"); - currentSubSequence.reset(); - canRecover = false; - } else { - currentSubSequence = nextSubSequence; - } - pageMasterName = currentSubSequence - .getNextPageMasterName(isOddPage, isFirstPage, isBlankPage); + + /** + * Add a new alternative condition set. + * @param condition - a <tt>PageCondition</tt>. + */ + public void addCondition(PageCondition condition) { + alternatives.add(condition); + } + + /** + * Get the length of the <i>alternatives</i> <tt>ArrayList</tt>. + * @return - the length. + */ + public int getAlternativesLength() { + return alternatives.size(); + } + + /** + * Get the indexed <tt>PageMasterAlternatives</tt> master. + * @param i - the index of the master to retrieve. + * @return - the indexed <tt>PageMasterAlternatives</tt> master. + */ + public PageCondition getAlternative(int i) { + return (PageCondition)(alternatives.get(i)); } - SimplePageMaster pageMaster = this.layoutMasterSet - .getSimplePageMaster(pageMasterName); - if (pageMaster == null) { - throw new FOPException("No simple-page-master matching '" - + pageMasterName + "' in page-sequence-master '" - + masterName + "'"); + + /** + * Encodes a condition set from an FoConditionalPageReferenceMaster. + */ + public class PageCondition { + + private static final String tag = "$Name$"; + private static final String revision = "$Revision$"; + + /** The simple page master used when these conditions are true. */ + public final FoSimplePageMaster master; + /** The blank-or-not-blank condition. + Encoded from BlankOrNotBlank. */ + public final int blankOrNot; + /** The odd-or-even condition. + Encoded from OddOrEven. */ + public final int oddOrEven; + /** The page-position condition. + Encoded from pagePosition. */ + public final int pagePosition; + + /** + * @param master - a reference to an <i>fo:simple-page-master</i>. + * @param blankOrNot - an <tt>int</tt> encoding a + * <i>blank-or-not-blank</i> condition. + * @param oddOrEven - an <tt>int</tt> encoding an + * <i>odd-or-even</i> condition. + * @param pagePosition - an <tt>int</tt> encoding a + * <i>page-position</i> + * condition. + */ + public PageCondition(FoSimplePageMaster master, + int blankOrNot, int oddOrEven, int pagePosition) { + this.master = master; + this.blankOrNot = blankOrNot; + this.oddOrEven = oddOrEven; + this.pagePosition = pagePosition; + //System.out.println("New condition: " + // + blankOrNot + // + " "+ oddOrEven + " " + pagePosition); + } } - return pageMaster; + } } - 1.1.2.1 +139 -0 xml-fop/src/java/org/apache/fop/fo/pagination/Attic/FoRegionBody.java
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]