aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorfotis <fotis@unknown>2000-06-18 21:06:24 +0000
committerfotis <fotis@unknown>2000-06-18 21:06:24 +0000
commit08f344c994b750f1726d2a95ea998f2867878816 (patch)
tree65914407516cd736b8d71eafe761ce7eed78802f /src
parent07f4cedc2894f30041a5fd1f18f23e975ce097a8 (diff)
downloadxmlgraphics-fop-08f344c994b750f1726d2a95ea998f2867878816.tar.gz
xmlgraphics-fop-08f344c994b750f1726d2a95ea998f2867878816.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/codegen/properties.xml18
-rw-r--r--src/org/apache/fop/fo/FONode.java16
-rw-r--r--src/org/apache/fop/fo/FObj.java36
-rw-r--r--src/org/apache/fop/fo/PropertyListBuilder.java3
-rw-r--r--src/org/apache/fop/fo/StandardElementMapping.java1
-rw-r--r--src/org/apache/fop/fo/flow/Block.java1
-rw-r--r--src/org/apache/fop/fo/flow/PageNumberCitation.java284
-rw-r--r--src/org/apache/fop/fo/flow/StaticContent.java12
-rw-r--r--src/org/apache/fop/fo/pagination/Root.java103
9 files changed, 437 insertions, 37 deletions
diff --git a/src/codegen/properties.xml b/src/codegen/properties.xml
index 5ccaed025..90cf720c1 100644
--- a/src/codegen/properties.xml
+++ b/src/codegen/properties.xml
@@ -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>
diff --git a/src/org/apache/fop/fo/FONode.java b/src/org/apache/fop/fo/FONode.java
index de9af88a3..6b55dda54 100644
--- a/src/org/apache/fop/fo/FONode.java
+++ b/src/org/apache/fop/fo/FONode.java
@@ -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);
+ }
+
}
diff --git a/src/org/apache/fop/fo/FObj.java b/src/org/apache/fop/fo/FObj.java
index ec7d6b396..45bcfd5f2 100644
--- a/src/org/apache/fop/fo/FObj.java
+++ b/src/org/apache/fop/fo/FObj.java
@@ -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);
+ }
}
diff --git a/src/org/apache/fop/fo/PropertyListBuilder.java b/src/org/apache/fop/fo/PropertyListBuilder.java
index 2fac7d7a0..2fbb98d63 100644
--- a/src/org/apache/fop/fo/PropertyListBuilder.java
+++ b/src/org/apache/fop/fo/PropertyListBuilder.java
@@ -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) {
diff --git a/src/org/apache/fop/fo/StandardElementMapping.java b/src/org/apache/fop/fo/StandardElementMapping.java
index b81a7165f..aa294ba55 100644
--- a/src/org/apache/fop/fo/StandardElementMapping.java
+++ b/src/org/apache/fop/fo/StandardElementMapping.java
@@ -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",
diff --git a/src/org/apache/fop/fo/flow/Block.java b/src/org/apache/fop/fo/flow/Block.java
index e3e771242..0d729a41f 100644
--- a/src/org/apache/fop/fo/flow/Block.java
+++ b/src/org/apache/fop/fo/flow/Block.java
@@ -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());
diff --git a/src/org/apache/fop/fo/flow/PageNumberCitation.java b/src/org/apache/fop/fo/flow/PageNumberCitation.java
new file mode 100644
index 000000000..71cc19415
--- /dev/null
+++ b/src/org/apache/fop/fo/flow/PageNumberCitation.java
@@ -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);
+ }
+
+
+}
+
diff --git a/src/org/apache/fop/fo/flow/StaticContent.java b/src/org/apache/fop/fo/flow/StaticContent.java
index 26c07b8f5..cee450ee8 100644
--- a/src/org/apache/fop/fo/flow/StaticContent.java
+++ b/src/org/apache/fop/fo/flow/StaticContent.java
@@ -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);
diff --git a/src/org/apache/fop/fo/pagination/Root.java b/src/org/apache/fop/fo/pagination/Root.java
index f7f8bbbd6..8022fca78 100644
--- a/src/org/apache/fop/fo/pagination/Root.java
+++ b/src/org/apache/fop/fo/pagination/Root.java
@@ -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;