Browse Source

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
tags/fop-0_90-alpha1
Luca Furini 19 years ago
parent
commit
74014dc4ff

+ 1
- 0
src/java/org/apache/fop/fo/FOPropertyMapping.java View File

@@ -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

+ 7
- 0
src/java/org/apache/fop/fo/flow/Block.java View File

@@ -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;)*

+ 20
- 13
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java View File

@@ -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

Loading…
Cancel
Save