Author: lbernardo
Date: Fri Nov 14 09:27:25 2014
New Revision: 1639587

URL: http://svn.apache.org/r1639587
Log:
handle floats inside lists

Added:
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml
   (with props)
Modified:
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java?rev=1639587&r1=1639586&r2=1639587&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
 Fri Nov 14 09:27:25 2014
@@ -71,6 +71,7 @@ public class FloatContentLayoutManager e
         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 e
     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;
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java?rev=1639587&r1=1639586&r2=1639587&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
 Fri Nov 14 09:27:25 2014
@@ -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;

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java?rev=1639587&r1=1639586&r2=1639587&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
 Fri Nov 14 09:27:25 2014
@@ -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.BreakOpp
 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 exten
         
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);
@@ -395,14 +423,26 @@ public class ListItemLayoutManager exten
                 
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));
             }
 
@@ -581,6 +621,10 @@ public class ListItemLayoutManager exten
                 positionList.add(pos.getPosition());
             }
         }
+        if (positionList.isEmpty()) {
+            reset();
+            return;
+        }
 
         registerMarkers(true, isFirst(firstPos), isLast(lastPos));
 

Added: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml?rev=1639587&view=auto
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml
 (added)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml
 Fri Nov 14 09:27:25 2014
@@ -0,0 +1,134 @@
+<?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>&#x2022;</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>&#x2022;</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>&#x2022;</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>&#x2022;</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>&#x2022;</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>&#x2022;</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>&#x2022;</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>

Propchange: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_6.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to