From f0a9a8887b36edeb6b1d435a6dde4176c40fa434 Mon Sep 17 00:00:00 2001 From: Luis Bernardo Date: Fri, 14 Nov 2014 09:27:25 +0000 Subject: [PATCH] handle floats inside lists git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_BasicSideFloats@1639587 13f79535-47bb-0310-9956-ffa450edef68 --- .../layoutmgr/FloatContentLayoutManager.java | 13 ++ .../fop/layoutmgr/PageBreakingAlgorithm.java | 1 - .../layoutmgr/list/ListItemLayoutManager.java | 52 ++++++- .../standard-testcases/float_6.xml | 134 ++++++++++++++++++ 4 files changed, 195 insertions(+), 5 deletions(-) create mode 100644 test/layoutengine/standard-testcases/float_6.xml diff --git a/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java index a1c576140..5c6f6c685 100644 --- a/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java @@ -71,6 +71,7 @@ public class FloatContentLayoutManager extends SpacedBorderedPaddedBlockLayoutMa 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); @@ -125,4 +126,16 @@ public class FloatContentLayoutManager extends SpacedBorderedPaddedBlockLayoutMa public int getFloatYOffset() { return yOffset; } + + private int getStartIndent() { + int startIndent = 0; + LayoutManager lm = getParent(); + while (!(lm instanceof BlockLayoutManager)) { + lm = lm.getParent(); + } + if (lm instanceof BlockLayoutManager) { + startIndent = ((BlockLayoutManager) lm).startIndent; + } + return startIndent; + } } diff --git a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java index 43a6ca607..dc3cc591a 100644 --- a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java +++ b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java @@ -31,7 +31,6 @@ import org.apache.fop.fo.Constants; import org.apache.fop.fo.FObj; import org.apache.fop.layoutmgr.AbstractBreaker.FloatPosition; import org.apache.fop.layoutmgr.AbstractBreaker.PageBreakPosition; -import org.apache.fop.layoutmgr.BreakingAlgorithm.KnuthNode; import org.apache.fop.layoutmgr.WhitespaceManagementPenalty.Variant; import org.apache.fop.traits.MinOptMax; import org.apache.fop.util.ListUtil; diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index ce9746b6a..d29dba20b 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -20,6 +20,7 @@ package org.apache.fop.layoutmgr.list; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; @@ -40,15 +41,16 @@ import org.apache.fop.layoutmgr.BreakOpportunity; import org.apache.fop.layoutmgr.BreakOpportunityHelper; import org.apache.fop.layoutmgr.ElementListObserver; import org.apache.fop.layoutmgr.ElementListUtils; +import org.apache.fop.layoutmgr.FloatContentLayoutManager; import org.apache.fop.layoutmgr.FootenoteUtil; import org.apache.fop.layoutmgr.Keep; 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.LeafPosition; import org.apache.fop.layoutmgr.ListElement; import org.apache.fop.layoutmgr.NonLeafPosition; import org.apache.fop.layoutmgr.Position; @@ -294,8 +296,34 @@ public class ListItemLayoutManager extends SpacedBorderedPaddedBlockLayoutManage context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending()); this.keepWithNextPendingOnBody = childLC.getKeepWithNextPending(); + List returnedList = new LinkedList(); + if (!labelList.isEmpty() && labelList.get(0) instanceof KnuthBlockBox) { + KnuthBlockBox kbb = (KnuthBlockBox) labelList.get(0); + if (kbb.getWidth() == 0 && kbb.hasFloatAnchors()) { + List floats = kbb.getFloatContentLMs(); + returnedList.add(new KnuthBlockBox(0, Collections.emptyList(), null, false, floats)); + Keep keep = getKeepTogether(); + returnedList.add(new BreakElement(new LeafPosition(this, 0), keep.getPenalty(), keep + .getContext(), context)); + labelList.remove(0); + labelList.remove(0); + } + } + if (!bodyList.isEmpty() && bodyList.get(0) instanceof KnuthBlockBox) { + KnuthBlockBox kbb = (KnuthBlockBox) bodyList.get(0); + if (kbb.getWidth() == 0 && kbb.hasFloatAnchors()) { + List floats = kbb.getFloatContentLMs(); + returnedList.add(new KnuthBlockBox(0, Collections.emptyList(), null, false, floats)); + Keep keep = getKeepTogether(); + returnedList.add(new BreakElement(new LeafPosition(this, 0), keep.getPenalty(), keep + .getContext(), context)); + bodyList.remove(0); + bodyList.remove(0); + } + } + // create a combined list - List returnedList = getCombinedKnuthElementsForListItem(labelList, bodyList, context); + returnedList.addAll(getCombinedKnuthElementsForListItem(labelList, bodyList, context)); // "wrap" the Position inside each element wrapPositionElements(returnedList, returnList, true); @@ -395,14 +423,26 @@ public class ListItemLayoutManager extends SpacedBorderedPaddedBlockLayoutManage footnoteList.addAll(FootenoteUtil.getFootnotes(elementLists[i], start[i], end[i])); } + LinkedList floats = new LinkedList(); + for (int i = 0; i < elementLists.length; i++) { + floats.addAll(FloatContentLayoutManager.checkForFloats(elementLists[i], start[i], end[i])); + } + // add the new elements addedBoxHeight += boxHeight; ListItemPosition stepPosition = new ListItemPosition(this, start[0], end[0], start[1], end[1]); stepPosition.setOriginalLabelPosition(originalLabelPosition); stepPosition.setOriginalBodyPosition(originalBodyPosition); - if (footnoteList.isEmpty()) { - returnList.add(new KnuthBox(boxHeight, stepPosition, false)); + + if (floats.isEmpty()) { + returnList.add(new KnuthBlockBox(boxHeight, footnoteList, stepPosition, false)); } else { + // add a line with height zero and no content and attach float to it + returnList.add(new KnuthBlockBox(0, Collections.emptyList(), stepPosition, false, floats)); + // add a break element to signal that we should restart LB at this break + Keep keep = getKeepTogether(); + returnList.add(new BreakElement(stepPosition, keep.getPenalty(), keep.getContext(), context)); + // add the original line where the float was but without the float now returnList.add(new KnuthBlockBox(boxHeight, footnoteList, stepPosition, false)); } @@ -581,6 +621,10 @@ public class ListItemLayoutManager extends SpacedBorderedPaddedBlockLayoutManage positionList.add(pos.getPosition()); } } + if (positionList.isEmpty()) { + reset(); + return; + } registerMarkers(true, isFirst(firstPos), isLast(lastPos)); diff --git a/test/layoutengine/standard-testcases/float_6.xml b/test/layoutengine/standard-testcases/float_6.xml new file mode 100644 index 000000000..543096a15 --- /dev/null +++ b/test/layoutengine/standard-testcases/float_6.xml @@ -0,0 +1,134 @@ + + + + + +

