| /* |
| * 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; |
| |
| import java.util.List; |
| |
| import org.apache.fop.fo.pagination.RegionBody; |
| import org.apache.fop.traits.WritingModeTraitsGetter; |
| |
| /** |
| * 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 static final long serialVersionUID = -1848872997724078080L; |
| |
| 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) { |
| this(rb.getNameId(), rb.getRegionName(), parent, rb.getColumnCount(), rb.getColumnGap()); |
| } |
| |
| /** |
| * Constructor which can read traits directly |
| * from an fo:region-body formatting object. |
| * @param regionClass the region class (as returned by Region.getNameId()) |
| * @param regionName the name of the region (as returned by Region.getRegionName()) |
| * @param parent the parent region viewport |
| * @param columnCount the number of columns |
| * @param columnGap the gap between columns |
| */ |
| public BodyRegion(int regionClass, String regionName, RegionViewport parent, |
| int columnCount, int columnGap) { |
| super(regionClass, regionName, parent); |
| this.columnCount = columnCount; |
| this.columnGap = columnGap; |
| 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; |
| } |
| |
| int getContentIPD() { |
| RegionViewport rv = getRegionViewport(); |
| return getIPD() - rv.getBorderAndPaddingWidthStart() - rv.getBorderAndPaddingWidthEnd(); |
| } |
| |
| public int getColumnIPD() { |
| return (getContentIPD() - (columnCount - 1) * columnGap) / columnCount; |
| } |
| |
| /** |
| * 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<Span> spans = getMainReference().getSpans(); |
| int previousSpanCount = spans.size() - 1; |
| for (int i = 0; i < previousSpanCount; i++) { |
| usedBPD += spans.get(i).getHeight(); |
| } |
| return getBPD() - usedBPD; |
| } |
| |
| /** |
| * Sets the writing mode traits for the main reference area of |
| * this body region area. |
| * @param wmtg a WM traits getter |
| */ |
| public void setWritingModeTraits(WritingModeTraitsGetter wmtg) { |
| if (getMainReference() != null) { |
| getMainReference().setWritingModeTraits(wmtg); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public Object clone() throws CloneNotSupportedException { |
| BodyRegion br = (BodyRegion) super.clone(); |
| br.mainReference = new MainReference(br); |
| br.mainReference.setSpans(mainReference.getSpans()); |
| return br; |
| } |
| |
| } |