]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Now uses IDReferences to search for page numbers
authorJordan Naftolin <jordan@apache.org>
Wed, 28 Jun 2000 17:51:43 +0000 (17:51 +0000)
committerJordan Naftolin <jordan@apache.org>
Wed, 28 Jun 2000 17:51:43 +0000 (17:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193444 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/fo/flow/PageNumberCitation.java

index 7f00a6efcef934f9d7d366f28683205149d5a25b..d9faf67c3d437f068cbc7297f99beb98862f8129 100644 (file)
@@ -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);
-       }
+    }
 
-    
 }