]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Restored breakability of block-level content in inlines:
authorJeremias Maerki <jeremias@apache.org>
Wed, 10 Aug 2005 14:59:56 +0000 (14:59 +0000)
committerJeremias Maerki <jeremias@apache.org>
Wed, 10 Aug 2005 14:59:56 +0000 (14:59 +0000)
Treat block sequences diffently from inline sequences. A block sequence's elements should not be combined to a single box as this removes breakability. The elements are now simply wrapped and handled separately in the previously disabled code part in addAreas().

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/inlineblock@231255 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/area/LineArea.java
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java

index 12a5fb61c72f5238ed9b32cb34797bf5dbffd5dd..593b9077ea27ad5647c5adcd7272efbaef4afc46 100644 (file)
@@ -91,5 +91,19 @@ public class LineArea extends Area {
     public int getStartIndent() {
         return startIndent;
     }
+
+    /**
+     * Updates the extents of the line area from its children.
+     */
+    public void updateExtentsFromChildren() {
+        int ipd = 0;
+        int bpd = 0;
+        for (int i = 0, len = inlineAreas.size(); i < len; i++) {
+            ipd = Math.max(ipd, ((InlineArea)inlineAreas.get(i)).getAllocIPD());
+            bpd += ((InlineArea)inlineAreas.get(i)).getAllocBPD();
+        }
+        setIPD(ipd);
+        setBPD(bpd);
+    }
 }
 
index 50013dfc28f82e2ba871ab4f1451d9207565ec8d..f51e6af2b386876d20bd0dd1e86f55f00ee06e0e 100644 (file)
@@ -37,6 +37,7 @@ import org.apache.fop.layoutmgr.KnuthSequence;
 import org.apache.fop.layoutmgr.LayoutContext;
 import org.apache.fop.layoutmgr.LayoutManager;
 import org.apache.fop.layoutmgr.LeafPosition;
+import org.apache.fop.layoutmgr.NonLeafPosition;
 import org.apache.fop.layoutmgr.Position;
 import org.apache.fop.layoutmgr.PositionIterator;
 import org.apache.fop.layoutmgr.SpaceSpecifier;
@@ -1079,7 +1080,20 @@ public class LineLayoutManager extends InlineStackingLayoutManager
             lineLayouts = (LineLayoutPossibilities)lineLayoutsList.get(p);
             KnuthSequence seq = (KnuthSequence) knuthParagraphs.get(p);
 
-            if (seq.isInlineSequence() && alignment == EN_JUSTIFY) {
+            if (!seq.isInlineSequence()) {
+                LinkedList targetList = new LinkedList();
+                ListIterator listIter = seq.listIterator();
+                while (listIter.hasNext()) {
+                    KnuthElement tempElement;
+                    tempElement = (KnuthElement) listIter.next();
+                    if (tempElement.getLayoutManager() != this) {
+                        tempElement.setPosition(new NonLeafPosition(this,
+                                tempElement.getPosition()));
+                    }
+                    targetList.add(tempElement);
+                }
+                returnList.addAll(targetList); 
+            } else if (seq.isInlineSequence() && alignment == EN_JUSTIFY) {
                 /* justified vertical alignment (not in the XSL FO recommendation):
                    create a multi-layout sequence whose elements will contain 
                    a conventional Position */
@@ -1651,8 +1665,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager
                     lineArea.setBPD(lineArea.getBPD() + context.getSpaceAfter());
                 }
                 parentLM.addChildArea(lineArea);
-/*            } else if (pos instanceof NonLeafPosition) {
-                // LineBreakPosition inside a nested block;
+            } else if (pos instanceof NonLeafPosition) {
+                // Nested block-level content;
                 // go down the LM stack again;
                 // collect all consecutive NonLeafPosition objects,
                 // "unwrap" them and put the child positions in a new list.
@@ -1661,7 +1675,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
                 innerPosition = ((NonLeafPosition) pos).getPosition();
                 positionList.add(innerPosition);
                 while (parentIter.hasNext()) {
-                    pos = (Position) parentIter.getPos(parentIter.peekNext());
+                    pos = (Position)parentIter.peekNext();
                     if (!(pos instanceof NonLeafPosition)) {
                         break;
                     }
@@ -1697,8 +1711,9 @@ public class LineLayoutManager extends InlineStackingLayoutManager
                     blocklc.setLeadingSpace(blocklc.getTrailingSpace());
                     blocklc.setTrailingSpace(new SpaceSpecifier(false));
                 }
+                lineArea.updateExtentsFromChildren();
                 parentLM.addChildArea(lineArea);
-*/            } else {
+            } else {
                 // pos was the Position inside a penalty item, nothing to do
             }
         }