diff options
author | Jordan Naftolin <jordan@apache.org> | 2000-06-28 17:51:43 +0000 |
---|---|---|
committer | Jordan Naftolin <jordan@apache.org> | 2000-06-28 17:51:43 +0000 |
commit | 2321d7891d27510f44cd51f34f6f7a87beb2283b (patch) | |
tree | 3a75027b7783fa534d83f7f2ba24b909e421b6d9 /src | |
parent | 91fac2e0e2f5e65d708ce24cfc1c04485fa6e184 (diff) | |
download | xmlgraphics-fop-2321d7891d27510f44cd51f34f6f7a87beb2283b.tar.gz xmlgraphics-fop-2321d7891d27510f44cd51f34f6f7a87beb2283b.zip |
Now uses IDReferences to search for page numbers
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193444 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/org/apache/fop/fo/flow/PageNumberCitation.java | 328 |
1 files changed, 125 insertions, 203 deletions
diff --git a/src/org/apache/fop/fo/flow/PageNumberCitation.java b/src/org/apache/fop/fo/flow/PageNumberCitation.java index 7f00a6efc..d9faf67c3 100644 --- a/src/org/apache/fop/fo/flow/PageNumberCitation.java +++ b/src/org/apache/fop/fo/flow/PageNumberCitation.java @@ -64,227 +64,149 @@ import org.apache.fop.apps.FOPException; 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"] - */ +/** +* 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 FObj make(FObj parent, PropertyList propertyList) throws FOPException + { + return new PageNumberCitation(parent, propertyList); + } } public static FObj.Maker maker() { - return new PageNumberCitation.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; - + FontState fs; + float red; + float green; + float blue; + int wrapOption; + int whiteSpaceTreatment; + Area area; + public PageNumberCitation(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "fo:page-number"; - idPageNumber = -2; + super(parent, propertyList); + this.name = "fo:page-number-citation"; } - - 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)) - { - MessageHandler.errorln("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; - - // initialize id - String id = this.properties.get("id").getString(); - area.getIDReferences().initializeID(id,area); - } - - if(idPageNumber <0) - { - FObj root; - refId = this.properties.get("ref-id").getString(); -//MessageHandler.logln("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) - { -//MessageHandler.logln("PageNumberCitation.layout() found citation"); - Status s = resolvePageNumber(); - if(s.isIncomplete()) - { - ((Root)root).addUnresolvedCitation((Object)this); - return new Status(Status.OK); - } - } - } - else - { -//MessageHandler.logln("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 layout(Area area) throws FOPException + { + if ( !(area instanceof BlockArea) ) + { + MessageHandler.errorln("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; + + // initialize id + String id = this.properties.get("id").getString(); + area.getIDReferences().initializeID(id,area); + } + + String refId = this.properties.get("ref-id").getString(); + IDReferences idReferences= area.getIDReferences(); + + String pageNumber=idReferences.getPageNumber(refId); + String output = (pageNumber!=null)?pageNumber:"?"; + + + int orig_start = this.marker; + + this.marker = ((BlockArea) area).addText(fs, red, green, blue, wrapOption, null, whiteSpaceTreatment, output.toCharArray(), 0, output.length()); + + if ( this.marker == -1 ) + { + return new Status(Status.OK); + } + else if ( this.marker != orig_start ) + { + return new Status(Status.AREA_FULL_SOME); + } + else + { + return new Status(Status.AREA_FULL_NONE); + } - public Status resolvePageNumber() - { - idPageNumber = citation.getPageNumber(); -//MessageHandler.logln("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); - } + } - } |