/* * 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.properties; import org.apache.fop.fo.Constants; import org.apache.fop.fo.FObj; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.expr.PropertyException; /** * Custom Maker for page-height / page-width * */ public class PageDimensionMaker extends LengthProperty.Maker { /** * Constructor * * @param propId the property Id */ public PageDimensionMaker(int propId) { super(propId); } /** * Check the value of the page-width / page-height property. * Return the default or user-defined fallback in case the value * was specified as "auto" * @param subpropId The subproperty id of the property being retrieved. * Is 0 when retrieving a base property. * @param propertyList The PropertyList object being built for this FO. * @param tryInherit true if inherited properties should be examined. * @param tryDefault true if the default value should be returned. * @return the property * @throws PropertyException if a property exception occurs * @see 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); FObj fo = propertyList.getFObj(); String fallbackValue = (propId == Constants.PR_PAGE_HEIGHT) ? fo.getUserAgent().getPageHeight() : fo.getUserAgent().getPageWidth(); if (p.getEnum() == Constants.EN_INDEFINITE) { int otherId = (propId == Constants.PR_PAGE_HEIGHT) ? Constants.PR_PAGE_WIDTH : Constants.PR_PAGE_HEIGHT; int writingMode = propertyList.get(Constants.PR_WRITING_MODE).getEnum(); int refOrientation = propertyList.get(Constants.PR_REFERENCE_ORIENTATION) .getNumeric().getValue(); if (propertyList.getExplicit(otherId) != null && propertyList.getExplicit(otherId).getEnum() == Constants.EN_INDEFINITE) { //both set to "indefinite": //determine which one of the two defines the dimension //in block-progression-direction, and set the other to //"auto" if ((writingMode != Constants.EN_TB_RL && (refOrientation == 0 || refOrientation == 180 || refOrientation == -180)) || (writingMode == Constants.EN_TB_RL && (refOrientation == 90 || refOrientation == 270 || refOrientation == -270))) { //set page-width to "auto" = use the fallback from FOUserAgent if (propId == Constants.PR_PAGE_WIDTH) { Property.log.warn("Both page-width and page-height set to " + "\"indefinite\". Forcing page-width to \"auto\""); return make(propertyList, fallbackValue, fo); } } else { //set page-height to "auto" = use fallback from FOUserAgent Property.log.warn("Both page-width and page-height set to " + "\"indefinite\". Forcing page-height to \"auto\""); if (propId == Constants.PR_PAGE_HEIGHT) { return make(propertyList, fallbackValue, fo); } } } } else if (p.isAuto()) { return make(propertyList, fallbackValue, fo); } return p; } }