You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by pi...@apache.org on 2002/08/18 01:51:08 UTC

cvs commit: xml-fop/src/org/apache/fop/layoutmgr StaticContentLayoutManager.java PageLayoutManager.java

pietsch     2002/08/17 16:51:08

  Modified:    src/org/apache/fop/area RegionReference.java
               src/org/apache/fop/fo/flow StaticContent.java
               src/org/apache/fop/fo/pagination
                        ConditionalPageMasterReference.java
                        LayoutMasterSet.java PageMasterReference.java
                        PageSequence.java PageSequenceMaster.java
                        Region.java RepeatablePageMasterAlternatives.java
                        RepeatablePageMasterReference.java
                        SimplePageMaster.java
                        SinglePageMasterReference.java
                        SubSequenceSpecifier.java
               src/org/apache/fop/layoutmgr PageLayoutManager.java
  Added:       src/org/apache/fop/layoutmgr StaticContentLayoutManager.java
  Log:
  Attempt at adding static content.
  Moved subsequence handling to PageSequenceMaster.
  
  Revision  Changes    Path
  1.5       +2 -2      xml-fop/src/org/apache/fop/area/RegionReference.java
  
  Index: RegionReference.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/RegionReference.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- RegionReference.java	17 May 2002 14:47:12 -0000	1.4
  +++ RegionReference.java	17 Aug 2002 23:51:07 -0000	1.5
  @@ -39,7 +39,6 @@
           return this.ctm;
       }
   
  -
       // the list of block areas from the static flow
       ArrayList blocks = new ArrayList();
   
  @@ -61,4 +60,5 @@
           rr.setIPD(getIPD());
           return rr;
       }
  +
   }
  
  
  
  1.24      +11 -1     xml-fop/src/org/apache/fop/fo/flow/StaticContent.java
  
  Index: StaticContent.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/flow/StaticContent.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- StaticContent.java	20 Jun 2002 09:14:13 -0000	1.23
  +++ StaticContent.java	17 Aug 2002 23:51:07 -0000	1.24
  @@ -12,6 +12,7 @@
   import org.apache.fop.fo.properties.*;
   import org.apache.fop.fo.pagination.*;
   import org.apache.fop.apps.FOPException;
  +import org.apache.fop.layoutmgr.StaticContentLayoutManager;
   
   public class StaticContent extends Flow {
   
  @@ -32,6 +33,15 @@
               super.setFlowName(name);
           }
   
  +    }
  +
  +    private StaticContentLayoutManager lm;
  +
  +    public StaticContentLayoutManager getLayoutManager() {
  +        if (lm == null) {
  +            lm = new StaticContentLayoutManager(this);
  +        }
  +        return lm;
       }
   
   }
  
  
  
  1.11      +40 -68    xml-fop/src/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java
  
  Index: ConditionalPageMasterReference.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ConditionalPageMasterReference.java	7 Aug 2002 16:54:57 -0000	1.10
  +++ ConditionalPageMasterReference.java	17 Aug 2002 23:51:07 -0000	1.11
  @@ -43,9 +43,9 @@
   
           validateParent(parent);
   
  -        setPagePosition(this.properties.get("page-position").getEnum());
  -        setOddOrEven(this.properties.get("odd-or-even").getEnum());
  -        setBlankOrNotBlank(this.properties.get("blank-or-not-blank").getEnum());
  +        this.pagePosition = this.properties.get("page-position").getEnum();
  +        this.oddOrEven = this.properties.get("odd-or-even").getEnum();
  +        this.blankOrNotBlank = this.properties.get("blank-or-not-blank").getEnum();
       }
   
       protected void setMasterName(String masterName) {
  @@ -64,77 +64,49 @@
        * checks the page number and emptyness to determine if this
        * matches.
        */
  -    protected boolean isValid(int currentPageNumber, boolean thisIsFirstPage,
  +    protected boolean isValid(boolean isOddPage, boolean isFirstPage,
                                 boolean isEmptyPage) {
           // page-position
  -        boolean okOnPagePosition = true;    // default is 'any'
  -        switch (getPagePosition()) {
  -        case PagePosition.FIRST:
  -            if (!thisIsFirstPage)
  -                okOnPagePosition = false;
  -            break;
  -        case PagePosition.LAST:
  -            // how the hell do you know at this point?
  -            getLogger().warn("LAST PagePosition NYI");
  -            okOnPagePosition = true;
  -            break;
  -        case PagePosition.REST:
  -            if (thisIsFirstPage)
  -                okOnPagePosition = false;
  -            break;
  -        case PagePosition.ANY:
  -            okOnPagePosition = true;
  +        if( isFirstPage ) {
  +            if (pagePosition==PagePosition.REST) {
  +                return false;
  +            } else if (pagePosition==PagePosition.LAST) {
  +                // how the hell do you know at this point?
  +                getLogger().debug("LAST PagePosition NYI");
  +                return false;
  +            }
  +        } else {
  +            if (pagePosition==PagePosition.FIRST) {
  +                return false;
  +            } else if (pagePosition==PagePosition.LAST) {
  +                // how the hell do you know at this point?
  +                getLogger().debug("LAST PagePosition NYI");
  +                // potentially valid, don't return
  +            }
           }
   
  -        // odd or even
  -        boolean okOnOddOrEven = true;    // default is 'any'
  -        int ooe = getOddOrEven();
  -        boolean isOddPage = ((currentPageNumber % 2) == 1) ? true : false;
  -        if ((OddOrEven.ODD == ooe) &&!isOddPage) {
  -            okOnOddOrEven = false;
  +        // odd-or-even
  +        if (isOddPage) {
  +            if (oddOrEven==OddOrEven.EVEN) {
  +              return false;
  +            }
  +        } else {
  +            if (oddOrEven==OddOrEven.ODD) {
  +              return false;
  +            }
           }
  -        if ((OddOrEven.EVEN == ooe) && isOddPage) {
  -            okOnOddOrEven = false;
  -        }
  -
  -        // experimental check for blank-or-not-blank
  -
  -        boolean okOnBlankOrNotBlank = true;    // default is 'any'
   
  -        int bnb = getBlankOrNotBlank();
  -
  -        if ((BlankOrNotBlank.BLANK == bnb) &&!isEmptyPage) {
  -            okOnBlankOrNotBlank = false;
  -        } else if ((BlankOrNotBlank.NOT_BLANK == bnb) && isEmptyPage) {
  -            okOnBlankOrNotBlank = false;
  +        // blank-or-not-blank
  +        if (isEmptyPage) {
  +            if (blankOrNotBlank==BlankOrNotBlank.NOT_BLANK) {
  +                return false;
  +            }
  +        } else {
  +            if (blankOrNotBlank==BlankOrNotBlank.BLANK) {
  +                return false;
  +            }
           }
  -
  -        return (okOnOddOrEven && okOnPagePosition && okOnBlankOrNotBlank);
  -
  -    }
  -
  -    protected void setPagePosition(int pagePosition) {
  -        this.pagePosition = pagePosition;
  -    }
  -
  -    protected int getPagePosition() {
  -        return this.pagePosition;
  -    }
  -
  -    protected void setOddOrEven(int oddOrEven) {
  -        this.oddOrEven = oddOrEven;
  -    }
  -
  -    protected int getOddOrEven() {
  -        return this.oddOrEven;
  -    }
  -
  -    protected void setBlankOrNotBlank(int blankOrNotBlank) {
  -        this.blankOrNotBlank = blankOrNotBlank;
  -    }
  -
  -    protected int getBlankOrNotBlank() {
  -        return this.blankOrNotBlank;
  +        return true;
       }
   
       /**
  
  
  
  1.16      +5 -20     xml-fop/src/org/apache/fop/fo/pagination/LayoutMasterSet.java
  
  Index: LayoutMasterSet.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/LayoutMasterSet.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- LayoutMasterSet.java	5 Jun 2002 14:52:27 -0000	1.15
  +++ LayoutMasterSet.java	17 Aug 2002 23:51:07 -0000	1.16
  @@ -31,7 +31,6 @@
   public class LayoutMasterSet extends FObj {
       private HashMap simplePageMasters;
       private HashMap pageSequenceMasters;
  -    private HashMap allRegions;
   
       public LayoutMasterSet(FONode parent) {
           super(parent);
  @@ -50,7 +49,6 @@
   
           this.simplePageMasters = new HashMap();
           this.pageSequenceMasters = new HashMap();
  -        allRegions = new HashMap();
       }
   
       /**
  @@ -109,20 +107,10 @@
               return false;
       }
   
  -    /**
  -     * Reset the state of the page sequence masters.
  -     * Use when starting a new page sequence.
  -     */
  -    protected void resetPageMasters() {
  -        for (Iterator e = pageSequenceMasters.values().iterator();
  -                e.hasNext(); ) {
  -            ((PageSequenceMaster)e.next()).reset();
  -        }
  -    }
  -
       protected void checkRegionNames() throws FOPException {
           // Section 7.33.15 check to see that if a region-name is a
           // duplicate, that it maps to the same region-class.
  +        HashMap allRegions = new HashMap();
           for (Iterator spm = simplePageMasters.values().iterator();
                   spm.hasNext(); ) {
               SimplePageMaster simplePageMaster =
  @@ -155,16 +143,13 @@
        * @returns true when the region name specified has a region in this LayoutMasterSet
        */
       protected boolean regionNameExists(String regionName) {
  -        boolean result = false;
           for (Iterator e = simplePageMasters.values().iterator();
                   e.hasNext(); ) {
  -            result =
  -                ((SimplePageMaster)e.next()).regionNameExists(regionName);
  -            if (result) {
  -                return result;
  +            if (((SimplePageMaster)e.next()).regionNameExists(regionName)) {
  +                return true;
               }
           }
  -        return result;
  +        return false;
       }
   }
   
  
  
  
  1.10      +6 -25     xml-fop/src/org/apache/fop/fo/pagination/PageMasterReference.java
  
  Index: PageMasterReference.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/PageMasterReference.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- PageMasterReference.java	7 Aug 2002 16:54:57 -0000	1.9
  +++ PageMasterReference.java	17 Aug 2002 23:51:07 -0000	1.10
  @@ -20,8 +20,7 @@
   public abstract class PageMasterReference extends FObj
       implements SubSequenceSpecifier {
   
  -    private String _masterName;
  -    private PageSequenceMaster _pageSequenceMaster;
  +    private String masterName;
   
       public PageMasterReference(FONode parent) {
           super(parent);
  @@ -30,48 +29,32 @@
       public void handleAttrs(Attributes attlist) throws FOPException {
           super.handleAttrs(attlist);
           if (getProperty("master-reference") != null) {
  -            setMasterName(getProperty("master-reference").getString());
  +            this.masterName = getProperty("master-reference").getString();
           }
           validateParent(parent);
  -
       }
   
  -    protected void setMasterName(String masterName) {
  -        _masterName = masterName;
  -    }
   
       /**
        * Returns the "master-reference" attribute of this page master reference
        */
       public String getMasterName() {
  -        return _masterName;
  -    }
  -
  -    protected void setPageSequenceMaster(PageSequenceMaster pageSequenceMaster) {
  -        _pageSequenceMaster = pageSequenceMaster;
  +        return masterName;
       }
   
  -    protected PageSequenceMaster getPageSequenceMaster() {
  -        return _pageSequenceMaster;
  -    }
  -
  -    public abstract String getNextPageMaster(int currentPageNumber,
  -                                             boolean thisIsFirstPage,
  -                                             boolean isEmptyPage);
  -
       /**
        * Checks that the parent is the right element. The default implementation
        * checks for fo:page-sequence-master
        */
       protected void validateParent(FONode parent) throws FOPException {
           if (parent.getName().equals("fo:page-sequence-master")) {
  -            _pageSequenceMaster = (PageSequenceMaster)parent;
  +            PageSequenceMaster pageSequenceMaster = (PageSequenceMaster)parent;
   
               if (getMasterName() == null) {
                   getLogger().warn("" + getName()
                                          + " does not have a master-reference and so is being ignored");
               } else {
  -                _pageSequenceMaster.addSubsequenceSpecifier(this);
  +                pageSequenceMaster.addSubsequenceSpecifier(this);
               }
           } else {
               throw new FOPException(getName() + " must be"
  @@ -79,7 +62,5 @@
                                      + parent.getName());
           }
       }
  -
  -    public abstract void reset();
   
   }
  
  
  
  1.54      +268 -254  xml-fop/src/org/apache/fop/fo/pagination/PageSequence.java
  
  Index: PageSequence.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/PageSequence.java,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -r1.53 -r1.54
  --- PageSequence.java	7 Aug 2002 16:54:57 -0000	1.53
  +++ PageSequence.java	17 Aug 2002 23:51:07 -0000	1.54
  @@ -66,16 +66,11 @@
        */
       private HashMap _flowMap;
   
  -    /**
  -     * the "master-reference" attribute
  -     */
  -    private String masterName;
  -
       // according to communication from Paul Grosso (XSL-List,
       // 001228, Number 406), confusion in spec section 6.4.5 about
       // multiplicity of fo:flow in XSL 1.0 is cleared up - one (1)
       // fo:flow per fo:page-sequence only.
  -    private boolean isFlowSet = false;
  +//    private boolean isFlowSet = false;
   
       // for structure handler
       private boolean sequenceStarted = false;
  @@ -108,20 +103,14 @@
       private boolean thisIsFirstPage;
   
       /**
  -     * the current subsequence while formatting a given page sequence
  -     */
  -    private SubSequenceSpecifier currentSubsequence;
  -
  -    /**
  -     * the current index in the subsequence list
  +     * The currentSimplePageMaster is either the page master for the
  +     * whole page sequence if master-reference refers to a simple-page-master,
  +     * or the simple page master produced by the page sequence mster otherwise.
  +     * The pageSequenceMaster is null if master-reference refers to a
  +     * simple-page-master.
        */
  -    private int currentSubsequenceNumber =
  -        -1;    // starting case is -1 so that first getNext increments to 0
  -
  -    /**
  -     * the name of the current page master
  -     */
  -    private String currentPageMasterName;
  +    private SimplePageMaster currentSimplePageMaster;
  +    private PageSequenceMaster pageSequenceMaster;
   
       /**
        * The main content flow for this page-sequence.
  @@ -179,10 +168,17 @@
           }
   
   
  -        masterName = this.properties.get("master-reference").getString();
  -    // TODO: Add code here to set a reference to the PageSequenceMaster
  -    // if the masterName names a page-sequence-master, else get a
  -    // reference to the SimplePageMaster. Throw an exception if neither?
  +        String masterName = this.properties.get("master-reference").getString();
  +        this.currentSimplePageMaster =
  +          this.layoutMasterSet.getSimplePageMaster(masterName);
  +        if (this.currentSimplePageMaster==null) {
  +            this.pageSequenceMaster =
  +              this.layoutMasterSet.getPageSequenceMaster(masterName);
  +            if (this.pageSequenceMaster==null) {
  +                throw new FOPException("master-reference '" + masterName
  +                                       + "' for fo:page-sequence matches no simple-page-master or page-sequence-master");
  +            }
  +        }
   
           // get the 'format' properties
           this.pageNumberGenerator =
  @@ -207,18 +203,18 @@
        * based on the names given to the regions in the page-master used to
        * generate that page.
        */
  -    private void addFlow(Flow flow) throws FOPException {
  -        if (_flowMap.containsKey(flow.getFlowName())) {
  -            throw new FOPException("flow-names must be unique within an fo:page-sequence");
  -        }
  -        if (!this.layoutMasterSet.regionNameExists(flow.getFlowName())) {
  -            getLogger().error("region-name '"
  -                                   + flow.getFlowName()
  -                                   + "' doesn't exist in the layout-master-set.");
  -        }
  -        _flowMap.put(flow.getFlowName(), flow);
  -        //setIsFlowSet(true);
  -    }
  +//      private void addFlow(Flow flow) throws FOPException {
  +//          if (_flowMap.containsKey(flow.getFlowName())) {
  +//              throw new FOPException("flow-names must be unique within an fo:page-sequence");
  +//          }
  +//          if (!this.layoutMasterSet.regionNameExists(flow.getFlowName())) {
  +//              getLogger().error("region-name '"
  +//                                     + flow.getFlowName()
  +//                                     + "' doesn't exist in the layout-master-set.");
  +//          }
  +//          _flowMap.put(flow.getFlowName(), flow);
  +//          //setIsFlowSet(true);
  +//      }
   
   
       /**
  @@ -242,26 +238,47 @@
               } else if (childName.equals("fo:flow")) {
                   if (this.mainFlow != null) {
                       throw new FOPException("Only a single fo:flow permitted"
  -                        + " per fo:page-sequence");
  +                                           + " per fo:page-sequence");
                   } else {
  +                    this.mainFlow = (Flow)child;
  +                    String flowName = this.mainFlow.getFlowName();
  +                    if (_flowMap.containsKey(flowName)) {
  +                        throw new FOPException("flow-name "
  +                                               + flowName
  +                                               + " is not unique within an fo:page-sequence");
  +                    }
  +                    if (!this.layoutMasterSet.regionNameExists(flowName)) {
  +                        getLogger().error("region-name '"
  +                                          + flowName
  +                                          + "' doesn't exist in the layout-master-set.");
  +                    }
  +                    // Don't add main flow to the flow map
  +//                    addFlow(mainFlow);
                       if(!sequenceStarted) {
                           structHandler.startPageSequence(this, titleFO, layoutMasterSet);
                           sequenceStarted = true;
                       }
  -                    this.mainFlow = (Flow)child;
  -                    addFlow(mainFlow);
                       super.addChild(child); // For getChildren
                   }
               } else if (childName.equals("fo:static-content")) {
                   if (this.mainFlow != null) {
  -                    throw new FOPException(childName +
  -                            " must precede fo:flow; ignoring");
  -                } else {
  -                    if(!sequenceStarted) {
  -                        structHandler.startPageSequence(this, titleFO, layoutMasterSet);
  -                        sequenceStarted = true;
  -                    }
  -                    addFlow((Flow)child);
  +                  throw new FOPException(childName +
  +                                         " must precede fo:flow; ignoring");
  +                }
  +                String flowName = ((StaticContent)child).getFlowName();
  +                if (_flowMap.containsKey(flowName)) {
  +                  throw new FOPException("flow-name " + flowName
  +                                         + " is not unique within an fo:page-sequence");
  +                }
  +                if (!this.layoutMasterSet.regionNameExists(flowName)) {
  +                    getLogger().error("region-name '" + flowName
  +                                      + "' doesn't exist in the layout-master-set.");
  +                }
  +                _flowMap.put(flowName, child);
  +//                    addFlow((Flow)child);
  +                if(!sequenceStarted) {
  +                  structHandler.startPageSequence(this, titleFO, layoutMasterSet);
  +                  sequenceStarted = true;
                   }
               } else {
                   // Ignore it!
  @@ -284,51 +301,33 @@
           }
       }
   
  -
  -//     /**
  -//      * Return children for layout. Only the main flow is laid out directly.
  -//      */
  -//     public ListIterator getChildren() {
  -// 	return new ListIterator() {
  -// 		boolean bFirst=true;
  -// 		public boolean hasNext() {
  -// 		    return (bFirst==true && mainFlow != null);
  -// 		}
  -// 		public Object next() {
  -// 		    if (bFirst==true && mainFlow != null) {
  -// 			bFirst=false;
  -// 			return mainFlow;
  -// 		    }
  -// 		    else throw new NoSuchElementException();
  -// 		}
  -// 		public void remove() {
  -// 		    throw new UnsupportedOperationException();
  -// 		}
  -// 	    };
  -//     }
  -
       /**
        * Runs the formatting of this page sequence into the given area tree
        */
       public void format(AreaTree areaTree) throws FOPException {
  -    // Make a new PageLayoutManager and a FlowLayoutManager
  -    // Run the PLM in a thread
  -    // Wait for them to finish.
  -
  -    // If no main flow, nothing to layout!
  -    if (this.mainFlow == null) return;
  +        // Make a new PageLayoutManager and a FlowLayoutManager
  +        // Run the PLM in a thread
  +        // Wait for them to finish.
  +
  +        // If no main flow, nothing to layout!
  +        if (this.mainFlow == null) {
  +            return;
  +        }
   
  -    // Initialize if already used?
  -        this.layoutMasterSet.resetPageMasters();
  +        // Initialize if already used?
  +        //    this.layoutMasterSet.resetPageMasters();
  +        if (pageSequenceMaster != null ) {
  +            pageSequenceMaster.reset();
  +        }
   
           int firstAvailPageNumber = 0;
   
  -    // This will layout pages and add them to the area tree
  -    PageLayoutManager pageLM = new PageLayoutManager(areaTree, this);
  -    // For now, skip the threading and just call run directly.
  -    pageLM.run();
  +        // This will layout pages and add them to the area tree
  +        PageLayoutManager pageLM = new PageLayoutManager(areaTree, this);
  +        // For now, skip the threading and just call run directly.
  +        pageLM.run();
   
  -// 	Thread layoutThread = new Thread(pageLM);
  +        // Thread layoutThread = new Thread(pageLM);
   //  	layoutThread.start();
   // 	log.debug("Layout thread started");
   
  @@ -339,8 +338,8 @@
   // 	} catch (InterruptedException ie) {
   // 	    log.error("PageSequence.format() interrupted waiting on layout");
   // 	}
  -    // Tell the root the last page number we created.
  -    this.root.setRunningPageNumberCounter(this.currentPageNumber);
  +        // Tell the root the last page number we created.
  +        this.root.setRunningPageNumberCounter(this.currentPageNumber);
       }
   
       private void initPageNumber() {
  @@ -352,7 +351,7 @@
           // Use force-page-count=auto
           // on preceding page-sequence to make sure that there is no gap!
           if (currentPageNumber % 2 == 0) {
  -        this.currentPageNumber++;
  +            this.currentPageNumber++;
           }
       } else if (pageNumberType == AUTO_EVEN) {
           if (currentPageNumber % 2 == 1) {
  @@ -373,17 +372,26 @@
        * @param bIsLast If true, use the master for the last page in the sequence.
        */
       public PageViewport createPage(boolean bIsBlank, boolean bIsLast)
  -    throws FOPException
  -    {
  -
  -        // Set even/odd flag and first flag based on current state
  -    // Should do it this way, but fix it later....
  -    /*boolean bEvenPage = ((this.currentPageNumber %2)==0);
  -      currentPage = makePage(bEvenPage, */
  -    currentPage = makePage(this.currentPageNumber,
  -                   this.currentPageNumber==this.firstPageNumber,
  -                   bIsLast, bIsBlank);
  -    return currentPage;
  +      throws FOPException {
  +        if (this.pageSequenceMaster!=null) {
  +            this.currentSimplePageMaster = this.pageSequenceMaster
  +              .getNextSimplePageMaster(((this.currentPageNumber % 2)==1),
  +                                       thisIsFirstPage,
  +                                       bIsBlank);
  +        }
  +        Region body = currentSimplePageMaster.getRegion(Region.BODY);
  +        if (!this.mainFlow.getFlowName().equals(body.getRegionName())) {
  +          throw new FOPException("Flow '" + this.mainFlow.getFlowName()
  +                                 + "' does not map to the region-body in page-master '"
  +                                 + currentSimplePageMaster.getMasterName() + "'");
  +        }
  +        PageMaster pageMaster = this.currentSimplePageMaster.getPageMaster();
  +        PageViewport p = pageMaster.makePage();
  +//         if (currentPage != null) {
  +//             Vector foots = currentPage.getPendingFootnotes();
  +//             p.setPendingFootnotes(foots);
  +//         }
  +        return p;
           // The page will have a viewport/reference area pair defined
           // for each region in the master.
           // Set up the page itself
  @@ -422,32 +430,32 @@
        * from the params
        * TODO: modify the other methods to use even/odd flag and bIsLast
        */
  -    private PageViewport makePage(int firstAvailPageNumber,
  -              boolean isFirstPage, boolean bIsLast,
  -              boolean isEmptyPage) throws FOPException {
  -        // layout this page sequence
  -
  -        // while there is still stuff in the flow, ask the
  -        // layoutMasterSet for a new page
  -
  -        // page number is 0-indexed
  -        PageMaster pageMaster = getNextPageMaster(masterName,
  -                                firstAvailPageNumber,
  -                                isFirstPage, isEmptyPage);
  -
  -        // a legal alternative is to use the last sub-sequence
  -        // specification which should be handled in getNextSubsequence.
  -    // That's not done here.
  -        if (pageMaster == null) {
  -            throw new FOPException("page masters exhausted. Cannot recover.");
  -        }
  -        PageViewport p = pageMaster.makePage();
  -//         if (currentPage != null) {
  -//             Vector foots = currentPage.getPendingFootnotes();
  -//             p.setPendingFootnotes(foots);
  -//         }
  -        return p;
  -    }
  +//      private PageViewport makePage(int firstAvailPageNumber,
  +//                boolean isFirstPage, boolean bIsLast,
  +//                boolean isEmptyPage) throws FOPException {
  +//          // layout this page sequence
  +
  +//          // while there is still stuff in the flow, ask the
  +//          // layoutMasterSet for a new page
  +
  +//          // page number is 0-indexed
  +//          PageMaster pageMaster = getNextPageMaster(masterName,
  +//                                  firstAvailPageNumber,
  +//                                  isFirstPage, isEmptyPage);
  +
  +//          // a legal alternative is to use the last sub-sequence
  +//          // specification which should be handled in getNextSubsequence.
  +//      // That's not done here.
  +//          if (pageMaster == null) {
  +//              throw new FOPException("page masters exhausted. Cannot recover.");
  +//          }
  +//          PageViewport p = pageMaster.makePage();
  +//  //         if (currentPage != null) {
  +//  //             Vector foots = currentPage.getPendingFootnotes();
  +//  //             p.setPendingFootnotes(foots);
  +//  //         }
  +//          return p;
  +//      }
   
       /**
        * Formats the static content of the current page
  @@ -525,37 +533,37 @@
        * Returns the next SubSequenceSpecifier for the given page sequence master.
        * The result is bassed on the current state of this page sequence.
        */
  -    private SubSequenceSpecifier getNextSubsequence(PageSequenceMaster master) {
  -        if (master.getSubSequenceSpecifierCount()
  -                > currentSubsequenceNumber + 1) {
  -
  -            currentSubsequence =
  -                master.getSubSequenceSpecifier(currentSubsequenceNumber + 1);
  -            currentSubsequenceNumber++;
  -            return currentSubsequence;
  -        } else {
  -            return null;
  -        }
  -    }
  +//      private SubSequenceSpecifier getNextSubsequence(PageSequenceMaster master) {
  +//          if (master.getSubSequenceSpecifierCount()
  +//                  > currentSubsequenceNumber + 1) {
  +
  +//              currentSubsequence =
  +//                  master.getSubSequenceSpecifier(currentSubsequenceNumber + 1);
  +//              currentSubsequenceNumber++;
  +//              return currentSubsequence;
  +//          } else {
  +//              return null;
  +//          }
  +//      }
   
       /**
        * Returns the next simple page master for the given sequence master, page number and
        * other state information
        */
  -    private SimplePageMaster getNextSimplePageMaster(PageSequenceMaster sequenceMaster,
  -            int currentPageNumber, boolean thisIsFirstPage,
  -            boolean isEmptyPage) {
  -        // handle forcing
  -        if (isForcing) {
  -            String nextPageMaster = getNextPageMasterName(sequenceMaster,
  -                                    currentPageNumber, false, true);
  -            return this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
  -        }
  -        String nextPageMaster = getNextPageMasterName(sequenceMaster,
  -                                currentPageNumber, thisIsFirstPage, isEmptyPage);
  -        return this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
  +//      private SimplePageMaster getNextSimplePageMaster(PageSequenceMaster sequenceMaster,
  +//              int currentPageNumber, boolean thisIsFirstPage,
  +//              boolean isEmptyPage) {
  +//          // handle forcing
  +//          if (isForcing) {
  +//              String nextPageMaster = getNextPageMasterName(sequenceMaster,
  +//                                      currentPageNumber, false, true);
  +//              return this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
  +//          }
  +//          String nextPageMaster = getNextPageMasterName(sequenceMaster,
  +//                                  currentPageNumber, thisIsFirstPage, isEmptyPage);
  +//          return this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
   
  -    }
  +//      }
   
       /**
        * Get the next page master name.
  @@ -563,86 +571,86 @@
        * is exhausted then an error is indicated and the last page
        * master name is used.
        */
  -    private String getNextPageMasterName(PageSequenceMaster sequenceMaster,
  -                                         int currentPageNumber,
  -                                         boolean thisIsFirstPage,
  -                                         boolean isEmptyPage) {
  -
  -        if (null == currentSubsequence) {
  -            currentSubsequence = getNextSubsequence(sequenceMaster);
  -        }
  -
  -        String nextPageMaster =
  -            currentSubsequence.getNextPageMaster(currentPageNumber,
  -                                                 thisIsFirstPage,
  -                                                 isEmptyPage);
  -
  -
  -        if (null == nextPageMaster
  -                || isFlowForMasterNameDone(currentPageMasterName)) {
  -            SubSequenceSpecifier nextSubsequence =
  -                getNextSubsequence(sequenceMaster);
  -            if (nextSubsequence == null) {
  -                getLogger().error("Page subsequences exhausted. Using previous subsequence.");
  -                thisIsFirstPage =
  -                    true;    // this becomes the first page in the new (old really) page master
  -                currentSubsequence.reset();
  -
  -                // we leave currentSubsequence alone
  -            }
  -            else {
  -                currentSubsequence = nextSubsequence;
  -            }
  -
  -            nextPageMaster =
  -                currentSubsequence.getNextPageMaster(currentPageNumber,
  -                                                     thisIsFirstPage,
  -                                                     isEmptyPage);
  -        }
  -        currentPageMasterName = nextPageMaster;
  -
  -        return nextPageMaster;
  -
  -    }
  -
  -    private SimplePageMaster getCurrentSimplePageMaster() {
  -        return this.layoutMasterSet.getSimplePageMaster(currentPageMasterName);
  -    }
  -
  -    private String getCurrentPageMasterName() {
  -        return currentPageMasterName;
  -    }
  +//      private String getNextPageMasterName(PageSequenceMaster sequenceMaster,
  +//                                           int currentPageNumber,
  +//                                           boolean thisIsFirstPage,
  +//                                           boolean isEmptyPage) {
  +
  +//          if (null == currentSubsequence) {
  +//              currentSubsequence = getNextSubsequence(sequenceMaster);
  +//          }
  +
  +//          String nextPageMaster =
  +//              currentSubsequence.getNextPageMaster(currentPageNumber,
  +//                                                   thisIsFirstPage,
  +//                                                   isEmptyPage);
  +
  +
  +//          if (null == nextPageMaster
  +//                  || isFlowForMasterNameDone(currentPageMasterName)) {
  +//              SubSequenceSpecifier nextSubsequence =
  +//                  getNextSubsequence(sequenceMaster);
  +//              if (nextSubsequence == null) {
  +//                  getLogger().error("Page subsequences exhausted. Using previous subsequence.");
  +//                  thisIsFirstPage =
  +//                      true;    // this becomes the first page in the new (old really) page master
  +//                  currentSubsequence.reset();
  +
  +//                  // we leave currentSubsequence alone
  +//              }
  +//              else {
  +//                  currentSubsequence = nextSubsequence;
  +//              }
  +
  +//              nextPageMaster =
  +//                  currentSubsequence.getNextPageMaster(currentPageNumber,
  +//                                                       thisIsFirstPage,
  +//                                                       isEmptyPage);
  +//          }
  +//          currentPageMasterName = nextPageMaster;
  +
  +//          return nextPageMaster;
  +
  +//      }
  +
  +//      private SimplePageMaster getCurrentSimplePageMaster() {
  +//          return this.layoutMasterSet.getSimplePageMaster(currentPageMasterName);
  +//      }
  +
  +//      private String getCurrentPageMasterName() {
  +//          return currentPageMasterName;
  +//      }
   
       // refactored from LayoutMasterSet
  -    private PageMaster getNextPageMaster(String pageSequenceName,
  -                                         int currentPageNumber,
  -                                         boolean thisIsFirstPage,
  -                                         boolean isEmptyPage) throws FOPException {
  -        PageMaster pageMaster = null;
  -
  -        // see if there is a page master sequence for this master name
  -        PageSequenceMaster sequenceMaster =
  -            this.layoutMasterSet.getPageSequenceMaster(pageSequenceName);
  -
  -        if (sequenceMaster != null) {
  -            pageMaster = getNextSimplePageMaster(sequenceMaster,
  -                                                 currentPageNumber,
  -                                                 thisIsFirstPage,
  -                                                 isEmptyPage).getPageMaster();
  -
  -        } else {    // otherwise see if there's a simple master by the given name
  -            SimplePageMaster simpleMaster =
  -                this.layoutMasterSet.getSimplePageMaster(pageSequenceName);
  -            if (simpleMaster == null) {
  -                throw new FOPException("'master-reference' for 'fo:page-sequence'"
  -                                       + "matches no 'simple-page-master' or 'page-sequence-master'");
  -            }
  -            currentPageMasterName = pageSequenceName;
  -
  -            pageMaster = simpleMaster.getNextPageMaster();
  -        }
  -        return pageMaster;
  -    }
  +//      private PageMaster getNextPageMaster(String pageSequenceName,
  +//                                           int currentPageNumber,
  +//                                           boolean thisIsFirstPage,
  +//                                           boolean isEmptyPage) throws FOPException {
  +//          PageMaster pageMaster = null;
  +
  +//          // see if there is a page master sequence for this master name
  +//          PageSequenceMaster sequenceMaster =
  +//              this.layoutMasterSet.getPageSequenceMaster(pageSequenceName);
  +
  +//          if (sequenceMaster != null) {
  +//              pageMaster = getNextSimplePageMaster(sequenceMaster,
  +//                                                   currentPageNumber,
  +//                                                   thisIsFirstPage,
  +//                                                   isEmptyPage).getPageMaster();
  +
  +//          } else {    // otherwise see if there's a simple master by the given name
  +//              SimplePageMaster simpleMaster =
  +//                  this.layoutMasterSet.getSimplePageMaster(pageSequenceName);
  +//              if (simpleMaster == null) {
  +//                  throw new FOPException("'master-reference' for 'fo:page-sequence'"
  +//                                         + "matches no 'simple-page-master' or 'page-sequence-master'");
  +//              }
  +//              currentPageMasterName = pageSequenceName;
  +
  +//              pageMaster = simpleMaster.getNextPageMaster();
  +//          }
  +//          return pageMaster;
  +//      }
   
   
   //     /**
  @@ -684,34 +692,34 @@
   
   //     }
   
  -    private boolean isFlowForMasterNameDone(String masterName) {
  -        // parameter is master-name of PMR; we need to locate PM
  -        // referenced by this, and determine whether flow(s) are OK
  -        if (isForcing)
  -            return false;
  -        if (masterName != null) {
  -
  -            SimplePageMaster spm =
  -                this.layoutMasterSet.getSimplePageMaster(masterName);
  -            Region region = spm.getRegion(Region.BODY);
  -
  -
  -            Flow flow = (Flow)_flowMap.get(region.getRegionName());
  -            /*if ((null == flow) || flow.getStatus().isIncomplete())
  -                return false;
  -            else
  -                return true;*/
  -        }
  -        return false;
  -    }
  -
  -    public boolean isFlowSet() {
  -        return isFlowSet;
  -    }
  -
  -    public void setIsFlowSet(boolean isFlowSet) {
  -        this.isFlowSet = isFlowSet;
  -    }
  +//      private boolean isFlowForMasterNameDone(String masterName) {
  +//          // parameter is master-name of PMR; we need to locate PM
  +//          // referenced by this, and determine whether flow(s) are OK
  +//          if (isForcing)
  +//              return false;
  +//          if (masterName != null) {
  +
  +//              SimplePageMaster spm =
  +//                  this.layoutMasterSet.getSimplePageMaster(masterName);
  +//              Region region = spm.getRegion(Region.BODY);
  +
  +
  +//              Flow flow = (Flow)_flowMap.get(region.getRegionName());
  +//              /*if ((null == flow) || flow.getStatus().isIncomplete())
  +//                  return false;
  +//              else
  +//                  return true;*/
  +//          }
  +//          return false;
  +//      }
  +
  +//      public boolean isFlowSet() {
  +//          return isFlowSet;
  +//      }
  +
  +//      public void setIsFlowSet(boolean isFlowSet) {
  +//          this.isFlowSet = isFlowSet;
  +//      }
   
       public String getIpnValue() {
           return ipnValue;
  @@ -788,4 +796,10 @@
   //         }
   //     }
   
  +    public SimplePageMaster getCurrentSimplePageMaster() {
  +        return currentSimplePageMaster;
  +    }
  +    public StaticContent getStaticContent(String name) {
  +        return (StaticContent)_flowMap.get(name);
  +    }
   }
  
  
  
  1.11      +57 -11    xml-fop/src/org/apache/fop/fo/pagination/PageSequenceMaster.java
  
  Index: PageSequenceMaster.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/PageSequenceMaster.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- PageSequenceMaster.java	7 Aug 2002 16:54:57 -0000	1.10
  +++ PageSequenceMaster.java	17 Aug 2002 23:51:07 -0000	1.11
  @@ -27,6 +27,9 @@
   public class PageSequenceMaster extends FObj {
       LayoutMasterSet layoutMasterSet;
       ArrayList subSequenceSpecifiers;
  +    private SubSequenceSpecifier currentSubSequence;
  +    private int currentSubSequenceNumber;
  +    private String masterName;
   
       // The terminology may be confusing. A 'page-sequence-master' consists
       // of a sequence of what the XSL spec refers to as
  @@ -63,23 +66,66 @@
           subSequenceSpecifiers.add(pageMasterReference);
       }
   
  -    protected SubSequenceSpecifier getSubSequenceSpecifier(int sequenceNumber) {
  -        if (sequenceNumber >= 0
  -                && sequenceNumber < getSubSequenceSpecifierCount()) {
  -            return (SubSequenceSpecifier)subSequenceSpecifiers.get(sequenceNumber);
  +    private SubSequenceSpecifier getNextSubSequence() {
  +        currentSubSequenceNumber++;
  +        if (currentSubSequenceNumber >= 0
  +            && currentSubSequenceNumber < subSequenceSpecifiers.size()) {
  +            return (SubSequenceSpecifier)subSequenceSpecifiers
  +              .get(currentSubSequenceNumber);
           }
           return null;
       }
   
  -    protected int getSubSequenceSpecifierCount() {
  -        return subSequenceSpecifiers.size();
  +    public void reset() {
  +        currentSubSequenceNumber = -1;
  +        currentSubSequence = null;
  +        for (int i = 0; i< subSequenceSpecifiers.size(); i++ ) {
  +            ((SubSequenceSpecifier)subSequenceSpecifiers.get(i)).reset();
  +        }
       }
   
  -    public void reset() {
  -        for (Iterator e = subSequenceSpecifiers.iterator();
  -                e.hasNext(); ) {
  -            ((SubSequenceSpecifier)e.next()).reset();
  +    public SimplePageMaster getNextSimplePageMaster(boolean oddPage,
  +                                                    boolean firstPage,
  +                                                    boolean blankPage)
  +      throws FOPException {
  +        if (currentSubSequence==null) {
  +            currentSubSequence = getNextSubSequence();
  +            if (currentSubSequence==null) {
  +                throw new FOPException("no subsequences in page-sequence-master '"
  +                                       + masterName + "'");
  +            }
           }
  +        String pageMasterName = currentSubSequence
  +          .getNextPageMasterName(oddPage, firstPage, blankPage);
  +        boolean canRecover = true;
  +        while (pageMasterName==null) {
  +            SubSequenceSpecifier nextSubSequence = getNextSubSequence();
  +            if (nextSubSequence==null) {
  +                if (!canRecover) {
  +                    throw new FOPException("subsequences exhausted in page-sequence-master '"
  +                                           + masterName
  +                                           + "', cannot recover");
  +                }
  +                getLogger().warn("subsequences exhausted in page-sequence-master '"
  +                                 + masterName
  +                                 + "', use previous subsequence");
  +                currentSubSequence.reset();
  +                canRecover = false;
  +            } else {
  +                currentSubSequence = nextSubSequence;
  +            }
  +            pageMasterName = currentSubSequence
  +              .getNextPageMasterName(oddPage, firstPage, blankPage);
  +        }
  +        SimplePageMaster pageMaster=this.layoutMasterSet
  +          .getSimplePageMaster(pageMasterName);
  +        if (pageMaster==null) {
  +            throw new FOPException("No simple-page-master matching '"
  +                                   + pageMasterName + "' in page-sequence-master '"
  +                                   + masterName +"'");
  +        }
  +        return pageMaster;
       }
  +
   }
   
  
  
  
  1.11      +6 -6      xml-fop/src/org/apache/fop/fo/pagination/Region.java
  
  Index: Region.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/Region.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Region.java	17 Feb 2002 21:59:30 -0000	1.10
  +++ Region.java	17 Aug 2002 23:51:07 -0000	1.11
  @@ -31,11 +31,11 @@
   public abstract class Region extends FObj {
       public static final String PROP_REGION_NAME = "region-name";
   
  -    final static String BEFORE = "before";
  -    final static String START =  "start";
  -    final static String END =    "end";
  -    final static String AFTER =  "after";
  -    final static String BODY =   "body";
  +    public final static String BEFORE = "before";
  +    public final static String START =  "start";
  +    public final static String END =    "end";
  +    public final static String AFTER =  "after";
  +    public final static String BODY =   "body";
   
       private SimplePageMaster _layoutMaster;
       private String _regionName;
  
  
  
  1.11      +19 -37    xml-fop/src/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
  
  Index: RepeatablePageMasterAlternatives.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- RepeatablePageMasterAlternatives.java	15 Nov 2001 12:40:31 -0000	1.10
  +++ RepeatablePageMasterAlternatives.java	17 Aug 2002 23:51:07 -0000	1.11
  @@ -26,8 +26,6 @@
   
       private static final int INFINITE = -1;
   
  -    private PageSequenceMaster pageSequenceMaster;
  -
       /**
        * Max times this page master can be repeated.
        * INFINITE is used for the unbounded case
  @@ -47,20 +45,25 @@
           conditionalPageMasterRefs = new ArrayList();
   
           if (parent.getName().equals("fo:page-sequence-master")) {
  -            this.pageSequenceMaster = (PageSequenceMaster)parent;
  -            this.pageSequenceMaster.addSubsequenceSpecifier(this);
  +            PageSequenceMaster pageSequenceMaster = (PageSequenceMaster)parent;
  +            pageSequenceMaster.addSubsequenceSpecifier(this);
           } else {
  -            throw new FOPException("fo:repeatable-page-master-alternatives"
  +            throw new FOPException("fo:repeatable-page-master-alternatives "
                                      + "must be child of fo:page-sequence-master, not "
                                      + parent.getName());
           }
   
           String mr = getProperty("maximum-repeats").getString();
           if (mr.equals("no-limit")) {
  -            setMaximumRepeats(INFINITE);
  +            this.maximumRepeats=INFINITE;
           } else {
               try {
  -                setMaximumRepeats(Integer.parseInt(mr));
  +                this.maximumRepeats = Integer.parseInt(mr);
  +                if (this.maximumRepeats < 0) {
  +                    getLogger().debug("negative maximum-repeats: "
  +                                      + this.maximumRepeats);
  +                    this.maximumRepeats = 0;
  +                }
               } catch (NumberFormatException nfe) {
                   throw new FOPException("Invalid number for "
                                          + "'maximum-repeats' property");
  @@ -72,13 +75,11 @@
        * Get the next matching page master from the conditional
        * page master references.
        */
  -    public String getNextPageMaster(int currentPageNumber,
  -                                    boolean thisIsFirstPage,
  -                                    boolean isEmptyPage) {
  -        String pm = null;
  -
  -        if (getMaximumRepeats() != INFINITE) {
  -            if (numberConsumed < getMaximumRepeats()) {
  +    public String getNextPageMasterName(boolean isOddPage,
  +                                        boolean isFirstPage,
  +                                        boolean isEmptyPage) {
  +        if (maximumRepeats != INFINITE) {
  +            if (numberConsumed < maximumRepeats) {
                   numberConsumed++;
               } else {
                   return null;
  @@ -88,28 +89,13 @@
           for (int i = 0; i < conditionalPageMasterRefs.size(); i++) {
               ConditionalPageMasterReference cpmr =
                   (ConditionalPageMasterReference)conditionalPageMasterRefs.get(i);
  -
  -            // 0-indexed page number
  -            if (cpmr.isValid(currentPageNumber + 1, thisIsFirstPage,
  -                             isEmptyPage)) {
  -                pm = cpmr.getMasterName();
  -                break;
  +            if (cpmr.isValid(isOddPage, isFirstPage, isEmptyPage)) {
  +                return cpmr.getMasterName();
               }
           }
  -        return pm;
  -    }
  -
  -    private void setMaximumRepeats(int maximumRepeats) {
  -        if (maximumRepeats == INFINITE) {
  -            this.maximumRepeats = maximumRepeats;
  -        } else {
  -            this.maximumRepeats = (maximumRepeats < 0) ? 0 : maximumRepeats;
  -        }
  +        return null;
       }
   
  -    private int getMaximumRepeats() {
  -        return this.maximumRepeats;
  -    }
   
       public void addConditionalPageMasterReference(ConditionalPageMasterReference cpmr) {
           this.conditionalPageMasterRefs.add(cpmr);
  @@ -117,10 +103,6 @@
   
       public void reset() {
           this.numberConsumed = 0;
  -    }
  -
  -    protected PageSequenceMaster getPageSequenceMaster() {
  -        return pageSequenceMaster;
       }
   
   }
  
  
  
  1.7       +15 -24    xml-fop/src/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
  
  Index: RepeatablePageMasterReference.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- RepeatablePageMasterReference.java	15 Nov 2001 12:40:31 -0000	1.6
  +++ RepeatablePageMasterReference.java	17 Aug 2002 23:51:07 -0000	1.7
  @@ -36,10 +36,15 @@
   
           String mr = getProperty("maximum-repeats").getString();
           if (mr.equals("no-limit")) {
  -            setMaximumRepeats(INFINITE);
  +            this.maximumRepeats = INFINITE;
           } else {
               try {
  -                setMaximumRepeats(Integer.parseInt(mr));
  +                this.maximumRepeats = Integer.parseInt(mr);
  +                if (this.maximumRepeats < 0) {
  +                    getLogger().debug("negative maximum-repeats: "
  +                                      + this.maximumRepeats);
  +                    this.maximumRepeats = 0;
  +                }
               } catch (NumberFormatException nfe) {
                   throw new FOPException("Invalid number for "
                                          + "'maximum-repeats' property");
  @@ -47,31 +52,17 @@
           }
       }
   
  -    public String getNextPageMaster(int currentPageNumber,
  -                                    boolean thisIsFirstPage,
  -                                    boolean isEmptyPage) {
  -        String pm = getMasterName();
  -
  -        if (getMaximumRepeats() != INFINITE) {
  -            if (numberConsumed < getMaximumRepeats()) {
  +    public String getNextPageMasterName(boolean isOddPage,
  +                                        boolean isFirstPage,
  +                                        boolean isEmptyPage) {
  +        if (maximumRepeats != INFINITE) {
  +            if (numberConsumed < maximumRepeats) {
                   numberConsumed++;
               } else {
  -                pm = null;
  +                return null;
               }
           }
  -        return pm;
  -    }
  -
  -    private void setMaximumRepeats(int maximumRepeats) {
  -        if (maximumRepeats == INFINITE) {
  -            this.maximumRepeats = maximumRepeats;
  -        } else {
  -            this.maximumRepeats = (maximumRepeats < 0) ? 0 : maximumRepeats;
  -        }
  -    }
  -
  -    private int getMaximumRepeats() {
  -        return this.maximumRepeats;
  +        return getMasterName();
       }
   
       public void reset() {
  
  
  
  1.26      +4 -4      xml-fop/src/org/apache/fop/fo/pagination/SimplePageMaster.java
  
  Index: SimplePageMaster.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/SimplePageMaster.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- SimplePageMaster.java	7 Aug 2002 16:54:57 -0000	1.25
  +++ SimplePageMaster.java	17 Aug 2002 23:51:07 -0000	1.26
  @@ -154,8 +154,8 @@
           String key = region.getRegionClass();
           if (_regions.containsKey(key)) {
               getLogger().error("Only one region of class "
  -                                   + key
  -                                   + " allowed within a simple-page-master.");
  +                              + key
  +                              + " allowed within a simple-page-master.");
               // throw new FOPException("Only one region of class "
   //                                    + key
   //                                    + " allowed within a simple-page-master.");
  @@ -164,7 +164,7 @@
           }
       }
   
  -    protected Region getRegion(String regionClass) {
  +    public Region getRegion(String regionClass) {
           return (Region)_regions.get(regionClass);
       }
   
  
  
  
  1.8       +4 -4      xml-fop/src/org/apache/fop/fo/pagination/SinglePageMasterReference.java
  
  Index: SinglePageMasterReference.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/SinglePageMasterReference.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SinglePageMasterReference.java	15 Nov 2001 12:40:31 -0000	1.7
  +++ SinglePageMasterReference.java	17 Aug 2002 23:51:07 -0000	1.8
  @@ -26,9 +26,9 @@
           this.state = FIRST;
       }
   
  -    public String getNextPageMaster(int currentPageNumber,
  -                                    boolean thisIsFirstPage,
  -                                    boolean isEmptyPage) {
  +    public String getNextPageMasterName(boolean isOddPage,
  +                                        boolean isFirstPage,
  +                                        boolean isEmptyPage) {
           if (this.state == FIRST) {
               this.state = DONE;
               return getMasterName();
  
  
  
  1.4       +6 -4      xml-fop/src/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
  
  Index: SubSequenceSpecifier.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/pagination/SubSequenceSpecifier.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SubSequenceSpecifier.java	30 Jul 2001 20:29:25 -0000	1.3
  +++ SubSequenceSpecifier.java	17 Aug 2002 23:51:07 -0000	1.4
  @@ -7,14 +7,16 @@
   
   package org.apache.fop.fo.pagination;
   
  +import org.apache.fop.apps.FOPException;
   /**
    * Classes that implement this interface can be added to a PageSequenceMaster,
    * and are capable of looking up an appropriate PageMaster.
    */
   public interface SubSequenceSpecifier {
  -    public String getNextPageMaster(int currentPageNumber,
  -                                    boolean thisIsFirstPage,
  -                                    boolean isEmptyPage);
  +    public String getNextPageMasterName(boolean isOddPage,
  +                                        boolean isFirstPage,
  +                                        boolean isEmptyPage)
  +      throws FOPException;
   
       /**
        * Called before a new page sequence is rendered so subsequences can reset
  
  
  
  1.11      +46 -4     xml-fop/src/org/apache/fop/layoutmgr/PageLayoutManager.java
  
  Index: PageLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/PageLayoutManager.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- PageLayoutManager.java	11 Aug 2002 07:31:30 -0000	1.10
  +++ PageLayoutManager.java	17 Aug 2002 23:51:08 -0000	1.11
  @@ -9,7 +9,10 @@
   
   import org.apache.fop.apps.FOPException;
   import org.apache.fop.area.*;
  +import org.apache.fop.fo.flow.StaticContent;
   import org.apache.fop.fo.pagination.PageSequence;
  +import org.apache.fop.fo.pagination.Region;
  +import org.apache.fop.fo.pagination.SimplePageMaster;
   import org.apache.fop.fo.properties.Constants;
   
   import java.util.ArrayList;
  @@ -109,13 +112,13 @@
           BPLayoutManager curLM ; // currently active LM
   
           while ((curLM = getChildLM()) != null) {
  -            BreakPoss bp;
               ArrayList vecBreakPoss = new ArrayList();
   
               LayoutContext childLC = new LayoutContext(0);
               childLC.setStackLimit(new MinOptMax(flowBPD));
   
               if (!curLM.isFinished()) {
  +                BreakPoss bp;
                   if ((bp = curLM.getNextBreakPoss(childLC, null)) != null) {
                       vecBreakPoss.add(bp);
                   }
  @@ -171,7 +174,7 @@
           // The Flow LM sets the "finished" flag on the Flow Area if it has
           // completely filled it. In this case, if on the last column
           // end the page.
  -getParentArea(area);
  +        getParentArea(area);
           // Alternatively the child LM indicates to parent that it's full?
           //System.out.println("size: " + area.getAllocationBPD().max +
           //                   ":" + curSpan.getMaxBPD().min);
  @@ -214,17 +217,56 @@
           } catch (FOPException fopex) { /* ???? */
               fopex.printStackTrace();
           }
  -        RegionViewport reg = curPage.getPage(). getRegion(
  +        RegionViewport reg = curPage.getPage().getRegion(
                       RegionReference.BODY);
           curBody = (BodyRegion) reg.getRegion();
           flowBPD = (int)reg.getViewArea().getHeight();
           return curPage;
       }
   
  +    private void layoutStaticContent(Region region, int regionClass) {
  +        if (region != null ) {
  +            StaticContent flow = pageSequence
  +              .getStaticContent(region.getRegionName());
  +            if (flow != null) {
  +                RegionViewport reg = curPage.getPage()
  +                  .getRegion(regionClass);
  +                reg.getRegion().setIPD((int)reg.getViewArea().getWidth());
  +                if (reg == null ) {
  +                    System.out.println("no region viewport: shouldn't happen");
  +                }
  +                StaticContentLayoutManager lm = flow.getLayoutManager();
  +                lm.init();
  +                lm.setRegionReference(reg.getRegion());
  +                lm.setParentLM(this);
  +                LayoutContext childLC = new LayoutContext(0);
  +                childLC.setStackLimit(new MinOptMax((int)curPage.getViewArea().getHeight()));
  +                while (!lm.isFinished()) {
  +                    BreakPoss bp = lm.getNextBreakPoss(childLC, null);
  +                    if (bp != null) {
  +                        ArrayList vecBreakPoss = new ArrayList();
  +                        vecBreakPoss.add(bp);
  +                        lm.addAreas( new BreakPossPosIter(vecBreakPoss, 0,
  +                                                          vecBreakPoss.size()), null);
  +                    } else {
  +                      System.out.println("bp==null  cls="+regionClass);
  +                    }
  +                }
  +                //lm.flush();
  +                lm.reset(null);
  +            }
  +        }
  +    }
  +  
       private void finishPage() {
           if (curPage != null) {
               // Layout static content into the regions
               // Need help from pageseq for this
  +            SimplePageMaster spm = pageSequence.getCurrentSimplePageMaster();
  +            layoutStaticContent(spm.getRegion(Region.BEFORE), RegionReference.BEFORE);
  +            layoutStaticContent(spm.getRegion(Region.AFTER), RegionReference.AFTER);
  +            layoutStaticContent(spm.getRegion(Region.START), RegionReference.START);
  +            layoutStaticContent(spm.getRegion(Region.END), RegionReference.END);
               // Queue for ID resolution and rendering
               areaTree.addPage(curPage);
               curPage = null;
  
  
  
  1.1                  xml-fop/src/org/apache/fop/layoutmgr/StaticContentLayoutManager.java
  
  Index: StaticContentLayoutManager.java
  ===================================================================
  /*
   * $Id: StaticContentLayoutManager.java,v 1.1 2002/08/17 23:51:08 pietsch Exp $
   * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
   * For details on use and redistribution please refer to the
   * LICENSE file included with these sources.
   */
  
  package org.apache.fop.layoutmgr;
  
  import org.apache.fop.apps.FOPException;
  import org.apache.fop.fo.FObj;
  import org.apache.fop.fo.properties.Constants;
  import org.apache.fop.area.*;
  
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * LayoutManager for an fo:flow object.
   * Its parent LM is the PageLayoutManager.
   * This LM is responsible for getting columns of the appropriate size
   * and filling them with block-level areas generated by its children.
   */
  public class StaticContentLayoutManager extends BlockStackingLayoutManager {
  
      private RegionReference region;
      ArrayList blockBreaks = new ArrayList();      
    
      public StaticContentLayoutManager(FObj fobj) {
          super(fobj);
      }
  
      public void setRegionReference(RegionReference region) {
          this.region = region;
      }
     
      public BreakPoss getNextBreakPoss(LayoutContext context,
                                        Position prevLineBP) {
  
          BPLayoutManager curLM ; // currently active LM
  
          while ((curLM = getChildLM()) != null) {
              // Make break positions and return page break
              // Set up a LayoutContext
              BreakPoss bp;
              LayoutContext childLC = context;
              if (!curLM.isFinished()) {
                  if ((bp = curLM.getNextBreakPoss(childLC, null)) != null) {
                      blockBreaks.add(bp);
                      if(bp.isForcedBreak()) {
                          System.out.println("Forced breaks are not allowed in static content");
                          return null;
                      }
                  }
              }
          }
          setFinished(true);
          if (blockBreaks.size() > 0) {
              return new BreakPoss(
                new LeafPosition(this, blockBreaks.size() - 1));
          }
          return null;
      }
  
      public void addAreas(PositionIterator parentIter, LayoutContext layoutContext) {
  
          BPLayoutManager childLM ;
          int iStartPos = 0;
          LayoutContext lc = new LayoutContext(0);
          while (parentIter.hasNext()) {
              LeafPosition lfp = (LeafPosition) parentIter.next();
              // Add the block areas to Area
              PositionIterator breakPosIter =
                new BreakPossPosIter(blockBreaks, iStartPos,
                                     lfp.getLeafPos() + 1);
              iStartPos = lfp.getLeafPos() + 1; 
              while ((childLM = breakPosIter.getNextChildLM()) != null) {
                  childLM.addAreas(breakPosIter, lc);
              }
          }
  
          flush();
          // clear the breaks for the page to start for the next page
          blockBreaks.clear();
      }
  
  
      /**
       * Add child area to a the correct container, depending on its
       * area class. A Flow can fill at most one area container of any class
       * at any one time. The actual work is done by BlockStackingLM.
       */
      public boolean addChild(Area childArea) {
          region.addBlock((Block)childArea);
          return true;
      }
  
      public Area getParentArea(Area childArea) {
          return region;
      }
  
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org