DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
[PATCH] Alignment of the last line in a justified block
------- Additional Comments From [EMAIL PROTECTED] 2004-04-23 15:15 -------
I have tried to follow the other idea, i.e. understand why reset() is called
in these problematic situations, and maybe I have found an alternative patch
which doesn't involve white-space-treatment changes.
Problems in the justification of the last line arise when the
TextLayoutManagers returns to the LineLM, in sequence:
- a valid BreakPoss, stored in the ArrayList vecInlineBreaks and in the
- one or more invalid BreakPoss, for which isSuppressible() is true, stored
only in vecInlineBreaks
- nothing else, as ther are no more child LM with something to layout
An important detail: if the spaces are at the end of the text of a TLM, prevBP
has the REST_ARE_SUPPRESS_AT_LB flag set; in the other case it hasn't.
The invalid bp have the ALL_ARE_SUPPRESS_AT_LB flag set.
The method reset() is called if
bp != prevBP (the last returned bp is invalid)
&& !prevCouldEndLine(prevBP) (we cannot ignore what is after prevBP)
and I think in our problematic situations !prevCouldEndLine(prevBP) should be
false, i.e. prevCouldEndLine(prevBP) should be true.
So, this is how I would calculate prevCouldEndLine(prev):
1) first of all, check if isFinished() is true: if it's not, there are other
childLM and we cannot ignore any space
2) starting from the last element in vecInlineBreaks and moving backward
(stopping when prev is reached), check if bp are suppressible
At the moment, prevCouldEndLine calls bp.couldEndLine(), which checks the
REST_ARE_SUPPRESS_AT_LB bit, which can be true only for a valid BreakPoss
followed by suppressible spaces, and not for the invalid BreakPoss; with my
patch, this method would be very similar to allAreSuppressible.
There is only another change to do in the getNextBreakPoss method: if
(bpDim.min > availIPD.max) and !(bTextAlignment == TextAlign.JUSTIFY || prevBP
== null) the bp should be added to vecInlineBreaks whether prevBP is null or
not, otherwise if the last line of a non-justified block contains only a word
it is not shown.
You can see this using the sample fo file I attached before: the first block
is left-aligned, and its third and last line is "spaces."; without this last
change, the line disappears. In this case reset() should have been called, but
prevBP is the last BreakPoss in vecInlineBreaks, so prevCouldEndLine(prevBP)
I'm going to attach this alternative proposed patch.