/* * Copyright 1999-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: BodyRegion.java,v 1.4 2004/02/27 17:41:26 jeremias Exp $ */ package org.apache.fop.area; import java.util.List; import org.apache.fop.fo.pagination.RegionBody; /** * This class is a container for the areas that may be generated by * an fo:region-body. It extends the RegionReference that is used * directly by the other region classes. * See fo:region-body definition in the XSL Rec for more information. */ public class BodyRegion extends RegionReference { private BeforeFloat beforeFloat; // optional private MainReference mainReference; // mandatory private Footnote footnote; // optional private int columnGap; private int columnCount; /** * Constructor which can read traits directly * from an fo:region-body formatting object. * @param rb the region-body FO node * @param parent the parent region viewport */ public BodyRegion(RegionBody rb, RegionViewport parent) { super(rb, parent); this.columnCount = rb.getColumnCount(); this.columnGap = rb.getColumnGap(); mainReference = new MainReference(this); } /** * Get the number of columns when not spanning * * @return the number of columns */ public int getColumnCount() { return this.columnCount; } /** @return the column-gap value */ public int getColumnGap() { return this.columnGap; } /** * Get the main reference area. * * @return the main reference area */ public MainReference getMainReference() { return mainReference; } /** * indicates whether the main reference area has any child areas added to it * * @return whether the main reference area has any child areas added to it */ public boolean isEmpty() { return (mainReference == null || mainReference.isEmpty()) && (footnote == null || footnote.isEmpty()) && (beforeFloat == null || beforeFloat.isEmpty()); } /** * Get the before float area. * * @return the before float area */ public BeforeFloat getBeforeFloat() { if (beforeFloat == null) { beforeFloat = new BeforeFloat(); } return beforeFloat; } /** * Get the footnote area. * * @return the footnote area */ public Footnote getFootnote() { if (footnote == null) { footnote = new Footnote(); } return footnote; } /** * @return the available BPD in the main reference area after the previous span reference * areas are subtracted. */ public int getRemainingBPD() { int usedBPD = 0; List spans = getMainReference().getSpans(); int previousSpanCount = spans.size() - 1; for (int i = 0; i < previousSpanCount; i++) { usedBPD += ((Span)spans.get(i)).getHeight(); } return getBPD() - usedBPD; } /** * Clone this object. * * @return a shallow copy of this object */ public Object clone() { BodyRegion br = new BodyRegion((RegionBody) regionFO, regionViewport); br.setCTM(getCTM()); br.setIPD(getIPD()); br.beforeFloat = beforeFloat; br.mainReference = mainReference; br.footnote = footnote; return br; } }