/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.pagination; import org.apache.fop.apps.FOPException; import org.apache.fop.datatypes.Numeric; import org.apache.fop.fo.FONode; import org.apache.fop.fo.FObj; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.properties.CommonAccessibility; import org.apache.fop.fo.properties.CommonAccessibilityHolder; /** * Abstract base class for the <a href="http://www.w3.org/TR/xsl/#fo_page-sequence"> * <code>fo:page-sequence</code></a> formatting object and the * <a href="http://xmlgraphics.apache.org/fop/0.95/extensions.html#external-document"> * <code>fox:external-document</code></a> extension object. */ public abstract class AbstractPageSequence extends FObj implements CommonAccessibilityHolder { /** initial page number */ protected Numeric initialPageNumber; /** forced page count */ protected int forcePageCount; private String format; private int letterValue; private char groupingSeparator; private int groupingSize; private Numeric referenceOrientation; private String language; private String country; private String numberConversionFeatures; private CommonAccessibility commonAccessibility; private PageNumberGenerator pageNumberGenerator; /** starting page number */ protected int startingPageNumber; /** * Create an AbstractPageSequence that is a child * of the given parent {@link FONode}. * * @param parent the parent {@link FONode} */ public AbstractPageSequence(FONode parent) { super(parent); } /** {@inheritDoc} */ public void bind(PropertyList pList) throws FOPException { super.bind(pList); initialPageNumber = pList.get(PR_INITIAL_PAGE_NUMBER).getNumeric(); forcePageCount = pList.get(PR_FORCE_PAGE_COUNT).getEnum(); format = pList.get(PR_FORMAT).getString(); letterValue = pList.get(PR_LETTER_VALUE).getEnum(); groupingSeparator = pList.get(PR_GROUPING_SEPARATOR).getCharacter(); groupingSize = pList.get(PR_GROUPING_SIZE).getNumber().intValue(); referenceOrientation = pList.get(PR_REFERENCE_ORIENTATION).getNumeric(); language = pList.get(PR_LANGUAGE).getString(); country = pList.get(PR_COUNTRY).getString(); numberConversionFeatures = pList.get(PR_X_NUMBER_CONVERSION_FEATURES).getString(); commonAccessibility = CommonAccessibility.getInstance(pList); } /** {@inheritDoc} */ public void startOfNode() throws FOPException { this.pageNumberGenerator = new PageNumberGenerator( format, groupingSeparator, groupingSize, letterValue, numberConversionFeatures, language, country); } /** * Initialize the current page number for the start of the page sequence. */ public void initPageNumber() { int pageNumberType = 0; if (initialPageNumber.getEnum() != 0) { // auto | auto-odd | auto-even. startingPageNumber = getRoot().getEndingPageNumberOfPreviousSequence() + 1; pageNumberType = initialPageNumber.getEnum(); if (pageNumberType == EN_AUTO_ODD) { if (startingPageNumber % 2 == 0) { startingPageNumber++; } } else if (pageNumberType == EN_AUTO_EVEN) { if (startingPageNumber % 2 != 0) { startingPageNumber++; } } } else { // <integer> for explicit page number int pageStart = initialPageNumber.getValue(); startingPageNumber = (pageStart > 0) ? pageStart : 1; // spec rule } } /** * Get the starting page number for this page sequence. * * @return the starting page number */ public int getStartingPageNumber() { return startingPageNumber; } /** * Retrieves the string representation of a page number applicable * for this page sequence * @param pageNumber the page number * @return string representation of the page number */ public String makeFormattedPageNumber(int pageNumber) { return pageNumberGenerator.makeFormattedPageNumber(pageNumber); } public CommonAccessibility getCommonAccessibility() { return commonAccessibility; } /** * Public accessor for the ancestor Root. * @return the ancestor Root */ public Root getRoot() { return (Root)this.getParent(); } /** * Get the value of the <code>force-page-count</code> property. * @return the force-page-count value */ public int getForcePageCount() { return forcePageCount; } /** * Get the value of the <code>initial-page-number</code> property. * @return the initial-page-number property value */ public Numeric getInitialPageNumber() { return initialPageNumber; } /** * Get the value of the <code>reference-orientation</code> property. * @return the "reference-orientation" property * @since XSL 1.1 */ public int getReferenceOrientation() { return referenceOrientation.getValue(); } }