gmazza 2005/02/16 16:27:54
Modified: src/java/org/apache/fop/area AreaTreeHandler.java
src/java/org/apache/fop/fo/pagination PageSequence.java
Root.java
src/java/org/apache/fop/layoutmgr AbstractLayoutManager.java
ContentLayoutManager.java LayoutManager.java
PageNumberLayoutManager.java
PageSequenceLayoutManager.java
Log:
Cleanup of page number handling throughout application. Removed old code
from PageSequence.java.
Revision Changes Path
1.34 +2 -2 xml-fop/src/java/org/apache/fop/area/AreaTreeHandler.java
Index: AreaTreeHandler.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/area/AreaTreeHandler.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- AreaTreeHandler.java 6 Feb 2005 08:14:07 -0000 1.33
+++ AreaTreeHandler.java 17 Feb 2005 00:27:53 -0000 1.34
@@ -264,7 +264,7 @@
long memoryNow = runtime.totalMemory() - runtime.freeMemory();
long memoryUsed = (memoryNow - initialMemory) / 1024L;
long timeUsed = System.currentTimeMillis() - startTime;
- int pageCount = rootFObj.getRunningPageNumberCounter();
+ int pageCount = rootFObj.getTotalPagesGenerated();
log.debug("Initial heap size: " + (initialMemory / 1024L) +
"Kb");
log.debug("Current heap size: " + (memoryNow / 1024L) + "Kb");
log.debug("Total memory used: " + memoryUsed + "Kb");
1.56 +29 -245
xml-fop/src/java/org/apache/fop/fo/pagination/PageSequence.java
Index: PageSequence.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/PageSequence.java,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- PageSequence.java 12 Feb 2005 22:32:36 -0000 1.55
+++ PageSequence.java 17 Feb 2005 00:27:54 -0000 1.56
@@ -49,11 +49,6 @@
private String masterReference;
// End of property values
- //
- // initial-page-number types
- //
- public static final int EXPLICIT = 0;
-
/**
* The parent root object
*/
@@ -76,33 +71,13 @@
// private boolean isFlowSet = false;
- // for structure handler
- private boolean sequenceStarted = false;
-
- //
- // state attributes used during layout
- //
-
// page number and related formatting variables
- public int currentPageNumber = 0;
+ public int startingPageNumber = 0;
private int explicitFirstNumber = 0; // explicitly specified
- public int firstPageNumber = 0; // actual
private PageNumberGenerator pageNumberGenerator;
-
- private int pageCount = 0;
private boolean isForcing = false;
/**
- * specifies page numbering type (auto|auto-even|auto-odd|explicit)
- */
- public int pageNumberType;
-
- /**
- * used to determine whether to calculate auto, auto-even, auto-odd
- */
- private boolean thisIsFirstPage;
-
- /**
* 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 master
otherwise.
@@ -155,18 +130,6 @@
layoutMasterSet = root.getLayoutMasterSet();
flowMap = new HashMap();
- // we are now on the first page of the page sequence
- thisIsFirstPage = true;
-
- if (initialPageNumber.getEnum() != 0) {
- // auto | auto-odd | auto-even.
- pageNumberType = initialPageNumber.getEnum();
- } else {
- pageNumberType = EXPLICIT;
- int pageStart = initialPageNumber.getValue();
- this.explicitFirstNumber = (pageStart > 0) ? pageStart : 1;
- }
-
this.simplePageMaster =
this.layoutMasterSet.getSimplePageMaster(masterReference);
if (this.simplePageMaster == null) {
@@ -186,9 +149,8 @@
new PageNumberGenerator(format, groupingSeparator, groupingSize,
letterValue);
checkId(id);
- //call startStructuredPageSequence to ensure, that startPageSequence
is called
- //before startFlow.
- startStructuredPageSequence();
+ initPageNumber();
+ getFOEventHandler().startPageSequence(this);
}
/**
@@ -248,13 +210,11 @@
} else if (childId == FO_FLOW) {
this.mainFlow = (Flow) child;
addFlow(mainFlow);
- startStructuredPageSequence();
super.addChildNode(child); // For getChildren
} else if (childId == FO_STATIC_CONTENT) {
addFlow((StaticContent) child);
String flowName = ((StaticContent) child).getFlowName();
flowMap.put(flowName, child);
- startStructuredPageSequence();
}
}
@@ -284,198 +244,34 @@
}
/**
- * Start the page-sequence logic in the Structured Handler
- */
- private void startStructuredPageSequence() {
- if (!sequenceStarted) {
- getFOEventHandler().startPageSequence(this);
- sequenceStarted = true;
- }
- }
-
- /**
* Initialize the current page number for the start of the page sequence.
*/
- public void initPageNumber() {
- this.currentPageNumber = this.root.getRunningPageNumberCounter() + 1;
-
- if (this.pageNumberType == EN_AUTO_ODD) {
- // Next page but force odd. May force empty page creation!
- // Whose master is used for this??? Assume no.
- // Use force-page-count = auto
- // on preceding page-sequence to make sure that there is no gap!
- if (currentPageNumber % 2 == 0) {
- this.currentPageNumber++;
- }
- } else if (pageNumberType == EN_AUTO_EVEN) {
- if (currentPageNumber % 2 == 1) {
- this.currentPageNumber++;
+ private void initPageNumber() {
+ int pageNumberType = 0;
+
+ if (initialPageNumber.getEnum() != 0) {
+ // auto | auto-odd | auto-even.
+ startingPageNumber =
root.getEndingPageNumberOfPreviousSequence() + 1;
+ pageNumberType = initialPageNumber.getEnum();
+ if (pageNumberType == EN_AUTO_ODD) {
+ // Next page but force odd. May force empty page creation!
+ // Whose master is used for this??? Assume no.
+ // Use force-page-count = auto
+ // on preceding page-sequence to make sure that there is no
gap!
+ if (startingPageNumber % 2 == 0) {
+ startingPageNumber++;
+ }
+ } else if (pageNumberType == EN_AUTO_EVEN) {
+ if (startingPageNumber % 2 == 1) {
+ startingPageNumber++;
+ }
}
- } else if (pageNumberType == EXPLICIT) {
- this.currentPageNumber = this.explicitFirstNumber;
+ } else { // <integer> for explicit page number
+ int pageStart = initialPageNumber.getValue();
+ startingPageNumber = (pageStart > 0) ? pageStart : 1; // spec
rule
}
- this.firstPageNumber = this.currentPageNumber;
}
- /**
- * Creates a new page area for the given parameters
- * @param areaTree the area tree the page should be contained in
- * @param firstAvailPageNumber the page number for this page
- * @param isFirstPage true when this is the first page in the sequence
- * @param isEmptyPage true if this page will be empty
- * (e.g. forced even or odd break)
- * @return a Page layout object based on the page master selected
- * 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();
-// return p;
-// }
-
- /**
- * 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;
-// }
-// }
-
- /**
- * Returns the next simple page master for the given sequence master,
page number and
- * other state information
- */
-// private SimplePageMaster getNextSimplePageMaster(PageSequenceMaster
sequenceMaster,
-// int pageNumber, boolean thisIsFirstPage,
-// boolean isEmptyPage) {
-// // handle forcing
-// if (isForcing) {
-// String nextPageMaster = getNextPageMasterName(sequenceMaster,
-// pageNumber, false, true);
-// return
this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
-// }
-// String nextPageMaster = getNextPageMasterName(sequenceMaster,
-// pageNumber, thisIsFirstPage,
isEmptyPage);
-// return this.layoutMasterSet.getSimplePageMaster(nextPageMaster);
-
-// }
-
- /**
- * Get the next page master name.
- * This gets the name of the next page master. If the sequence
- * is exhausted then an error is indicated and the last page
- * master name is used.
- */
-// private String getNextPageMasterName(PageSequenceMaster
sequenceMaster,
-// int pageNumber,
-// boolean thisIsFirstPage,
-// boolean isEmptyPage) {
-
-// if (null == currentSubsequence) {
-// currentSubsequence = getNextSubsequence(sequenceMaster);
-// }
-
-// String nextPageMaster =
-// currentSubsequence.getNextPageMaster(pageNumber,
-// 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(pageNumber,
-// 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 pageNumber,
-// 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,
-// pageNumber,
-// 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;
-// }
-
-
// /**
// * Returns true when there is more flow elements left to lay out.
// */
@@ -545,12 +341,12 @@
// }
/**
- * Get the current page number for this page sequence.
+ * Get the starting page number for this page sequence.
*
- * @return the current page number
+ * @return the starting page number
*/
- public int getCurrentPageNumber() {
- return currentPageNumber;
+ public int getStartingPageNumber() {
+ return startingPageNumber;
}
// private void forcePage(AreaTree areaTree, int firstAvailPageNumber) {
@@ -689,18 +485,6 @@
}
/**
- * Public accessor for setting the currentPageNumber.
- * @param currentPageNumber the value to which currentPageNumber should
be
- * set.
- */
- public void setCurrentPageNumber(int currentPageNumber) {
- this.currentPageNumber = currentPageNumber;
-
- // Tell the root the last page number we created.
- root.setRunningPageNumberCounter(currentPageNumber);
- }
-
- /**
* Public accessor for the ancestor Root.
* @return the ancestor Root
*/
1.39 +34 -9 xml-fop/src/java/org/apache/fop/fo/pagination/Root.java
Index: Root.java
===================================================================
RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/Root.java,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- Root.java 5 Feb 2005 07:39:12 -0000 1.38
+++ Root.java 17 Feb 2005 00:27:54 -0000 1.39
@@ -51,7 +51,8 @@
/**
* Keeps count of page number from over PageSequence instances
*/
- private int runningPageNumberCounter = 0;
+ private int endingPageNumberOfPreviousSequence = 0;
+ private int totalPagesGenerated = 0;
/**
* FOEventHandler object for this FO Tree
@@ -150,19 +151,43 @@
}
/**
- * Returns the number of pages generated (over all PageSequence
instances).
- * @return the number of pages
+ * Gets the last page number generated by the previous page-sequence
+ * @return the last page number, 0 if no page sequences yet generated
*/
- public int getRunningPageNumberCounter() {
- return this.runningPageNumberCounter;
+ public int getEndingPageNumberOfPreviousSequence() {
+ return endingPageNumberOfPreviousSequence;
}
/**
- * Sets the overall page number counter.
- * @param count the new page count
+ * Sets the last page number by the just-finished page-sequence
+ * @param lastPageNumber the last page number of the sequence
*/
- public void setRunningPageNumberCounter(int count) {
- this.runningPageNumberCounter = count;
+ public void setEndingPageNumberOfPreviousSequence(int lastPageNumber) {
+ endingPageNumberOfPreviousSequence = lastPageNumber;
+ }
+
+ /**
+ * Returns the total number of pages generated by FOP
+ * (May not equal endingPageNumberOfPreviousSequence due to
+ * initial-page-number property on fo:page-sequences.)
+ * @return the last page number, 0 if no page sequences yet generated
+ */
+ public int getTotalPagesGenerated() {
+ return totalPagesGenerated;
+ }
+
+ /**
+ * Report additional pages generated to increase the totalPagesGenerated
counter
+ * @param lastPageNumber the last page number of the sequence
+ * @throws IllegalArgumentException for negative additional page counts
+ */
+ public void reportAdditionalPagesGenerated(int additionalPages) {
+ if (additionalPages >= 0) {
+ totalPagesGenerated += additionalPages;
+ } else {
+ throw new IllegalArgumentException(
+ "Number of additional pages must be zero or greater.");
+ }
}
/**
1.39 +2 -2
xml-fop/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
Index: AbstractLayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- AbstractLayoutManager.java 10 Feb 2005 14:18:39 -0000 1.38
+++ AbstractLayoutManager.java 17 Feb 2005 00:27:54 -0000 1.39
@@ -314,8 +314,8 @@
*
* @see org.apache.fop.layoutmgr.LayoutManager
*/
- public String getCurrentPageNumber() {
- return parentLM.getCurrentPageNumber();
+ public String getCurrentPageNumberString() {
+ return parentLM.getCurrentPageNumberString();
}
/**
1.20 +2 -2
xml-fop/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java
Index: ContentLayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- ContentLayoutManager.java 7 Feb 2005 11:01:36 -0000 1.19
+++ ContentLayoutManager.java 17 Feb 2005 00:27:54 -0000 1.20
@@ -234,8 +234,8 @@
Position bp2) { }
/** @see org.apache.fop.layoutmgr.LayoutManager */
- public String getCurrentPageNumber() {
- return parentLM.getCurrentPageNumber();
+ public String getCurrentPageNumberString() {
+ return parentLM.getCurrentPageNumberString();
}
/** @see org.apache.fop.layoutmgr.LayoutManager */
1.19 +1 -1
xml-fop/src/java/org/apache/fop/layoutmgr/LayoutManager.java
Index: LayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/LayoutManager.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- LayoutManager.java 7 Feb 2005 11:01:36 -0000 1.18
+++ LayoutManager.java 17 Feb 2005 00:27:54 -0000 1.19
@@ -172,7 +172,7 @@
*
* @return the string for the current page number
*/
- String getCurrentPageNumber();
+ String getCurrentPageNumberString();
/**
* Resolve the id reference.
1.7 +2 -2
xml-fop/src/java/org/apache/fop/layoutmgr/PageNumberLayoutManager.java
Index: PageNumberLayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/PageNumberLayoutManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PageNumberLayoutManager.java 25 Jan 2005 10:55:47 -0000 1.6
+++ PageNumberLayoutManager.java 17 Feb 2005 00:27:54 -0000 1.7
@@ -46,7 +46,7 @@
public InlineArea get(LayoutContext context) {
// get page string from parent, build area
TextArea inline = new TextArea();
- String str = parentLM.getCurrentPageNumber();
+ String str = parentLM.getCurrentPageNumberString();
int width = 0;
for (int count = 0; count < str.length(); count++) {
width += font.getCharWidth(str.charAt(count));
1.33 +16 -14
xml-fop/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
Index: PageSequenceLayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- PageSequenceLayoutManager.java 12 Feb 2005 22:32:36 -0000 1.32
+++ PageSequenceLayoutManager.java 17 Feb 2005 00:27:54 -0000 1.33
@@ -75,7 +75,8 @@
}
}
- private int pageCount = 1;
+ private int startPageNum = 0;
+ private int currentPageNum = 0;
private String pageNumberString;
private boolean isFirstPage = true;
@@ -177,9 +178,9 @@
* which creates and adds all the pages to the area tree.
*/
public void activateLayout() {
- pageSeq.initPageNumber();
- pageCount = pageSeq.getCurrentPageNumber();
- pageNumberString = pageSeq.makeFormattedPageNumber(pageCount);
+ startPageNum = pageSeq.getStartingPageNumber();
+ currentPageNum = startPageNum;
+ pageNumberString = pageSeq.makeFormattedPageNumber(currentPageNum);
LineArea title = null;
if (pageSeq.getTitleFO() != null) {
@@ -203,14 +204,15 @@
// finish page and add to area tree
finishPage();
- pageCount++;
- pageNumberString =
pageSeq.makeFormattedPageNumber(pageCount);
+ currentPageNum++;
+ pageNumberString =
pageSeq.makeFormattedPageNumber(currentPageNum);
}
}
- pageCount--;
+ // TODO: Don't decrement currentPageNum when no pages are generated
+ currentPageNum--;
log.debug("Ending layout");
finishPage();
- pageSeq.setCurrentPageNumber(pageCount);
+ pageSeq.getRoot().reportAdditionalPagesGenerated((currentPageNum -
startPageNum) + 1);
}
/** @see org.apache.fop.layoutmgr.LayoutManager#isBogus() */
@@ -257,7 +259,7 @@
*
* @return the formatted page number string
*/
- public String getCurrentPageNumber() {
+ public String getCurrentPageNumberString() {
return pageNumberString;
}
@@ -464,7 +466,7 @@
try {
// create a new page
currentSimplePageMaster = pageSeq.getSimplePageMasterToUse(
- pageCount, isFirstPage, bIsBlank);
+ currentPageNum, isFirstPage, bIsBlank);
Region body = currentSimplePageMaster.getRegion(FO_REGION_BODY);
if
(!pageSeq.getMainFlow().getFlowName().equals(body.getRegionName())) {
throw new FOPException("Flow '" +
pageSeq.getMainFlow().getFlowName()
@@ -477,7 +479,7 @@
throw new IllegalArgumentException("Cannot create page: " +
fopex.getMessage());
}
- curPage.setPageNumberString(getCurrentPageNumber());
+ curPage.setPageNumberString(pageNumberString);
if (log.isDebugEnabled()) {
log.debug("[" + curPage.getPageNumberString() + "]");
}
@@ -669,7 +671,7 @@
}
else {
/* IF we are on the kind of page we need, we'll need a new page.
*/
- if (pageCount%2 != 0) {
+ if (currentPageNum%2 != 0) {
// Current page is odd
return (breakValue == Constants.EN_ODD_PAGE);
}
@@ -687,7 +689,7 @@
if (breakValue == Constants.EN_PAGE) {
return false;
}
- else if (pageCount%2 != 0) {
+ else if (currentPageNum%2 != 0) {
// Current page is odd
return (breakValue == Constants.EN_EVEN_PAGE);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]