]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Corrected the logic of adding markers. LayoutManagers are responsible
authorSimon Pepping <spepping@apache.org>
Sun, 20 Feb 2005 19:50:47 +0000 (19:50 +0000)
committerSimon Pepping <spepping@apache.org>
Sun, 20 Feb 2005 19:50:47 +0000 (19:50 +0000)
for correctly setting is-first and is-last on the BreakPoss and from
there in the arguments of the addMarkers method. Implemented this for
BlockLM. Also made a small change in the retrieval of markers from
preceding pages.

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

src/java/org/apache/fop/area/PageViewport.java
src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java
src/java/org/apache/fop/layoutmgr/LayoutManager.java
src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java

index 90f3aaba650c4e11483a0617a68552599c2db7c6..78f478b0922ac51cecf68aa91f4cad946df39881 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  */
 
 /* $Id$ */
+
 package org.apache.fop.area;
 
 import java.awt.geom.Rectangle2D;
@@ -27,6 +27,9 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.Iterator;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.fo.Constants;
 
 /**
@@ -38,7 +41,7 @@ import org.apache.fop.fo.Constants;
  * The page (reference area) is then rendered inside the page object
  */
 public class PageViewport implements Resolvable, Cloneable {
-    
+
     private Page page;
     private Rectangle2D viewArea;
     private boolean clip = false;
@@ -51,7 +54,7 @@ public class PageViewport implements Resolvable, Cloneable {
     // once an idref is resolved it is removed
     // when this is empty the page can be rendered
     private HashMap unresolvedIDRefs = new HashMap();
-    
+
     private Map pendingResolved = null;
 
     // hashmap of markers for this page
@@ -62,6 +65,11 @@ public class PageViewport implements Resolvable, Cloneable {
     private Map markerLastEnd = null;
     private Map markerLastAny = null;
 
+    /**
+     * logging instance
+     */
+    protected static Log log = LogFactory.getLog(PageViewport.class);
+
     /**
      * Create a page viewport.
      * @param p the page reference area that holds the contents
@@ -206,11 +214,14 @@ public class PageViewport implements Resolvable, Cloneable {
      * Should this logic be placed in the Page layout manager.
      *
      * @param marks the map of markers to add
-     * @param start if the area being added is starting or ending
-     * @param isfirst isfirst or islast flag
+     * @param starting if the area being added is starting or ending
+     * @param isfirst if the area being added has is-first trait
+     * @param islast if the area being added has is-last trait
      */
-    public void addMarkers(Map marks, boolean start, boolean isfirst) {
-        if (start) {
+    public void addMarkers(Map marks, boolean starting,
+            boolean isfirst, boolean islast) {
+        // at the start of the area, register is-first and any areas
+        if (starting) {
             if (isfirst) {
                 if (markerFirstStart == null) {
                     markerFirstStart = new HashMap();
@@ -218,47 +229,54 @@ public class PageViewport implements Resolvable, Cloneable {
                 if (markerFirstAny == null) {
                     markerFirstAny = new HashMap();
                 }
-                // only put in new values, leave current
+                // first on page: only put in new values, leave current
                 for (Iterator iter = marks.keySet().iterator(); iter.hasNext();) {
                     Object key = iter.next();
                     if (!markerFirstStart.containsKey(key)) {
                         markerFirstStart.put(key, marks.get(key));
+                        log.trace("page " + pageNumberString + ": " + "Adding marker " + key + " to FirstStart");
                     }
                     if (!markerFirstAny.containsKey(key)) {
                         markerFirstAny.put(key, marks.get(key));
+                        log.trace("page " + pageNumberString + ": " + "Adding marker " + key + " to FirstAny");
                     }
                 }
                 if (markerLastStart == null) {
                     markerLastStart = new HashMap();
                 }
-                // replace all
+                // last on page: replace all
                 markerLastStart.putAll(marks);
-
+                log.trace("page " + pageNumberString + ": " + "Adding all markers to LastStart");
             } else {
                 if (markerFirstAny == null) {
                     markerFirstAny = new HashMap();
                 }
-                // only put in new values, leave current
+                // first on page: only put in new values, leave current
                 for (Iterator iter = marks.keySet().iterator(); iter.hasNext();) {
                     Object key = iter.next();
                     if (!markerFirstAny.containsKey(key)) {
                         markerFirstAny.put(key, marks.get(key));
+                        log.trace("page " + pageNumberString + ": " + "Adding marker " + key + " to FirstAny");
                     }
                 }
             }
-        } else {
-            if (!isfirst) {
+        }
+        // at the end of the area, register is-last and any areas
+        else {
+            if (islast) {
                 if (markerLastEnd == null) {
                     markerLastEnd = new HashMap();
                 }
-                // replace all
+                // last on page: replace all
                 markerLastEnd.putAll(marks);
+                log.trace("page " + pageNumberString + ": " + "Adding all markers to LastEnd");
             }
             if (markerLastAny == null) {
                 markerLastAny = new HashMap();
             }
-            // replace all
+            // last on page: replace all
             markerLastAny.putAll(marks);
+            log.trace("page " + pageNumberString + ": " + "Adding all markers to LastAny");
         }
     }
 
@@ -273,38 +291,47 @@ public class PageViewport implements Resolvable, Cloneable {
      */
     public Object getMarker(String name, int pos) {
         Object mark = null;
+        String posName = null;
         switch (pos) {
             case Constants.EN_FSWP:
                 if (markerFirstStart != null) {
                     mark = markerFirstStart.get(name);
+                    posName = "FSWP";
                 }
                 if (mark == null && markerFirstAny != null) {
                     mark = markerFirstAny.get(name);
+                    posName = "FirstAny after " + posName;
                 }
             break;
             case Constants.EN_FIC:
                 if (markerFirstAny != null) {
                     mark = markerFirstAny.get(name);
+                    posName = "FIC";
                 }
             break;
             case Constants.EN_LSWP:
                 if (markerLastStart != null) {
                     mark = markerLastStart.get(name);
+                    posName = "LSWP";
                 }
                 if (mark == null && markerLastAny != null) {
                     mark = markerLastAny.get(name);
+                    posName = "LastAny after " + posName;
                 }
             break;
             case Constants.EN_LEWP:
                 if (markerLastEnd != null) {
                     mark = markerLastEnd.get(name);
+                    posName = "LEWP";
                 }
                 if (mark == null && markerLastAny != null) {
                     mark = markerLastAny.get(name);
+                    posName = "LastAny after " + posName;
                 }
             break;
         }
-        return mark;
+        log.trace("page " + pageNumberString + ": " + "Retrieving marker " + name + "at position " + posName); 
+        return mark;    
     }
 
     /**
@@ -361,7 +388,7 @@ public class PageViewport implements Resolvable, Cloneable {
     public void clear() {
         page = null;
     }
-    
+
     /**
      * @see java.lang.Object#toString()
      */
@@ -371,4 +398,4 @@ public class PageViewport implements Resolvable, Cloneable {
         sb.append(getPageNumberString());
         return sb.toString();
     }
-}
+}
\ No newline at end of file
index 4e6c6221fdc74d35fde7c6b00b077696814af752..ceb8184acb303fef3288a3cffa22cc324ae88f53 100644 (file)
@@ -358,10 +358,10 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
     /**
      * Add the markers when adding an area.
      */
-    protected void addMarkers(boolean start, boolean isfirst) {
+    protected void addMarkers(boolean starting, boolean isfirst, boolean islast) {
         // add markers
         if (markers != null) {
-            addMarkerMap(markers, start, isfirst);
+            addMarkerMap(markers, starting, isfirst, islast);
         }
     }
 
@@ -370,8 +370,8 @@ public abstract class AbstractLayoutManager implements LayoutManager, Constants
      *
      * @see org.apache.fop.layoutmgr.LayoutManager
      */
-    public void addMarkerMap(Map marks, boolean start, boolean isfirst) {
-        parentLM.addMarkerMap(marks, start, isfirst);
+    public void addMarkerMap(Map marks, boolean starting, boolean isfirst, boolean islast) {
+        parentLM.addMarkerMap(marks, starting, isfirst, islast);
     }
 
     /**
index a92558ee2a15209ec5fb143df5c575dae4aca158..2d789328ddf9903d0b5783a7f539363ca3f5ec84 100644 (file)
@@ -449,8 +449,9 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
             foBlockSpaceBefore = null;
         }*/
 
+        BreakPoss bp1 = (BreakPoss)parentIter.peekNext();
         addID(fobj.getId());
-        addMarkers(true, true);
+        addMarkers(true, bp1.isFirstArea(), bp1.isLastArea());
 
         LayoutManager childLM;
         int iStartPos = 0;
@@ -468,7 +469,7 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager {
         }
 
         flush();
-        addMarkers(true, true);
+        addMarkers(true, bp1.isFirstArea(), bp1.isLastArea());
 
         /*
         if (!isAbsoluteOrFixed()) {
index 454afa2bdf1e9ec10d5cb905fb16fbea67d225df..55354fe40bc57c722c355f30baa1c22375252838 100644 (file)
@@ -70,6 +70,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
     /** The list of child BreakPoss instances. */
     protected List childBreaks = new java.util.ArrayList();
 
+    private boolean isfirst = true;
+
     /**
      * Creates a new BlockLayoutManager.
      * @param inBlock the block FO object to create the layout manager for.
@@ -269,12 +271,21 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
                     breakPoss.setFlag(BreakPoss.NEXT_OVERFLOWS, true);
                 }
                 breakPoss.setStackingSize(stackSize);
+                if (isfirst && breakPoss.getStackingSize().opt > 0) {
+                    breakPoss.setFlag(BreakPoss.ISFIRST, true);
+                    isfirst = false;
+                }
+                if (isFinished()) {
+                    breakPoss.setFlag(BreakPoss.ISLAST, true);
+                }
                 return breakPoss;
             }
         }
         setFinished(true);
         BreakPoss breakPoss = new BreakPoss(new LeafPosition(this, FINISHED_LEAF_POS));
         breakPoss.setStackingSize(stackSize);
+        breakPoss.setFlag(BreakPoss.ISFIRST, isfirst);
+        breakPoss.setFlag(BreakPoss.ISLAST, true);
         return breakPoss;
     }
 
@@ -295,7 +306,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
 
         if (!isBogus()) {
             addID(fobj.getId());
-            addMarkers(true, true);
+            addMarkers(true, bp1.isFirstArea(), bp1.isLastArea());
         }
 
         try {
@@ -317,7 +328,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
             }
         } finally {
             if (!isBogus()) {
-                addMarkers(false, true);
+                addMarkers(false, bp1.isFirstArea(), bp1.isLastArea());
             }
             flush();
 
index 06cd942304569f37f27ec2ef65b5bc7aceba9346..e1dc46e89ff7e240b1244b14eef6bcdb2390ca73 100644 (file)
@@ -254,8 +254,8 @@ public class ContentLayoutManager implements InlineLevelLayoutManager {
     }
 
     /** @see org.apache.fop.layoutmgr.LayoutManager */
-    public void addMarkerMap(Map marks, boolean start, boolean isfirst) {
-        parentLM.addMarkerMap(marks, start, isfirst);
+    public void addMarkerMap(Map marks, boolean starting, boolean isfirst, boolean islast) {
+        parentLM.addMarkerMap(marks, starting, isfirst, islast);
     }
 
     /** @see org.apache.fop.layoutmgr.LayoutManager */
index 93b6742817db8ff074a1fd534eeeb5b265048be2..a06da78bec91203a90b4396e65ac82dc82be4ad7 100644 (file)
@@ -207,10 +207,11 @@ public interface LayoutManager {
      * method is used to add those markers to the page.
      *
      * @param name the marker class name
-     * @param start true if the formatting object is starting false is finishing
-     * @param isfirst a flag for is first
+     * @param starting if the area being added is starting or ending
+     * @param isfirst if the area being added has is-first trait
+     * @param islast if the area being added has is-last trait
      */
-    void addMarkerMap(Map marks, boolean start, boolean isfirst);
+    void addMarkerMap(Map marks, boolean starting, boolean isfirst, boolean islast);
 
     /**
      * Retrieve a marker.
index f08bf58206dd837e982d154d5217c12097ab83ad..a571ffa862b795e2c453223068de17b7224d2570 100644 (file)
@@ -335,14 +335,12 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
     /**
      * Add the marker to the page layout manager.
      *
-     * @param name the marker class name
-     * @param lm the layout manager for the marker contents
-     * @param start true if starting marker area, false for ending
+     * @see org.apache.fop.layoutmgr.LayoutManager
      */
-    public void addMarkerMap(Map marks, boolean start, boolean isfirst) {
+    public void addMarkerMap(Map marks, boolean starting, boolean isfirst, boolean islast) {
         //getLogger().debug("adding markers: " + marks + ":" + start);
         // add markers to page on area tree
-        curPage.addMarkers(marks, start, isfirst);
+        curPage.addMarkers(marks, starting, isfirst, islast);
     }
 
     /**
@@ -351,6 +349,11 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
      * current page. For page-sequence and document it will
      * lookup preceding pages from the area tree and try to find
      * a marker.
+     * If we retrieve a marker from a preceding page,
+     * then the containing page does not have a qualifying area,
+     * and all qualifying areas have ended.
+     * Therefore we use last-ending-within-page (Constants.EN_LEWP)
+     * as the position. 
      *
      * @param name the marker class name to lookup
      * @param pos the position to locate the marker
@@ -372,7 +375,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager {
             }
             while (page >= 0) {
                 PageViewport pv = areaTreeModel.getPage(seq, page);
-                mark = (Marker)pv.getMarker(name, pos);
+                mark = (Marker)pv.getMarker(name, Constants.EN_LEWP);
                 if (mark != null) {
                     return mark;
                 }