Author: lbernardo
Date: Mon Oct 20 09:09:56 2014
New Revision: 1633083

URL: http://svn.apache.org/r1633083
Log:
basic implementation of side floats

Added:
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_1.xml
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_2.xml
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_3.xml
   (with props)
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/layoutengine/standard-testcases/float_4.xml
   (with props)
Modified:
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.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/PageSequenceLayoutManager.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
    
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Area.java
 Mon Oct 20 09:09:56 2014
@@ -111,6 +111,8 @@ public class Area extends AreaTreeObject
     /** the area's block-progression-dimension */
     protected int bpd;
 
+    protected int effectiveIPD = -1;
+
     /**
      * Resolved bidirectional level for area.
      */
@@ -208,6 +210,10 @@ public class Area extends AreaTreeObject
         return getBorderAndPaddingWidthStart() + getIPD() + 
getBorderAndPaddingWidthEnd();
     }
 
+    public int getEffectiveAllocIPD() {
+        return getBorderAndPaddingWidthStart() + getEffectiveIPD() + 
getBorderAndPaddingWidthEnd();
+    }
+
     /**
      * Get the allocation block progression dimension of this area.
      * This adds the content, borders, padding and spaces to find the
@@ -499,4 +505,14 @@ public class Area extends AreaTreeObject
         sb.append("}");
         return sb.toString();
     }
+
+    public int getEffectiveIPD() {
+        return 0;
+    }
+
+    public void activateEffectiveIPD() {
+        if (effectiveIPD != -1) {
+            ipd = effectiveIPD;
+        }
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/Block.java
 Mon Oct 20 09:09:56 2014
@@ -184,5 +184,21 @@ public class Block extends BlockParent {
         return location;
     }
 
+    // maybe this can be done in the parent?
+    public int getEffectiveIPD() {
+        int eIPD = super.getEffectiveIPD();
+        if (eIPD != 0) {
+            effectiveIPD = eIPD;
+        }
+        return eIPD;
+    }
+
+    // maybe this can be done in the parent?
+    public void activateEffectiveIPD() {
+        super.activateEffectiveIPD();
+        if (effectiveIPD != -1) {
+            ipd = effectiveIPD;
+        }
+    }
 }
 

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockParent.java
 Mon Oct 20 09:09:56 2014
@@ -123,4 +123,25 @@ public class BlockParent extends Area {
     public int getYOffset() {
         return yOffset;
     }
+
+    public int getEffectiveIPD() {
+        int maxIPD = 0;
+        if (children != null) {
+            for (Area area : children) {
+                int effectiveIPD = area.getEffectiveIPD();
+                if (effectiveIPD > maxIPD) {
+                    maxIPD = effectiveIPD;
+                }
+            }
+        }
+        return maxIPD;
+    }
+
+    public void activateEffectiveIPD() {
+        if (children != null) {
+            for (Area area : children) {
+                area.activateEffectiveIPD();
+            }
+        }
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/BlockViewport.java
 Mon Oct 20 09:09:56 2014
@@ -93,5 +93,9 @@ public class BlockViewport extends Block
             return null;
         }
     }
+
+    public int getEffectiveIPD() {
+        return getIPD();
+    }
 }
 

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/LineArea.java
 Mon Oct 20 09:09:56 2014
@@ -283,5 +283,19 @@ public class LineArea extends Area {
             // been handled, modifying the line indent
         }
     }
+
+    public int getEffectiveIPD() {
+        int maxIPD = 0;
+        if (inlineAreas != null) {
+            for (Area area : inlineAreas) {
+                int effectiveIPD = area.getEffectiveIPD();
+                if (effectiveIPD > maxIPD) {
+                    maxIPD = effectiveIPD;
+                }
+            }
+        }
+        return maxIPD;
+    }
+
 }
 

Added: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java?rev=1633083&view=auto
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
 (added)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
 Mon Oct 20 09:09:56 2014
@@ -0,0 +1,31 @@
+/*
+ * 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.area;
+
+public class SideFloat extends Block {
+
+    private static final long serialVersionUID = 2058594336594375047L;
+
+    public SideFloat() {
+        setAreaClass(Area.CLASS_SIDE_FLOAT);
+        addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
+        setPositioning(Block.ABSOLUTE);
+    }
+}

Propchange: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/SideFloat.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/InlineViewport.java
 Mon Oct 20 09:09:56 2014
@@ -149,4 +149,7 @@ public class InlineViewport extends Inli
         this.content = (Area) in.readObject();
     }
 
+    public int getEffectiveIPD() {
+        return getIPD();
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/area/inline/TextArea.java
 Mon Oct 20 09:09:56 2014
@@ -209,5 +209,8 @@ public class TextArea extends AbstractTe
         }
     }
 
+    public int getEffectiveIPD() {
+        return getIPD();
+    }
 }
 

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
 Mon Oct 20 09:09:56 2014
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Stack;
 
 import org.apache.fop.fo.flow.Block;
+import org.apache.fop.fo.flow.Float;
 import org.apache.fop.util.CharUtilities;
 
 /**
@@ -157,6 +158,10 @@ public class XMLWhiteSpaceHandler {
 
         charIter = new RecursiveCharIterator(fo, firstTextNode);
         inWhiteSpace = false;
+        if (firstTextNode.siblings != null && firstTextNode.siblings[0] != null
+                && firstTextNode.siblings[0].getNameId() == 
Constants.FO_FLOAT) {
+            inWhiteSpace = ((Float) 
firstTextNode.siblings[0]).getInWhiteSpace();
+        }
 
         if (fo == currentBlock
                 || currentBlock == null
@@ -232,6 +237,9 @@ public class XMLWhiteSpaceHandler {
                 firstWhiteSpaceInSeq = null;
             }
         }
+        if (nextChild instanceof Float) {
+            ((Float) nextChild).setInWhiteSpace(inWhiteSpace);
+        }
     }
 
     /**

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/fo/flow/Float.java
 Mon Oct 20 09:09:56 2014
@@ -34,11 +34,10 @@ import org.apache.fop.fo.ValidationExcep
  */
 public class Float extends FObj {
     // The value of properties relevant for fo:float (commented out for 
performance.
-    //     private int float_;
-    //     private int clear;
+    private int foFloat;
+    private int clear;
     // End of property values
-
-    private static boolean notImplementedWarningGiven;
+    private boolean inWhiteSpace;
 
     /**
      * Base constructor
@@ -47,17 +46,13 @@ public class Float extends FObj {
      */
     public Float(FONode parent) {
         super(parent);
-
-        if (!notImplementedWarningGiven) {
-            getFOValidationEventProducer().unimplementedFeature(this, 
getName(),
-                    getName(), getLocator());
-            notImplementedWarningGiven = true;
-        }
     }
 
     /** {@inheritDoc} */
     public void bind(PropertyList pList) throws FOPException {
-        // No active properties -> Nothing to do.
+        super.bind(pList);
+        foFloat = pList.get(PR_FLOAT).getEnum();
+        clear = pList.get(PR_CLEAR).getEnum();
     }
 
     /**
@@ -92,4 +87,16 @@ public class Float extends FObj {
     public int getNameId() {
         return FO_FLOAT;
     }
+
+    public int getFloat() {
+        return foFloat;
+    }
+
+    public void setInWhiteSpace(boolean iws) {
+        inWhiteSpace = iws;
+    }
+
+    public boolean getInWhiteSpace() {
+        return inWhiteSpace;
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java
 Mon Oct 20 09:09:56 2014
@@ -67,6 +67,17 @@ public abstract class AbstractBreaker {
         }
     }
 
+    public static class FloatPosition extends LeafPosition {
+        double bpdAdjust; // Percentage to adjust (stretch or shrink)
+        int difference;
+
+        FloatPosition(LayoutManager lm, int breakIndex, double bpdA, int diff) 
{
+            super(lm, breakIndex);
+            bpdAdjust = bpdA;
+            difference = diff;
+        }
+    }
+
     /**
      * Helper method, mainly used to improve debug/trace output
      * @param breakClassId  the {@link Constants} enum value.
@@ -195,9 +206,12 @@ public abstract class AbstractBreaker {
     }
 
     // used by doLayout and getNextBlockList*
-    private List<BlockSequence> blockLists;
+    protected List<BlockSequence> blockLists;
 
     private boolean empty = true;
+    /** blockListIndex of the current BlockSequence in blockLists */
+    protected int blockListIndex;
+
 
     /** desired text alignment */
     protected int alignment;
@@ -372,7 +386,7 @@ public abstract class AbstractBreaker {
 
             //*** Phases 2 and 3 ***
             log.debug("PLM> blockLists.size() = " + blockLists.size());
-            for (int blockListIndex = 0; blockListIndex < blockLists.size(); 
blockListIndex++) {
+            for (blockListIndex = 0; blockListIndex < blockLists.size(); 
blockListIndex++) {
                 blockList = blockLists.get(blockListIndex);
 
                 //debug code start
@@ -394,7 +408,10 @@ public abstract class AbstractBreaker {
                 alg.setConstantLineWidth(flowBPD);
                 int optimalPageCount = alg.findBreakingPoints(blockList, 1, 
true,
                         BreakingAlgorithm.ALL_BREAKS);
-                if (Math.abs(alg.getIPDdifference()) > 1) {
+
+                if (alg.handlingFloat()) {
+                    nextSequenceStartsOn = handleFloatLayout(alg, 
optimalPageCount, blockList, childLC);
+                } else if (Math.abs(alg.getIPDdifference()) > 1) {
                     addAreas(alg, optimalPageCount, blockList, blockList);
                     // *** redo Phase 1 ***
                     log.trace("IPD changes after page " + optimalPageCount);
@@ -476,14 +493,14 @@ public abstract class AbstractBreaker {
         for (int p = startPart; p < startPart + partCount; p++) {
             PageBreakPosition pbp = alg.getPageBreaks().get(p);
 
-            //Check the last break position for forced breaks
+            // Check the last break position for forced breaks
             int lastBreakClass;
             if (p == 0) {
                 lastBreakClass = effectiveList.getStartOn();
             } else {
                 ListElement lastBreakElement = 
effectiveList.getElement(endElementIndex);
                 if (lastBreakElement.isPenalty()) {
-                    KnuthPenalty pen = (KnuthPenalty)lastBreakElement;
+                    KnuthPenalty pen = (KnuthPenalty) lastBreakElement;
                     if (pen.getPenalty() == KnuthPenalty.INFINITE) {
                         /**
                          * That means that there was a 
keep.within-page="always", but that
@@ -500,14 +517,12 @@ public abstract class AbstractBreaker {
                 }
             }
 
-            //the end of the new part
+            // the end of the new part
             endElementIndex = pbp.getLeafPos();
 
             // ignore the first elements added by the
             // PageSequenceLayoutManager
-            startElementIndex += (startElementIndex == 0)
-                    ? effectiveList.ignoreAtStart
-                    : 0;
+            startElementIndex += (startElementIndex == 0) ? 
effectiveList.ignoreAtStart : 0;
 
             log.debug("PLM> part: " + (p + 1)
                     + ", start at pos " + startElementIndex
@@ -518,20 +533,17 @@ public abstract class AbstractBreaker {
 
             int displayAlign = getCurrentDisplayAlign();
 
-            //The following is needed by 
SpaceResolver.performConditionalsNotification()
-            //further down as there may be important Position elements in the 
element list trailer
+            // The following is needed by 
SpaceResolver.performConditionalsNotification()
+            // further down as there may be important Position elements in the 
element list trailer
             int notificationEndElementIndex = endElementIndex;
 
             // ignore the last elements added by the
             // PageSequenceLayoutManager
-            endElementIndex -= (endElementIndex == (originalList.size() - 1))
-                    ? effectiveList.ignoreAtEnd
-                    : 0;
+            endElementIndex -= (endElementIndex == (originalList.size() - 1)) 
? effectiveList.ignoreAtEnd : 0;
 
             // ignore the last element in the page if it is a KnuthGlue
             // object
-            if (((KnuthElement) effectiveList.get(endElementIndex))
-                    .isGlue()) {
+            if (((KnuthElement) effectiveList.get(endElementIndex)).isGlue()) {
                 endElementIndex--;
             }
 
@@ -556,13 +568,12 @@ public abstract class AbstractBreaker {
                 }
 
                 // Handle SpaceHandling(Break)Positions, see SpaceResolver!
-                SpaceResolver.performConditionalsNotification(effectiveList,
-                        startElementIndex, notificationEndElementIndex, 
lastBreak);
+                SpaceResolver.performConditionalsNotification(effectiveList, 
startElementIndex,
+                        notificationEndElementIndex, lastBreak);
                 // Add areas now!
-                addAreas(new KnuthPossPosIter(effectiveList,
-                        startElementIndex, endElementIndex + 1), childLC);
+                addAreas(new KnuthPossPosIter(effectiveList, 
startElementIndex, endElementIndex + 1), childLC);
             } else {
-                //no content for this part
+                // no content for this part
                 handleEmptyContent();
             }
 
@@ -571,6 +582,10 @@ public abstract class AbstractBreaker {
             lastBreak = endElementIndex;
             startElementIndex = pbp.getLeafPos() + 1;
         }
+        if (alg.handlingFloat()) {
+            addAreasForFloats(alg, startPart, partCount, originalList, 
effectiveList, childLC, lastBreak,
+                    startElementIndex, endElementIndex);
+        }
     }
     /**
      * Notifies the layout managers about the space and conditional length 
situation based on
@@ -774,4 +789,14 @@ public abstract class AbstractBreaker {
         return nextSequenceStartsOn;
     }
 
+    protected int handleFloatLayout(PageBreakingAlgorithm alg, int 
optimalPageCount, BlockSequence blockList,
+            LayoutContext childLC) {
+        throw new IllegalStateException();
+    }
+
+    protected void addAreasForFloats(PageBreakingAlgorithm alg, int startPart, 
int partCount,
+            BlockSequence originalList, BlockSequence effectiveList, final 
LayoutContext childLC,
+            int lastBreak, int startElementIndex, int endElementIndex) {
+        throw new IllegalStateException();
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -537,4 +537,11 @@ public abstract class AbstractLayoutMana
         }
         ((AbstractLayoutManager) lm).possiblyRegisterMarkersForTables(markers, 
isStarting, isFirst, isLast);
     }
+
+    public boolean handlingFloat() {
+        if (parentLayoutManager != null && parentLayoutManager instanceof 
AbstractLayoutManager) {
+            return ((AbstractLayoutManager) 
parentLayoutManager).handlingFloat();
+        }
+        return false;
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/BreakingAlgorithm.java
 Mon Oct 20 09:09:56 2014
@@ -558,6 +558,9 @@ public abstract class BreakingAlgorithm 
                     elementIndex, previousIsBox, allowedBreaks).isBox();
 
             if (activeNodeCount == 0) {
+                if (handlingFloat()) {
+                    return handleFloat();
+                }
                 if (getIPDdifference() != 0) {
                     return handleIpdChange();
                 }
@@ -945,8 +948,11 @@ public abstract class BreakingAlgorithm 
                     log.trace("\tline=" + line);
                 }
 
+                if (element.isForcedBreak() && handlingFloat()) {
+                    disableFloatHandling(); // so that we do not create a 
float edge position later
+                }
                 // The line would be too long.
-                if (r < -1 || element.isForcedBreak()) {
+                if (r < -1 || element.isForcedBreak() || handlingFloat()) {
                     deactivateNode(node, line);
                 }
 
@@ -1028,6 +1034,13 @@ public abstract class BreakingAlgorithm 
             }
         }
 
+        createForcedNodes(node, line, elementIdx, difference, r, demerits, 
fitnessClass, availableShrink,
+                availableStretch, newWidth, newStretch, newShrink);
+    }
+
+    protected void createForcedNodes(KnuthNode node, int line, int elementIdx, 
int difference, double r,
+            double demerits, int fitnessClass, int availableShrink, int 
availableStretch, int newWidth,
+            int newStretch, int newShrink) {
         if (r <= -1) {
             log.debug("Considering tooLong, demerits=" + demerits);
             if (lastTooLong == null || demerits < lastTooLong.totalDemerits) {
@@ -1042,10 +1055,9 @@ public abstract class BreakingAlgorithm 
         } else {
             if (lastTooShort == null || demerits <= 
lastTooShort.totalDemerits) {
                 if (considerTooShort) {
-                    //consider possibilities which are too short
-                    best.addRecord(demerits, node, r,
-                            availableShrink, availableStretch,
-                            difference, fitnessClass);
+                    // consider possibilities which are too short
+                    best.addRecord(demerits, node, r, availableShrink, 
availableStretch, difference,
+                            fitnessClass);
                 }
                 lastTooShort = createNode(elementIdx, line + 1, fitnessClass,
                         newWidth, newStretch, newShrink,
@@ -1451,4 +1463,15 @@ public abstract class BreakingAlgorithm 
         return this.alignmentLast;
     }
 
+    protected boolean handlingFloat() {
+        return false;
+    }
+
+    protected int handleFloat() {
+        throw new IllegalStateException();
+    }
+
+    protected void disableFloatHandling() {
+        throw new IllegalStateException();
+    }
 }

Added: 
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=1633083&view=auto
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
 (added)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -0,0 +1,128 @@
+/*
+ * 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;
+
+    public FloatContentLayoutManager(Float node) {
+        super(node);
+        generatesReferenceArea = true;
+        side = node.getFloat();
+    }
+
+    public Keep getKeepTogether() {
+        return getParentKeepTogether();
+    }
+
+    public Keep getKeepWithNext() {
+        return Keep.KEEP_AUTO;
+    }
+
+    public Keep getKeepWithPrevious() {
+        return Keep.KEEP_ALWAYS;
+    }
+
+    public void addAreas(PositionIterator parentIter, LayoutContext 
layoutContext) {
+        floatContentArea = new SideFloat();
+        AreaAdditionUtil.addAreas(this, parentIter, layoutContext);
+        flush();
+    }
+
+    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) {
+            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);
+        }
+    }
+
+    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;
+        }
+    }
+
+    protected CommonBorderPaddingBackground getCommonBorderPaddingBackground() 
{
+        return null;
+    }
+
+    public void processAreas(LayoutContext layoutContext) {
+        if (getParent() instanceof FloatLayoutManager) {
+            FloatLayoutManager flm = (FloatLayoutManager) getParent();
+            flm.processAreas(layoutContext);
+        }
+    }
+
+    public int getFloatHeight() {
+        return floatContentArea.getAllocBPD();
+    }
+
+    public int getFloatYOffset() {
+        return yOffset;
+    }
+}

Propchange: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FloatContentLayoutManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -49,6 +49,8 @@ public class FlowLayoutManager extends B
     /** Array of areas currently being filled stored by area class */
     private final BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX];
 
+    private boolean handlingFloat;
+
     /**
      * This is the top level layout manager.
      * It is created by the PageSequence FO.
@@ -374,6 +376,10 @@ public class FlowLayoutManager extends B
      */
     @Override
     public void addChildArea(Area childArea) {
+        if (childArea instanceof BlockParent && handlingFloat()) {
+            BlockParent bp = (BlockParent) childArea;
+            bp.setXOffset(getPSLM().getStartIntrusionAdjustment());
+        }
         getParentArea(childArea);
         addChildToArea(childArea,
                           this.currentAreas[childArea.getAreaClass()]);
@@ -385,7 +391,7 @@ public class FlowLayoutManager extends B
         BlockParent parentArea = null;
         int aclass = childArea.getAreaClass();
 
-        if (aclass == Area.CLASS_NORMAL) {
+        if (aclass == Area.CLASS_NORMAL || aclass == Area.CLASS_SIDE_FLOAT) {
             parentArea = getCurrentPV().getCurrentFlow();
         } else if (aclass == Area.CLASS_BEFORE_FLOAT) {
             parentArea = getCurrentPV().getBodyRegion().getBeforeFloat();
@@ -407,7 +413,8 @@ public class FlowLayoutManager extends B
      */
     @Override
     public int getContentAreaIPD() {
-        return getCurrentPV().getCurrentSpan().getColumnWidth();
+        int flowIPD = getPSLM().getCurrentColumnWidth();
+        return flowIPD;
     }
 
     /**
@@ -425,5 +432,16 @@ public class FlowLayoutManager extends B
         return true;
     }
 
+    public void handleFloatOn() {
+        handlingFloat = true;
+    }
+
+    public void handleFloatOff() {
+        handlingFloat = false;
+    }
+
+    public boolean handlingFloat() {
+        return handlingFloat;
+    }
 }
 

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/KnuthBlockBox.java
 Mon Oct 20 09:09:56 2014
@@ -36,6 +36,7 @@ public class KnuthBlockBox extends Knuth
      */
     private int bpd;
     private List<FootnoteBodyLayoutManager> footnoteList;
+    private List<FloatContentLayoutManager> floatContentLMs;
     /** List of Knuth elements. This is a list of LinkedList elements. */
     private List elementLists;
 
@@ -53,6 +54,7 @@ public class KnuthBlockBox extends Knuth
         ipdRange = range;
         bpd = bpdim;
         footnoteList = new LinkedList<FootnoteBodyLayoutManager>();
+        floatContentLMs = new LinkedList<FloatContentLayoutManager>();
     }
 
     /**
@@ -69,6 +71,16 @@ public class KnuthBlockBox extends Knuth
         ipdRange = MinOptMax.ZERO;
         bpd = 0;
         footnoteList = new LinkedList<FootnoteBodyLayoutManager>(list);
+        floatContentLMs = new LinkedList<FloatContentLayoutManager>();
+    }
+
+    public KnuthBlockBox(int width, List list, Position pos, boolean auxiliary,
+            List<FloatContentLayoutManager> fclms) {
+        super(width, pos, auxiliary);
+        ipdRange = MinOptMax.ZERO;
+        bpd = 0;
+        footnoteList = new LinkedList<FootnoteBodyLayoutManager>(list);
+        floatContentLMs = new LinkedList<FloatContentLayoutManager>(fclms);
     }
 
     /**
@@ -122,4 +134,12 @@ public class KnuthBlockBox extends Knuth
     public int getBPD() {
         return bpd;
     }
+
+    public List<FloatContentLayoutManager> getFloatContentLMs() {
+        return floatContentLMs;
+    }
+
+    public boolean hasFloatAnchors() {
+        return (floatContentLMs.size() > 0);
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java
 Mon Oct 20 09:09:56 2014
@@ -41,6 +41,7 @@ import org.apache.fop.fo.flow.Block;
 import org.apache.fop.fo.flow.BlockContainer;
 import org.apache.fop.fo.flow.Character;
 import org.apache.fop.fo.flow.ExternalGraphic;
+import org.apache.fop.fo.flow.Float;
 import org.apache.fop.fo.flow.Footnote;
 import org.apache.fop.fo.flow.Inline;
 import org.apache.fop.fo.flow.InlineContainer;
@@ -74,6 +75,7 @@ import org.apache.fop.layoutmgr.inline.B
 import org.apache.fop.layoutmgr.inline.CharacterLayoutManager;
 import org.apache.fop.layoutmgr.inline.ContentLayoutManager;
 import org.apache.fop.layoutmgr.inline.ExternalGraphicLayoutManager;
+import org.apache.fop.layoutmgr.inline.FloatLayoutManager;
 import org.apache.fop.layoutmgr.inline.FootnoteLayoutManager;
 import org.apache.fop.layoutmgr.inline.InlineContainerLayoutManager;
 import org.apache.fop.layoutmgr.inline.InlineLayoutManager;
@@ -113,7 +115,7 @@ public class LayoutManagerMapping implem
         registerMaker(FObjMixed.class, new Maker());
         registerMaker(BidiOverride.class, new 
BidiOverrideLayoutManagerMaker());
         registerMaker(Inline.class, new InlineLayoutManagerMaker());
-        registerMaker(Footnote.class, new FootnodeLayoutManagerMaker());
+        registerMaker(Footnote.class, new FootnoteLayoutManagerMaker());
         registerMaker(InlineContainer.class,
                    new InlineContainerLayoutManagerMaker());
         registerMaker(BasicLink.class, new BasicLinkLayoutManagerMaker());
@@ -146,6 +148,7 @@ public class LayoutManagerMapping implem
         registerMaker(Title.class, new InlineLayoutManagerMaker());
         registerMaker(MultiCase.class, new MultiCaseLayoutManagerMaker());
         registerMaker(MultiSwitch.class, new MultiSwitchLayoutManagerMaker());
+        registerMaker(Float.class, new FloatLayoutManagerMaker());
     }
 
     /**
@@ -267,7 +270,7 @@ public class LayoutManagerMapping implem
     }
 
     /** a layout manager maker */
-    public static class FootnodeLayoutManagerMaker extends Maker {
+    public static class FootnoteLayoutManagerMaker extends Maker {
         /** {@inheritDoc} */
         public void make(FONode node, List lms) {
             lms.add(new FootnoteLayoutManager((Footnote) node));
@@ -463,4 +466,10 @@ public class LayoutManagerMapping implem
         }
     }
 
+    public static class FloatLayoutManagerMaker extends Maker {
+        public void make(FONode node, List lms) {
+            lms.add(new FloatLayoutManager((Float) node));
+        }
+    }
+
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageBreaker.java
 Mon Oct 20 09:09:56 2014
@@ -20,6 +20,8 @@
 package org.apache.fop.layoutmgr;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 
@@ -32,6 +34,7 @@ import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.pagination.Region;
 import org.apache.fop.fo.pagination.RegionBody;
 import org.apache.fop.fo.pagination.StaticContent;
+import org.apache.fop.layoutmgr.BreakingAlgorithm.KnuthNode;
 import 
org.apache.fop.layoutmgr.PageBreakingAlgorithm.PageBreakingLayoutListener;
 import org.apache.fop.traits.MinOptMax;
 
@@ -47,6 +50,10 @@ public class PageBreaker extends Abstrac
     private PageProvider pageProvider;
     private Block separatorArea;
     private boolean spanAllActive;
+    private boolean handlingStartOfFloat;
+    private boolean handlingEndOfFloat;
+    private int floatHeight;
+    private int floatYOffset;
 
     /**
      * The FlowLayoutManager object, which processes
@@ -69,7 +76,7 @@ public class PageBreaker extends Abstrac
 
     /** {@inheritDoc} */
     protected void updateLayoutContext(LayoutContext context) {
-        int flowIPD = pslm.getCurrentPV().getCurrentSpan().getColumnWidth();
+        int flowIPD = pslm.getCurrentColumnWidth();
         context.setRefIPD(flowIPD);
     }
 
@@ -140,18 +147,20 @@ public class PageBreaker extends Abstrac
     /** {@inheritDoc} */
     protected int getNextBlockList(LayoutContext childLC, int 
nextSequenceStartsOn,
             Position positionAtIPDChange, LayoutManager restartLM, List 
firstElements) {
-        if (!firstPart) {
-            // if this is the first page that will be created by
-            // the current BlockSequence, it could have a break
-            // condition that must be satisfied;
-            // otherwise, we may simply need a new page
-            handleBreakTrait(nextSequenceStartsOn);
-        }
-        firstPart = false;
-        pageBreakHandled = true;
+        if (!handlingFloat()) {
+            if (!firstPart) {
+                // if this is the first page that will be created by
+                // the current BlockSequence, it could have a break
+                // condition that must be satisfied;
+                // otherwise, we may simply need a new page
+                handleBreakTrait(nextSequenceStartsOn);
+            }
+            firstPart = false;
+            pageBreakHandled = true;
 
-        pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(),
-                pslm.getCurrentPV().getCurrentSpan().getCurrentFlowIndex(), 
this.spanAllActive);
+            pageProvider.setStartOfNextElementList(pslm.getCurrentPageNum(), 
pslm.getCurrentPV()
+                    .getCurrentSpan().getCurrentFlowIndex(), 
this.spanAllActive);
+        }
         return super.getNextBlockList(childLC, nextSequenceStartsOn, 
positionAtIPDChange,
                 restartLM, firstElements);
     }
@@ -234,6 +243,7 @@ public class PageBreaker extends Abstrac
             // handle the footnote separator
             handleFootnoteSeparator();
         }
+
         return contentList;
     }
 
@@ -616,4 +626,194 @@ public class PageBreaker extends Abstrac
             return true;
         }
     }
+
+    protected boolean handlingStartOfFloat() {
+        return handlingStartOfFloat;
+    }
+
+    protected void handleStartOfFloat(int fHeight, int fYOffset) {
+        handlingStartOfFloat = true;
+        handlingEndOfFloat = false;
+        floatHeight = fHeight;
+        floatYOffset = fYOffset;
+        childFLM.handleFloatOn();
+    }
+
+    protected int getFloatHeight() {
+        return floatHeight;
+    }
+
+    protected int getFloatYOffset() {
+        return floatYOffset;
+    }
+
+    protected boolean handlingEndOfFloat() {
+        return handlingEndOfFloat;
+    }
+
+    protected void handleEndOfFloat(int fHeight) {
+        handlingEndOfFloat = true;
+        handlingStartOfFloat = false;
+        floatHeight = fHeight;
+        childFLM.handleFloatOff();
+    }
+
+    protected boolean handlingFloat() {
+        return (handlingStartOfFloat || handlingEndOfFloat);
+    }
+
+    public int getOffsetDueToFloat() {
+        handlingEndOfFloat = false;
+        return floatHeight + floatYOffset;
+    }
+
+    protected int handleFloatLayout(PageBreakingAlgorithm alg, int 
optimalPageCount, BlockSequence blockList,
+            LayoutContext childLC) {
+        pageBreakHandled = true;
+        List firstElements = Collections.EMPTY_LIST;
+        KnuthNode floatNode = alg.getBestFloatEdgeNode();
+        int floatPosition = floatNode.position;
+        KnuthElement floatElem = alg.getElement(floatPosition);
+        Position positionAtBreak = floatElem.getPosition();
+        if (!(positionAtBreak instanceof 
SpaceResolver.SpaceHandlingBreakPosition)) {
+            throw new UnsupportedOperationException("Don't know how to restart 
at position" + positionAtBreak);
+        }
+        /* Retrieve the original position wrapped into this space position */
+        positionAtBreak = positionAtBreak.getPosition();
+        addAreas(alg, optimalPageCount, blockList, blockList);
+        blockLists.clear();
+        blockListIndex = -1;
+        LayoutManager restartAtLM = null;
+        if (positionAtBreak != null && positionAtBreak.getIndex() == -1) {
+            Position position;
+            Iterator iter = blockList.listIterator(floatPosition + 1);
+            do {
+                KnuthElement nextElement = (KnuthElement) iter.next();
+                position = nextElement.getPosition();
+            } while (position == null || position instanceof 
SpaceResolver.SpaceHandlingPosition
+                    || position instanceof 
SpaceResolver.SpaceHandlingBreakPosition
+                    && position.getPosition().getIndex() == -1);
+            LayoutManager surroundingLM = positionAtBreak.getLM();
+            while (position.getLM() != surroundingLM) {
+                position = position.getPosition();
+            }
+            restartAtLM = position.getPosition().getLM();
+        }
+        int nextSequenceStartsOn = getNextBlockList(childLC, 
Constants.EN_COLUMN, positionAtBreak,
+                restartAtLM, firstElements);
+        return nextSequenceStartsOn;
+    }
+
+    protected void addAreasForFloats(PageBreakingAlgorithm alg, int startPart, 
int partCount,
+            BlockSequence originalList, BlockSequence effectiveList, final 
LayoutContext childLC,
+            int lastBreak, int startElementIndex, int endElementIndex) {
+        FloatPosition pbp = alg.getFloatPosition();
+
+        // Check the last break position for forced breaks
+        int lastBreakClass;
+        if (startElementIndex == 0) {
+            lastBreakClass = effectiveList.getStartOn();
+        } else {
+            ListElement lastBreakElement = 
effectiveList.getElement(endElementIndex);
+            if (lastBreakElement.isPenalty()) {
+                KnuthPenalty pen = (KnuthPenalty) lastBreakElement;
+                if (pen.getPenalty() == KnuthPenalty.INFINITE) {
+                    /**
+                     * That means that there was a keep.within-page="always", 
but that
+                     * it's OK to break at a column. TODO The break class is 
being
+                     * abused to implement keep.within-column and 
keep.within-page.
+                     * This is very misleading and must be revised.
+                     */
+                    lastBreakClass = Constants.EN_COLUMN;
+                } else {
+                    lastBreakClass = pen.getBreakClass();
+                }
+            } else {
+                lastBreakClass = Constants.EN_COLUMN;
+            }
+        }
+
+        // the end of the new part
+        endElementIndex = pbp.getLeafPos();
+
+        // ignore the first elements added by the
+        // PageSequenceLayoutManager
+        startElementIndex += (startElementIndex == 0) ? 
effectiveList.ignoreAtStart : 0;
+
+        log.debug("PLM> part: " + (startPart + partCount + 1) + ", start at 
pos " + startElementIndex
+                + ", break at pos " + endElementIndex + ", break class = "
+                + getBreakClassName(lastBreakClass));
+
+        startPart(effectiveList, lastBreakClass);
+
+        int displayAlign = getCurrentDisplayAlign();
+
+        // The following is needed by 
SpaceResolver.performConditionalsNotification()
+        // further down as there may be important Position elements in the 
element list trailer
+        int notificationEndElementIndex = endElementIndex;
+
+        // ignore the last elements added by the
+        // PageSequenceLayoutManager
+        endElementIndex -= (endElementIndex == (originalList.size() - 1)) ? 
effectiveList.ignoreAtEnd : 0;
+
+        // ignore the last element in the page if it is a KnuthGlue
+        // object
+        if (((KnuthElement) effectiveList.get(endElementIndex)).isGlue()) {
+            endElementIndex--;
+        }
+
+        // ignore KnuthGlue and KnuthPenalty objects
+        // at the beginning of the line
+        startElementIndex = alg.par.getFirstBoxIndex(startElementIndex);
+
+        if (startElementIndex <= endElementIndex) {
+            if (log.isDebugEnabled()) {
+                log.debug("     addAreas from " + startElementIndex + " to " + 
endElementIndex);
+            }
+            // set the space adjustment ratio
+            childLC.setSpaceAdjust(pbp.bpdAdjust);
+            // add space before if display-align is center or bottom
+            // add space after if display-align is distribute and
+            // this is not the last page
+            if (pbp.difference != 0 && displayAlign == Constants.EN_CENTER) {
+                childLC.setSpaceBefore(pbp.difference / 2);
+            } else if (pbp.difference != 0 && displayAlign == 
Constants.EN_AFTER) {
+                childLC.setSpaceBefore(pbp.difference);
+            }
+
+            // Handle SpaceHandling(Break)Positions, see SpaceResolver!
+            SpaceResolver.performConditionalsNotification(effectiveList, 
startElementIndex,
+                    notificationEndElementIndex, lastBreak);
+            // Add areas of lines, in the current page, before the float or 
during float
+            addAreas(new KnuthPossPosIter(effectiveList, startElementIndex, 
endElementIndex + 1), childLC);
+            // add areas for the float, if applicable
+            if (alg.handlingStartOfFloat()) {
+                for (int k = startElementIndex; k < endElementIndex + 1; k++) {
+                    ListElement le = effectiveList.getElement(k);
+                    if (le instanceof KnuthBlockBox) {
+                        KnuthBlockBox kbb = (KnuthBlockBox) le;
+                        for (FloatContentLayoutManager fclm : 
kbb.getFloatContentLMs()) {
+                            fclm.processAreas(childLC);
+                            int floatHeight = fclm.getFloatHeight();
+                            int floatYOffset = fclm.getFloatYOffset();
+                            PageSequenceLayoutManager pslm = 
(PageSequenceLayoutManager) getTopLevelLM();
+                            pslm.recordStartOfFloat(floatHeight, floatYOffset);
+                        }
+                    }
+                }
+            }
+            if (alg.handlingEndOfFloat()) {
+                PageSequenceLayoutManager pslm = (PageSequenceLayoutManager) 
getTopLevelLM();
+                pslm.setEndIntrusionAdjustment(0);
+                pslm.setStartIntrusionAdjustment(0);
+                int effectiveFloatHeight = alg.getFloatHeight();
+                pslm.recordEndOfFloat(effectiveFloatHeight);
+            }
+        } else {
+            // no content for this part
+            handleEmptyContent();
+        }
+
+        pageBreakHandled = true;
+    }
 }

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=1633083&r1=1633082&r2=1633083&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
 Mon Oct 20 09:09:56 2014
@@ -29,7 +29,9 @@ import org.apache.commons.logging.LogFac
 
 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;
@@ -99,6 +101,14 @@ class PageBreakingAlgorithm extends Brea
     private int currentKeepContext = Constants.EN_AUTO;
     private KnuthNode lastBeforeKeepContextSwitch;
 
+    // just one float for now...
+    private boolean handlingStartOfFloat;
+    private boolean handlingEndOfFloat;
+    private int floatYOffset;
+    private int floatHeight;
+    private KnuthNode bestFloatEdgeNode;
+    private FloatPosition floatPosition;
+
     /**
      * Construct a page breaking algorithm.
      * @param topLevelLM the top level layout manager
@@ -235,6 +245,15 @@ class PageBreakingAlgorithm extends Brea
         insertedFootnotesLength = 0;
         footnoteListIndex = 0;
         footnoteElementIndex = -1;
+        if (topLevelLM instanceof PageSequenceLayoutManager) {
+            PageSequenceLayoutManager pslm = (PageSequenceLayoutManager) 
topLevelLM;
+            if (pslm.handlingStartOfFloat()) {
+                floatHeight = Math.min(pslm.getFloatHeight(), lineWidth - 
pslm.getFloatYOffset());
+            }
+            if (pslm.handlingEndOfFloat()) {
+                totalWidth += pslm.getOffsetDueToFloat();
+            }
+        }
     }
 
     /**
@@ -352,6 +371,12 @@ class PageBreakingAlgorithm extends Brea
                 firstNewFootnoteIndex = footnotesList.size() - 1;
             }
         }
+        if (box instanceof KnuthBlockBox && ((KnuthBlockBox) 
box).hasFloatAnchors()) {
+            handlingStartOfFloat = true;
+        }
+        if (floatHeight != 0 && totalWidth >= floatHeight) {
+            handlingEndOfFloat = true;
+        }
     }
 
     /**
@@ -1082,12 +1107,13 @@ class PageBreakingAlgorithm extends Brea
             log.debug("BBA> difference=" + difference + " ratio=" + ratio
                     + " position=" + bestActiveNode.position);
         }
-        insertPageBreakAsFirst(new PageBreakPosition(this.topLevelLM,
-                bestActiveNode.position,
-                firstListIndex, firstElementIndex,
-                ((KnuthPageNode) bestActiveNode).footnoteListIndex,
-                ((KnuthPageNode) bestActiveNode).footnoteElementIndex,
-                ratio, difference));
+        if (handlingFloat() && floatPosition == null) {
+            floatPosition = new FloatPosition(this.topLevelLM, 
bestActiveNode.position, ratio, difference);
+        } else {
+            insertPageBreakAsFirst(new PageBreakPosition(this.topLevelLM, 
bestActiveNode.position,
+                    firstListIndex, firstElementIndex, ((KnuthPageNode) 
bestActiveNode).footnoteListIndex,
+                    ((KnuthPageNode) bestActiveNode).footnoteElementIndex, 
ratio, difference));
+        }
     }
 
     /** {@inheritDoc} */
@@ -1233,4 +1259,65 @@ class PageBreakingAlgorithm extends Brea
         }
         return pageProvider.compareIPDs(line);
     }
+
+    protected boolean handlingFloat() {
+        return (handlingStartOfFloat || handlingEndOfFloat);
+    }
+
+    protected void createForcedNodes(KnuthNode node, int line, int elementIdx, 
int difference, double r,
+            double demerits, int fitnessClass, int availableShrink, int 
availableStretch, int newWidth,
+            int newStretch, int newShrink) {
+        super.createForcedNodes(node, line, elementIdx, difference, r, 
demerits, fitnessClass,
+                availableShrink, availableStretch, newWidth, newStretch, 
newShrink);
+        if (handlingFloat()) {
+            if (bestFloatEdgeNode == null || demerits <= 
bestFloatEdgeNode.totalDemerits) {
+                bestFloatEdgeNode = createNode(elementIdx, line + 1, 
fitnessClass, newWidth, newStretch,
+                        newShrink, r, availableShrink, availableStretch, 
difference, demerits, node);
+            }
+        }
+    }
+
+    protected int handleFloat() {
+        calculateBreakPoints(bestFloatEdgeNode, par, bestFloatEdgeNode.line);
+        activeLines = null;
+        return bestFloatEdgeNode.line - 1;
+    }
+
+    protected KnuthNode getBestFloatEdgeNode() {
+        return bestFloatEdgeNode;
+    }
+
+    protected FloatPosition getFloatPosition() {
+        return floatPosition;
+    }
+
+    protected int getFloatHeight() {
+        return floatHeight;
+    }
+
+    protected boolean handlingStartOfFloat() {
+        return handlingStartOfFloat;
+    }
+
+    protected boolean handlingEndOfFloat() {
+        return handlingEndOfFloat;
+    }
+
+    /**
+     * Deactivate the given node
+     *
+     * @param node  the node
+     * @param line  the line number
+     */
+    protected void deactivateNode(KnuthNode node, int line) {
+        super.deactivateNode(node, line);
+        if (handlingEndOfFloat) {
+            floatHeight = totalWidth;
+        }
+    }
+
+    protected void disableFloatHandling() {
+        handlingEndOfFloat = false;
+        handlingStartOfFloat = false;
+    }
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -56,6 +56,9 @@ public class PageSequenceLayoutManager e
     /** Footnotes coming from repeated table footers, to be added after any 
other footnote. */
     private List<List<KnuthElement>> tableFooterFootnotes;
 
+    private int startIntrusionAdjustment;
+    private int endIntrusionAdjustment;
+
     /**
      * Constructor
      *
@@ -293,4 +296,53 @@ public class PageSequenceLayoutManager e
         }
     }
 
+    public void setStartIntrusionAdjustment(int sia) {
+        startIntrusionAdjustment = sia;
+    }
+
+    public void setEndIntrusionAdjustment(int eia) {
+        endIntrusionAdjustment = eia;
+    }
+
+    public int getStartIntrusionAdjustment() {
+        return startIntrusionAdjustment;
+    }
+
+    public int getEndIntrusionAdjustment() {
+        return endIntrusionAdjustment;
+    }
+
+    public void recordEndOfFloat(int fHeight) {
+        pageBreaker.handleEndOfFloat(fHeight);
+    }
+
+    public boolean handlingEndOfFloat() {
+        return pageBreaker.handlingEndOfFloat();
+    }
+
+    public int getOffsetDueToFloat() {
+        return pageBreaker.getOffsetDueToFloat();
+    }
+
+    public void recordStartOfFloat(int fHeight, int fYOffset) {
+        pageBreaker.handleStartOfFloat(fHeight, fYOffset);
+    }
+
+    public boolean handlingStartOfFloat() {
+        return pageBreaker.handlingStartOfFloat();
+    }
+
+    public int getFloatHeight() {
+        return pageBreaker.getFloatHeight();
+    }
+
+    public int getFloatYOffset() {
+        return pageBreaker.getFloatYOffset();
+    }
+
+    public int getCurrentColumnWidth() {
+        int flowIPD = getCurrentPV().getCurrentSpan().getColumnWidth();
+        flowIPD -= startIntrusionAdjustment + endIntrusionAdjustment;
+        return flowIPD;
+    }
 }

Added: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java?rev=1633083&view=auto
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
 (added)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -0,0 +1,98 @@
+/*
+ * 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.inline;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.fop.fo.flow.Float;
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
+import org.apache.fop.layoutmgr.InlineKnuthSequence;
+import org.apache.fop.layoutmgr.KnuthElement;
+import org.apache.fop.layoutmgr.KnuthPossPosIter;
+import org.apache.fop.layoutmgr.KnuthSequence;
+import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.LayoutManager;
+import org.apache.fop.layoutmgr.Position;
+import org.apache.fop.layoutmgr.PositionIterator;
+import org.apache.fop.layoutmgr.SpaceResolver;
+
+public class FloatLayoutManager extends InlineStackingLayoutManager {
+
+    private FloatContentLayoutManager floatContentLM;
+    private KnuthInlineBox anchor;
+    private List<KnuthElement> floatContentKnuthElements;
+    private Float floatContent;
+    private boolean floatContentAreaAdded;
+
+    public FloatLayoutManager(Float node) {
+        super(node);
+        floatContent = node;
+    }
+
+    protected LayoutManager getChildLM() {
+        return null;
+    }
+
+    public LinkedList getNextKnuthElements(LayoutContext context, int 
alignment) {
+
+        if (!floatContentAreaAdded) {
+            floatContentLM = new FloatContentLayoutManager(floatContent);
+            floatContentLM.setParent(this);
+            floatContentLM.initialize();
+            floatContentKnuthElements = 
floatContentLM.getNextKnuthElements(context, alignment);
+            SpaceResolver.resolveElementList(floatContentKnuthElements);
+        }
+
+        // the only knuth element is a zero width and height knuth box
+        LinkedList knuthElements = new LinkedList();
+        KnuthSequence seq = new InlineKnuthSequence();
+        anchor = new KnuthInlineBox(0, null, null, true);
+        if (!floatContentAreaAdded) {
+            anchor.setFloatContentLM(floatContentLM);
+        }
+        anchor.setPosition(notifyPos(new Position(this)));
+        seq.add(anchor);
+        knuthElements.add(seq);
+        setFinished(true);
+
+        return knuthElements;
+    }
+
+    public void addAreas(PositionIterator posIter, LayoutContext context) {
+        // "Unwrap" the NonLeafPositions stored in posIter
+        LinkedList positionList = new LinkedList();
+        Position pos = null;
+        while (posIter.hasNext()) {
+            pos = posIter.next();
+            if (pos != null && pos.getPosition() != null) {
+                positionList.add(pos.getPosition());
+            }
+        }
+    }
+
+    public void processAreas(LayoutContext context) {
+        PositionIterator contentPosIter = new 
KnuthPossPosIter(floatContentKnuthElements, 0,
+                floatContentKnuthElements.size());
+        floatContentLM.addAreas(contentPosIter, context);
+        floatContentAreaAdded = true;
+        anchor.setFloatContentLM(null);
+    }
+}

Propchange: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/FloatLayoutManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/KnuthInlineBox.java
 Mon Oct 20 09:09:56 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.layoutmgr.inline;
 
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
 import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
 import org.apache.fop.layoutmgr.KnuthBox;
 import org.apache.fop.layoutmgr.Position;
@@ -30,6 +31,8 @@ public class KnuthInlineBox extends Knut
 
     private FootnoteBodyLayoutManager footnoteBodyLM;
     private AlignmentContext alignmentContext;
+    private FloatContentLayoutManager floatContentLM;
+
 
     /**
      * Create a new KnuthBox.
@@ -72,4 +75,17 @@ public class KnuthInlineBox extends Knut
     public boolean isAnchor() {
         return (footnoteBodyLM != null);
     }
+
+    public void setFloatContentLM(FloatContentLayoutManager fclm) {
+        floatContentLM = fclm;
+    }
+
+    public FloatContentLayoutManager getFloatContentLM() {
+        return floatContentLM;
+    }
+
+    public boolean isFloatAnchor() {
+        return (floatContentLM != null);
+    }
+
 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
 Mon Oct 20 09:09:56 2014
@@ -20,6 +20,7 @@
 package org.apache.fop.layoutmgr.inline;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -50,6 +51,7 @@ import org.apache.fop.layoutmgr.BlockLev
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.BreakingAlgorithm;
 import org.apache.fop.layoutmgr.ElementListObserver;
+import org.apache.fop.layoutmgr.FloatContentLayoutManager;
 import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
 import org.apache.fop.layoutmgr.InlineKnuthSequence;
@@ -963,13 +965,19 @@ public class LineLayoutManager extends I
                 /* "normal" vertical alignment: create a sequence whose boxes
                    represent effective lines, and contain LineBreakPositions */
                 int startIndex = 0;
+                int previousEndIndex = 0;
                 for (int i = 0;
                         i < llPoss.getChosenLineCount();
                         i++) {
+                    int orphans = fobj.getOrphans();
+                    int widows = fobj.getWidows();
+                    if (handlingFloat()) {
+                        orphans = 1;
+                        widows = 1;
+                    }
                     if (returnList.size() > 0
                             && i > 0 //if i==0 break generated above already
-                            && i >= fobj.getOrphans()
-                            && i <= llPoss.getChosenLineCount() - 
fobj.getWidows()) {
+                            && i >= orphans && i <= 
llPoss.getChosenLineCount() - widows) {
                         // penalty allowing a page break between lines
                         Keep keep = getKeepTogether();
                         returnList.add(new BreakElement(
@@ -983,14 +991,28 @@ public class LineLayoutManager extends I
                     // whose citations are in this line
                     List<FootnoteBodyLayoutManager> footnoteList = 
FootenoteUtil.getFootnotes(
                             seq, startIndex, endIndex);
+                    List<FloatContentLayoutManager> floats = 
FloatContentLayoutManager.checkForFloats(seq,
+                            startIndex, endIndex);
                     startIndex = endIndex + 1;
                     LineBreakPosition lbp = (LineBreakPosition) 
llPoss.getChosenPosition(i);
                     if (baselineOffset < 0) {
                         baselineOffset = lbp.spaceBefore + lbp.baseline;
                     }
-                    returnList.add(new KnuthBlockBox(
-                                   lbp.lineHeight + lbp.spaceBefore + 
lbp.spaceAfter,
-                                    footnoteList, lbp, false));
+                    if (floats.isEmpty()) {
+                        returnList.add(new KnuthBlockBox(lbp.lineHeight + 
lbp.spaceBefore + lbp.spaceAfter,
+                                footnoteList, lbp, false));
+                    } else {
+                        // add a line with height zero and no content and 
attach float to it
+                        returnList.add(new KnuthBlockBox(0, 
Collections.emptyList(), null, false, floats));
+                        // add a break element to signal that we should 
restart LB at this break
+                        Keep keep = getKeepTogether();
+                        returnList.add(new BreakElement(new LeafPosition(this, 
p, previousEndIndex), keep
+                                .getPenalty(), keep.getContext(), context));
+                        // add the original line where the float was but 
without the float now
+                        returnList.add(new KnuthBlockBox(lbp.lineHeight + 
lbp.spaceBefore + lbp.spaceAfter,
+                                footnoteList, lbp, false));
+                    }
+                    previousEndIndex = endIndex;
                 }
             }
         }
@@ -1196,10 +1218,15 @@ public class LineLayoutManager extends I
         for (int p = 0; p < knuthParagraphs.size(); p++) {
             LineLayoutPossibilities llPoss = lineLayoutsList[p];
             //log.debug("demerits of the chosen layout: " + 
llPoss.getChosenDemerits());
+            int orphans = fobj.getOrphans();
+            int widows = fobj.getWidows();
+            if (handlingFloat()) {
+                orphans = 1;
+                widows = 1;
+            }
             for (int i = 0; i < llPoss.getChosenLineCount(); i++) {
-                if (!((BlockLevelLayoutManager) 
parentLayoutManager).mustKeepTogether()
-                    && i >= fobj.getOrphans()
-                    && i <= llPoss.getChosenLineCount() - fobj.getWidows()) {
+                if (!((BlockLevelLayoutManager) 
parentLayoutManager).mustKeepTogether() && i >= orphans
+                        && i <= llPoss.getChosenLineCount() - widows) {
                     // null penalty allowing a page break between lines
                     returnList.add(new KnuthPenalty(0, 0, false, new 
Position(this), false));
                 }

Modified: 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java?rev=1633083&r1=1633082&r2=1633083&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_BasicSideFloats/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
 Mon Oct 20 09:09:56 2014
@@ -323,7 +323,11 @@ public class LayoutEngineTestCase {
             throw new RuntimeException("No available area tree check");
         }
         for (LayoutEngineCheck check : checks) {
-            check.check(result);
+            try {
+                check.check(result);
+            } catch (RuntimeException rte) {
+                throw new RuntimeException("Layout test (" + 
testFile.getName() + "): " + rte.getMessage());
+            }
         }
     }
 



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

Reply via email to