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;
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;
context.updateKeepWithPreviousPending(childLC.getKeepWithPreviousPending());
this.keepWithNextPendingOnBody = childLC.getKeepWithNextPending();
+ List<ListElement> returnedList = new LinkedList<ListElement>();
+ if (!labelList.isEmpty() && labelList.get(0) instanceof KnuthBlockBox) {
+ KnuthBlockBox kbb = (KnuthBlockBox) labelList.get(0);
+ if (kbb.getWidth() == 0 && kbb.hasFloatAnchors()) {
+ List<FloatContentLayoutManager> 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<FloatContentLayoutManager> 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);
footnoteList.addAll(FootenoteUtil.getFootnotes(elementLists[i], start[i], end[i]));
}
+ LinkedList<FloatContentLayoutManager> floats = new LinkedList<FloatContentLayoutManager>();
+ 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));
}
positionList.add(pos.getPosition());
}
}
+ if (positionList.isEmpty()) {
+ reset();
+ return;
+ }
registerMarkers(true, isFirst(firstPos), isLast(lastPos));
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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$ -->
+<testcase>
+ <info>
+ <p>
+ This test checks floats.
+ </p>
+ </info>
+ <fo>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master margin="0.25in" master-name="page" page-height="11in" page-width="8.5in">
+ <fo:region-body />
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="page">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+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)
+ </fo:block>
+ <fo:block>
+From Wikipedia's new and recently improved content:
+ </fo:block>
+ <fo:block>
+ <fo:list-block>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that while testifying in a 2004 lawsuit involving the meaning of the word steakburger, a corporate CEO was grilled on the witness stand?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that the Queen Anne house (pictured)
+ <fo:float float="end">
+ <fo:block border="1pt solid red" padding="5pt" end-indent="0pt" start-indent="0pt">
+ <fo:block-container inline-progression-dimension="120pt">
+ <fo:block background-color="yellow">
+The former dean's house at the University of Wisconsin (this is the alt text of the image in the Wikipedia page)
+ </fo:block>
+ </fo:block-container>
+ </fo:block>
+ </fo:float>
+at the Allen Centennial Gardens was home to four deans of the University of Wisconsin–Madison College of Agricultural and Life Sciences?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that rhapsodomancy was so vague, Virgil wrote against it in The Aeneid?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that Australian physician Claudia Burton Bradley was one of the first diabetics to be treated with insulin?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... 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?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that in the Byzantine Empire, the office of orphanotrophos, head of the imperial orphanage, ranked among the higher offices of state?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>•</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+... that the stream Shingle Run is actually named after sawmills?
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
+ </fo>
+ <checks>
+ <!-- first float -->
+ <eval expected="450000" xpath="//pageViewport[1]/page/regionViewport[1]//flow[1]/block[4]/@left-offset" />
+ <eval expected="... that the Queen Anne house (pictured) at the Allen Centennial Gardens" xpath="//pageViewport[1]/page/regionViewport[1]//flow[1]/block[5]/block[1]/block[1]/block[2]/block[1]/lineArea[1]" />
+ <eval expected="was home to four deans of the University of Wisconsin–Madison College of" xpath="//pageViewport[1]/page/regionViewport[1]//flow[1]/block[5]/block[1]/block[1]/block[2]/block[1]/lineArea[2]" />
+ </checks>
+</testcase>