// 'retrieve-boundary'. Initially we will always check
// the containing page
Page containingPage = area.getPage();
- Marker bestMarker = searchPage(containingPage);
+ Marker bestMarker = searchPage(containingPage, true);
// if marker not yet found, and 'retrieve-boundary' permits,
// search forward by Page
- /* insert code for searching forward by Page, if allowed */
+ if ((null == bestMarker) && (retrieveBoundary != RetrieveBoundary.PAGE)) {
+ // System.out.println("Null bestMarker and searching...");
+ Page currentPage = containingPage;
+ boolean isFirstCall = true;
+ while (bestMarker == null) {
+ Page previousPage =
+ locatePreviousPage(currentPage, retrieveBoundary, isFirstCall);
+ isFirstCall = false;
+ // System.out.println("Previous page = '" + previousPage + "'");
+ bestMarker = searchPage(previousPage, false);
+ currentPage = previousPage;
+ }
+ }
Status status = new Status(Status.AREA_FULL_NONE);
if (null != bestMarker) {
- // System.out.println("Laying out marker in area '" + area + "'");
+ // System.out.println("Laying out marker '" + bestMarker + "' in area '" + area + "'");
+ // the 'markers' referred to in this method are internal; they have
+ // nothing to do with fo:marker
+ bestMarker.resetMarker();
status = bestMarker.layoutMarker(area);
}
return status;
}
- private Marker searchPage(Page page) throws FOPException {
+ private Marker searchPage(Page page, boolean isContainingPage)
+ throws FOPException {
Vector pageMarkers = page.getMarkers();
- if (pageMarkers.isEmpty())
+ if (pageMarkers.isEmpty()) {
+ // System.out.println("No markers on page");
return null;
-
+ }
+
+ // if no longer the containing page (fo:retrieve-marker, or the page
+ // being processed), grab the last qualifying marker on this one
+ if (!isContainingPage) {
+ for (int c = pageMarkers.size(); c > 0; c--) {
+ Marker currentMarker = (Marker)pageMarkers.elementAt(c-1);
+ if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
+ return currentMarker;
+ }
+ }
+ }
+
// search forward if 'first-starting-within-page' or
// 'first-including-carryover'
- Marker fallback = null;
if (retrievePosition == RetrievePosition.FIC) {
for (int c = 0; c < pageMarkers.size(); c++) {
Marker currentMarker = (Marker)pageMarkers.elementAt(c);
- if (currentMarker.getMarkerClassName().equals(retrieveClassName))
+ if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
return currentMarker;
+ }
}
} else if (retrievePosition == RetrievePosition.FSWP) {
for (int c = 0; c < pageMarkers.size(); c++) {
Marker currentMarker = (Marker)pageMarkers.elementAt(c);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isFirst)
+ if (currentMarker.getRegistryArea().isFirst) {
return currentMarker;
- else if (null == fallback)
- fallback = currentMarker;
+ }
}
}
for (int c = pageMarkers.size(); c > 0; c--) {
Marker currentMarker = (Marker)pageMarkers.elementAt(c-1);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isFirst)
+ if (currentMarker.getRegistryArea().isFirst) {
return currentMarker;
- else if (null == fallback)
- fallback = currentMarker;
+ }
}
}
for (int c = pageMarkers.size(); c > 0; c--) {
Marker currentMarker = (Marker)pageMarkers.elementAt(c-1);
if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
- if (currentMarker.getRegistryArea().isLast)
+ if (currentMarker.getRegistryArea().isLast) {
return currentMarker;
- else if (null == fallback)
- fallback = currentMarker;
+ }
}
}
} else {
throw new FOPException("Illegal 'retrieve-position' value");
}
- return fallback;
+ return null;
+ }
+
+ private Page locatePreviousPage(Page page, int retrieveBoundary,
+ boolean isFirstCall) {
+ boolean pageWithinSequence = true;
+ if (retrieveBoundary == RetrieveBoundary.DOCUMENT)
+ pageWithinSequence = false;
+ return page.getAreaTree().getPreviousPage(page, pageWithinSequence,
+ isFirstCall);
}
}
import org.apache.fop.render.Renderer;
import org.apache.fop.datatypes.IDReferences;
import org.apache.fop.extensions.ExtensionObj;
+import org.apache.fop.fo.pagination.PageSequence;
// Java
import java.io.IOException;
return rootExtensions;
}
+ public Page getNextPage(Page current, boolean isWithinPageSequence,
+ boolean isFirstCall) {
+ Page nextPage = null;
+ int pageIndex = 0;
+ if (isFirstCall)
+ pageIndex = pageList.size();
+ else
+ pageIndex = pageList.indexOf(current);
+ if ((pageIndex + 1) < pageList.size()) {
+ nextPage = (Page)pageList.elementAt(pageIndex + 1);
+ if (isWithinPageSequence && !nextPage.getPageSequence().equals(current.getPageSequence())) {
+ nextPage = null;
+ }
+ }
+ return nextPage;
+ }
+ public Page getPreviousPage(Page current, boolean isWithinPageSequence,
+ boolean isFirstCall) {
+ Page previousPage = null;
+ int pageIndex = 0;
+ if (isFirstCall)
+ pageIndex = pageList.size();
+ else
+ pageIndex = pageList.indexOf(current);
+ // System.out.println("Page index = " + pageIndex);
+ if ((pageIndex - 1) >= 0) {
+ previousPage = (Page)pageList.elementAt(pageIndex - 1);
+ PageSequence currentPS = current.getPageSequence();
+ // System.out.println("Current PS = '" + currentPS + "'");
+ PageSequence previousPS = previousPage.getPageSequence();
+ // System.out.println("Previous PS = '" + previousPS + "'");
+ if (isWithinPageSequence && !previousPS.equals(currentPS)) {
+ // System.out.println("Outside page sequence");
+ previousPage = null;
+ }
+ }
+ return previousPage;
+ }
}