diff options
author | Luca Furini <lfurini@apache.org> | 2006-02-07 12:29:19 +0000 |
---|---|---|
committer | Luca Furini <lfurini@apache.org> | 2006-02-07 12:29:19 +0000 |
commit | 5769a0fe9fb13878a9573ea45b5544ca481c1d00 (patch) | |
tree | 7ff32da452664e4d95ed0ca11552016379d856b9 /src | |
parent | f6bf4a418239b8600d5e4957febd12fdef6a61dd (diff) | |
download | xmlgraphics-fop-5769a0fe9fb13878a9573ea45b5544ca481c1d00.tar.gz xmlgraphics-fop-5769a0fe9fb13878a9573ea45b5544ca481c1d00.zip |
Fix for bug 38507: the elements representing a non-breaking space were not always correct, sometimes allowing a break.
This also solves another bug concerning the incorrect suppression of a nbsp at the beginning of a line.
A bit of clean-up in TextLayoutManager
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@375585 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java | 317 |
1 files changed, 127 insertions, 190 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 4816f5c02..ac8867b31 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -752,204 +752,141 @@ public class TextLayoutManager extends LeafNodeLayoutManager { LinkedList spaceElements = new LinkedList(); LeafPosition mainPosition = new LeafPosition(this, leafValue); - // add a penalty to avoid the next glue element to be - // a feasible line break if (textArray[ai.iStartIndex] == NBSPACE) { - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), - false)); - } - - switch (alignment) { - case EN_CENTER : - // centered text: - // if the second element is chosen as a line break these elements - // add a constant amount of stretch at the end of a line and at the - // beginning of the next one, otherwise they don't add any stretch - /* - spaceElements.add - (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, - (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0), - false, new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - - 6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - mainPosition, false)); - spaceElements.add - (new KnuthInlineBox(0, 0, 0, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), false)); - */ - spaceElements.add - (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), true)); - spaceElements.add - (new KnuthPenalty(0, - (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0), + // a non-breaking space + //TODO: other kinds of non-breaking spaces + if (alignment == EN_JUSTIFY) { + // the space can stretch and shrink, and must be preserved + // when starting a line + spaceElements.add(new KnuthInlineBox(0, null, + notifyPos(new LeafPosition(this, -1)), true)); + spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE, false, new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP), - -6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - mainPosition, false)); - spaceElements.add - (new KnuthInlineBox(0, null, - notifyPos(new LeafPosition(this, -1)), true)); - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), true)); - spaceElements.add - (new KnuthGlue(lineStartBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), true)); - break; - - case EN_START : // fall through - case EN_END : - // left- or right-aligned text: - // if the second element is chosen as a line break these elements - // add a constant amount of stretch at the end of a line, otherwise - // they don't add any stretch - /* - spaceElements.add - (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, 0, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - - 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - mainPosition, false)); - */ - if (lineStartBAP != 0 || lineEndBAP != 0) { - spaceElements.add - (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, 0, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP), - -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - mainPosition, false)); - spaceElements.add - (new KnuthInlineBox(0, null, - notifyPos(new LeafPosition(this, -1)), false)); - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(lineStartBAP, 0, 0, - new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt, ai.ipdArea.max - ai.ipdArea.opt, + ai.ipdArea.opt - ai.ipdArea.min, mainPosition, false)); } else { - spaceElements.add - (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, 0, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, - mainPosition, false)); + // the space does not need to stretch or shrink, and must be + // preserved when starting a line + spaceElements.add(new KnuthInlineBox(ai.ipdArea.opt, null, + mainPosition, true)); } - break; - - case EN_JUSTIFY: - // justified text: - // the stretch and shrink depends on the space width - /* - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - ai.ipdArea.max - ai.ipdArea.opt, - ai.ipdArea.opt - ai.ipdArea.min, - mainPosition, false)); - */ - if (lineStartBAP != 0 || lineEndBAP != 0) { - spaceElements.add - (new KnuthGlue(lineEndBAP, 0, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, 0, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP), - ai.ipdArea.max - ai.ipdArea.opt, - ai.ipdArea.opt - ai.ipdArea.min, - mainPosition, false)); - spaceElements.add - (new KnuthInlineBox(0, null, - notifyPos(new LeafPosition(this, -1)), false)); - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(lineStartBAP, 0, 0, - new LeafPosition(this, -1), false)); - } else { - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - ai.ipdArea.max - ai.ipdArea.opt, - ai.ipdArea.opt - ai.ipdArea.min, + } else { + // a breaking space + switch (alignment) { + case EN_CENTER: + // centered text: + // if the second element is chosen as a line break these elements + // add a constant amount of stretch at the end of a line and at the + // beginning of the next one, otherwise they don't add any stretch + spaceElements.add(new KnuthGlue(lineEndBAP, + 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + new LeafPosition(this, -1), false)); + spaceElements + .add(new KnuthPenalty( + 0, + (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE + : 0), false, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt + - (lineStartBAP + lineEndBAP), -6 + * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + mainPosition, false)); + spaceElements.add(new KnuthInlineBox(0, null, + notifyPos(new LeafPosition(this, -1)), false)); + spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE, + false, new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(lineStartBAP, + 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + new LeafPosition(this, -1), false)); + break; + + case EN_START: // fall through + case EN_END: + // left- or right-aligned text: + // if the second element is chosen as a line break these elements + // add a constant amount of stretch at the end of a line, otherwise + // they don't add any stretch + if (lineStartBAP != 0 || lineEndBAP != 0) { + spaceElements.add(new KnuthGlue(lineEndBAP, + 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthPenalty(0, 0, false, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt + - (lineStartBAP + lineEndBAP), -3 + * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, mainPosition, false)); - } - break; - - default: - // last line justified, the other lines unjustified: - // use only the space stretch - /* - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - ai.ipdArea.max - ai.ipdArea.opt, 0, - mainPosition, false)); - */ - if (lineStartBAP != 0 || lineEndBAP != 0) { - spaceElements.add - (new KnuthGlue(lineEndBAP, 0, 0, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthPenalty(0, 0, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP), - ai.ipdArea.max - ai.ipdArea.opt, 0, - mainPosition, false)); - spaceElements.add - (new KnuthInlineBox(0, null, - notifyPos(new LeafPosition(this, -1)), false)); - spaceElements.add - (new KnuthPenalty(0, KnuthElement.INFINITE, false, - new LeafPosition(this, -1), false)); - spaceElements.add - (new KnuthGlue(lineStartBAP, 0, 0, - new LeafPosition(this, -1), false)); - } else { - spaceElements.add - (new KnuthGlue(ai.ipdArea.opt, - ai.ipdArea.max - ai.ipdArea.opt, 0, - mainPosition, false)); + spaceElements.add(new KnuthInlineBox(0, null, + notifyPos(new LeafPosition(this, -1)), false)); + spaceElements.add(new KnuthPenalty(0, + KnuthElement.INFINITE, false, new LeafPosition( + this, -1), false)); + spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0, + new LeafPosition(this, -1), false)); + } else { + spaceElements.add(new KnuthGlue(0, + 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthPenalty(0, 0, false, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt, -3 + * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0, + mainPosition, false)); + } + break; + + case EN_JUSTIFY: + // justified text: + // the stretch and shrink depends on the space width + if (lineStartBAP != 0 || lineEndBAP != 0) { + spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthPenalty(0, 0, false, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt + - (lineStartBAP + lineEndBAP), ai.ipdArea.max + - ai.ipdArea.opt, ai.ipdArea.opt - ai.ipdArea.min, + mainPosition, false)); + spaceElements.add(new KnuthInlineBox(0, null, + notifyPos(new LeafPosition(this, -1)), false)); + spaceElements.add(new KnuthPenalty(0, + KnuthElement.INFINITE, false, new LeafPosition( + this, -1), false)); + spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0, + new LeafPosition(this, -1), false)); + } else { + spaceElements.add(new KnuthGlue(ai.ipdArea.opt, + ai.ipdArea.max - ai.ipdArea.opt, ai.ipdArea.opt + - ai.ipdArea.min, mainPosition, false)); + } + break; + + default: + // last line justified, the other lines unjustified: + // use only the space stretch + if (lineStartBAP != 0 || lineEndBAP != 0) { + spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthPenalty(0, 0, false, + new LeafPosition(this, -1), false)); + spaceElements.add(new KnuthGlue(ai.ipdArea.opt + - (lineStartBAP + lineEndBAP), ai.ipdArea.max + - ai.ipdArea.opt, 0, mainPosition, false)); + spaceElements.add(new KnuthInlineBox(0, null, + notifyPos(new LeafPosition(this, -1)), false)); + spaceElements.add(new KnuthPenalty(0, + KnuthElement.INFINITE, false, new LeafPosition( + this, -1), false)); + spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0, + new LeafPosition(this, -1), false)); + } else { + spaceElements.add(new KnuthGlue(ai.ipdArea.opt, + ai.ipdArea.max - ai.ipdArea.opt, 0, mainPosition, + false)); + } } } - // TODO - // Add zero width box to avoid any nbspace to be removed - // at the end of a paragraph. - // This is kind of a hack and should be removed once the - // whole line building and white space handling is revisited. - if (textArray[ai.iStartIndex] == NBSPACE) { - spaceElements.add - (new KnuthInlineBox(0, null, - notifyPos(new LeafPosition(this, -1)), true)); - } return spaceElements; } |