/*
 * 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.layoutmgr;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

import org.apache.fop.area.Area;
import org.apache.fop.area.SideFloat;
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.flow.Float;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.inline.FloatLayoutManager;
import org.apache.fop.layoutmgr.inline.KnuthInlineBox;

public class FloatContentLayoutManager extends SpacedBorderedPaddedBlockLayoutManager {

    private SideFloat floatContentArea;
    private int side;
    private int yOffset;

    
{Add info}
Params:
  • node – the Float associated with this instance
/** * {Add info} * * @param node the {@link Float} associated with this instance */
public FloatContentLayoutManager(Float node) { super(node); generatesReferenceArea = true; side = node.getFloat(); } @Override public Keep getKeepTogether() { return getParentKeepTogether(); } @Override public Keep getKeepWithNext() { return Keep.KEEP_AUTO; } @Override public Keep getKeepWithPrevious() { return Keep.KEEP_ALWAYS; } @Override public void addAreas(PositionIterator parentIter, LayoutContext layoutContext) { floatContentArea = new SideFloat(); AreaAdditionUtil.addAreas(this, parentIter, layoutContext); flush(); } @Override public void addChildArea(Area childArea) { floatContentArea.addChildArea(childArea); floatContentArea.setBPD(childArea.getAllocBPD()); int effectiveContentIPD = childArea.getEffectiveAllocIPD(); int contentIPD = childArea.getIPD(); int xOffset = childArea.getBorderAndPaddingWidthStart(); floatContentArea.setIPD(effectiveContentIPD); childArea.activateEffectiveIPD(); if (side == Constants.EN_END || side == Constants.EN_RIGHT) { xOffset += getStartIndent(); floatContentArea.setXOffset(xOffset + contentIPD - effectiveContentIPD); } else if (side == Constants.EN_START || side == Constants.EN_LEFT) { floatContentArea.setXOffset(xOffset); } LayoutManager lm = parentLayoutManager; while (!lm.getGeneratesReferenceArea()) { lm = lm.getParent(); } yOffset = lm.getParentArea(floatContentArea).getBPD(); lm.addChildArea(floatContentArea); if (side == Constants.EN_END || side == Constants.EN_RIGHT) { lm.getPSLM().setEndIntrusionAdjustment(effectiveContentIPD); } else if (side == Constants.EN_START || side == Constants.EN_LEFT) { lm.getPSLM().setStartIntrusionAdjustment(effectiveContentIPD); } }
{Add info}
Params:
  • elemenList –
  • startIndex –
  • endIndex –
Returns:
/** * {Add info} * * @param elemenList * @param startIndex * @param endIndex * @return */
public static List<FloatContentLayoutManager> checkForFloats(List<ListElement> elemenList, int startIndex, int endIndex) { ListIterator<ListElement> iter = elemenList.listIterator(startIndex); List<FloatContentLayoutManager> floats = new ArrayList<FloatContentLayoutManager>(); while (iter.nextIndex() <= endIndex) { ListElement element = iter.next(); if (element instanceof KnuthInlineBox && ((KnuthInlineBox) element).isFloatAnchor()) { floats.add(((KnuthInlineBox) element).getFloatContentLM()); } else if (element instanceof KnuthBlockBox && ((KnuthBlockBox) element).hasFloatAnchors()) { floats.addAll(((KnuthBlockBox) element).getFloatContentLMs()); } } if (floats.isEmpty()) { return Collections.emptyList(); } else { return floats; } } @Override protected CommonBorderPaddingBackground getCommonBorderPaddingBackground() { return null; }
{Add info}
Params:
  • layoutContext –
/** * {Add info} * * @param layoutContext */
public void processAreas(LayoutContext layoutContext) { if (getParent() instanceof FloatLayoutManager) { FloatLayoutManager flm = (FloatLayoutManager) getParent(); flm.processAreas(layoutContext); } }
Returns:the height of the float content area
/** * @return the height of the float content area */
public int getFloatHeight() { return floatContentArea.getAllocBPD(); }
Returns:the y-offset of the float content
/** * @return the y-offset of the float content */
public int getFloatYOffset() { return yOffset; } private int getStartIndent() { int startIndent; LayoutManager lm = getParent(); while (!(lm instanceof BlockLayoutManager)) { lm = lm.getParent(); } startIndent = ((BlockLayoutManager) lm).startIndent; return startIndent; } }