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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]