1 51 package org.apache.fop.fo.pagination; 52 53 import org.apache.fop.fo.*; 55 import org.apache.fop.apps.FOPException; 56 57 import java.util.ArrayList ; 59 60 67 public class PageSequenceMaster extends FObj { 68 69 public static class Maker extends FObj.Maker { 70 public FObj make(FObj parent, PropertyList propertyList, 71 String systemId, int line, int column) 72 throws FOPException { 73 return new PageSequenceMaster(parent, propertyList, 74 systemId, line, column); 75 } 76 77 } 78 79 public static FObj.Maker maker() { 80 return new PageSequenceMaster.Maker(); 81 } 82 83 private LayoutMasterSet layoutMasterSet; 84 private ArrayList subSequenceSpecifiers; 85 private SubSequenceSpecifier currentSubSequence; 86 private int currentSubSequenceNumber; 87 private String masterName; 88 89 protected PageSequenceMaster(FObj parent, PropertyList propertyList, 96 String systemId, int line, int column) 97 throws FOPException { 98 super(parent, propertyList, systemId, line, column); 99 100 if (parent.getName().equals("fo:layout-master-set")) { 101 this.layoutMasterSet = (LayoutMasterSet)parent; 102 this.masterName = this.properties.get("master-name").getString(); 103 if (this.masterName == null) { 104 log.warn("page-sequence-master does not have " 105 + "a page-master-name and so is being ignored"); 106 } else { 107 this.layoutMasterSet.addPageSequenceMaster(masterName, this); 108 } 109 } else { 110 throw new FOPException("fo:page-sequence-master must be child " 111 + "of fo:layout-master-set, not " 112 + parent.getName(), systemId, line, column); 113 } 114 subSequenceSpecifiers = new ArrayList (); 115 currentSubSequenceNumber = -1; 116 currentSubSequence = null; 117 } 118 119 protected void addSubsequenceSpecifier(SubSequenceSpecifier pageMasterReference) { 120 subSequenceSpecifiers.add(pageMasterReference); 121 } 122 123 protected SubSequenceSpecifier getNextSubSequence() { 124 currentSubSequenceNumber++; 125 if (currentSubSequenceNumber >= 0 126 && currentSubSequenceNumber < subSequenceSpecifiers.size()) { 127 return (SubSequenceSpecifier)subSequenceSpecifiers 128 .get(currentSubSequenceNumber); 129 } 130 return null; 131 } 132 133 public void reset() { 134 currentSubSequenceNumber = -1; 135 currentSubSequence = null; 136 for (int i = 0; i< subSequenceSpecifiers.size(); i++ ) { 137 ((SubSequenceSpecifier)subSequenceSpecifiers.get(i)).reset(); 138 } 139 } 140 141 public SimplePageMaster getNextSimplePageMaster(boolean oddPage, 142 boolean blankPage) 143 throws FOPException { 144 boolean firstPage = false; 145 if (currentSubSequence==null) { 146 currentSubSequence = getNextSubSequence(); 147 if (currentSubSequence==null) { 148 throw new FOPException("no subsequences in page-sequence-master '" 149 + masterName + "'", systemId, line, column); 150 } 151 firstPage = true; 152 } 153 String pageMasterName = currentSubSequence 154 .getNextPageMasterName(oddPage, firstPage, blankPage); 155 boolean canRecover = true; 156 while (pageMasterName==null) { 157 SubSequenceSpecifier nextSubSequence = getNextSubSequence(); 158 firstPage = true; 159 if (nextSubSequence==null) { 160 if (!canRecover) { 161 throw new FOPException("subsequences exhausted in page-sequence-master '" 162 + masterName 163 + "', cannot recover", systemId, line, column); 164 } 165 log.warn("subsequences exhausted in page-sequence-master '" 166 + masterName 167 + "', use previous subsequence"); 168 currentSubSequence.reset(); 169 canRecover = false; 170 } else { 171 currentSubSequence = nextSubSequence; 172 } 173 pageMasterName = currentSubSequence 174 .getNextPageMasterName(oddPage, firstPage, blankPage); 175 } 176 SimplePageMaster pageMaster=this.layoutMasterSet 177 .getSimplePageMaster(pageMasterName); 178 if (pageMaster==null) { 179 throw new FOPException("No simple-page-master matching '" 180 + pageMasterName + "' in page-sequence-master '" 181 + masterName +"'", systemId, line, column); 182 } 183 return pageMaster; 184 } 185 186 public String getName() { 187 return "fo:page-sequence-master"; 188 } 189 190 } 191 | Popular Tags |