arved       01/07/22 18:58:56

  Modified:    src/org/apache/fop/fo/flow RetrieveMarker.java
  Log:
  AHS: continued work on fo:marker support
  
  Revision  Changes    Path
  1.3       +54 -19    xml-fop/src/org/apache/fop/fo/flow/RetrieveMarker.java
  
  Index: RetrieveMarker.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/flow/RetrieveMarker.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RetrieveMarker.java       2001/07/16 10:43:51     1.2
  +++ RetrieveMarker.java       2001/07/23 01:58:56     1.3
  @@ -1,4 +1,4 @@
  -/*-- $Id: RetrieveMarker.java,v 1.2 2001/07/16 10:43:51 arved Exp $-- */
  +/*-- $Id: RetrieveMarker.java,v 1.3 2001/07/23 01:58:56 arved Exp $-- */
   /*
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
  @@ -48,44 +48,72 @@
                // 'retrieve-boundary'. Initially we will always check
                // the containing page
                Page containingPage = area.getPage();
  -             Marker bestMarker = searchPage(containingPage);
  +             Marker bestMarker = searchPage(containingPage, true);
                
                // if marker not yet found, and 'retrieve-boundary' permits,
                // search forward by Page
  -             /* insert code for searching forward by Page, if allowed */
  +             if ((null == bestMarker) && (retrieveBoundary != 
RetrieveBoundary.PAGE)) {
  +                     // System.out.println("Null bestMarker and searching...");
  +                     Page currentPage = containingPage;
  +                     boolean isFirstCall = true;
  +                     while (bestMarker == null) {
  +                             Page previousPage =
  +                                     locatePreviousPage(currentPage, 
retrieveBoundary, isFirstCall);
  +                             isFirstCall = false;
  +                             // System.out.println("Previous page = '" + 
previousPage + "'");
  +                             bestMarker = searchPage(previousPage, false);
  +                             currentPage = previousPage;
  +                     }
  +             }
                
                Status status = new Status(Status.AREA_FULL_NONE);
                if (null != bestMarker) {
  -                     // System.out.println("Laying out marker in area '" + area + 
"'");
  +                     // System.out.println("Laying out marker '" + bestMarker + "' 
in area '" + area + "'");
  +                     // the 'markers' referred to in this method are internal; they 
have
  +                     // nothing to do with fo:marker
  +                     bestMarker.resetMarker();
                        status = bestMarker.layoutMarker(area);
                }
                
                return status;
        }
        
  -     private Marker searchPage(Page page) throws FOPException {
  +     private Marker searchPage(Page page, boolean isContainingPage)
  +             throws FOPException {
                Vector pageMarkers = page.getMarkers();
  -             if (pageMarkers.isEmpty())
  +             if (pageMarkers.isEmpty()) {
  +                     // System.out.println("No markers on page");
                        return null;
  -                     
  +             }
  +             
  +             // if no longer the containing page (fo:retrieve-marker, or the page
  +             // being processed), grab the last qualifying marker on this one
  +             if (!isContainingPage) {
  +                     for (int c = pageMarkers.size(); c > 0; c--) {
  +                             Marker currentMarker = 
(Marker)pageMarkers.elementAt(c-1);
  +                             if 
(currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  +                                     return currentMarker;
  +                             }
  +                     }       
  +             }
  +             
                // search forward if 'first-starting-within-page' or
                // 'first-including-carryover'
  -             Marker fallback = null;
                if (retrievePosition == RetrievePosition.FIC) {
                        for (int c = 0; c < pageMarkers.size(); c++) {
                                Marker currentMarker = 
(Marker)pageMarkers.elementAt(c);
  -                             if 
(currentMarker.getMarkerClassName().equals(retrieveClassName))
  +                             if 
(currentMarker.getMarkerClassName().equals(retrieveClassName)) {
                                        return currentMarker;
  +                             }
                        }
                        
                } else if (retrievePosition == RetrievePosition.FSWP) {
                        for (int c = 0; c < pageMarkers.size(); c++) {
                                Marker currentMarker = 
(Marker)pageMarkers.elementAt(c);
                                if 
(currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  -                                     if (currentMarker.getRegistryArea().isFirst)
  +                                     if (currentMarker.getRegistryArea().isFirst) {
                                                return currentMarker;
  -                                     else if (null == fallback)
  -                                             fallback = currentMarker;
  +                                     }
                                }
                        }
                        
  @@ -93,10 +121,9 @@
                        for (int c = pageMarkers.size(); c > 0; c--) {
                                Marker currentMarker = 
(Marker)pageMarkers.elementAt(c-1);
                                if 
(currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  -                                     if (currentMarker.getRegistryArea().isFirst)
  +                                     if (currentMarker.getRegistryArea().isFirst) {
                                                return currentMarker;
  -                                     else if (null == fallback)
  -                                             fallback = currentMarker;
  +                                     }
                                }
                        }       
                        
  @@ -104,16 +131,24 @@
                        for (int c = pageMarkers.size(); c > 0; c--) {
                                Marker currentMarker = 
(Marker)pageMarkers.elementAt(c-1);
                                if 
(currentMarker.getMarkerClassName().equals(retrieveClassName)) {
  -                                     if (currentMarker.getRegistryArea().isLast)
  +                                     if (currentMarker.getRegistryArea().isLast) {
                                                return currentMarker;
  -                                     else if (null == fallback)
  -                                             fallback = currentMarker;
  +                                     }
                                }
                        }       
                        
                } else {
                        throw new FOPException("Illegal 'retrieve-position' value");
                }
  -             return fallback;
  +             return null;
  +     }
  +     
  +     private Page locatePreviousPage(Page page, int retrieveBoundary,
  +             boolean isFirstCall) {
  +             boolean pageWithinSequence = true;
  +             if (retrieveBoundary == RetrieveBoundary.DOCUMENT)
  +                     pageWithinSequence = false;
  +             return page.getAreaTree().getPreviousPage(page, pageWithinSequence,
  +                     isFirstCall);
        }
   }
  
  
  

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

Reply via email to