Browse Source

Restored breakability of block-level content in inlines:

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
inlineblock
Jeremias Maerki 19 years ago
parent
commit
3def9e8349

+ 14
- 0
src/java/org/apache/fop/area/LineArea.java View 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);
}
}


+ 20
- 5
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java View 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
}
}

Loading…
Cancel
Save