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);
- }
+ }
-
}