addAll(((InlineLevelLayoutManager)
prevBox.getLayoutManager())
.addALetterSpaceTo(oldList));
- if (((KnuthInlineBox) prevBox).isAnchor()) {
+ // prevBox may not be a KnuthInlineBox;
+ // this may happen if it is a padding box; see bug 39571.
+ if ( prevBox instanceof KnuthInlineBox && ((KnuthInlineBox) prevBox).isAnchor()) {
// prevBox represents a footnote citation: copy footnote info
// from prevBox to the new box
KnuthInlineBox newBox = (KnuthInlineBox) getLast();
element.setPosition(((NonLeafPosition)element.getPosition()).getPosition());
}
- oldList = ((InlineLevelLayoutManager)
- element.getLayoutManager()).addALetterSpaceTo(oldList);
-
+ // The last element may not have a layout manager (its position == null);
+ // this may happen if it is a padding box; see bug 39571.
+ InlineLevelLayoutManager LM =
+ (InlineLevelLayoutManager) element.getLayoutManager();
+ if (LM != null) {
+ oldList = LM.addALetterSpaceTo(oldList);
+ }
// "wrap" again the Position stored in each element of oldList
oldListIterator = oldList.listIterator();
while (oldListIterator.hasNext()) {
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2006 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+ <info>
+ <p>
+ This test checks that a non-breaking space at the end of an
+ fo:inline with padding, followed by another fo:inline, while
+ text-align is justify, does not cause a NullPointerException due
+ to InlineStackingLayoutManager.addALetterSpaceTo().
+ </p>
+ <p>http://issues.apache.org/bugzilla/show_bug.cgi?id=39571</p>
+ </info>
+ <fo>
+ <fo:root
+ xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="small"
+ page-height="5cm" page-width="15cm"
+ margin-top="2cm" margin-bottom="2cm"
+ margin-left="2cm" margin-right="2cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference="small">
+ <fo:flow flow-name="xsl-region-body" text-align="justify">
+ <fo:block language="en" country="US">
+ <fo:inline><fo:inline padding-end="1em">non-breaking </fo:inline><fo:inline>space</fo:inline></fo:inline>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks>
+ <eval expected="105384"
+xpath="//flow/block[1]/lineArea[1]/inlineparent[1]/@ipd" desc="IPD of
+containing inline area"/>
+ <eval expected="73368"
+xpath="//flow/block[1]/lineArea[1]/inlineparent[1]/inlineparent[1]/@ipd"
+desc="IPD of first contained inline area"/>
+ <eval expected="73368"
+xpath="//flow/block[1]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/@ipd"
+desc="IPD of corresponding text area"/>
+ </checks>
+</testcase>