vmote       2003/09/19 11:17:40

  Modified:    src/java/org/apache/fop/fo FOInputHandler.java
                        FOTreeHandler.java
               src/java/org/apache/fop/fo/flow PageNumber.java
               src/java/org/apache/fop/fo/pagination PageSequence.java
               src/java/org/apache/fop/mif MIFHandler.java
               src/java/org/apache/fop/rtf/renderer RTFHandler.java
  Log:
  add support for "xsl-region-before", "xsl-region-after" and fo:page-number tag, 
submitted by Peter Herweg, see http://nagoya.apache.org/bugzilla/show_bug.cgi?id=23274
  
  Revision  Changes    Path
  1.10      +17 -1     xml-fop/src/java/org/apache/fop/fo/FOInputHandler.java
  
  Index: FOInputHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/FOInputHandler.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- FOInputHandler.java       16 Sep 2003 17:33:06 -0000      1.9
  +++ FOInputHandler.java       19 Sep 2003 18:17:40 -0000      1.10
  @@ -61,6 +61,7 @@
   import org.apache.fop.fo.flow.Leader;
   import org.apache.fop.fo.flow.ListBlock;
   import org.apache.fop.fo.flow.ListItem;
  +import org.apache.fop.fo.flow.PageNumber;
   import org.apache.fop.fo.flow.Table;
   import org.apache.fop.fo.flow.TableColumn;
   import org.apache.fop.fo.flow.TableBody;
  @@ -131,6 +132,21 @@
       public abstract void endPageSequence(PageSequence pageSeq) throws FOPException;
   
       /**
  +     *
  +     * @param pagenum PageNumber that is starting.
  +     */
  +    public abstract void startPageNumber(PageNumber pagenum);
  +
  +    /**
  +     *
  +     * @param pagenum PageNumber that is ending.
  +     */
  +    public abstract void endPageNumber(PageNumber pagenum);
  +
  +    /**
  +     * This method is called to indicate the start of a new fo:flow or 
fo:static-content.
  +     * This method also handles fo:static-content tags, because the StaticContent 
class
  +     * is derived from the Flow class.
        *
        * @param fl Flow that is starting.
        */
  
  
  
  1.9       +15 -1     xml-fop/src/java/org/apache/fop/fo/FOTreeHandler.java
  
  Index: FOTreeHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/FOTreeHandler.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FOTreeHandler.java        16 Sep 2003 17:33:06 -0000      1.8
  +++ FOTreeHandler.java        19 Sep 2003 18:17:40 -0000      1.9
  @@ -65,6 +65,7 @@
   import org.apache.fop.fo.flow.Leader;
   import org.apache.fop.fo.flow.ListBlock;
   import org.apache.fop.fo.flow.ListItem;
  +import org.apache.fop.fo.flow.PageNumber;
   import org.apache.fop.fo.flow.Table;
   import org.apache.fop.fo.flow.TableColumn;
   import org.apache.fop.fo.flow.TableBody;
  @@ -514,4 +515,17 @@
           }
       }
   
  +    /**
  +     *
  +     * @param pagenum PageNumber that is starting.
  +     */
  +    public void startPageNumber(PageNumber pagenum) {
  +    }
  +
  +    /**
  +     *
  +     * @param pagenum PageNumber that is ending.
  +     */
  +    public void endPageNumber(PageNumber pagenum) {
  +    }
   }
  
  
  
  1.16      +19 -0     xml-fop/src/java/org/apache/fop/fo/flow/PageNumber.java
  
  Index: PageNumber.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/flow/PageNumber.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- PageNumber.java   19 Sep 2003 14:33:15 -0000      1.15
  +++ PageNumber.java   19 Sep 2003 18:17:40 -0000      1.16
  @@ -50,6 +50,11 @@
    */
   package org.apache.fop.fo.flow;
   
  +// XML
  +import org.xml.sax.Attributes;
  +
  +// FOP
  +import org.apache.fop.apps.FOPException;
   import org.apache.fop.datatypes.ColorType;
   import org.apache.fop.fo.FONode;
   import org.apache.fop.fo.FOTreeVisitor;
  @@ -146,4 +151,18 @@
           fotv.servePageNumber(this);
       }
   
  +    /**
  +     * @see org.apache.fop.fo.FObj#handleAttrs
  +     */
  +    public void handleAttrs(Attributes attlist) throws FOPException {
  +        super.handleAttrs(attlist);
  +
  +        setup();
  +
  +        getFOTreeControl().getFOInputHandler().startPageNumber(this);
  +    }
  +
  +    protected void end() {
  +        getFOTreeControl().getFOInputHandler().endPageNumber(this);
  +    }
   }
  
  
  
  1.14      +4 -0      xml-fop/src/java/org/apache/fop/fo/pagination/PageSequence.java
  
  Index: PageSequence.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/PageSequence.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- PageSequence.java 16 Sep 2003 05:21:06 -0000      1.13
  +++ PageSequence.java 19 Sep 2003 18:17:40 -0000      1.14
  @@ -236,6 +236,10 @@
           // this.properties.get("country");
           // this.properties.get("language");
           setupID();
  +
  +        //call startStructuredPageSequence to ensure, that startPageSequence is 
