1 51 package org.apache.fop.fo.pagination; 52 53 import org.apache.fop.fo.*; 54 import org.apache.fop.apps.FOPException; 55 56 63 public class RepeatablePageMasterReference extends PageMasterReference 64 implements SubSequenceSpecifier { 65 66 private static final int INFINITE = -1; 67 68 public static class Maker extends FObj.Maker { 69 public FObj make(FObj parent, PropertyList propertyList, 70 String systemId, int line, int column) 71 throws FOPException { 72 return new RepeatablePageMasterReference(parent, propertyList, 73 systemId, line, column); 74 } 75 76 } 77 78 public static FObj.Maker maker() { 79 return new RepeatablePageMasterReference.Maker(); 80 } 81 82 private int maximumRepeats; 83 private int numberConsumed = 0; 84 85 public RepeatablePageMasterReference(FObj parent, PropertyList propertyList, 86 String systemId, int line, int column) 87 throws FOPException { 88 super(parent, propertyList, systemId, line, column); 89 if (getProperty("master-reference") != null) { 90 this.masterName = getProperty("master-reference").getString(); 91 if (parent.getName().equals("fo:page-sequence-master")) { 92 PageSequenceMaster pageSequenceMaster = (PageSequenceMaster)parent; 93 pageSequenceMaster.addSubsequenceSpecifier(this); 94 } else { 95 throw new FOPException("A fo:repeatable-page-master-reference must be child of fo:page-sequence-master, not " 96 + parent.getName(), systemId, line, column); 97 } 98 } else { 99 log.warn("A fo:repeatable-page-master-reference does not have a master-reference and so is being ignored"); 100 } 101 String mr = getProperty("maximum-repeats").getString(); 102 if (mr.equals("no-limit")) { 103 this.maximumRepeats = INFINITE; 104 } else { 105 try { 106 this.maximumRepeats = Integer.parseInt(mr); 107 if (this.maximumRepeats < 0) { 108 log.debug("negative maximum-repeats: "+this.maximumRepeats); 109 this.maximumRepeats = 0; 110 } 111 } catch (NumberFormatException nfe) { 112 throw new FOPException("Invalid number '" + mr 113 + "'for 'maximum-repeats' property", 114 systemId, line, column); 115 } 116 } 117 } 118 119 public String getName() { 120 return "fo:repeatable-page-master-reference"; 121 } 122 123 public String getNextPageMasterName(boolean isOddPage, 124 boolean isFirstPage, 125 boolean isEmptyPage) { 126 if (maximumRepeats != INFINITE) { 127 if (numberConsumed < maximumRepeats) { 128 numberConsumed++; 129 } else { 130 return null; 131 } 132 } 133 return getMasterName(); 134 } 135 136 public void reset() { 137 this.numberConsumed = 0; 138 } 139 140 } 141 | Popular Tags |