hello
I tried to implement the force-page-count property. It looks like
someone had already prepaired many things and it looks easy, but
there is a showstopper: I had no luck using the
getSucceedingPageSequence function of
/fop/fo/pagination/Root.java from
/fop/layoutmgr/PageSequenceLayoutManager.java by calling
nextPageSeq = pageSeq.getRoot().getSucceedingPageSequence(pageSeq)
it always returns null. In detail the
currentIndex = pageSequences.indexOf(current)
part of the getSucceedingPageSequence function always returns -1
Because i am not very familiar with java and the
getSucceedingPageSequence function is not used elsewhere i want
to ask if it is working as expected or if i called it in a wrong
manner.
Though the work is not ready and not tested at all i venture to
append the patch because it is very little to give you a larger
picture of the circumstances.
gerhard
--
.''`. gerhard oettl on Debian/Gnu Linux
: :' :
`. `'` gpg key: 1024D/D59131AA 2002-06-18
`-
Index: src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
(Revision 360063)
+++ src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
(Arbeitskopie)
@@ -21,6 +21,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.Numeric;
import org.apache.fop.area.AreaTreeHandler;
import org.apache.fop.area.AreaTreeModel;
@@ -146,6 +147,8 @@
int flowBPD = (int)getCurrentPV().getBodyRegion().getRemainingBPD();
breaker.doLayout(flowBPD);
+ checkForcePageCount();
+
finishPage();
pageSeq.getRoot().notifyPageSequenceFinished(currentPageNum,
(currentPageNum - startPageNum) + 1);
@@ -888,4 +891,90 @@
}
}
+
+
+
+ /*
+ * check if the page-number of the last page suits to the force-page-count
property
+ */
+ private void checkForcePageCount() {
+ // if (curPage != null) {
+ // finishPage();
+ // }
+
+ int forcePageCount = pageSeq.getForcePageCount();
+ PageSequence nextPageSeq;
+ int nextPageSeqStartPageNum;
+ int nextPageSeqPageNumberType = 0;
+ Numeric nextPageSeqInitialPageNumber;
+ int nextPageSeqStartingPageNumber;
+
+ log.warn("blabla oettl");
+
+ // xsl-spec version 1.0 (15.oct 2001)
+ // auto | even | odd | end-on-even | end-on-odd | no-force | inherit
+ // auto:
+ // Force the last page in this page-sequence to be an odd-page
+ // if the initial-page-number of the next page-sequence is even.
+ // Force it to be an even-page
+ // if the initial-page-number of the next page-sequence is odd.
+ // If there is no next page-sequence
+ // or if the value of its initial-page-number is "auto" do not force
any page.
+
+
+ // if force-page-count is auto then set the value of forcePageCount
+ // depending on the initial-page-number of the next page-sequence
+ if (forcePageCount == Constants.EN_AUTO) {
+ if ((nextPageSeq =
pageSeq.getRoot().getSucceedingPageSequence(pageSeq)) == null) {
+ log.warn("no next pageseq");
+ forcePageCount = Constants.EN_NO_FORCE;
+ } else {
+ nextPageSeqInitialPageNumber =
nextPageSeq.getInitialPageNumber();
+ if (nextPageSeqInitialPageNumber.getEnum() != 0) {
+ // auto | auto-odd | auto-even
+ nextPageSeqPageNumberType =
nextPageSeqInitialPageNumber.getEnum();
+ if (nextPageSeqPageNumberType == Constants.EN_AUTO_ODD) {
+ forcePageCount = Constants.EN_EVEN;
+ } else if (nextPageSeqPageNumberType ==
Constants.EN_AUTO_EVEN) {
+ forcePageCount = Constants.EN_ODD;
+ } else { // auto
+ forcePageCount = Constants.EN_NO_FORCE;
+ }
+ } else { // <integer> for explicit page number
+ int nextPageSeqPageStart =
nextPageSeqInitialPageNumber.getValue();
+ nextPageSeqStartingPageNumber =
+ (nextPageSeqPageStart > 0) ? nextPageSeqPageStart : 1;
// spec rule
+ if (nextPageSeqStartingPageNumber % 2 == 0) { //
explicit even startnumber
+ forcePageCount = Constants.EN_ODD;
+ } else { // explicit odd startnumber
+ forcePageCount = Constants.EN_EVEN;
+ }
+ }
+ }
+ }
+
+ log.warn("forcePageCount" + forcePageCount);
+
+ if (forcePageCount == Constants.EN_EVEN) {
+ if ((currentPageNum - startPageNum + 1) % 2 != 0) { // we have a
odd number of pages
+ curPage = makeNewPage(true, false);
+ }
+ } else if (forcePageCount == Constants.EN_ODD) {
+ if ((currentPageNum - startPageNum + 1) % 2 == 0) { // we have a
even number of pages
+ curPage = makeNewPage(true, false);
+ }
+ } else if (forcePageCount == Constants.EN_END_ON_EVEN) {
+ if (currentPageNum % 2 != 0) { // we are now on a odd page
+ curPage = makeNewPage(true, false);
+ }
+ } else if (forcePageCount == Constants.EN_END_ON_ODD) {
+ if (currentPageNum % 2 == 0) { // we are now on a even page
+ curPage = makeNewPage(true, false);
+ }
+ } else if (forcePageCount == Constants.EN_NO_FORCE) {
+ // i hope: nothing special at all
+ }
+
+ }
+
}
Index: src/java/org/apache/fop/fo/pagination/PageSequence.java
===================================================================
--- src/java/org/apache/fop/fo/pagination/PageSequence.java (Revision
360063)
+++ src/java/org/apache/fop/fo/pagination/PageSequence.java (Arbeitskopie)
@@ -511,4 +511,20 @@
public int getNameId() {
return FO_PAGE_SEQUENCE;
}
+
+ /**
+ * get the forcePageCount value
+ */
+ public int getForcePageCount() {
+ return forcePageCount;
+ }
+
+ /**
+ * get the initial pagenumber property value
+ */
+ public Numeric getInitialPageNumber() {
+ return initialPageNumber;
+ }
+
+
}