called
  +        //before startFlow.
  +        startStructuredPageSequence();
       }
   
   
  
  
  
  1.14      +14 -0     xml-fop/src/java/org/apache/fop/mif/MIFHandler.java
  
  Index: MIFHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/mif/MIFHandler.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- MIFHandler.java   19 Sep 2003 14:33:16 -0000      1.13
  +++ MIFHandler.java   19 Sep 2003 18:17:40 -0000      1.14
  @@ -63,6 +63,7 @@
   import org.apache.fop.fo.flow.Leader;
   import org.apache.fop.fo.flow.ListBlock;
   import org.apache.fop.fo.flow.ListItem;
  +import org.apache.fop.fo.flow.PageNumber;
   import org.apache.fop.fo.flow.Table;
   import org.apache.fop.fo.flow.TableBody;
   import org.apache.fop.fo.flow.TableCell;
  @@ -447,5 +448,18 @@
           }
       }
   
  +    /**
  +     *
  +     * @param pagenum PageNumber that is starting.
  +     */
  +    public void startPageNumber(PageNumber pagenum) {
  +    }
  +
  +    /**
  +     *
  +     * @param pagenum PageNumber that is ending.
  +     */
  +    public void endPageNumber(PageNumber pagenum) {
  +    }
   }
   
  
  
  
  1.22      +123 -4    xml-fop/src/java/org/apache/fop/rtf/renderer/RTFHandler.java
  
  Index: RTFHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/rtf/renderer/RTFHandler.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- RTFHandler.java   18 Sep 2003 17:11:51 -0000      1.21
  +++ RTFHandler.java   19 Sep 2003 18:17:40 -0000      1.22
  @@ -66,6 +66,7 @@
   import org.apache.fop.fo.flow.Leader;
   import org.apache.fop.fo.flow.ListBlock;
   import org.apache.fop.fo.flow.ListItem;
  +import org.apache.fop.fo.flow.PageNumber;
   import org.apache.fop.fo.flow.Table;
   import org.apache.fop.fo.flow.TableColumn;
   import org.apache.fop.fo.flow.TableBody;
  @@ -76,10 +77,16 @@
   import org.apache.fop.fo.properties.Constants;
   import org.apache.fop.fo.Property;
   import org.apache.fop.apps.Document;
  +import org.apache.fop.rtf.rtflib.rtfdoc.IRtfAfterContainer;
  +import org.apache.fop.rtf.rtflib.rtfdoc.IRtfBeforeContainer;
  +import org.apache.fop.rtf.rtflib.rtfdoc.IRtfPageNumberContainer;
   import org.apache.fop.rtf.rtflib.rtfdoc.IRtfParagraphContainer;
  +import org.apache.fop.rtf.rtflib.rtfdoc.RtfAfter;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfAttributes;
  +import org.apache.fop.rtf.rtflib.rtfdoc.RtfBefore;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfColorTable;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfDocumentArea;
  +import org.apache.fop.rtf.rtflib.rtfdoc.RtfElement;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfFile;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfParagraph;
   import org.apache.fop.rtf.rtflib.rtfdoc.RtfSection;
  @@ -108,6 +115,14 @@
       private RtfDocumentArea docArea;
       private RtfParagraph para;
       private boolean warned = false;
  +    private boolean bPrevHeaderSpecified=false;//true, if there has been a
  +                                               //header in any page-sequence
  +    private boolean bPrevFooterSpecified=false;//true, if there has been a
  +                                               //footer in any page-sequence
  +    private boolean bHeaderSpecified = false;  //true, if there is a header
  +                                               //in current page-sequence
  +    private boolean bFooterSpecified = false;  //true, if there is a footer
  +                                               //in current page-sequence
       private BuilderContext m_context = new BuilderContext(null);
   
       private static final String ALPHA_WARNING = "WARNING: RTF renderer is "
  @@ -164,10 +179,9 @@
           try {
               sect = docArea.newSection();
               m_context.pushContainer(sect);
  -            if (!warned) {
  -                sect.newParagraph().newText(ALPHA_WARNING);
  -                warned = true;
  -            }
  +
  +            bHeaderSpecified=false;
  +            bFooterSpecified=false;
           } catch (IOException ioe) {
               // FIXME could we throw Exception in all FOInputHandler events?
               log.error("startPageSequence: " + ioe.getMessage());
  @@ -186,12 +200,88 @@
        * @see org.apache.fop.fo.FOInputHandler#startFlow(Flow)
        */
       public void startFlow(Flow fl) {
  +        try {
  +            if (fl.getFlowName().equals("xsl-region-body")) {
  +                // if there is no header in current page-sequence but there has been
  +                // a header in a previous page-sequence, insert an empty header.
  +                if (bPrevHeaderSpecified && !bHeaderSpecified) {
  +                    RtfAttributes attr=new RtfAttributes();
  +                    attr.set(RtfBefore.HEADER);
  +
  +                    final IRtfBeforeContainer contBefore = 
(IRtfBeforeContainer)m_context.getContainer(IRtfBeforeContainer.class,true,this);
  +                    contBefore.newBefore(attr);
  +                }
  +
  +                // if there is no footer in current page-sequence but there has been
  +                // a footer in a previous page-sequence, insert an empty footer.
  +                if (bPrevFooterSpecified && !bFooterSpecified) {
  +                    RtfAttributes attr=new RtfAttributes();
  +                    attr.set(RtfAfter.FOOTER);
  +
  +                    final IRtfAfterContainer contAfter = 
(IRtfAfterContainer)m_context.getContainer(IRtfAfterContainer.class,true,this);
  +                    contAfter.newAfter(attr);
  +                }
  +
  +                // print ALPHA_WARNING
  +                if (!warned) {
  +                    sect.newParagraph().newText(ALPHA_WARNING);
  +                    warned = true;
  +                }
  +            } else if(fl.getFlowName().equals("xsl-region-before")) {
  +                bHeaderSpecified=true;
  +                bPrevHeaderSpecified=true;
  +
  +                final IRtfBeforeContainer c = 
(IRtfBeforeContainer)m_context.getContainer(IRtfBeforeContainer.class,true,this);
  +
  +                RtfAttributes beforeAttributes = ((RtfElement)c).getRtfAttributes();
  +                if ( beforeAttributes == null ) {
  +                    beforeAttributes = new RtfAttributes();
  +                }
  +                beforeAttributes.set(RtfBefore.HEADER);
  +
  +                RtfBefore before = c.newBefore(beforeAttributes);
  +                m_context.pushContainer(before);
  +            } else if(fl.getFlowName().equals("xsl-region-after")) {
  +                bFooterSpecified=true;
  +                bPrevFooterSpecified=true;
  +
  +                final IRtfAfterContainer c = 
(IRtfAfterContainer)m_context.getContainer(IRtfAfterContainer.class,true,this);
  +
  +                RtfAttributes afterAttributes = ((RtfElement)c).getRtfAttributes();
  +                if ( afterAttributes == null ) {
  +                    afterAttributes = new RtfAttributes();
  +                }
  +
  +                afterAttributes.set(RtfAfter.FOOTER);
  +
  +                RtfAfter after = c.newAfter(afterAttributes);
  +                m_context.pushContainer(after);
  +            }
  +        } catch(IOException ioe) {
  +            log.error("startFlow: " + ioe.getMessage());
  +            throw new Error(ioe.getMessage());
  +        } catch(Exception e) {
  +            log.error("startFlow: " + e.getMessage());
  +            throw new Error(e.getMessage());
  +        }
       }
   
       /**
        * @see org.apache.fop.fo.FOInputHandler#endFlow(Flow)
        */
       public void endFlow(Flow fl) {
  +        try {
  +            if (fl.getFlowName().equals("xsl-region-body")) {
  +                //just do nothing
  +            } else if (fl.getFlowName().equals("xsl-region-before")) {
  +                m_context.popContainer();
  +            } else if (fl.getFlowName().equals("xsl-region-after")) {
  +                m_context.popContainer();
  +            }
  +        } catch(Exception e){
  +            log.error("endFlow: " + e.getMessage());
  +            throw new Error(e.getMessage());
  +        }
       }
   
       /**
  @@ -625,4 +715,33 @@
                   greenComponent, blueComponent).intValue();
       }
   
  +    /**
  +     *
  +     * @param pagenum PageNumber that is starting.
  +     */
  +    public void startPageNumber(PageNumber pagenum) {
  +        try {
  +            //insert page number
  +            IRtfPageNumberContainer pageNumberContainer = 
(IRtfPageNumberContainer)m_context.getContainer(IRtfPageNumberContainer.class,true,this);
  +            m_context.pushContainer(pageNumberContainer.newPageNumber());
  +
  +            //set Attribute "WhiteSpaceFalse" in order to prevent the rtf library 
from
  +            //stripping the whitespaces. This applies to whole paragraph.
  +            if(pageNumberContainer instanceof RtfParagraph) {
  +                RtfParagraph para=(RtfParagraph)pageNumberContainer;
  +                para.getRtfAttributes().set("WhiteSpaceFalse");
  +            }
  +        } catch(Exception e) {
  +            log.error("startPageNumber: " + e.getMessage());
  +            throw new Error(e.getMessage());
  +        }
  +    }
  +
  +    /**
  +     *
  +     * @param pagenum PageNumber that is ending.
  +     */
  +    public void endPageNumber(PageNumber pagenum) {
  +        m_context.popContainer();
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to