You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RetrieveMarker.java 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.fo.flow;
  8. // FOP
  9. import org.apache.fop.fo.*;
  10. import org.apache.fop.fo.properties.*;
  11. import org.apache.fop.layout.*;
  12. import org.apache.fop.datatypes.*;
  13. import org.apache.fop.apps.FOPException;
  14. // Java
  15. import java.util.Vector;
  16. import org.xml.sax.Attributes;
  17. public class RetrieveMarker extends FObjMixed {
  18. private String retrieveClassName;
  19. private int retrievePosition;
  20. private int retrieveBoundary;
  21. public RetrieveMarker(FONode parent) {
  22. super(parent);
  23. }
  24. public void handleAttrs(Attributes attlist) throws FOPException {
  25. super.handleAttrs(attlist);
  26. this.retrieveClassName =
  27. this.properties.get("retrieve-class-name").getString();
  28. this.retrievePosition =
  29. this.properties.get("retrieve-position").getEnum();
  30. this.retrieveBoundary =
  31. this.properties.get("retrieve-boundary").getEnum();
  32. }
  33. public Status layout(Area area) throws FOPException {
  34. // locate qualifying areas by 'marker-class-name' and
  35. // 'retrieve-boundary'. Initially we will always check
  36. // the containing page
  37. Page containingPage = area.getPage();
  38. Marker bestMarker = searchPage(containingPage, true);
  39. // if marker not yet found, and 'retrieve-boundary' permits,
  40. // search forward by Page
  41. if ((null == bestMarker)
  42. && (retrieveBoundary != RetrieveBoundary.PAGE)) {
  43. // System.out.println("Null bestMarker and searching...");
  44. Page currentPage = containingPage;
  45. boolean isFirstCall = true;
  46. while (bestMarker == null) {
  47. Page previousPage = locatePreviousPage(currentPage,
  48. retrieveBoundary,
  49. isFirstCall);
  50. isFirstCall = false;
  51. // System.out.println("Previous page = '" + previousPage + "'");
  52. bestMarker = searchPage(previousPage, false);
  53. currentPage = previousPage;
  54. }
  55. }
  56. Status status = new Status(Status.AREA_FULL_NONE);
  57. if (null != bestMarker) {
  58. // System.out.println("Laying out marker '" + bestMarker + "' in area '" + area + "'");
  59. // the 'markers' referred to in this method are internal; they have
  60. // nothing to do with fo:marker
  61. bestMarker.resetMarker();
  62. status = bestMarker.layoutMarker(area);
  63. }
  64. return status;
  65. }
  66. private Marker searchPage(Page page,
  67. boolean isContainingPage) throws FOPException {
  68. Vector pageMarkers = page.getMarkers();
  69. if (pageMarkers.isEmpty()) {
  70. // System.out.println("No markers on page");
  71. return null;
  72. }
  73. // if no longer the containing page (fo:retrieve-marker, or the page
  74. // being processed), grab the last qualifying marker on this one
  75. if (!isContainingPage) {
  76. for (int c = pageMarkers.size(); c > 0; c--) {
  77. Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
  78. if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  79. return currentMarker;
  80. }
  81. }
  82. }
  83. // search forward if 'first-starting-within-page' or
  84. // 'first-including-carryover'
  85. if (retrievePosition == RetrievePosition.FIC) {
  86. for (int c = 0; c < pageMarkers.size(); c++) {
  87. Marker currentMarker = (Marker)pageMarkers.elementAt(c);
  88. if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  89. return currentMarker;
  90. }
  91. }
  92. } else if (retrievePosition == RetrievePosition.FSWP) {
  93. for (int c = 0; c < pageMarkers.size(); c++) {
  94. Marker currentMarker = (Marker)pageMarkers.elementAt(c);
  95. if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  96. if (currentMarker.getRegistryArea().isFirst()) {
  97. return currentMarker;
  98. }
  99. }
  100. }
  101. } else if (retrievePosition == RetrievePosition.LSWP) {
  102. for (int c = pageMarkers.size(); c > 0; c--) {
  103. Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
  104. if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  105. if (currentMarker.getRegistryArea().isFirst()) {
  106. return currentMarker;
  107. }
  108. }
  109. }
  110. } else if (retrievePosition == RetrievePosition.LEWP) {
  111. for (int c = pageMarkers.size(); c > 0; c--) {
  112. Marker currentMarker = (Marker)pageMarkers.elementAt(c - 1);
  113. if (currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  114. if (currentMarker.getRegistryArea().isLast()) {
  115. return currentMarker;
  116. }
  117. }
  118. }
  119. } else {
  120. throw new FOPException("Illegal 'retrieve-position' value");
  121. }
  122. return null;
  123. }
  124. private Page locatePreviousPage(Page page, int retrieveBoundary,
  125. boolean isFirstCall) {
  126. boolean pageWithinSequence = true;
  127. if (retrieveBoundary == RetrieveBoundary.DOCUMENT)
  128. pageWithinSequence = false;
  129. return page.getAreaTree().getPreviousPage(page, pageWithinSequence,
  130. isFirstCall);
  131. }
  132. }