Browse Source

adds support for page-number-citation (limitation: works only for reversed referenced

blocks). Contributed by Mike Crowe.


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193404 13f79535-47bb-0310-9956-ffa450edef68
tags/pre-columns
fotis 24 years ago
parent
commit
08f344c994

+ 17
- 1
src/codegen/properties.xml View File

@@ -303,7 +303,7 @@
<class-name>HRef</class-name>
<inherited>false</inherited>
<datatype>String</datatype>
<default></default>
<default></default>
</property>
<property>
<name>column-width</name>
@@ -799,5 +799,21 @@
<datatype>String</datatype>
<default>auto</default>
</property>
<property>
<name>ref-id</name>
<class-name>RefId</class-name>
<inherited>false</inherited>
<datatype>String</datatype>
<default></default>
</property>
<property>
<name>id</name>
<class-name>Id</class-name>
<inherited>false</inherited>
<datatype>String</datatype>
<default></default>
</property>


</property-list>


+ 15
- 1
src/org/apache/fop/fo/FONode.java View File

@@ -65,7 +65,8 @@ import java.util.Vector;
abstract public class FONode {

protected FObj parent;
protected Vector children = new Vector();

public Vector children = new Vector(); // made public for searching for id's

/** value of marker before layout begins */
public final static int START = -1000;
@@ -199,4 +200,17 @@ abstract public class FONode {

abstract public Status layout(Area area)
throws FOPException;
/**
* lets outside sources access the property list
* first used by PageNumberCitation to find the "id" property
* returns null by default, overide this function when there is a property list
*@param name - the name of the desired property to obtain
* @returns the property
*/
public Property getProperty(String name)
{
return(null);
}

}

+ 35
- 1
src/org/apache/fop/fo/FObj.java View File

@@ -75,7 +75,9 @@ public class FObj extends FONode {
return new Maker();
}

protected PropertyList properties;
// protected PropertyList properties;
public PropertyList properties;

protected String name;

protected FObj(FObj parent, PropertyList propertyList) {
@@ -92,6 +94,20 @@ public class FObj extends FONode {
// should always be overridden
return new Status(Status.OK);
}

/**
* performs layout tasks which are global to all layout objects
* all subclasses of FObj which override layout should call layoutStart
* @param area - the current area being layed out
*/
public Status layoutStart(Area area)
{
pageNumber = area.getPage().getNumber();
return new Status(Status.OK);
}


public String getName() {
return this.name;
@@ -104,5 +120,23 @@ public class FObj extends FONode {
protected void end() {
// do nothing by default
}
/**
* lets outside sources access the property list
* first used by PageNumberCitation to find the "id" property
*@param name - the name of the desired property to obtain
* @returns the property
*/
public Property getProperty(String name)
{
return(properties.get(name));
}

protected int pageNumber = -1;
public int getPageNumber()
{
return(pageNumber);
}
}


+ 3
- 0
src/org/apache/fop/fo/PropertyListBuilder.java View File

@@ -163,6 +163,9 @@ public class PropertyListBuilder {
propertyTable.put("top",Top.maker());
propertyTable.put("width",Width.maker());
propertyTable.put("initial-page-number",InitialPageNumber.maker());
propertyTable.put("ref-id",RefId.maker()); // used by page-number-citation
propertyTable.put("id",Id.maker()); // attribute for objects, used by page-number-citation

}

public Property computeProperty(PropertyList propertyList, String propertyName) {

+ 1
- 0
src/org/apache/fop/fo/StandardElementMapping.java View File

@@ -88,6 +88,7 @@ public class StandardElementMapping implements ElementMapping {
ListItemLabel.maker());
builder.addMapping(uri, "list-item-body", ListItemBody.maker());
builder.addMapping(uri, "page-number", PageNumber.maker());
builder.addMapping(uri, "page-number-citation", PageNumberCitation.maker());
builder.addMapping(uri, "display-sequence",
DisplaySequence.maker());
builder.addMapping(uri, "inline-sequence",

+ 1
- 0
src/org/apache/fop/fo/flow/Block.java View File

@@ -218,6 +218,7 @@ public class Block extends FObjMixed {
blockArea.setBorderWidth(borderWidth, borderWidth, borderWidth, borderWidth);
blockArea.setBorderColor(borderColor, borderColor, borderColor, borderColor);
blockArea.start();
layoutStart(area); // performs

blockArea.setAbsoluteHeight(area.getAbsoluteHeight());


+ 284
- 0
src/org/apache/fop/fo/flow/PageNumberCitation.java View File

@@ -0,0 +1,284 @@
/*-- $Id$ --

============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "FOP" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior
written permission. For written permission, please contact
apache@apache.org.
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/

package org.apache.fop.fo.flow;

// FOP
import org.apache.fop.fo.*;
import org.apache.fop.fo.pagination.*;
import org.apache.fop.datatypes.*;
import org.apache.fop.fo.properties.*;
import org.apache.fop.layout.*;
import org.apache.fop.apps.FOPException;

// Java
import java.util.Enumeration;


/**
* 6.6.11 fo:page-number-citation
*
* Common Usage:
* The fo:page-number-citation is used to reference the page-number for the page containing the first normal area returned by
* the cited formatting object.
*
* NOTE:
* It may be used to provide the page-numbers in the table of contents, cross-references, and index entries.
*
* Areas:
* The fo:page-number-citation formatting object generates and returns a single normal inline-area.
* Constraints:
*
* The cited page-number is the number of the page containing, as a descendant, the first normal area returned by the
* formatting object with an id trait matching the ref-id trait of the fo:page-number-citation (the referenced formatting
* object).
*
* The cited page-number string is obtained by converting the cited page-number in accordance with the number to string
* conversion properties specified on the ancestor fo:page-sequence of the referenced formatting object.
*
* The child areas of the generated inline-area are the same as the result of formatting a result-tree fragment consisting of
* fo:character flow objects; one for each character in the cited page-number string and with only the "character" property
* specified.
*
* Contents:
*
* EMPTY
*
* The following properties apply to this formatting object:
*
* [7.3 Common Accessibility Properties]
* [7.5 Common Aural Properties]
* [7.6 Common Border, Padding, and Background Properties]
* [7.7 Common Font Properties]
* [7.10 Common Margin Properties-Inline]
* [7.11.1 "alignment-adjust"]
* [7.11.2 "baseline-identifier"]
* [7.11.3 "baseline-shift"]
* [7.11.5 "dominant-baseline"]
* [7.36.2 "id"]
* [7.17.4 "keep-with-next"]
* [7.17.5 "keep-with-previous"]
* [7.14.2 "letter-spacing"]
* [7.13.4 "line-height"]
* [7.13.5 "line-height-shift-adjustment"]
* [7.36.5 "ref-id"]
* [7.18.4 "relative-position"]
* [7.36.6 "score-spaces"]
* [7.14.4 "text-decoration"]
* [7.14.5 "text-shadow"]
* [7.14.6 "text-transform"]
* [7.14.8 "word-spacing"]
*/
public class PageNumberCitation extends FObj
{

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

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

FontState fs;
float red;
float green;
float blue;
int wrapOption;
int whiteSpaceTreatment;
String refId;
FObj citation;
int idPageNumber;
Area area;

public PageNumberCitation(FObj parent, PropertyList propertyList)
{
super(parent, propertyList);
this.name = "fo:page-number";
idPageNumber = -2;
}
public FObj findRoot()
{
// find root object
FObj prevParent = this;
FObj root = this;
while(prevParent != null)
{
root = prevParent;
prevParent = prevParent.getParent();
}
return(root);
}


public Status layout(Area area) throws FOPException
{
if(!(area instanceof BlockArea))
{
System.err.println("WARNING: page-number-citation outside block area");
return new Status(Status.OK);
}
this.area = area;
if( this.marker == START)
{
String fontFamily = this.properties.get("font-family").getString();
String fontStyle = this.properties.get("font-style").getString();
String fontWeight = this.properties.get("font-weight").getString();
int fontSize = this.properties.get("font-size").getLength().mvalue();
this.fs = new FontState(area.getFontInfo(), fontFamily, fontStyle, fontWeight, fontSize);
ColorType c = this.properties.get("color").getColorType();
this.red = c.red();
this.green = c.green();
this.blue = c.blue();
this.wrapOption = this.properties.get("wrap-option").getEnum();
this.whiteSpaceTreatment = this.properties.get("white-space-treatment").getEnum();
this.marker = 0;
}
if(idPageNumber <0)
{
FObj root;
refId = this.properties.get("ref-id").getString();
//System.out.println("PageNumberCitation.layout() ref-id: "+refId);

// find the reference number citation here, what to do if not found?
// to do this, get the root document, and do a search for the id that matches ref-id
// try to get the page number,
// if no page number, save the current object for a second pass (does this really occur)
root = findRoot();
if(citation == null)
{
// should have the root document object here
// methodically search for object with id which matches ref-id
citation = searchForId(root);
if(citation != null)
{
//System.out.println("PageNumberCitation.layout() found citation");
Status s = resolvePageNumber();
if(s.isIncomplete())
{
((Root)root).addUnresolvedCitation((Object)this);
return new Status(Status.OK);
}
}
}
else
{
//System.out.println("PageNumberCitation.layout() found citation");
Status s = resolvePageNumber();
if(s.isIncomplete())
{
((Root)root).addUnresolvedCitation((Object)this);
return new Status(Status.OK);
}
}
}


String p = Integer.toString(idPageNumber);
this.marker = ((BlockArea) area).addText(fs, red, green, blue, wrapOption, null, whiteSpaceTreatment, p.toCharArray(), 0, p.length());
return new Status(Status.OK);
}


public Status resolvePageNumber()
{
idPageNumber = citation.getPageNumber();
//System.out.println("PageNumberCitation: citation page #: "+idPageNumber);
if(idPageNumber <0) return new Status(Status.AREA_FULL_NONE);
return new Status(Status.OK);
}



/**
* the classic recursive search routine
*/
FObj searchForId(FObj searchTarget)
{
if(searchTarget == null) return(null);
if(searchTarget.properties == null) return(null);
String idString = (String)(searchTarget.getProperty("id").getString());
if( idString != null)
{
if(refId.equals(idString))
{
return(searchTarget);
}
}

for(int i=0; i<searchTarget.children.size();i++)
{
Object newTarget = searchTarget.children.elementAt(i);
if( newTarget instanceof FObj )
{
FObj retVal = searchForId((FObj)(newTarget));
if(retVal != null) return(retVal);
}
}
return(null);
}

}


+ 11
- 1
src/org/apache/fop/fo/flow/StaticContent.java View File

@@ -93,6 +93,7 @@ public class StaticContent extends FObj {
}
public Status layout(Area area) throws FOPException {

int numChildren = this.children.size();
// Set area absolute height so that link rectangles will be drawn correctly in xsl-before and xsl-after
String flowName = this.properties.get("flow-name").getString();
@@ -107,7 +108,16 @@ public class StaticContent extends FObj {
for (int i = 0; i < numChildren; i++) {
FObj fo = (FObj) children.elementAt(i);
fo.layout(area);
Status status;
if ((status = fo.layout(area)).isIncomplete()) {
this.marker = i;
if ((i != 0) && (status.getCode() == Status.AREA_FULL_NONE)) {
status = new Status(Status.AREA_FULL_SOME);
}
return(status);
}
// fo.layout(area);
}
resetMarker();
return new Status(Status.OK);

+ 70
- 33
src/org/apache/fop/fo/pagination/Root.java View File

@@ -52,58 +52,95 @@ package org.apache.fop.fo.pagination;

// FOP
import org.apache.fop.fo.*;
import org.apache.fop.fo.flow.*;
import org.apache.fop.fo.properties.*;
import org.apache.fop.layout.AreaTree;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOPException;

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

public class Root extends FObj {

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

LayoutMasterSet layoutMasterSet;
Vector pageSequences;
LayoutMasterSet layoutMasterSet;
Vector pageSequences;
Vector unresolvedCitations;
protected Root(FObj parent, PropertyList propertyList)
throws FOPException {
super(parent, propertyList);
this.name = "fo:root";
protected Root(FObj parent, PropertyList propertyList) throws FOPException
{
super(parent, propertyList);
this.name = "fo:root";
pageSequences = new Vector();
if (parent != null) {
throw new FOPException("root must be root element");
pageSequences = new Vector();
if (parent != null)
{
throw new FOPException("root must be root element");
}
}
}

public void addPageSequence(PageSequence pageSequence) {
this.pageSequences.addElement(pageSequence);
}

public void addPageSequence(PageSequence pageSequence)
{
this.pageSequences.addElement(pageSequence);
}
public LayoutMasterSet getLayoutMasterSet() {
return this.layoutMasterSet;
}

public LayoutMasterSet getLayoutMasterSet()
{
return this.layoutMasterSet;
}
public void format(AreaTree areaTree) throws FOPException {
if (layoutMasterSet == null) {
throw new FOPException("No layout master set.");

public void format(AreaTree areaTree) throws FOPException
{
// System.err.println(" Root[" + marker + "] ");
if(layoutMasterSet == null)
{
throw new FOPException("No layout master set.");
}
Enumeration e = pageSequences.elements();
while (e.hasMoreElements())
{
((PageSequence) e.nextElement()).format(areaTree);
}


if(unresolvedCitations != null)
{
Enumeration ec = unresolvedCitations.elements();
while( ec.hasMoreElements() )
{
((PageNumberCitation)ec.nextElement()).resolvePageNumber();
}
// forward page number citations have been resolved here
// question now is how to apply this information to the document
}
}
Enumeration e = pageSequences.elements();
while (e.hasMoreElements()) {
((PageSequence) e.nextElement()).format(areaTree);
public void addUnresolvedCitation(Object x)
{
if(unresolvedCitations == null)
{
unresolvedCitations = new Vector();
}
unresolvedCitations.add(x);
}
}

public void setLayoutMasterSet(LayoutMasterSet layoutMasterSet) {
this.layoutMasterSet = layoutMasterSet;

Loading…
Cancel
Save