]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Moved the logic for creating Spans to MainReference. Moved the overflow/column count
authorGlen Mazza <gmazza@apache.org>
Mon, 28 Mar 2005 06:14:13 +0000 (06:14 +0000)
committerGlen Mazza <gmazza@apache.org>
Mon, 28 Mar 2005 06:14:13 +0000 (06:14 +0000)
check to fo:region-body (will need more work if we allow >1 colcounts w/scrolling again,
as I don't see the ability to alter Numerics.)

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_KnuthStylePageBreaking@198550 13f79535-47bb-0310-9956-ffa450edef68

12 files changed:
src/java/org/apache/fop/area/BodyRegion.java
src/java/org/apache/fop/area/MainReference.java
src/java/org/apache/fop/area/Page.java
src/java/org/apache/fop/area/PageViewport.java
src/java/org/apache/fop/area/RegionReference.java
src/java/org/apache/fop/area/RegionViewport.java
src/java/org/apache/fop/area/Span.java
src/java/org/apache/fop/fo/pagination/RegionBody.java
src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
src/java/org/apache/fop/render/AbstractRenderer.java
src/java/org/apache/fop/render/pdf/PDFRenderer.java
src/java/org/apache/fop/render/xml/XMLRenderer.java

index 7b8faa958ead8f15837664efd24fba974e38374d..41771842e65aa0c892aa0ea0783801d05904f156 100644 (file)
 package org.apache.fop.area;
 
 import org.apache.fop.fo.Constants;
-import org.apache.fop.fo.pagination.RegionBody;
 
 /**
- * This class is a container for all areas that may be generated by
+ * This class is a container for the areas that may be generated by
  * an fo:region-body.  It extends the RegionReference that is used
  * directly by the other region classes.
  * See fo:region-body definition in the XSL Rec for more information.
@@ -34,31 +33,15 @@ public class BodyRegion extends RegionReference {
     private int columnGap;
     private int columnCount;
 
-    /**
-     * Create a new body region area.
-     * This sets the region reference area class to BODY.
-     */
-    public BodyRegion() {
-        super(Constants.FO_REGION_BODY);
-        addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
-        mainReference = new MainReference(this);
-    }
-
     /**
      * Constructor which can read traits directly
      * from an fo:region-body formatting object.
      */
-    public BodyRegion(RegionBody rb) {
-        this();
-        columnCount = rb.getColumnCount();
-        columnGap = rb.getColumnGap();
-        if ((columnCount > 1) && (rb.getOverflow() == Constants.EN_SCROLL)) {
-            // recover by setting 'column-count' to 1. This is allowed but
-            // not required by the spec.
-            log.error("Setting 'column-count' to 1 because "
-                    + "'overflow' is set to 'scroll'");
-            columnCount = 1;
-        }
+    public BodyRegion(int columnCount, int columnGap, RegionViewport parent) {
+        super(Constants.FO_REGION_BODY, parent);
+        this.columnCount = columnCount;
+        this.columnGap = columnGap;
+        mainReference = new MainReference(this);
     }
 
     /**
@@ -155,11 +138,9 @@ public class BodyRegion extends RegionReference {
      * @return a shallow copy of this object
      */
     public Object clone() {
-        BodyRegion br = new BodyRegion();
+        BodyRegion br = new BodyRegion(columnCount, columnGap, regionViewport);
         br.setCTM(getCTM());
         br.setIPD(getIPD());
-        br.columnGap = columnGap;
-        br.columnCount = columnCount;
         br.beforeFloat = beforeFloat;
         br.mainReference = mainReference;
         br.footnote = footnote;
index a63b2733269d84e8b76d1adee025156b217bd058..85a5d7ec17f5b74dbc713ae30cd5f5b1622b2962 100644 (file)
@@ -47,8 +47,15 @@ public class MainReference extends Area {
      *
      * @param span the span area to add
      */
-    public void addSpan(Span span) {
-        spanAreas.add(span);
+    public Span createSpan(boolean spanAll) {
+        RegionViewport rv = parent.getRegionViewport();
+        int ipdWidth = (int) parent.getIPD() -
+            rv.getBorderAndPaddingWidthStart() - rv.getBorderAndPaddingWidthEnd();
+        
+        Span newSpan = new Span(((spanAll) ? 1 : getColumnCount()), 
+                getColumnGap(), ipdWidth);
+        spanAreas.add(newSpan);
+        return getCurrentSpan(); 
     }
 
     /**
@@ -60,6 +67,15 @@ public class MainReference extends Area {
         return spanAreas;
     }
 
+    /**
+     * Get the span area currently being filled (i.e., the last span created)
+     *
+     * @return the active span 
+     */
+    public Span getCurrentSpan() {
+        return (Span) spanAreas.get(spanAreas.size()-1);
+    }
+
     /**
      * indicates whether any child areas have been added to this reference area
      * this is achieved by looping through each span
index 9c1a1aafd3c98ae68edfd50c606066847928a588..56294f3b60e2f1e0d234dbb7aa86505a91ac7550 100644 (file)
@@ -97,7 +97,7 @@ public class Page implements Serializable, Cloneable {
             return true;
         }
         else {
-            BodyRegion body = (BodyRegion)regionBody.getRegion();
+            BodyRegion body = (BodyRegion)regionBody.getRegionReference();
             return body.isEmpty();
         }
     }
index 48c9dd732f285583aab4a036dc447083261fa183..32d4684461e8d63135656ae13992f37bface27e3 100644 (file)
@@ -85,8 +85,19 @@ public class PageViewport implements Resolvable, Cloneable {
      * @return BodyRegion object
      */
     public BodyRegion getBodyRegion() {
-        return (BodyRegion)
-            getPage().getRegionViewport(Constants.FO_REGION_BODY).getRegion();
+        return (BodyRegion) getPage().getRegionViewport(
+                Constants.FO_REGION_BODY).getRegionReference();
+    }    
+
+    /**
+     * Convenience method to create a new Span for this
+     * this PageViewport.
+     * 
+     * @param spanAll whether this is a single-column span
+     * @return Span object created
+     */
+    public Span createSpan(boolean spanAll) {
+        return getBodyRegion().getMainReference().createSpan(spanAll);
     }    
 
     /**
index e1ebf97f31783d7679f30028c0b5d12207d9e992..e4da38fd3ec723d8e6f0196422ee7988e1bc6459 100644 (file)
@@ -24,26 +24,30 @@ import java.util.List;
 import org.apache.fop.fo.Constants;
 
 /**
- * This is a region reference area for the page regions.
- * This area represents a region on the page. It is cloneable
+ * This is a region reference area for a page regions.
+ * This area is the direct child of a region-viewport-area. It is cloneable
  * so the page master can make copies from the original page and regions.
  */
 public class RegionReference extends Area implements Cloneable {
     private int regionClass = Constants.FO_REGION_BEFORE;
     private CTM ctm;
+    private int bpd;
+
     // the list of block areas from the static flow
     private List blocks = new ArrayList();
-
-    private int bpd;
+    
+    // the parent RegionViewport for this object
+    protected RegionViewport regionViewport;
 
     /**
      * Create a new region reference area.
      *
      * @param type the region class type
      */
-    public RegionReference(int type) {
+    public RegionReference(int type, RegionViewport parent) {
         regionClass = type;
         addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
+        regionViewport = parent;
     }
 
     /**
@@ -58,6 +62,13 @@ public class RegionReference extends Area implements Cloneable {
     public void setCTM(CTM ctm) {
         this.ctm = ctm;
     }
+    
+    /**
+     * @return Returns the parent RegionViewport.
+     */
+    public RegionViewport getRegionViewport() {
+        return regionViewport;
+    }
 
     /**
      * Get the current transform of this region.
@@ -121,7 +132,7 @@ public class RegionReference extends Area implements Cloneable {
      * @return a copy of this region reference area
      */
     public Object clone() {
-        RegionReference rr = new RegionReference(regionClass);
+        RegionReference rr = new RegionReference(regionClass, regionViewport);
         rr.ctm = ctm;
         rr.setIPD(getIPD());
         return rr;
index fdcf39a40ce8a64733e896fa58111ef401086399..ff3146e17f000cf0a782c2c2108bb5a5d2be15cc 100644 (file)
@@ -23,17 +23,19 @@ import java.io.IOException;
 import java.util.HashMap;
 
 /**
- * Region Viewport reference area.
- * This area is the viewport for a region and contains a region area.
+ * Region Viewport area.
+ * This object represents the region-viewport-area.  It has a 
+ * region-reference-area as its child.  These areas are described
+ * in the fo:region-body description in the XSL Recommendation.
  */
 public class RegionViewport extends Area implements Cloneable {
     // this rectangle is relative to the page
-    private RegionReference region;
+    private RegionReference regionReference;
     private Rectangle2D viewArea;
     private boolean clip = false;
 
     /**
-     * Create a new region viewport.
+     * Create a new region-viewport-area
      *
      * @param viewArea the view area of this viewport
      */
@@ -43,21 +45,21 @@ public class RegionViewport extends Area implements Cloneable {
     }
 
     /**
-     * Set the region for this region viewport.
+     * Set the region-reference-area for this region viewport.
      *
-     * @param reg the child region inside this viewport
+     * @param reg the child region-reference-area inside this viewport
      */
-    public void setRegion(RegionReference reg) {
-        region = reg;
+    public void setRegionReference(RegionReference reg) {
+        regionReference = reg;
     }
 
     /**
-     * Get the region for this region viewport.
+     * Get the region-reference-area for this region viewport.
      *
-     * @return the child region inside this viewport
+     * @return the child region-reference-area inside this viewport
      */
-    public RegionReference getRegion() {
-        return region;
+    public RegionReference getRegionReference() {
+        return regionReference;
     }
 
     /**
@@ -91,7 +93,7 @@ public class RegionViewport extends Area implements Cloneable {
         out.writeFloat((float) viewArea.getHeight());
         out.writeBoolean(clip);
         out.writeObject(props);
-        out.writeObject(region);
+        out.writeObject(regionReference);
     }
 
     private void readObject(java.io.ObjectInputStream in)
@@ -100,7 +102,7 @@ public class RegionViewport extends Area implements Cloneable {
                                          in.readFloat(), in.readFloat());
         clip = in.readBoolean();
         props = (HashMap)in.readObject();
-        setRegion((RegionReference) in.readObject());
+        setRegionReference((RegionReference) in.readObject());
     }
 
     /**
@@ -111,7 +113,7 @@ public class RegionViewport extends Area implements Cloneable {
      */
     public Object clone() {
         RegionViewport rv = new RegionViewport((Rectangle2D)viewArea.clone());
-        rv.region = (RegionReference)region.clone();
+        rv.regionReference = (RegionReference)regionReference.clone();
         if (props != null) {
             rv.props = (HashMap)props.clone();
         }
index 6e7af8b3c366537ffa63b2f612dc21f5c1da6c57..19e6bcabf40337b7218a99eeb975bf5a19b92c3a 100644 (file)
@@ -82,6 +82,7 @@ public class Span extends Area {
         return height;
     }
 
+
     /**
      * Get the normal flow area for a particular column.
      *
index 47fb7e8e8078c4cdfaa681dfbff19f15ec91271b..a4bd827009fe9a49ef93bbc4e67ee9ca9cb1d4c4 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.FODimension;
 import org.apache.fop.datatypes.Length;
 import org.apache.fop.datatypes.Numeric;
+import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.properties.CommonMarginBlock;
@@ -54,6 +55,16 @@ public class RegionBody extends Region {
         commonMarginBlock = pList.getMarginBlockProps();
         columnCount = pList.get(PR_COLUMN_COUNT).getNumeric();
         columnGap = pList.get(PR_COLUMN_GAP).getLength();
+        
+        if ((getColumnCount() > 1) && (getOverflow() == EN_SCROLL)) {
+            /* This is an error (See XSL Rec, fo:region-body description).
+             * The Rec allows for acting as if "1" is chosen in
+             * these cases, but we will need to be able to change Numeric
+             * values in order to do this.
+             */
+            attributeError("If overflow property is set to \"scroll\"," +
+                    " a column-count other than \"1\" may not be specified.");
+        }
     }
 
     /**
index 6a9e03079f5552847b290995891e46425bebeee6..a84df16a25106ae8a58887267dcfd5a1a9bc3cf6 100644 (file)
@@ -229,7 +229,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
                 //algorithm so we have a BPD and IPD. This may subject to change later when we
                 //start handling more complex cases.
                 if (!firstPart) {
-                    if (curFlowIdx < curSpan.getColumnCount()) {
+                    if (curFlowIdx < curSpan.getColumnCount()-1) {
                         curFlowIdx++;
                     } else {
                         handleBreak(list.getStartOn());
@@ -466,28 +466,9 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
         }
 
         flowBPD = (int) curPage.getBodyRegion().getBPD();
-        createSpan(curPage.getBodyRegion().getColumnCount());
-        return curPage;
-    }
-
-    /**
-     * Creates a new span reference area.
-     * @param numCols number of columns needed for new span
-     */
-    private void createSpan(int numCols) {
-        // get Width or Height as IPD for span
-        BodyRegion bodyRegion = curPage.getBodyRegion();
-        
-        RegionViewport rv = curPage.getPage().getRegionViewport(FO_REGION_BODY);
-        int ipdWidth = (int) rv.getRegion().getIPD() -
-            rv.getBorderAndPaddingWidthStart() - rv.getBorderAndPaddingWidthEnd();
-
-        //TODO currently hardcoding to one column, replace with numCols when ready
-        curSpan = new Span(numCols, bodyRegion.getColumnGap(), ipdWidth);
-
-        //curSpan.setPosition(BPD, newpos);
-        curPage.getBodyRegion().getMainReference().addSpan(curSpan);
+        curSpan = curPage.createSpan(false);
         curFlowIdx = 0;
+        return curPage;
     }
 
     private void layoutSideRegion(int regionID) {
@@ -511,7 +492,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
                 + "for flow " + sc.getFlowName());
         }
         lm.initialize();
-        lm.setRegionReference(rv.getRegion());
+        lm.setRegionReference(rv.getRegionReference());
         lm.setParent(this);
         /*
         LayoutContext childLC = new LayoutContext(0);
@@ -519,7 +500,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
         childLC.setRefIPD(rv.getRegion().getIPD());
         */
         
-        MinOptMax range = new MinOptMax(rv.getRegion().getIPD());
+        MinOptMax range = new MinOptMax(rv.getRegionReference().getIPD());
         lm.doLayout(reg, lm, range);
         
         
@@ -601,7 +582,8 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
             bNeedNewSpan = true;
         }
         if (bNeedNewSpan) {
-            createSpan(numColsNeeded);
+            curSpan = curPage.createSpan(span == Constants.EN_ALL);
+            curFlowIdx = 0;
         }
     }
     
@@ -753,12 +735,14 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
            r.setLayoutDimension(PercentBase.BLOCK_IPD, rvp.getIPD());
            r.setLayoutDimension(PercentBase.BLOCK_BPD, rvp.getBPD());
            if (r.getNameId() == FO_REGION_BODY) {
-               rr = new BodyRegion((RegionBody) r);
+               RegionBody rb = (RegionBody) r;
+               rr = new BodyRegion(rb.getColumnCount(), rb.getColumnGap(),
+                       rvp);
            } else {
-               rr = new RegionReference(r.getNameId());
+               rr = new RegionReference(r.getNameId(), rvp);
            }
-           setRegionPosition(r, rr, rvp.getViewArea());
-           rvp.setRegion(rr);
+           setRegionReferencePosition(rr, r, rvp.getViewArea());
+           rvp.setRegionReference(rr);
            page.setRegionViewport(r.getNameId(), rvp);
        }
 
@@ -785,16 +769,17 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
     }
    
     /**
-     * Set the region position inside the region viewport.
+     * Set the region reference position within the region viewport.
      * This sets the transform that is used to place the contents of
-     * the region.
+     * the region reference.
      *
-     * @param r the region reference area
+     * @param rr the region reference area
+     * @param r the region-xxx formatting object
      * @param absRegVPRect The region viewport rectangle in "absolute" coordinates
      * where x=distance from left, y=distance from bottom, width=right-left
      * height=top-bottom
      */
-    private void setRegionPosition(Region r, RegionReference rr,
+    private void setRegionReferencePosition(RegionReference rr, Region r, 
                                   Rectangle2D absRegVPRect) {
         FODimension reldims = new FODimension(0, 0);
         rr.setCTM(CTM.getCTMandRelDims(r.getReferenceOrientation(),
index 3e03c924f0884d5a8bf63ec066bf5e94fe5260f7..2bbd89fadd2b8bd1016c665bad3e8d50f4bd0b3d 100644 (file)
@@ -259,16 +259,16 @@ public abstract class AbstractRenderer
             currentBPPosition = 0;
             currentIPPosition = 0;
 
-            RegionReference region = port.getRegion();
+            RegionReference regionReference = port.getRegionReference();
             handleRegionTraits(port);
 
             //  shouldn't the viewport have the CTM
-            startVParea(region.getCTM());
+            startVParea(regionReference.getCTM());
             // do after starting viewport area
-            if (region.getRegionClass() == FO_REGION_BODY) {
-                renderBodyRegion((BodyRegion) region);
+            if (regionReference.getRegionClass() == FO_REGION_BODY) {
+                renderBodyRegion((BodyRegion) regionReference);
             } else {
-                renderRegion(region);
+                renderRegion(regionReference);
             }
             endVParea();
         }
index e7e4e8613753bfbf2b737477f223a9c70be847a7..b7cf0f455b118ced32181ac403cba3a27bea0db8 100644 (file)
@@ -517,7 +517,7 @@ public class PDFRenderer extends PrintRenderer {
         float width = (float)(viewArea.getWidth() / 1000f);
         float height = (float)(viewArea.getHeight() / 1000f);
 
-        if (region.getRegion().getRegionClass() == FO_REGION_BODY) {
+        if (region.getRegionReference().getRegionClass() == FO_REGION_BODY) {
             currentBPPosition = region.getBorderAndPaddingWidthBefore();
             currentIPPosition = region.getBorderAndPaddingWidthStart();
         }
index 8fccab4bd21921d84ec0863eef8d81c84bb46e6f..74e993c4ce046ccf8f721c35391bc24ab7721cc4 100644 (file)
@@ -378,7 +378,7 @@ public class XMLRenderer extends AbstractRenderer {
             addTraitAttributes(port);
             addAttribute("rect", port.getViewArea());
             startElement("regionViewport", atts);
-            RegionReference region = port.getRegion();
+            RegionReference region = port.getRegionReference();
             atts.clear();
             addAreaAttributes(region);
             addTraitAttributes(region);