From 8f509c6a2f422412e4840fc3dc849198295b6aa6 Mon Sep 17 00:00:00 2001 From: Peter Bernard West Date: Sun, 12 Sep 2004 06:57:12 +0000 Subject: [PATCH] Work in progress git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/FOP_0-20-0_Alt-Design@197942 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fo/FoRoot.java | 27 ++++- .../apache/fop/fo/flow/FoPageSequence.java | 114 +++++++++++++----- 2 files changed, 110 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/fop/fo/FoRoot.java b/src/java/org/apache/fop/fo/FoRoot.java index ed3b42066..ff24a045b 100644 --- a/src/java/org/apache/fop/fo/FoRoot.java +++ b/src/java/org/apache/fop/fo/FoRoot.java @@ -81,6 +81,25 @@ public class FoRoot extends FONode { /** Offset of first page-sequence child node. */ private int firstPageSeq = -1; + /** The page number of the last laid-out page */ + private int lastPageNumber = 0; + /** + * Gets the last laid-out page number. This is generally set by the + * page-sequence. + * @return the page number + */ + public int getLastPageNumber() { + return lastPageNumber; + } + /** + * Sets the last generated page number. This is generally set from the + * page-sequence processing. + * @param number the last generated number + */ + public void setLastPageNumber(int number) { + lastPageNumber = number; + } + /** * @param foTree the FO tree being built * @param event the XmlEvent that triggered the creation of this @@ -159,16 +178,16 @@ public class FoRoot extends FONode { if (ev == null) throw new FOPException("No page-sequence found."); firstPageSeq = numChildren(); - new FoPageSequence( - getFOTree(), this, (FoXmlEvent)ev, layoutMasters); + new FoPageSequence(getFOTree(), this, (FoXmlEvent)ev, + layoutMasters.getPageSequenceMasters()); ev = xmlevents.getEndElement(XmlEventReader.DISCARD_EV, ev); namespaces.relinquishEvent(ev); while ((ev = xmlevents.expectStartElement (FObjectNames.PAGE_SEQUENCE, XmlEvent.DISCARD_W_SPACE)) != null) { // Loop over remaining fo:page-sequences - new FoPageSequence( - getFOTree(), this, (FoXmlEvent)ev, layoutMasters); + new FoPageSequence(getFOTree(), this, (FoXmlEvent)ev, + layoutMasters.getPageSequenceMasters()); ev = xmlevents.getEndElement(XmlEventReader.DISCARD_EV, ev); namespaces.relinquishEvent(ev); } diff --git a/src/java/org/apache/fop/fo/flow/FoPageSequence.java b/src/java/org/apache/fop/fo/flow/FoPageSequence.java index fb3201203..d17e7c7c5 100644 --- a/src/java/org/apache/fop/fo/flow/FoPageSequence.java +++ b/src/java/org/apache/fop/fo/flow/FoPageSequence.java @@ -36,17 +36,19 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.area.Area; import org.apache.fop.area.Page; import org.apache.fop.area.PageList; -import org.apache.fop.area.PageListElement; -import org.apache.fop.area.PageSet; -import org.apache.fop.area.PageSetElement; import org.apache.fop.datastructs.TreeException; +import org.apache.fop.datatypes.EnumType; +import org.apache.fop.datatypes.IntegerType; +import org.apache.fop.datatypes.Numeric; +import org.apache.fop.datatypes.PropertyValue; import org.apache.fop.fo.FONode; import org.apache.fop.fo.FOPageSeqNode; import org.apache.fop.fo.FOTree; import org.apache.fop.fo.FObjectNames; +import org.apache.fop.fo.FoRoot; import org.apache.fop.fo.PropNames; import org.apache.fop.fo.expr.PropertyException; -import org.apache.fop.fo.pagination.FoLayoutMasterSet; +import org.apache.fop.fo.properties.InitialPageNumber; import org.apache.fop.xml.FoXmlEvent; import org.apache.fop.xml.XmlEvent; import org.apache.fop.xml.XmlEventReader; @@ -129,6 +131,7 @@ public class FoPageSequence extends FONode { private int flowChild = -1; /** The page currently being processed by this page-sequence */ private Page page = null; + /** * Gets the current page of this page-sequence * @return the page @@ -137,22 +140,30 @@ public class FoPageSequence extends FONode { return page; } - /** The PageList for this page-sequence */ - private PageList pagelist = null; - /** The index of the current element in the pagelist */ + /** The PageList containing the flattened + * pageTree for this page-sequence. This PageList contains + * only Page elements. */ + private ArrayList pageArray = new ArrayList(); + /** The index of the current element in the pageList */ private int pgListIndex = -1; + /** The tree of all layout attempts for this page-sequence */ + private PageList pageList = null; + /** An array of indicies mapping the path through the + * pageTree to the current element */ + private ArrayList pageTreeMap = null; + /** - * @return the pagelist + * @return the pageList */ - public PageList getPagelist() { - return pagelist; + public PageList getPageList() { + return pageList; } /** - * @param pagelist to set + * @param pageList to set */ - public void setPagelist(PageList pagelist) { - this.pagelist = pagelist; + public void setPagelist(PageList pageList) { + this.pageList = pageList; } /** * @return the pgListIndex @@ -167,22 +178,69 @@ public class FoPageSequence extends FONode { this.pgListIndex = pgListIndex; } + public Page getCurr1stPage() { + if (pageArray == null) { + return null; + } + return (Page)(pageArray.get(0)); + } + /** - * Gets the current first page - * @return the first page + * The number of the page being laid out */ - public Page getCurr1stPage() { - PageListElement firstPage = pagelist.get(0); - while (firstPage.isPageSet()) { - PageSet pageset = (PageSet)firstPage; - PageSetElement setEl = pageset.get(pageset.getCurrentElement()); - if (setEl.isPageList()) { - firstPage = ((PageList)setEl).get(0); + private int currPageNumber = 0; + + private FoRoot root; + + private void getInitialPageNumber() { + PropertyValue pv; + try { + pv = getPropertyValue(PropNames.INITIAL_PAGE_NUMBER); + } catch (PropertyException e) { + throw new RuntimeException( + "Unable to obtain InitialPageNumber value"); + } + int i = 0; + int lastnum = root.getLastPageNumber(); + switch (pv.getType()) { + case PropertyValue.AUTO: + currPageNumber = lastnum + 1; + break; + case PropertyValue.ENUM: + i = ((EnumType)pv).getEnumValue(); + switch (i) { + case InitialPageNumber.AUTO_ODD: + currPageNumber = + ((lastnum % 2 == 0) ? lastnum + 1 : lastnum + 2); + break; + case InitialPageNumber.AUTO_EVEN: + currPageNumber = + ((lastnum % 2 == 0) ? lastnum + 2 : lastnum + 1); + break; + default: + throw new RuntimeException( + "Unknown InitialPageNumber enum value: " + i); + } + case PropertyValue.INTEGER: + i = ((IntegerType)pv).getInt(); + if (i < 0) { + currPageNumber = 1; + } else { + currPageNumber = i; + } + break; + case PropertyValue.NUMERIC: + i = ((Numeric)pv).asInt(); + if (i < 0) { + currPageNumber = 1; } else { - firstPage = (Page)setEl; + currPageNumber = i; } + break; + default: + throw new RuntimeException("Invalid property value type " + + PropertyValue.propertyTypes.get(pv.getType())); } - return (Page)firstPage; } /** Maps flownames to fo:flow and fo:static-content objects */ @@ -233,14 +291,16 @@ public class FoPageSequence extends FONode { * @param parent the parent FONode of this node * @param event the XmlEvent that triggered the creation of * this node - * @param layoutMasters the layout master set + * @param pageSeqMasters a Map of the page sequence masters + * from the layout master set */ public FoPageSequence(FOTree foTree, FONode parent, FoXmlEvent event, - FoLayoutMasterSet layoutMasters) + Map pageSeqMasters) throws TreeException, FOPException { super(foTree, FObjectNames.PAGE_SEQUENCE, parent, event, FONode.PAGESEQ_SET, sparsePropsMap, sparseIndices); + root = (FoRoot)parent; // Set up the graphics environment pageSpread = new BufferedImage(20*72, 12*72, BufferedImage.TYPE_INT_RGB); @@ -306,7 +366,7 @@ public class FoPageSequence extends FONode { // Generate a null page for the flow(s) page = Page.setupNullPage(this, foTree.getNextPageId()); // Intialize the PageList for this page-sequence - pagelist = new PageList(page); + pageList = new PageList(page); pgListIndex = 0; // Look for one or more fo:flow -- 2.39.5