From 08f344c994b750f1726d2a95ea998f2867878816 Mon Sep 17 00:00:00 2001 From: fotis Date: Sun, 18 Jun 2000 21:06:24 +0000 Subject: [PATCH] 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 --- src/codegen/properties.xml | 18 +- src/org/apache/fop/fo/FONode.java | 16 +- src/org/apache/fop/fo/FObj.java | 36 ++- .../apache/fop/fo/PropertyListBuilder.java | 3 + .../apache/fop/fo/StandardElementMapping.java | 1 + src/org/apache/fop/fo/flow/Block.java | 1 + .../fop/fo/flow/PageNumberCitation.java | 284 ++++++++++++++++++ src/org/apache/fop/fo/flow/StaticContent.java | 12 +- src/org/apache/fop/fo/pagination/Root.java | 103 +++++-- 9 files changed, 437 insertions(+), 37 deletions(-) create mode 100644 src/org/apache/fop/fo/flow/PageNumberCitation.java 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 @@ HRef false String - + column-width @@ -799,5 +799,21 @@ String auto + + ref-id + RefId + false + String + + + + id + Id + false + String + + + + 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 . For more information on the Apache + Software Foundation, please see . + + */ + +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