您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

RepeatablePageMasterReference.java 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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.pagination;
  8. import org.apache.fop.fo.*;
  9. import org.apache.fop.apps.FOPException;
  10. /**
  11. * Class modeling the fo:repeatable-page-master-reference object.
  12. *
  13. * @see <a href="@XSLFO-STD@#fo_repeatable-page-master-reference"
  14. target="_xslfostd">@XSLFO-STDID@
  15. * &para;6.4.9</a>
  16. */
  17. public class RepeatablePageMasterReference extends PageMasterReference
  18. implements SubSequenceSpecifier {
  19. private static final int INFINITE = -1;
  20. public static class Maker extends FObj.Maker {
  21. public FObj make(FObj parent,
  22. PropertyList propertyList) throws FOPException {
  23. return new RepeatablePageMasterReference(parent, propertyList);
  24. }
  25. }
  26. public static FObj.Maker maker() {
  27. return new RepeatablePageMasterReference.Maker();
  28. }
  29. private int maximumRepeats;
  30. private int numberConsumed = 0;
  31. public RepeatablePageMasterReference(FObj parent, PropertyList propertyList)
  32. throws FOPException {
  33. super(parent, propertyList);
  34. if (getProperty("master-reference") != null) {
  35. this.masterName = getProperty("master-reference").getString();
  36. if (parent.getName().equals("fo:page-sequence-master")) {
  37. PageSequenceMaster pageSequenceMaster = (PageSequenceMaster)parent;
  38. pageSequenceMaster.addSubsequenceSpecifier(this);
  39. } else {
  40. throw new FOPException("A fo:repeatable-page-master-reference must be child of fo:page-sequence-master, not "
  41. + parent.getName());
  42. }
  43. } else {
  44. log.warn("A fo:repeatable-page-master-reference does not have a master-reference and so is being ignored");
  45. }
  46. String mr = getProperty("maximum-repeats").getString();
  47. if (mr.equals("no-limit")) {
  48. this.maximumRepeats = INFINITE;
  49. } else {
  50. try {
  51. this.maximumRepeats = Integer.parseInt(mr);
  52. if (this.maximumRepeats < 0) {
  53. log.debug("negative maximum-repeats: "+this.maximumRepeats);
  54. this.maximumRepeats = 0;
  55. }
  56. } catch (NumberFormatException nfe) {
  57. throw new FOPException("Invalid number '" + mr
  58. + "'for 'maximum-repeats' property");
  59. }
  60. }
  61. }
  62. public String getName() {
  63. return "fo:repeatable-page-master-reference";
  64. }
  65. public String getNextPageMasterName(boolean isOddPage,
  66. boolean isFirstPage,
  67. boolean isEmptyPage) {
  68. if (maximumRepeats != INFINITE) {
  69. if (numberConsumed < maximumRepeats) {
  70. numberConsumed++;
  71. } else {
  72. return null;
  73. }
  74. }
  75. return getMasterName();
  76. }
  77. public void reset() {
  78. this.numberConsumed = 0;
  79. }
  80. }