]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
This applies Jordon Naftolin's latest and greatest patch, fixing the PageSequence...
authorSteve Coffman <gears@apache.org>
Tue, 23 May 2000 20:44:19 +0000 (20:44 +0000)
committerSteve Coffman <gears@apache.org>
Tue, 23 May 2000 20:44:19 +0000 (20:44 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193382 13f79535-47bb-0310-9956-ffa450edef68

src/codegen/properties.xml
src/org/apache/fop/fo/pagination/PageSequence.java

index 8f84d721f31627fb9a21275eaff829005bb353e3..5ccaed0255b0bfbebd7c7a39651da8e74e5a50a7 100644 (file)
     <name>initial-page-number</name>
     <class-name>InitialPageNumber</class-name>
     <inherited>false</inherited>
-    <datatype>Integer</datatype>
-    <default>0</default>
+    <datatype>String</datatype>
+    <default>auto</default>
   </property>
 </property-list>
 
index 399665d05c7e9537a6889d1a2aa9eba948f3d182..34278d1621749382f561bdb6ac0877be21422905 100644 (file)
@@ -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"); 
+        }
     }
 }