From 9d4d10cd1df7edb249173cadf82655d019cb229b Mon Sep 17 00:00:00 2001 From: Steve Coffman Date: Tue, 23 May 2000 20:44:19 +0000 Subject: [PATCH] This applies Jordon Naftolin's latest and greatest patch, fixing the PageSequence to allow auto-even, auto-odd, auto, integer to all work happily. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193382 13f79535-47bb-0310-9956-ffa450edef68 --- src/codegen/properties.xml | 4 +- .../fop/fo/pagination/PageSequence.java | 267 ++++++++++++------ 2 files changed, 176 insertions(+), 95 deletions(-) diff --git a/src/codegen/properties.xml b/src/codegen/properties.xml index 8f84d721f..5ccaed025 100644 --- a/src/codegen/properties.xml +++ b/src/codegen/properties.xml @@ -796,8 +796,8 @@ initial-page-number InitialPageNumber false - Integer - 0 + String + auto diff --git a/src/org/apache/fop/fo/pagination/PageSequence.java b/src/org/apache/fop/fo/pagination/PageSequence.java index 399665d05..34278d162 100644 --- a/src/org/apache/fop/fo/pagination/PageSequence.java +++ b/src/org/apache/fop/fo/pagination/PageSequence.java @@ -62,25 +62,32 @@ import org.apache.fop.layout.AreaTree; import org.apache.fop.layout.Page; import org.apache.fop.layout.PageMaster; import org.apache.fop.layout.PageMasterFactory; -import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.FOPException; // Java import java.util.Hashtable; import java.util.Vector; -public class PageSequence extends FObj { +public class PageSequence extends FObj +{ - public static class Maker extends FObj.Maker { - public FObj make(FObj parent, PropertyList propertyList) - throws FOPException { - return new PageSequence(parent, propertyList); - } + public static class Maker extends FObj.Maker + { + public FObj make(FObj parent, PropertyList propertyList) + throws FOPException { + return new PageSequence(parent, propertyList); + } } public static FObj.Maker maker() { - return new PageSequence.Maker(); + return new PageSequence.Maker(); } + static final int EXPLICIT = 0; + static final int AUTO = 1; + static final int AUTO_EVEN = 2; + static final int AUTO_ODD = 3; + protected Root root; protected SequenceSpecification sequenceSpecification; protected Flow flow; @@ -90,105 +97,179 @@ public class PageSequence extends FObj { protected Page currentPage; protected int currentPageNumber = 0; + protected static int runningPageNumberCounter = 0; //keeps count of page number from previous PageSequence + protected int pageNumberType; // specifies page numbering type (auto|auto-even|auto-odd|explicit) + protected boolean thisIsFirstPage; // used to determine whether to calculate auto, auto-even, auto-odd protected PageSequence(FObj parent, PropertyList propertyList) - throws FOPException { - super(parent, propertyList); - this.name = "fo:page-sequence"; - - if (parent.getName().equals("fo:root")) { - this.root = (Root) parent; - this.root.addPageSequence(this); - } else { - throw - new FOPException("page-sequence must be child of root, not " - + parent.getName()); - } - layoutMasterSet = root.getLayoutMasterSet(); - - InitialPageNumber ipn = (InitialPageNumber) this.properties.get("initial-page-number"); - int pageStart = ipn.getInteger().intValue(); - this.currentPageNumber = - (pageStart > 0) ? pageStart - 1 : 0; + throws FOPException { + super(parent, propertyList); + this.name = "fo:page-sequence"; + + if ( parent.getName().equals("fo:root") ) + { + this.root = (Root) parent; + this.root.addPageSequence(this); + } + else + { + throw + new FOPException("page-sequence must be child of root, not " + + parent.getName()); + } + layoutMasterSet = root.getLayoutMasterSet(); + thisIsFirstPage=true; // we are now on the first page of the page sequence + InitialPageNumber ipn = (InitialPageNumber) this.properties.get("initial-page-number"); + String ipnValue=ipn.getString(); + + if ( ipnValue.equals("auto") ) + { + pageNumberType=AUTO; + } + else if ( ipnValue.equals("auto-even") ) + { + pageNumberType=AUTO_EVEN; + } + else if ( ipnValue.equals("auto-odd") ) + { + pageNumberType=AUTO_ODD; + } + else + { + pageNumberType=EXPLICIT; + try + { + int pageStart = new Integer(ipnValue).intValue(); + this.currentPageNumber = (pageStart > 0) ? pageStart - 1 : 0; + } + catch ( NumberFormatException nfe ) + { + throw new FOPException("\""+ipnValue+"\" is not a valid value for initial-page-number"); + } + } } protected Page makePage(AreaTree areaTree) throws FOPException { - PageMaster pageMaster; - // layout this page sequence - - // while there is still stuff in the flow, ask the - // sequence-specification for a new page - - if (this.sequenceSpecification == null) { - throw new FOPException("page-sequence is missing an" - + " sequence-specification"); - } - - PageMasterFactory pmf = - this.sequenceSpecification.getFirstPageMasterFactory(); - - pageMaster = pmf.getNextPageMaster(); - - while (pageMaster == null) { - /* move on to next sequence specifier */ - pmf = pmf.getNext(); - if (pmf == null) { - throw new FOPException("out of sequence specifiers" - + " (FOP will eventually allow this)"); - } - pageMaster = pmf.getNextPageMaster(); - } - return pageMaster.makePage(areaTree); + PageMaster pageMaster; + // layout this page sequence + + // while there is still stuff in the flow, ask the + // sequence-specification for a new page + + if ( this.sequenceSpecification == null ) + { + throw new FOPException("page-sequence is missing an" + + " sequence-specification"); + } + + PageMasterFactory pmf = + this.sequenceSpecification.getFirstPageMasterFactory(); + + pageMaster = pmf.getNextPageMaster(); + + while ( pageMaster == null ) + { + /* move on to next sequence specifier */ + pmf = pmf.getNext(); + if ( pmf == null ) + { + throw new FOPException("out of sequence specifiers" + + " (FOP will eventually allow this)"); + } + pageMaster = pmf.getNextPageMaster(); + } + return pageMaster.makePage(areaTree); } public void format(AreaTree areaTree) throws FOPException { - Status status = new Status(Status.OK); - - do { - currentPage = makePage(areaTree); - currentPage.setNumber(++this.currentPageNumber); - System.err.print(" [" + currentPageNumber); - if ((this.staticBefore != null) && - (currentPage.getBefore() != null)) { - AreaContainer beforeArea = currentPage.getBefore(); - this.staticBefore.layout(beforeArea); - } - if ((this.staticAfter != null) && - (currentPage.getAfter() != null)) { - AreaContainer afterArea = currentPage.getAfter(); - this.staticAfter.layout(afterArea); - } - if ((status.getCode() == Status.FORCE_PAGE_BREAK_EVEN) && - ((currentPageNumber % 2) == 1)) { - } else if ((status.getCode() == Status.FORCE_PAGE_BREAK_ODD) && - ((currentPageNumber % 2) == 0)) { - } else { - AreaContainer bodyArea = currentPage.getBody(); - status = this.flow.layout(bodyArea); - } - System.err.print("]"); - areaTree.addPage(currentPage); - } while (status.isIncomplete()); - System.err.println(); + Status status = new Status(Status.OK); + + do + { + currentPage = makePage(areaTree); + + if ( thisIsFirstPage ) + { + if ( pageNumberType==AUTO ) + { + this.currentPageNumber=this.runningPageNumberCounter; + } + else if ( pageNumberType==AUTO_ODD ) + { + this.currentPageNumber=this.runningPageNumberCounter; + if ( this.currentPageNumber % 2== 1 ) + { + this.currentPageNumber++; + } + } + else if ( pageNumberType==AUTO_EVEN ) + { + this.currentPageNumber=this.runningPageNumberCounter; + if ( this.currentPageNumber % 2 == 0 ) + { + this.currentPageNumber++; + } + } + thisIsFirstPage=false; + } + + currentPage.setNumber(++this.currentPageNumber); + this.runningPageNumberCounter=this.currentPageNumber; + + System.err.print(" [" + currentPageNumber); + if ( (this.staticBefore != null) && + (currentPage.getBefore() != null) ) + { + AreaContainer beforeArea = currentPage.getBefore(); + this.staticBefore.layout(beforeArea); + } + if ( (this.staticAfter != null) && + (currentPage.getAfter() != null) ) + { + AreaContainer afterArea = currentPage.getAfter(); + this.staticAfter.layout(afterArea); + } + if ( (status.getCode() == Status.FORCE_PAGE_BREAK_EVEN) && + ((currentPageNumber % 2) == 1) ) + { + } + else if ( (status.getCode() == Status.FORCE_PAGE_BREAK_ODD) && + ((currentPageNumber % 2) == 0) ) + { + } + else + { + AreaContainer bodyArea = currentPage.getBody(); + status = this.flow.layout(bodyArea); + } + System.err.print("]"); + areaTree.addPage(currentPage); + } while ( status.isIncomplete() ); + System.err.println(); } public void setFlow(Flow flow) { - this.flow = flow; + this.flow = flow; } - + protected void setSequenceSpecification(SequenceSpecification sequenceSpecification) { - this.sequenceSpecification = sequenceSpecification; - sequenceSpecification.setLayoutMasterSet(this.layoutMasterSet); + this.sequenceSpecification = sequenceSpecification; + sequenceSpecification.setLayoutMasterSet(this.layoutMasterSet); } - + public void setStaticContent(String name, StaticContent staticContent) { - if (name.equals("xsl-before")) { - this.staticBefore = staticContent; - } else if (name.equals("xsl-after")) { - this.staticAfter = staticContent; - } else { - System.err.println("WARNING: this version of FOP only supports " - + "static-content in region-before and region-after"); - } + if ( name.equals("xsl-before") ) + { + this.staticBefore = staticContent; + } + else if ( name.equals("xsl-after") ) + { + this.staticAfter = staticContent; + } + else + { + System.err.println("WARNING: this version of FOP only supports " + + "static-content in region-before and region-after"); + } } } -- 2.39.5