From 74014dc4ff641d1047cbbd6ef86bdfde99b3558d Mon Sep 17 00:00:00 2001 From: Luca Furini Date: Wed, 7 Sep 2005 15:03:06 +0000 Subject: [PATCH] Using the fo property last-line-end-indent instead of a hard coded value. This fixes item 1) in bug 36533. Note that the old behaviour (before the changes) was not completely equivalent to the one requested by the specs, as the empty space was not necessarily placed at the end of the line; for example, the last line in a right-aligned paragraph was aligned as the previous lines, although shorter. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@279338 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/fo/FOPropertyMapping.java | 1 + src/java/org/apache/fop/fo/flow/Block.java | 7 ++++ .../layoutmgr/inline/LineLayoutManager.java | 33 +++++++++++-------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/fop/fo/FOPropertyMapping.java b/src/java/org/apache/fop/fo/FOPropertyMapping.java index 7ff94a888..de2f5a55b 100644 --- a/src/java/org/apache/fop/fo/FOPropertyMapping.java +++ b/src/java/org/apache/fop/fo/FOPropertyMapping.java @@ -1582,6 +1582,7 @@ public class FOPropertyMapping implements Constants { m = new LengthProperty.Maker(PR_LAST_LINE_END_INDENT); m.setInherited(true); m.setDefault("0pt"); + m.setPercentBase(LengthBase.CONTAINING_BLOCK_WIDTH); addPropertyMaker("last-line-end-indent", m); // line-height diff --git a/src/java/org/apache/fop/fo/flow/Block.java b/src/java/org/apache/fop/fo/flow/Block.java index f5d8ceb05..f9a79bbdb 100644 --- a/src/java/org/apache/fop/fo/flow/Block.java +++ b/src/java/org/apache/fop/fo/flow/Block.java @@ -297,6 +297,13 @@ public class Block extends FObjMixed { return textIndent; } + /** + * @return the "last-line-end-indent" property. + */ + public Length getLastLineEndIndent() { + return lastLineEndIndent; + } + /** * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String) * XSL Content Model: marker* initial-property-set? (#PCDATA|%inline;|%block;)* diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java index cb5dbf33c..d0aa71e12 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java @@ -72,6 +72,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager bTextAlignment = fobj.getTextAlign(); bTextAlignmentLast = fobj.getTextAlignLast(); textIndent = fobj.getTextIndent(); + lastLineEndIndent = fobj.getLastLineEndIndent(); hyphProps = fobj.getCommonHyphenation(); // @@ -135,6 +136,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager private int bTextAlignmentLast; private int effectiveAlignment; private Length textIndent; + private Length lastLineEndIndent; private int iIndents = 0; private CommonHyphenation hyphProps; //private LayoutProps layoutProps; @@ -185,17 +187,19 @@ public class LineLayoutManager extends InlineStackingLayoutManager private int textAlignment; private int textAlignmentLast; private int textIndent; + private int lastLineEndIndent; private int lineWidth; // the LM which created the paragraph private LineLayoutManager layoutManager; public Paragraph(LineLayoutManager llm, int alignment, int alignmentLast, - int indent) { + int indent, int endIndent) { super(true); layoutManager = llm; textAlignment = alignment; textAlignmentLast = alignmentLast; textIndent = indent; + lastLineEndIndent = endIndent; } public void startParagraph(int lw) { @@ -207,9 +211,9 @@ public class LineLayoutManager extends InlineStackingLayoutManager // set the minimum amount of empty space at the end of the // last line if (bTextAlignment == EN_CENTER) { - lineFiller = new MinOptMax(0); + lineFiller = new MinOptMax(lastLineEndIndent); } else { - lineFiller = new MinOptMax(0, (int)(lineWidth / 12), lineWidth); + lineFiller = new MinOptMax(lastLineEndIndent, lastLineEndIndent, lineWidth); } // add auxiliary elements at the beginning of the paragraph @@ -244,7 +248,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager && bTextAlignmentLast != EN_JUSTIFY) { this.add(new KnuthGlue(0, 3 * DEFAULT_SPACE_WIDTH, 0, null, false)); - this.add(new KnuthPenalty(0, -KnuthElement.INFINITE, + this.add(new KnuthPenalty(lineFiller.opt, -KnuthElement.INFINITE, false, null, false)); ignoreAtEnd = 2; } else if (bTextAlignmentLast != EN_JUSTIFY) { @@ -253,15 +257,15 @@ public class LineLayoutManager extends InlineStackingLayoutManager // and the forced break this.add(new KnuthPenalty(0, KnuthElement.INFINITE, false, null, false)); - this.add(new KnuthGlue(lineFiller.opt, + this.add(new KnuthGlue(0, lineFiller.max - lineFiller.opt, lineFiller.opt - lineFiller.min, null, false)); - this.add(new KnuthPenalty(0, -KnuthElement.INFINITE, + this.add(new KnuthPenalty(lineFiller.opt, -KnuthElement.INFINITE, false, null, false)); ignoreAtEnd = 3; } else { // add only the element representing the forced break - this.add(new KnuthPenalty(0, -KnuthElement.INFINITE, + this.add(new KnuthPenalty(lineFiller.opt, -KnuthElement.INFINITE, false, null, false)); ignoreAtEnd = 1; } @@ -393,7 +397,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager // compute indent and adjustment ratio, according to // the value of text-align and text-align-last int indent = 0; - int difference = (bestActiveNode.line < total) ? bestActiveNode.difference : bestActiveNode.difference + fillerMinWidth; + int difference = bestActiveNode.difference; int textAlign = (bestActiveNode.line < total) ? alignment : alignmentLast; indent += (textAlign == Constants.EN_CENTER) ? difference / 2 : @@ -740,7 +744,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager if (lastPar == null) { lastPar = new Paragraph(this, bTextAlignment, bTextAlignmentLast, - textIndent.getValue(this)); + textIndent.getValue(this), lastLineEndIndent.getValue(this)); lastPar.startParagraph(availIPD.opt); if (log.isTraceEnabled()) { trace.append(" ["); @@ -1610,7 +1614,6 @@ public class LineLayoutManager extends InlineStackingLayoutManager KnuthSequence seq = (KnuthSequence) knuthParagraphs.get(iCurrParIndex); iEndElement = lbp.getLeafPos(); - //LineArea lineArea = new LineArea(); LineArea lineArea = new LineArea((lbp.getLeafPos() < seq.size() - 1 ? bTextAlignment : bTextAlignmentLast), lbp.difference, lbp.availableStretch, lbp.availableShrink); lineArea.setStartIndent(lbp.startIndent); @@ -1627,9 +1630,13 @@ public class LineLayoutManager extends InlineStackingLayoutManager // ignore the first elements added by the LineLayoutManager iStartElement += (iStartElement == 0) ? currPar.ignoreAtStart : 0; - // ignore the last elements added by the LineLayoutManager - iEndElement -= (iEndElement == (currPar.size() - 1)) - ? currPar.ignoreAtEnd : 0; + // if this is the last line area that for this paragraph, + // ignore the last elements added by the LineLayoutManager and + // subtract the last-line-end-indent from the area ipd + if (iEndElement == (currPar.size() - 1)) { + iEndElement -= currPar.ignoreAtEnd; + lineArea.setIPD(lineArea.getIPD() - lastLineEndIndent.getValue(this)); + } } // ignore the last element in the line if it is a KnuthGlue object -- 2.39.5