+ This test checks floats. +

+
+ + + + + + + + + + +Did you know... (taken from Wikipedia main page on November 6th, 2014, with the order slightly changed to better show the wrapping around the float) + + +From Wikipedia's new and recently improved content: + + + + + + + + + +... that while testifying in a 2004 lawsuit involving the meaning of the word steakburger, a corporate CEO was grilled on the witness stand? + + + + + + + + + +... that the Queen Anne house (pictured) + + + + +The former dean's house at the University of Wisconsin (this is the alt text of the image in the Wikipedia page) + + + + +at the Allen Centennial Gardens was home to four deans of the University of Wisconsin–Madison College of Agricultural and Life Sciences? + + + + + + + + + +... that rhapsodomancy was so vague, Virgil wrote against it in The Aeneid? + + + + + + + + + +... that Australian physician Claudia Burton Bradley was one of the first diabetics to be treated with insulin? + + + + + + + + + +... that Green Bay Packers offensive lineman David Bakhtiari was the first rookie in Packers history to start every game at left tackle in a season since the start of the 16-game season? + + + + + + + + + +... that in the Byzantine Empire, the office of orphanotrophos, head of the imperial orphanage, ranked among the higher offices of state? + + + + + + + + + +... that the stream Shingle Run is actually named after sawmills? + + + + + + + + + + + + + + + +
-- 2.39.5