aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java104
1 files changed, 57 insertions, 47 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
index 7e54cbe43..4b6638300 100644
--- a/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
+++ b/src/java/org/apache/fop/layoutmgr/PageBreakingAlgorithm.java
@@ -43,16 +43,16 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
private PageProvider pageProvider;
private PageBreakingLayoutListener layoutListener;
/** List of PageBreakPosition elements. */
- private LinkedList pageBreaks = null;
+ private LinkedList<PageBreakPosition> pageBreaks = null;
/** Footnotes which are cited between the currently considered active node (previous
* break) and the current considered break. Its type is
* List&lt;List&lt;KnuthElement&gt;&gt;, it contains the sequences of KnuthElement
* representing the footnotes bodies.
*/
- private List footnotesList = null;
+ private List<List<KnuthElement>> footnotesList = null;
/** Cumulated bpd of unhandled footnotes. */
- private List lengthList = null;
+ private List<Integer> lengthList = null;
/** Length of all the footnotes which will be put on the current page. */
private int totalFootnotesLength = 0;
/**
@@ -64,13 +64,9 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
/** True if footnote citations have been met since the beginning of the page sequence. */
private boolean footnotesPending = false;
- /**
- * True if the elements met after the previous break point contain footnote citations.
- */
+ /** True if the elements met after the previous break point contain footnote citations. */
private boolean newFootnotes = false;
- /**
- * Index of the first footnote met after the previous break point.
- */
+ /** Index of the first footnote met after the previous break point. */
private int firstNewFootnoteIndex = 0;
/** Index of the last footnote inserted on the current page. */
private int footnoteListIndex = 0;
@@ -206,6 +202,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected void initialize() {
super.initialize();
insertedFootnotesLength = 0;
@@ -214,11 +211,12 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/**
- * {@inheritDoc}
* Overridden to defer a part to the next page, if it
* must be kept within one page, but is too large to fit in
* the last column.
+ * {@inheritDoc}
*/
+ @Override
protected KnuthNode recoverFromTooLong(KnuthNode lastTooLong) {
if (log.isDebugEnabled()) {
@@ -256,6 +254,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @param node2 The other knuth node.
* @return the node with the least demerit.
*/
+ @Override
protected KnuthNode compareNodes(KnuthNode node1, KnuthNode node2) {
/* if either node is null, return the other one */
@@ -281,6 +280,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected KnuthNode createNode(int position, // CSOK: ParameterNumber
int line, int fitness,
int totalWidth, int totalStretch, int totalShrink,
@@ -294,6 +294,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected KnuthNode createNode(int position, int line, int fitness,
int totalWidth, int totalStretch, int totalShrink) {
return new KnuthPageNode(position, line, fitness,
@@ -307,11 +308,11 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/**
- * {@inheritDoc}
* Page-breaking specific handling of the given box. Currently it adds the footnotes
* cited in the given box to the list of to-be-handled footnotes.
- * @param box a block-level element possibly containing foonotes citations
+ * {@inheritDoc}
*/
+ @Override
protected void handleBox(KnuthBox box) {
super.handleBox(box);
if (box instanceof KnuthBlockBox
@@ -325,11 +326,12 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/**
- * {@inheritDoc}
* Overridden to consider penalties with value {@link KnuthElement#INFINITE}
* as legal break-points, if the current keep-context allows this
* (a keep-*.within-page="always" constraint still permits column-breaks)
+ * {@inheritDoc}
*/
+ @Override
protected void handlePenaltyAt(KnuthPenalty penalty, int position,
int allowedBreaks) {
super.handlePenaltyAt(penalty, position, allowedBreaks);
@@ -352,12 +354,12 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @param elementLists list of KnuthElement sequences corresponding to the footnotes
* bodies
*/
- private void handleFootnotes(List elementLists) {
+ private void handleFootnotes(List<List<KnuthElement>> elementLists) {
// initialization
if (!footnotesPending) {
footnotesPending = true;
- footnotesList = new ArrayList();
- lengthList = new ArrayList();
+ footnotesList = new ArrayList<List<KnuthElement>>();
+ lengthList = new ArrayList<Integer>();
totalFootnotesLength = 0;
}
if (!newFootnotes) {
@@ -366,9 +368,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
// compute the total length of the footnotes
- for (Iterator elementListsIterator = elementLists.iterator();
- elementListsIterator.hasNext();) {
- final List noteList = (List) elementListsIterator.next();
+ for (List<KnuthElement> noteList : elementLists) {
//Space resolution (Note: this does not respect possible stacking constraints
//between footnotes!)
@@ -376,23 +376,23 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
int noteLength = 0;
footnotesList.add(noteList);
- for (Iterator noteListIterator = noteList.iterator();
- noteListIterator.hasNext();) {
- final KnuthElement element = (KnuthElement) noteListIterator.next();
+ for (KnuthElement element : noteList) {
if (element.isBox() || element.isGlue()) {
noteLength += element.getWidth();
}
}
int prevLength = (lengthList == null || lengthList.isEmpty())
? 0
- : ((Integer) ListUtil.getLast(lengthList)).intValue();
- //TODO: replace with Integer.valueOf() once we switch to Java 5
- lengthList.add(new Integer(prevLength + noteLength));
+ : ListUtil.getLast(lengthList);
+ if (lengthList != null) {
+ lengthList.add(prevLength + noteLength);
+ }
totalFootnotesLength += noteLength;
}
}
/** {@inheritDoc} */
+ @Override
protected int restartFrom(KnuthNode restartingNode, int currentIndex) {
int returnValue = super.restartFrom(restartingNode, currentIndex);
newFootnotes = false;
@@ -410,14 +410,14 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
return returnValue;
}
- private void resetFootnotes(List elementLists) {
+ private void resetFootnotes(List<List<KnuthElement>> elementLists) {
for (int i = 0; i < elementLists.size(); i++) {
- /*LinkedList removedList = (LinkedList)*/ListUtil.removeLast(footnotesList);
+ ListUtil.removeLast(footnotesList);
ListUtil.removeLast(lengthList);
// update totalFootnotesLength
if (!lengthList.isEmpty()) {
- totalFootnotesLength = ((Integer) ListUtil.getLast(lengthList)).intValue();
+ totalFootnotesLength = ListUtil.getLast(lengthList);
} else {
totalFootnotesLength = 0;
}
@@ -429,6 +429,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected void considerLegalBreak(KnuthElement element, int elementIdx) {
if (element.isPenalty()) {
int breakClass = ((KnuthPenalty) element).getBreakClass();
@@ -457,6 +458,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected boolean elementCanEndLine(KnuthElement element, int line, int difference) {
if (!(element.isPenalty()) || pageProvider == null) {
return true;
@@ -489,11 +491,12 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected int computeDifference(KnuthNode activeNode, KnuthElement element,
int elementIndex) {
KnuthPageNode pageNode = (KnuthPageNode) activeNode;
int actualWidth = totalWidth - pageNode.totalWidth;
- int footnoteSplit = 0;
+ int footnoteSplit;
boolean canDeferOldFN;
if (element.isPenalty()) {
actualWidth += element.getWidth();
@@ -562,6 +565,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @param node active node for the preceding page break
* @param contentElementIndex index of the Knuth element considered for the
* current page break
+ * @return true if footnotes can be deferred
*/
private boolean canDeferOldFootnotes(KnuthPageNode node, int contentElementIndex) {
return (noBreakBetween(node.position, contentElementIndex)
@@ -668,8 +672,8 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
// together with all previous, not yet inserted footnotes;
// but if this is not possible, try adding as much content as possible
int splitLength = 0;
- ListIterator noteListIterator = null;
- KnuthElement element = null;
+ ListIterator<KnuthElement> noteListIterator;
+ KnuthElement element;
boolean somethingAdded = false;
// prevListIndex and prevElementIndex points to the last footnote element
@@ -687,16 +691,14 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
if (footnotesList.size() - 1 > listIndex) {
// add the previous footnotes: these cannot be broken or deferred
if (!canDeferOldFootnotes && newFootnotes && firstNewFootnoteIndex > 0) {
- splitLength = ((Integer) lengthList.get(firstNewFootnoteIndex - 1)).intValue()
- - prevLength;
+ splitLength = lengthList.get(firstNewFootnoteIndex - 1) - prevLength;
listIndex = firstNewFootnoteIndex;
elementIndex = 0;
}
// try adding the new footnotes
- while (((Integer) lengthList.get(listIndex)).intValue() - prevLength
+ while (lengthList.get(listIndex) - prevLength
<= availableLength) {
- splitLength = ((Integer) lengthList.get(listIndex)).intValue()
- - prevLength;
+ splitLength = lengthList.get(listIndex) - prevLength;
somethingAdded = true;
listIndex++;
elementIndex = 0;
@@ -727,7 +729,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
// all footnotes, and we have already tried (and failed) to insert
// this whole footnote, the while loop will never reach the end
// of the note sequence
- element = (KnuthElement) noteListIterator.next();
+ element = noteListIterator.next();
if (element.isBox()) {
// element is a box
splitLength += element.getWidth();
@@ -774,6 +776,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected double computeAdjustmentRatio(KnuthNode activeNode, int difference) {
// compute the adjustment ratio
if (difference > 0) {
@@ -804,6 +807,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected double computeDemerits(KnuthNode activeNode, KnuthElement element,
int fitnessClass, double r) {
double demerits = 0;
@@ -856,6 +860,8 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
return demerits;
}
+ /** {@inheritDoc} */
+ @Override
protected void finish() {
for (int i = startLine; i < endLine; i++) {
for (KnuthPageNode node = (KnuthPageNode) getNode(i);
@@ -880,7 +886,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
// create pages containing the remaining footnote bodies
while (insertedFootnotesLength < totalFootnotesLength) {
- final int tmpLength = ((Integer) lengthList.get(footnoteListIndex)).intValue();
+ final int tmpLength = lengthList.get(footnoteListIndex);
// try adding some more content
if ((tmpLength - insertedFootnotesLength) <= availableBPD) {
// add a whole footnote
@@ -925,7 +931,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @return a list of {@link PageBreakPosition} elements
* corresponding to the computed page- and column-breaks
*/
- public LinkedList getPageBreaks() {
+ public LinkedList<PageBreakPosition> getPageBreaks() {
return pageBreaks;
}
@@ -937,7 +943,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
*/
public void insertPageBreakAsFirst(PageBreakPosition pageBreak) {
if (pageBreaks == null) {
- pageBreaks = new LinkedList();
+ pageBreaks = new LinkedList<PageBreakPosition>();
}
pageBreaks.addFirst(pageBreak);
}
@@ -948,19 +954,19 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* whole content should be painted as one part.
*/
public void removeAllPageBreaks() {
- if (pageBreaks == null) {
+ if (pageBreaks == null || pageBreaks.isEmpty()) {
return;
}
- while (pageBreaks.size() > 1) {
- pageBreaks.removeFirst();
- }
+ pageBreaks.subList(0, pageBreaks.size() - 1).clear();
}
/** {@inheritDoc} */
+ @Override
public void updateData1(int total, double demerits) {
}
/** {@inheritDoc} */
+ @Override
public void updateData2(KnuthNode bestActiveNode,
KnuthSequence sequence,
int total) {
@@ -1029,6 +1035,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected int filterActiveNodes() {
// leave only the active node with fewest total demerits
KnuthNode bestActiveNode = null;
@@ -1058,8 +1065,8 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @param index the index in the list of footnotes
* @return the element-list
*/
- protected final List getFootnoteList(int index) {
- return (List) footnotesList.get(index);
+ protected final List<KnuthElement> getFootnoteList(int index) {
+ return footnotesList.get(index);
}
/** @return the associated top-level formatting object. */
@@ -1068,6 +1075,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected int getLineWidth(int line) {
int bpd;
if (pageProvider != null) {
@@ -1097,11 +1105,13 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
/** {@inheritDoc} */
+ @Override
protected int getIPDdifference() {
return ipdDifference;
}
/** {@inheritDoc} */
+ @Override
protected int handleIpdChange() {
log.trace("Best node for ipd change:" + bestNodeForIPDChange);
// TODO finish()
@@ -1123,6 +1133,7 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
* @param line number of the line ending at the node's corresponding breakpoint
* @param node the active node to add
*/
+ @Override
protected void addNode(int line, KnuthNode node) {
if (node.position < par.size() - 1 && line > 0
&& (ipdDifference = compareIPDs(line - 1)) != 0) { // CSOK: InnerAssignment
@@ -1153,5 +1164,4 @@ class PageBreakingAlgorithm extends BreakingAlgorithm {
}
return pageProvider.compareIPDs(line);
}
-
}