Browse Source

fix: initial-page-number started with page number 1 at each page sequence

added: initial-page-number now completely implemented
(author: Jordan Naftolin)


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/release-0-13-0@193381 13f79535-47bb-0310-9956-ffa450edef68
release-0-13-0
fotis 24 years ago
parent
commit
2b4ed8ebe4
2 changed files with 176 additions and 95 deletions
  1. 2
    2
      src/codegen/properties.xml
  2. 174
    93
      src/org/apache/fop/fo/pagination/PageSequence.java

+ 2
- 2
src/codegen/properties.xml View File

@@ -796,8 +796,8 @@
<name>initial-page-number</name>
<class-name>InitialPageNumber</class-name>
<inherited>false</inherited>
<datatype>Integer</datatype>
<default>0</default>
<datatype>String</datatype>
<default>auto</default>
</property>
</property-list>


+ 174
- 93
src/org/apache/fop/fo/pagination/PageSequence.java View File

@@ -62,25 +62,32 @@ import org.apache.fop.layout.AreaTree;
import org.apache.fop.layout.Page;
import org.apache.fop.layout.PageMaster;
import org.apache.fop.layout.PageMasterFactory;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOPException;

// Java
import java.util.Hashtable;
import java.util.Vector;

public class PageSequence extends FObj {
public class PageSequence extends FObj
{

public static class Maker extends FObj.Maker {
public FObj make(FObj parent, PropertyList propertyList)
throws FOPException {
return new PageSequence(parent, propertyList);
}
public static class Maker extends FObj.Maker
{
public FObj make(FObj parent, PropertyList propertyList)
throws FOPException {
return new PageSequence(parent, propertyList);
}
}

public static FObj.Maker maker() {
return new PageSequence.Maker();
return new PageSequence.Maker();
}

static final int EXPLICIT = 0;
static final int AUTO = 1;
static final int AUTO_EVEN = 2;
static final int AUTO_ODD = 3;

protected Root root;
protected SequenceSpecification sequenceSpecification;
protected Flow flow;
@@ -90,105 +97,179 @@ public class PageSequence extends FObj {

protected Page currentPage;
protected int currentPageNumber = 0;
protected static int runningPageNumberCounter = 0; //keeps count of page number from previous PageSequence
protected int pageNumberType; // specifies page numbering type (auto|auto-even|auto-odd|explicit)
protected boolean thisIsFirstPage; // used to determine whether to calculate auto, auto-even, auto-odd

protected PageSequence(FObj parent, PropertyList propertyList)
throws FOPException {
super(parent, propertyList);
this.name = "fo:page-sequence";

if (parent.getName().equals("fo:root")) {
this.root = (Root) parent;
this.root.addPageSequence(this);
} else {
throw
new FOPException("page-sequence must be child of root, not "
+ parent.getName());
}
layoutMasterSet = root.getLayoutMasterSet();

InitialPageNumber ipn = (InitialPageNumber) this.properties.get("initial-page-number");
int pageStart = ipn.getInteger().intValue();
this.currentPageNumber =
(pageStart > 0) ? pageStart - 1 : 0;
throws FOPException {
super(parent, propertyList);
this.name = "fo:page-sequence";

if ( parent.getName().equals("fo:root") )
{
this.root = (Root) parent;
this.root.addPageSequence(this);
}
else
{
throw
new FOPException("page-sequence must be child of root, not "
+ parent.getName());
}
layoutMasterSet = root.getLayoutMasterSet();
thisIsFirstPage=true; // we are now on the first page of the page sequence
InitialPageNumber ipn = (InitialPageNumber) this.properties.get("initial-page-number");
String ipnValue=ipn.getString();

if ( ipnValue.equals("auto") )
{
pageNumberType=AUTO;
}
else if ( ipnValue.equals("auto-even") )
{
pageNumberType=AUTO_EVEN;
}
else if ( ipnValue.equals("auto-odd") )
{
pageNumberType=AUTO_ODD;
}
else
{
pageNumberType=EXPLICIT;
try
{
int pageStart = new Integer(ipnValue).intValue();
this.currentPageNumber = (pageStart > 0) ? pageStart - 1 : 0;
}
catch ( NumberFormatException nfe )
{
throw new FOPException("\""+ipnValue+"\" is not a valid value for initial-page-number");
}
}
}

protected Page makePage(AreaTree areaTree) throws FOPException {
PageMaster pageMaster;
// layout this page sequence
// while there is still stuff in the flow, ask the
// sequence-specification for a new page
if (this.sequenceSpecification == null) {
throw new FOPException("page-sequence is missing an"
+ " sequence-specification");
}
PageMasterFactory pmf =
this.sequenceSpecification.getFirstPageMasterFactory();

pageMaster = pmf.getNextPageMaster();

while (pageMaster == null) {
/* move on to next sequence specifier */
pmf = pmf.getNext();
if (pmf == null) {
throw new FOPException("out of sequence specifiers"
+ " (FOP will eventually allow this)");
}
pageMaster = pmf.getNextPageMaster();
}
return pageMaster.makePage(areaTree);
PageMaster pageMaster;
// layout this page sequence

// while there is still stuff in the flow, ask the
// sequence-specification for a new page

if ( this.sequenceSpecification == null )
{
throw new FOPException("page-sequence is missing an"
+ " sequence-specification");
}

PageMasterFactory pmf =
this.sequenceSpecification.getFirstPageMasterFactory();

pageMaster = pmf.getNextPageMaster();

while ( pageMaster == null )
{
/* move on to next sequence specifier */
pmf = pmf.getNext();
if ( pmf == null )
{
throw new FOPException("out of sequence specifiers"
+ " (FOP will eventually allow this)");
}
pageMaster = pmf.getNextPageMaster();
}
return pageMaster.makePage(areaTree);
}

public void format(AreaTree areaTree) throws FOPException {
Status status = new Status(Status.OK);

do {
currentPage = makePage(areaTree);
currentPage.setNumber(++this.currentPageNumber);
System.err.print(" [" + currentPageNumber);
if ((this.staticBefore != null) &&
(currentPage.getBefore() != null)) {
AreaContainer beforeArea = currentPage.getBefore();
this.staticBefore.layout(beforeArea);
}
if ((this.staticAfter != null) &&
(currentPage.getAfter() != null)) {
AreaContainer afterArea = currentPage.getAfter();
this.staticAfter.layout(afterArea);
}
if ((status.getCode() == Status.FORCE_PAGE_BREAK_EVEN) &&
((currentPageNumber % 2) == 1)) {
} else if ((status.getCode() == Status.FORCE_PAGE_BREAK_ODD) &&
((currentPageNumber % 2) == 0)) {
} else {
AreaContainer bodyArea = currentPage.getBody();
status = this.flow.layout(bodyArea);
}
System.err.print("]");
areaTree.addPage(currentPage);
} while (status.isIncomplete());
System.err.println();
Status status = new Status(Status.OK);

do
{
currentPage = makePage(areaTree);

if ( thisIsFirstPage )
{
if ( pageNumberType==AUTO )
{
this.currentPageNumber=this.runningPageNumberCounter;
}
else if ( pageNumberType==AUTO_ODD )
{
this.currentPageNumber=this.runningPageNumberCounter;
if ( this.currentPageNumber % 2== 1 )
{
this.currentPageNumber++;
}
}
else if ( pageNumberType==AUTO_EVEN )
{
this.currentPageNumber=this.runningPageNumberCounter;
if ( this.currentPageNumber % 2 == 0 )
{
this.currentPageNumber++;
}
}
thisIsFirstPage=false;
}

currentPage.setNumber(++this.currentPageNumber);
this.runningPageNumberCounter=this.currentPageNumber;

System.err.print(" [" + currentPageNumber);
if ( (this.staticBefore != null) &&
(currentPage.getBefore() != null) )
{
AreaContainer beforeArea = currentPage.getBefore();
this.staticBefore.layout(beforeArea);
}
if ( (this.staticAfter != null) &&
(currentPage.getAfter() != null) )
{
AreaContainer afterArea = currentPage.getAfter();
this.staticAfter.layout(afterArea);
}
if ( (status.getCode() == Status.FORCE_PAGE_BREAK_EVEN) &&
((currentPageNumber % 2) == 1) )
{
}
else if ( (status.getCode() == Status.FORCE_PAGE_BREAK_ODD) &&
((currentPageNumber % 2) == 0) )
{
}
else
{
AreaContainer bodyArea = currentPage.getBody();
status = this.flow.layout(bodyArea);
}
System.err.print("]");
areaTree.addPage(currentPage);
} while ( status.isIncomplete() );
System.err.println();
}

public void setFlow(Flow flow) {
this.flow = flow;
this.flow = flow;
}
protected void setSequenceSpecification(SequenceSpecification sequenceSpecification) {
this.sequenceSpecification = sequenceSpecification;
sequenceSpecification.setLayoutMasterSet(this.layoutMasterSet);
this.sequenceSpecification = sequenceSpecification;
sequenceSpecification.setLayoutMasterSet(this.layoutMasterSet);
}
public void setStaticContent(String name, StaticContent staticContent) {
if (name.equals("xsl-before")) {
this.staticBefore = staticContent;
} else if (name.equals("xsl-after")) {
this.staticAfter = staticContent;
} else {
System.err.println("WARNING: this version of FOP only supports "
+ "static-content in region-before and region-after");
}
if ( name.equals("xsl-before") )
{
this.staticBefore = staticContent;
}
else if ( name.equals("xsl-after") )
{
this.staticAfter = staticContent;
}
else
{
System.err.println("WARNING: this version of FOP only supports "
+ "static-content in region-before and region-after");
}
}
}

Loading…
Cancel
Save