]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
add support for "xsl-region-before", "xsl-region-after" and fo:page-number tag, submi...
authorWilliam Victor Mote <vmote@apache.org>
Fri, 19 Sep 2003 18:17:40 +0000 (18:17 +0000)
committerWilliam Victor Mote <vmote@apache.org>
Fri, 19 Sep 2003 18:17:40 +0000 (18:17 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@196927 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/FOInputHandler.java
src/java/org/apache/fop/fo/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

index 7a2b1a281dbac92a36e5d62a0eec68b99efab679..9b525459253533b1189cee6e5c5bb82d69a5ccbd 100644 (file)
@@ -61,6 +61,7 @@ import org.apache.fop.fo.flow.InstreamForeignObject;
 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 class FOInputHandler extends AbstractLogEnabled {
     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.
      */
index a205f263dad46d16a771e5cd73b0eac08559a442..2362db1b9ef4eb049e209a57255ef586dd06e5c1 100644 (file)
@@ -65,6 +65,7 @@ import org.apache.fop.fo.flow.InstreamForeignObject;
 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 @@ public class FOTreeHandler extends FOInputHandler {
         }
     }
 
+    /**
+     *
+     * @param pagenum PageNumber that is starting.
+     */
+    public void startPageNumber(PageNumber pagenum) {
+    }
+
+    /**
+     *
+     * @param pagenum PageNumber that is ending.
+     */
+    public void endPageNumber(PageNumber pagenum) {
+    }
 }
index e936e35d8c8cdc7c130396588fe877d9fc0df605..d0d1c18992c6c763b6f32a6081919e2aef064b3a 100644 (file)
  */
 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 @@ public class PageNumber extends FObj {
         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);
+    }
 }
index c5615322fb40cc5b83a11b1772856c5efea354ab..31f9cd15708415e85ec9bc3c9d2a7598b7c551e2 100644 (file)
@@ -236,6 +236,10 @@ public class PageSequence extends FObj {
         // this.properties.get("country");
         // this.properties.get("language");
         setupID();
+
+        //call startStructuredPageSequence to ensure, that startPageSequence is called
+        //before startFlow.
+        startStructuredPageSequence();
     }
 
 
index 9d6be61568484893a16fd1f45d03cbc4855837a6..b392c78d323167f9123753ab362ea4793752dcb0 100644 (file)
@@ -63,6 +63,7 @@ import org.apache.fop.fo.flow.InstreamForeignObject;
 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 @@ public class MIFHandler extends FOInputHandler {
         }
     }
 
+    /**
+     *
+     * @param pagenum PageNumber that is starting.
+     */
+    public void startPageNumber(PageNumber pagenum) {
+    }
+
+    /**
+     *
+     * @param pagenum PageNumber that is ending.
+     */
+    public void endPageNumber(PageNumber pagenum) {
+    }
 }
 
index c900aad06745ae741e67ed43c8cf93e3c5dfaadf..6479f06424e7395c774ef8db4f668d57ce7a67cf 100644 (file)
@@ -66,6 +66,7 @@ import org.apache.fop.fo.flow.InstreamForeignObject;
 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.pagination.PageSequence;
 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 @@ public class RTFHandler extends FOInputHandler {
     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 @@ public class RTFHandler extends FOInputHandler {
         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 @@ public class RTFHandler extends FOInputHandler {
      * @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 @@ public class RTFHandler extends FOInputHandler {
                 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();
+    }
 }