1 51 package org.apache.fop.fo.flow; 52 53 import org.apache.fop.fo.FObj; 55 import org.apache.fop.fo.PropertyList; 56 import org.apache.fop.fo.Status; 57 import org.apache.fop.fo.pagination.PageSequence; 58 import org.apache.fop.fo.properties.RetrieveBoundary; 59 import org.apache.fop.fo.properties.RetrievePosition; 60 import org.apache.fop.layout.Area; 61 import org.apache.fop.layout.AreaTree; 62 import org.apache.fop.layout.Page; 63 import org.apache.fop.apps.FOPException; 64 65 import java.util.ArrayList ; 67 68 public class RetrieveMarker extends FObj { 69 70 private String retrieveClassName; 71 private int retrievePosition; 72 private int retrieveBoundary; 73 private Marker bestMarker; 74 75 public static class Maker extends FObj.Maker { 76 public FObj make(FObj parent, PropertyList propertyList, 77 String systemId, int line, int column) 78 throws FOPException { 79 return new RetrieveMarker(parent, propertyList, 80 systemId, line, column); 81 } 82 83 } 84 85 public static FObj.Maker maker() { 86 return new RetrieveMarker.Maker(); 87 } 88 89 public RetrieveMarker(FObj parent, PropertyList propertyList, 90 String systemId, int line, int column) { 91 super(parent, propertyList, systemId, line, column); 92 93 this.retrieveClassName = 94 this.properties.get("retrieve-class-name").getString(); 95 this.retrievePosition = 96 this.properties.get("retrieve-position").getEnum(); 97 this.retrieveBoundary = 98 this.properties.get("retrieve-boundary").getEnum(); 99 } 100 101 public String getName() { 102 return "fo:retrieve-marker"; 103 } 104 105 public int layout(Area area) throws FOPException { 106 if (marker == START) { 107 marker = 0; 108 Page containingPage = area.getPage(); 112 bestMarker = searchPage(containingPage); 113 114 if (bestMarker != null) { 115 bestMarker.resetMarkerContent(); 116 return bestMarker.layoutMarker(area); 117 } 118 AreaTree areaTree = containingPage.getAreaTree(); 121 if (retrieveBoundary == RetrieveBoundary.PAGE_SEQUENCE) { 122 PageSequence pageSequence = areaTree.getCurrentPageSequence(); 123 if (pageSequence == containingPage.getPageSequence() ) { 124 return layoutBestMarker(areaTree.getCurrentPageSequenceMarkers(),area); 125 } 126 } else if (retrieveBoundary == RetrieveBoundary.DOCUMENT) { 127 return layoutBestMarker(areaTree.getDocumentMarkers(),area); 128 } else if (retrieveBoundary != RetrieveBoundary.PAGE) { 129 throw new FOPException("Illegal 'retrieve-boundary' value", systemId, line, column); 130 } 131 } else if (bestMarker != null) { 132 return bestMarker.layoutMarker(area); 133 } 134 return Status.OK; 135 } 136 137 private int layoutBestMarker(ArrayList markers, Area area) 138 throws FOPException { 139 if (markers!=null) { 140 for (int i = markers.size() - 1; i >= 0; i--) { 141 Marker currentMarker = (Marker)markers.get(i); 142 if (currentMarker.getMarkerClassName().equals(retrieveClassName)) { 143 bestMarker = currentMarker; 144 bestMarker.resetMarkerContent(); 145 return bestMarker.layoutMarker(area); 146 } 147 } 148 } 149 return Status.OK; 150 } 151 152 private Marker searchPage(Page page) throws FOPException { 153 ArrayList pageMarkers = page.getMarkers(); 154 if (pageMarkers.isEmpty()) { 155 return null; 156 } 157 158 if (retrievePosition == RetrievePosition.FIC) { 161 for (int i = 0; i < pageMarkers.size(); i++) { 162 Marker currentMarker = (Marker)pageMarkers.get(i); 163 if (currentMarker.getMarkerClassName().equals(retrieveClassName)) { 164 return currentMarker; 165 } 166 } 167 } else if (retrievePosition == RetrievePosition.FSWP) { 168 for (int i = 0; i < pageMarkers.size(); i++) { 169 Marker currentMarker = (Marker)pageMarkers.get(i); 170 if (currentMarker.getMarkerClassName().equals(retrieveClassName)) { 171 if (currentMarker.getRegistryArea().isFirst()) { 172 return currentMarker; 173 } 174 } 175 } 176 } else if (retrievePosition == RetrievePosition.LSWP) { 177 for (int i = pageMarkers.size() - 1; i >= 0; i--) { 178 Marker currentMarker = (Marker)pageMarkers.get(i); 179 if (currentMarker.getMarkerClassName().equals(retrieveClassName)) { 180 if (currentMarker.getRegistryArea().isFirst()) { 181 return currentMarker; 182 } 183 } 184 } 185 186 } else if (retrievePosition == RetrievePosition.LEWP) { 187 for (int i = pageMarkers.size() - 1; i >= 0; i--) { 188 Marker currentMarker = (Marker)pageMarkers.get(i); 189 if (currentMarker.getMarkerClassName().equals(retrieveClassName)) { 190 if (currentMarker.getRegistryArea().isLast()) { 191 return currentMarker; 192 } 193 } 194 } 195 196 } else { 197 throw new FOPException("Illegal 'retrieve-position' value", systemId, line, column); 198 } 199 return null; 200 } 201 202 } 203 | Popular Tags |