]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
adds support for page-number-citation (limitation: works only for reversed referenced
authorfotis <fotis@unknown>
Sun, 18 Jun 2000 21:06:24 +0000 (21:06 +0000)
committerfotis <fotis@unknown>
Sun, 18 Jun 2000 21:06:24 +0000 (21:06 +0000)
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
src/org/apache/fop/fo/FONode.java
src/org/apache/fop/fo/FObj.java
src/org/apache/fop/fo/PropertyListBuilder.java
src/org/apache/fop/fo/StandardElementMapping.java
src/org/apache/fop/fo/flow/Block.java
src/org/apache/fop/fo/flow/PageNumberCitation.java [new file with mode: 0644]
src/org/apache/fop/fo/flow/StaticContent.java
src/org/apache/fop/fo/pagination/Root.java

index 5ccaed0255b0bfbebd7c7a39651da8e74e5a50a7..90cf720c1dd31efd57d67924ff24043457dcafbd 100644 (file)
     <class-name>HRef</class-name>
     <inherited>false</inherited>
     <datatype>String</datatype>
-    <default></default>
+    <default></default> 
   </property>
   <property>
     <name>column-width</name>
     <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>
 
index de9af88a3f49f0e965d40c6d7faad736489ca3ec..6b55dda5404d787e06ab0d800aa496cb9cc138c4 100644 (file)
@@ -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);
+    }
+
 }
index ec7d6b39633b51cbae2693e34c5a81a0b629141c..45bcfd5f2075890f36027bff1e5068f4527ddcf6 100644 (file)
@@ -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);
+    }
 }
 
index 2fac7d7a007b41f497da5c29c6862e0bc969c62b..2fbb98d63fbd6cc9b4b37fd5e8996495831dec16 100644 (file)
@@ -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) {
index b81a7165f13fd58d3dcc44e0f858058794f06a66..aa294ba556313a2c783426432b0313d29c14caba 100644 (file)
@@ -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",
index e3e7712426f3613edc6f7540bb5d476fc285ca63..0d729a41f280681809cb69274087ca1dabe37288 100644 (file)
@@ -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 (file)
index 0000000..71cc194
--- /dev/null
@@ -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);
+       }
+
+    
+}
+
index 26c07b8f58a5017c7c79586d0e08b33565380b2b..cee450ee8ee0ef47e59740e42b2097c7e3c2ba34 100644 (file)
@@ -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);
index f7f8bbbd691d5e558de29f67092ea5979515df84..8022fca780b590da7389f9bbbb612c720506d197 100644 (file)
@@ -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;