123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714 |
- /*
- * 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.list;
-
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.ListIterator;
-
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.apache.fop.area.Area;
- import org.apache.fop.area.Block;
- import org.apache.fop.fo.flow.ListItem;
- import org.apache.fop.fo.flow.ListItemBody;
- import org.apache.fop.fo.flow.ListItemLabel;
- import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
- import org.apache.fop.layoutmgr.BlockStackingLayoutManager;
- import org.apache.fop.layoutmgr.BreakElement;
- import org.apache.fop.layoutmgr.ConditionalElementListener;
- import org.apache.fop.layoutmgr.ElementListObserver;
- import org.apache.fop.layoutmgr.ElementListUtils;
- import org.apache.fop.layoutmgr.KeepUtil;
- import org.apache.fop.layoutmgr.KnuthBlockBox;
- import org.apache.fop.layoutmgr.KnuthBox;
- import org.apache.fop.layoutmgr.KnuthElement;
- import org.apache.fop.layoutmgr.KnuthPenalty;
- import org.apache.fop.layoutmgr.KnuthPossPosIter;
- import org.apache.fop.layoutmgr.LayoutContext;
- import org.apache.fop.layoutmgr.LayoutManager;
- import org.apache.fop.layoutmgr.ListElement;
- import org.apache.fop.layoutmgr.NonLeafPosition;
- import org.apache.fop.layoutmgr.Position;
- import org.apache.fop.layoutmgr.PositionIterator;
- import org.apache.fop.layoutmgr.RelSide;
- import org.apache.fop.layoutmgr.SpaceResolver;
- import org.apache.fop.layoutmgr.TraitSetter;
- import org.apache.fop.traits.MinOptMax;
- import org.apache.fop.traits.SpaceVal;
-
- /**
- * LayoutManager for a list-item FO.
- * The list item contains a list item label and a list item body.
- */
- public class ListItemLayoutManager extends BlockStackingLayoutManager
- implements ConditionalElementListener {
-
- /**
- * logging instance
- */
- private static Log log = LogFactory.getLog(ListItemLayoutManager.class);
-
- private ListItemContentLayoutManager label;
- private ListItemContentLayoutManager body;
-
- private Block curBlockArea = null;
-
- private List labelList = null;
- private List bodyList = null;
-
- private boolean discardBorderBefore;
- private boolean discardBorderAfter;
- private boolean discardPaddingBefore;
- private boolean discardPaddingAfter;
- private MinOptMax effSpaceBefore;
- private MinOptMax effSpaceAfter;
-
- private int keepWithNextPendingOnLabel;
- private int keepWithNextPendingOnBody;
-
- private int listItemHeight;
-
- private class ListItemPosition extends Position {
- private int iLabelFirstIndex;
- private int iLabelLastIndex;
- private int iBodyFirstIndex;
- private int iBodyLastIndex;
-
- public ListItemPosition(LayoutManager lm, int labelFirst, int labelLast,
- int bodyFirst, int bodyLast) {
- super(lm);
- iLabelFirstIndex = labelFirst;
- iLabelLastIndex = labelLast;
- iBodyFirstIndex = bodyFirst;
- iBodyLastIndex = bodyLast;
- }
-
- public int getLabelFirstIndex() {
- return iLabelFirstIndex;
- }
-
- public int getLabelLastIndex() {
- return iLabelLastIndex;
- }
-
- public int getBodyFirstIndex() {
- return iBodyFirstIndex;
- }
-
- public int getBodyLastIndex() {
- return iBodyLastIndex;
- }
-
- /** {@inheritDoc} */
- public boolean generatesAreas() {
- return true;
- }
-
- /** {@inheritDoc} */
- public String toString() {
- StringBuffer sb = new StringBuffer("ListItemPosition:");
- sb.append(getIndex()).append("(");
- sb.append("label:").append(iLabelFirstIndex).append("-").append(iLabelLastIndex);
- sb.append(" body:").append(iBodyFirstIndex).append("-").append(iBodyLastIndex);
- sb.append(")");
- return sb.toString();
- }
- }
-
- /**
- * Create a new list item layout manager.
- * @param node list-item to create the layout manager for
- */
- public ListItemLayoutManager(ListItem node) {
- super(node);
- setLabel(node.getLabel());
- setBody(node.getBody());
- }
-
- /**
- * Convenience method.
- * @return the ListBlock node
- */
- protected ListItem getListItemFO() {
- return (ListItem)fobj;
- }
-
- /**
- * Create a LM for the fo:list-item-label object
- * @param node the fo:list-item-label FO
- */
- public void setLabel(ListItemLabel node) {
- label = new ListItemContentLayoutManager(node);
- label.setParent(this);
- }
-
- /**
- * Create a LM for the fo:list-item-body object
- * @param node the fo:list-item-body FO
- */
- public void setBody(ListItemBody node) {
- body = new ListItemContentLayoutManager(node);
- body.setParent(this);
- }
-
- /** {@inheritDoc} */
- public void initialize() {
- foSpaceBefore = new SpaceVal(
- getListItemFO().getCommonMarginBlock().spaceBefore, this).getSpace();
- foSpaceAfter = new SpaceVal(
- getListItemFO().getCommonMarginBlock().spaceAfter, this).getSpace();
- startIndent = getListItemFO().getCommonMarginBlock().startIndent.getValue(this);
- endIndent = getListItemFO().getCommonMarginBlock().endIndent.getValue(this);
- }
-
- private void resetSpaces() {
- this.discardBorderBefore = false;
- this.discardBorderAfter = false;
- this.discardPaddingBefore = false;
- this.discardPaddingAfter = false;
- this.effSpaceBefore = null;
- this.effSpaceAfter = null;
- }
-
- /** {@inheritDoc} */
- public List getNextKnuthElements(LayoutContext context, int alignment) {
- referenceIPD = context.getRefIPD();
- LayoutContext childLC;
-
- List returnList = new LinkedList();
-
- if (!breakBeforeServed) {
- breakBeforeServed = true;
- if (!context.suppressBreakBefore()) {
- if (addKnuthElementsForBreakBefore(returnList, context)) {
- return returnList;
- }
- }
- }
-
- addKnuthElementsForSpaceBefore(returnList, alignment);
-
- addKnuthElementsForBorderPaddingBefore(returnList, !firstVisibleMarkServed);
- firstVisibleMarkServed = true;
-
- //Spaces, border and padding to be repeated at each break
- addPendingMarks(context);
-
- // label
- childLC = new LayoutContext(0);
- childLC.setRefIPD(context.getRefIPD());
- label.initialize();
- labelList = label.getNextKnuthElements(childLC, alignment);
-
- //Space resolution as if the contents were placed in a new reference area
- //(see 6.8.3, XSL 1.0, section on Constraints, last paragraph)
- SpaceResolver.resolveElementList(labelList);
- ElementListObserver.observe(labelList, "list-item-label", label.getPartFO().getId());
-
- context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending());
- this.keepWithNextPendingOnLabel = childLC.getKeepWithNextPending();
-
- // body
- childLC = new LayoutContext(0);
- childLC.setRefIPD(context.getRefIPD());
- body.initialize();
- bodyList = body.getNextKnuthElements(childLC, alignment);
-
- //Space resolution as if the contents were placed in a new reference area
- //(see 6.8.3, XSL 1.0, section on Constraints, last paragraph)
- SpaceResolver.resolveElementList(bodyList);
- ElementListObserver.observe(bodyList, "list-item-body", body.getPartFO().getId());
-
- context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending());
- this.keepWithNextPendingOnBody = childLC.getKeepWithNextPending();
-
- // create a combined list
- List returnedList = getCombinedKnuthElementsForListItem(labelList, bodyList, context);
-
- // "wrap" the Position inside each element
- wrapPositionElements(returnedList, returnList, true);
-
- addKnuthElementsForBorderPaddingAfter(returnList, true);
- addKnuthElementsForSpaceAfter(returnList, alignment);
- addKnuthElementsForBreakAfter(returnList, context);
-
- context.updateKeepWithNextPending(this.keepWithNextPendingOnLabel);
- context.updateKeepWithNextPending(this.keepWithNextPendingOnBody);
- context.updateKeepWithNextPending(getKeepWithNextStrength());
- context.updateKeepWithPreviousPending(getKeepWithPreviousStrength());
-
- setFinished(true);
- resetSpaces();
- return returnList;
- }
-
- private List getCombinedKnuthElementsForListItem(List labelElements,
- List bodyElements, LayoutContext context) {
- // Copy elements to array lists to improve element access performance
- List[] elementLists = {new ArrayList(labelElements),
- new ArrayList(bodyElements)};
- int[] fullHeights = {ElementListUtils.calcContentLength(elementLists[0]),
- ElementListUtils.calcContentLength(elementLists[1])};
- int[] partialHeights = {0, 0};
- int[] start = {-1, -1};
- int[] end = {-1, -1};
-
- int totalHeight = Math.max(fullHeights[0], fullHeights[1]);
- int step;
- int addedBoxHeight = 0;
- int keepWithNextActive = BlockLevelLayoutManager.KEEP_AUTO;
-
- LinkedList returnList = new LinkedList();
- while ((step = getNextStep(elementLists, start, end, partialHeights)) > 0) {
-
- if (end[0] + 1 == elementLists[0].size()) {
- keepWithNextActive = Math.max(keepWithNextActive, keepWithNextPendingOnLabel);
- }
- if (end[1] + 1 == elementLists[1].size()) {
- keepWithNextActive = Math.max(keepWithNextActive, keepWithNextPendingOnBody);
- }
-
- // compute penalty height and box height
- int penaltyHeight = step
- + getMaxRemainingHeight(fullHeights, partialHeights)
- - totalHeight;
-
- //Additional penalty height from penalties in the source lists
- int additionalPenaltyHeight = 0;
- int stepPenalty = 0;
- KnuthElement endEl = (KnuthElement)elementLists[0].get(end[0]);
- if (endEl instanceof KnuthPenalty) {
- additionalPenaltyHeight = endEl.getW();
- stepPenalty = Math.max(stepPenalty, endEl.getP());
- }
- endEl = (KnuthElement)elementLists[1].get(end[1]);
- if (endEl instanceof KnuthPenalty) {
- additionalPenaltyHeight = Math.max(
- additionalPenaltyHeight, endEl.getW());
- stepPenalty = Math.max(stepPenalty, endEl.getP());
- }
-
- int boxHeight = step - addedBoxHeight - penaltyHeight;
- penaltyHeight += additionalPenaltyHeight; //Add AFTER calculating boxHeight!
-
- // collect footnote information
- // TODO this should really not be done like this. ListItemLM should remain as
- // footnote-agnostic as possible
- LinkedList footnoteList = null;
- ListElement el;
- for (int i = 0; i < elementLists.length; i++) {
- for (int j = start[i]; j <= end[i]; j++) {
- el = (ListElement) elementLists[i].get(j);
- if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) {
- if (footnoteList == null) {
- footnoteList = new LinkedList();
- }
- footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs());
- }
- }
- }
-
- // add the new elements
- addedBoxHeight += boxHeight;
- ListItemPosition stepPosition = new ListItemPosition(this,
- start[0], end[0], start[1], end[1]);
- if (footnoteList == null) {
- returnList.add(new KnuthBox(boxHeight, stepPosition, false));
- } else {
- returnList.add(new KnuthBlockBox(boxHeight, footnoteList, stepPosition, false));
- }
-
- if (addedBoxHeight < totalHeight) {
- int strength = BlockLevelLayoutManager.KEEP_AUTO;
- strength = Math.max(strength, keepWithNextActive);
- strength = Math.max(strength, getKeepTogetherStrength());
- int p = stepPenalty;
- if (p > -KnuthElement.INFINITE) {
- p = Math.max(p, KeepUtil.getPenaltyForKeep(strength));
- }
- returnList.add(new BreakElement(stepPosition, penaltyHeight, p, -1, context));
- }
- }
-
- return returnList;
- }
-
- private int getNextStep(List[] elementLists, int[] start, int[] end, int[] partialHeights) {
- // backup of partial heights
- int[] backupHeights = {partialHeights[0], partialHeights[1]};
-
- // set starting points
- start[0] = end[0] + 1;
- start[1] = end[1] + 1;
-
- // get next possible sequence for label and body
- int seqCount = 0;
- for (int i = 0; i < start.length; i++) {
- while (end[i] + 1 < elementLists[i].size()) {
- end[i]++;
- KnuthElement el = (KnuthElement)elementLists[i].get(end[i]);
- if (el.isPenalty()) {
- if (el.getP() < KnuthElement.INFINITE) {
- //First legal break point
- break;
- }
- } else if (el.isGlue()) {
- if (end[i] > 0) {
- KnuthElement prev = (KnuthElement)elementLists[i].get(end[i] - 1);
- if (prev.isBox()) {
- //Second legal break point
- break;
- }
- }
- partialHeights[i] += el.getW();
- } else {
- partialHeights[i] += el.getW();
- }
- }
- if (end[i] < start[i]) {
- partialHeights[i] = backupHeights[i];
- } else {
- seqCount++;
- }
- }
- if (seqCount == 0) {
- return 0;
- }
-
- // determine next step
- int step;
- if (backupHeights[0] == 0 && backupHeights[1] == 0) {
- // this is the first step: choose the maximum increase, so that
- // the smallest area in the first page will contain at least
- // a label area and a body area
- step = Math.max((end[0] >= start[0] ? partialHeights[0] : Integer.MIN_VALUE),
- (end[1] >= start[1] ? partialHeights[1] : Integer.MIN_VALUE));
- } else {
- // this is not the first step: choose the minimum increase
- step = Math.min((end[0] >= start[0] ? partialHeights[0] : Integer.MAX_VALUE),
- (end[1] >= start[1] ? partialHeights[1] : Integer.MAX_VALUE));
- }
-
- // reset bigger-than-step sequences
- for (int i = 0; i < partialHeights.length; i++) {
- if (partialHeights[i] > step) {
- partialHeights[i] = backupHeights[i];
- end[i] = start[i] - 1;
- }
- }
-
- return step;
- }
-
- private int getMaxRemainingHeight(int[] fullHeights, int[] partialHeights) {
- return Math.max(fullHeights[0] - partialHeights[0],
- fullHeights[1] - partialHeights[1]);
- }
-
- /**
- * {@inheritDoc}
- */
- public List getChangedKnuthElements(List oldList, int alignment) {
- //log.debug(" LILM.getChanged> label");
- // label
- labelList = label.getChangedKnuthElements(labelList, alignment);
-
- //log.debug(" LILM.getChanged> body");
- // body
- // "unwrap" the Positions stored in the elements
- ListIterator oldListIterator = oldList.listIterator();
- KnuthElement oldElement;
- while (oldListIterator.hasNext()) {
- oldElement = (KnuthElement)oldListIterator.next();
- Position innerPosition = oldElement.getPosition().getPosition();
- //log.debug(" BLM> unwrapping: " + (oldElement.isBox()
- // ? "box " : (oldElement.isGlue() ? "glue " : "penalty"))
- // + " creato da " + oldElement.getLayoutManager().getClass().getName());
- //log.debug(" BLM> unwrapping: "
- // + oldElement.getPosition().getClass().getName());
- if (innerPosition != null) {
- // oldElement was created by a descendant of this BlockLM
- oldElement.setPosition(innerPosition);
- } else {
- // thisElement was created by this BlockLM
- // modify its position in order to recognize it was not created
- // by a child
- oldElement.setPosition(new Position(this));
- }
- }
-
- List returnedList = body.getChangedKnuthElements(oldList, alignment);
- // "wrap" the Position inside each element
- List tempList = returnedList;
- KnuthElement tempElement;
- returnedList = new LinkedList();
- ListIterator listIter = tempList.listIterator();
- while (listIter.hasNext()) {
- tempElement = (KnuthElement)listIter.next();
- tempElement.setPosition(new NonLeafPosition(this, tempElement.getPosition()));
- returnedList.add(tempElement);
- }
-
- return returnedList;
- }
-
- /**
- * Add the areas for the break points.
- * This sets the offset of each cell as it is added.
- *
- * @param parentIter the position iterator
- * @param layoutContext the layout context for adding areas
- */
- public void addAreas(PositionIterator parentIter,
- LayoutContext layoutContext) {
- getParentArea(null);
-
- addId();
-
- LayoutContext lc = new LayoutContext(0);
- Position firstPos = null;
- Position lastPos = null;
-
- // "unwrap" the NonLeafPositions stored in parentIter
- LinkedList positionList = new LinkedList();
- Position pos;
- while (parentIter.hasNext()) {
- pos = (Position) parentIter.next();
- if (pos.getIndex() >= 0) {
- if (firstPos == null) {
- firstPos = pos;
- }
- lastPos = pos;
- }
- if (pos instanceof NonLeafPosition && pos.getPosition() != null) {
- // pos contains a ListItemPosition created by this ListBlockLM
- positionList.add(pos.getPosition());
- }
- }
-
- addMarkersToPage(true, isFirst(firstPos), isLast(lastPos));
-
- // use the first and the last ListItemPosition to determine the
- // corresponding indexes in the original labelList and bodyList
- int labelFirstIndex = ((ListItemPosition) positionList.getFirst()).getLabelFirstIndex();
- int labelLastIndex = ((ListItemPosition) positionList.getLast()).getLabelLastIndex();
- int bodyFirstIndex = ((ListItemPosition) positionList.getFirst()).getBodyFirstIndex();
- int bodyLastIndex = ((ListItemPosition) positionList.getLast()).getBodyLastIndex();
-
- //Determine previous break if any
- int previousBreak = ElementListUtils.determinePreviousBreak(labelList, labelFirstIndex);
- SpaceResolver.performConditionalsNotification(labelList,
- labelFirstIndex, labelLastIndex, previousBreak);
-
- //Determine previous break if any
- previousBreak = ElementListUtils.determinePreviousBreak(bodyList, bodyFirstIndex);
- SpaceResolver.performConditionalsNotification(bodyList,
- bodyFirstIndex, bodyLastIndex, previousBreak);
-
- // add label areas
- if (labelFirstIndex <= labelLastIndex) {
- KnuthPossPosIter labelIter = new KnuthPossPosIter(labelList,
- labelFirstIndex, labelLastIndex + 1);
- lc.setFlags(LayoutContext.FIRST_AREA, layoutContext.isFirstArea());
- lc.setFlags(LayoutContext.LAST_AREA, layoutContext.isLastArea());
- // set the space adjustment ratio
- lc.setSpaceAdjust(layoutContext.getSpaceAdjust());
- // TO DO: use the right stack limit for the label
- lc.setStackLimitBP(layoutContext.getStackLimitBP());
- label.addAreas(labelIter, lc);
- }
-
- // reset the area bpd after adding the label areas and before adding the body areas
- int savedBPD = 0;
- if (labelFirstIndex <= labelLastIndex
- && bodyFirstIndex <= bodyLastIndex) {
- savedBPD = curBlockArea.getBPD();
- curBlockArea.setBPD(0);
- }
-
- // add body areas
- if (bodyFirstIndex <= bodyLastIndex) {
- KnuthPossPosIter bodyIter = new KnuthPossPosIter(bodyList,
- bodyFirstIndex, bodyLastIndex + 1);
- lc.setFlags(LayoutContext.FIRST_AREA, layoutContext.isFirstArea());
- lc.setFlags(LayoutContext.LAST_AREA, layoutContext.isLastArea());
- // set the space adjustment ratio
- lc.setSpaceAdjust(layoutContext.getSpaceAdjust());
- // TO DO: use the right stack limit for the body
- lc.setStackLimitBP(layoutContext.getStackLimitBP());
- body.addAreas(bodyIter, lc);
- }
-
- // after adding body areas, set the maximum area bpd
- if (curBlockArea.getBPD() < savedBPD) {
- curBlockArea.setBPD(savedBPD);
- }
-
- addMarkersToPage(false, isFirst(firstPos), isLast(lastPos));
-
- // We are done with this area add the background
- TraitSetter.addBackground(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground(),
- this);
- TraitSetter.addSpaceBeforeAfter(curBlockArea, layoutContext.getSpaceAdjust(),
- effSpaceBefore, effSpaceAfter);
-
- flush();
-
- curBlockArea = null;
- resetSpaces();
-
- checkEndOfLayout(lastPos);
- }
-
- /**
- * Get the height of the list item after adjusting.
- * Should only be called after adding the list item areas.
- *
- * @return the height of this list item after adjustment
- */
- public int getListItemHeight() {
- return listItemHeight;
- }
-
- /**
- * Return an Area which can contain the passed childArea. The childArea
- * may not yet have any content, but it has essential traits set.
- * In general, if the LayoutManager already has an Area it simply returns
- * it. Otherwise, it makes a new Area of the appropriate class.
- * It gets a parent area for its area by calling its parent LM.
- * Finally, based on the dimensions of the parent area, it initializes
- * its own area. This includes setting the content IPD and the maximum
- * BPD.
- *
- * @param childArea the child area
- * @return the parent are for the child
- */
- public Area getParentArea(Area childArea) {
- if (curBlockArea == null) {
- curBlockArea = new Block();
-
- // Set up dimensions
- /*Area parentArea =*/ parentLM.getParentArea(curBlockArea);
-
- // set traits
- TraitSetter.setProducerID(curBlockArea, getListItemFO().getId());
- TraitSetter.addBorders(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground(),
- discardBorderBefore, discardBorderAfter, false, false, this);
- TraitSetter.addPadding(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground(),
- discardPaddingBefore, discardPaddingAfter, false, false, this);
- TraitSetter.addMargins(curBlockArea,
- getListItemFO().getCommonBorderPaddingBackground(),
- getListItemFO().getCommonMarginBlock(), this);
- TraitSetter.addBreaks(curBlockArea,
- getListItemFO().getBreakBefore(),
- getListItemFO().getBreakAfter());
-
- int contentIPD = referenceIPD - getIPIndents();
- curBlockArea.setIPD(contentIPD);
-
- setCurrentArea(curBlockArea);
- }
- return curBlockArea;
- }
-
- /**
- * Add the child.
- * Rows return the areas returned by the child elements.
- * This simply adds the area to the parent layout manager.
- *
- * @param childArea the child area
- */
- public void addChildArea(Area childArea) {
- if (curBlockArea != null) {
- curBlockArea.addBlock((Block) childArea);
- }
- }
-
- /** {@inheritDoc} */
- public int getKeepTogetherStrength() {
- int strength = KeepUtil.getCombinedBlockLevelKeepStrength(
- getListItemFO().getKeepTogether());
- strength = Math.max(strength, getParentKeepTogetherStrength());
- return strength;
- }
-
- /** {@inheritDoc} */
- public int getKeepWithNextStrength() {
- return KeepUtil.getCombinedBlockLevelKeepStrength(getListItemFO().getKeepWithNext());
- }
-
- /** {@inheritDoc} */
- public int getKeepWithPreviousStrength() {
- return KeepUtil.getCombinedBlockLevelKeepStrength(getListItemFO().getKeepWithPrevious());
- }
-
- /** {@inheritDoc} */
- public void notifySpace(RelSide side, MinOptMax effectiveLength) {
- if (RelSide.BEFORE == side) {
- if (log.isDebugEnabled()) {
- log.debug(this + ": Space " + side + ", "
- + this.effSpaceBefore + "-> " + effectiveLength);
- }
- this.effSpaceBefore = effectiveLength;
- } else {
- if (log.isDebugEnabled()) {
- log.debug(this + ": Space " + side + ", "
- + this.effSpaceAfter + "-> " + effectiveLength);
- }
- this.effSpaceAfter = effectiveLength;
- }
- }
-
- /** {@inheritDoc} */
- public void notifyBorder(RelSide side, MinOptMax effectiveLength) {
- if (effectiveLength == null) {
- if (RelSide.BEFORE == side) {
- this.discardBorderBefore = true;
- } else {
- this.discardBorderAfter = true;
- }
- }
- if (log.isDebugEnabled()) {
- log.debug(this + ": Border " + side + " -> " + effectiveLength);
- }
- }
-
- /** {@inheritDoc} */
- public void notifyPadding(RelSide side, MinOptMax effectiveLength) {
- if (effectiveLength == null) {
- if (RelSide.BEFORE == side) {
- this.discardPaddingBefore = true;
- } else {
- this.discardPaddingAfter = true;
- }
- }
- if (log.isDebugEnabled()) {
- log.debug(this + ": Padding " + side + " -> " + effectiveLength);
- }
- }
-
-
- }
|