diff options
author | fotis <fotis@unknown> | 2000-06-18 21:06:24 +0000 |
---|---|---|
committer | fotis <fotis@unknown> | 2000-06-18 21:06:24 +0000 |
commit | 08f344c994b750f1726d2a95ea998f2867878816 (patch) | |
tree | 65914407516cd736b8d71eafe761ce7eed78802f /src | |
parent | 07f4cedc2894f30041a5fd1f18f23e975ce097a8 (diff) | |
download | xmlgraphics-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.xml | 18 | ||||
-rw-r--r-- | src/org/apache/fop/fo/FONode.java | 16 | ||||
-rw-r--r-- | src/org/apache/fop/fo/FObj.java | 36 | ||||
-rw-r--r-- | src/org/apache/fop/fo/PropertyListBuilder.java | 3 | ||||
-rw-r--r-- | src/org/apache/fop/fo/StandardElementMapping.java | 1 | ||||
-rw-r--r-- | src/org/apache/fop/fo/flow/Block.java | 1 | ||||
-rw-r--r-- | src/org/apache/fop/fo/flow/PageNumberCitation.java | 284 | ||||
-rw-r--r-- | src/org/apache/fop/fo/flow/StaticContent.java | 12 | ||||
-rw-r--r-- | src/org/apache/fop/fo/pagination/Root.java | 103 |
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; |