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