/* * 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.area.inline; import java.util.ArrayList; import java.util.List; /** * Filled area. * This inline area contains some inline areas. * When the renderer gets the child areas to render * the inline areas are repeated to fill the ipd of * this inline parent. * This extends InlineParent so that the renderer will render * this as a normal inline parent. */ public class FilledArea extends InlineParent { private static final long serialVersionUID = 8586584705587017474L; private int unitWidth; /** Create a new filled area. */ public FilledArea() { } /** * Set the offset of the descendant TextAreas, * instead of the offset of the FilledArea itself. * * @param v the offset */ /* public void setBlockProgressionOffset(int v) { setChildOffset(inlines.listIterator(), v); } private void setChildOffset(ListIterator childrenIterator, int v) { while (childrenIterator.hasNext()) { InlineArea child = (InlineArea) childrenIterator.next(); if (child instanceof InlineParent) { setChildOffset(((InlineParent) child).getChildAreas().listIterator(), v); } else if (child instanceof InlineViewport) { // nothing } else { child.setBlockProgressionOffset(v); } } } */ /** * Set the unit width for the areas to fill the full width. * * @param width the unit width */ public void setUnitWidth(int width) { this.unitWidth = width; } /** * Return the unit width for the areas to fill the full width. * * @return the unit width */ public int getUnitWidth() { return this.unitWidth; } /** {@inheritDoc} */ @Override public int getBPD() { int bpd = 0; for (InlineArea area : getChildAreas()) { if (bpd < area.getBPD()) { bpd = area.getBPD(); } } return bpd; } /** * Get the child areas for this filled area. * This copies the references of the inline areas so that * it fills the total width of the area a whole number of times * for the unit width. * * @return the list of child areas copied to fill the width */ @Override public List<InlineArea> getChildAreas() { int units = getIPD() / unitWidth; List<InlineArea> newList = new ArrayList<InlineArea>(); for (int count = 0; count < units; count++) { newList.addAll(inlines); } return newList; } /** * Recursively apply the variation factor to all descendant areas * @param variationFactor the variation factor that must be applied to adjustments * @param lineStretch the total stretch of the line * @param lineShrink the total shrink of the line * @return true if there is an UnresolvedArea descendant */ @Override public boolean applyVariationFactor(double variationFactor, int lineStretch, int lineShrink) { setIPD(getIPD() + adjustingInfo.applyVariationFactor(variationFactor)); return false; } }