From 925268e364bd4bb9d59b61e53d48077dc1dcb34a Mon Sep 17 00:00:00 2001 From: William Victor Mote Date: Fri, 12 Sep 2003 18:57:34 +0000 Subject: [PATCH] 1. tie the LMIter objects to their LM "parent" 2. tie the PageLayoutManager object to its parent LayoutManagerLS 3. create methods for going up the LM tree to get to the LayoutManagerLS 4. store an AddLMVisitor object in LayoutManagerLS so that subclasses can be stored there and used instead of AddLMVisitor itself (so that third-party users can subclass instead of modifying AddLMVisitor) 5. use the stored AddLMVisitor instead of creating one for each LMIter 6. add some accessor methods to AddLMVisitor so that subclasses can use Lists stored therein git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@196901 13f79535-47bb-0310-9956-ffa450edef68 --- .../fop/layoutmgr/AbstractLayoutManager.java | 30 ++++++++++++------- .../apache/fop/layoutmgr/AddLMVisitor.java | 22 ++++++++++++-- .../fop/layoutmgr/BlockLayoutManager.java | 6 ++-- .../fop/layoutmgr/ContentLayoutManager.java | 8 +++++ src/java/org/apache/fop/layoutmgr/LMiter.java | 7 +++-- .../apache/fop/layoutmgr/LayoutManagerLS.java | 28 +++++++++++++++-- .../apache/fop/layoutmgr/LayoutProcessor.java | 12 ++++++++ .../fop/layoutmgr/PageLayoutManager.java | 10 ++++++- 8 files changed, 101 insertions(+), 22 deletions(-) diff --git a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java index 7f113b851..cc8f85d07 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java @@ -3,34 +3,34 @@ * ============================================================================ * The Apache Software License, Version 1.1 * ============================================================================ - * + * * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. - * + * * 4. The names "FOP" and "Apache Software Foundation" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact * apache@apache.org. - * + * * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. - * + * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE @@ -42,12 +42,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ============================================================================ - * + * * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation and was originally created by * James Tauber . For more information on the Apache * Software Foundation, please see . - */ + */ package org.apache.fop.layoutmgr; import org.apache.fop.fo.FObj; @@ -94,7 +94,7 @@ public abstract class AbstractLayoutManager implements LayoutProcessor { this.fobj = fo; foID = fobj.getID(); markers = fobj.getMarkers(); - childLMiter = new LMiter(fobj.getChildren()); + childLMiter = new LMiter(this, fobj.getChildren()); } /** @@ -123,6 +123,14 @@ public abstract class AbstractLayoutManager implements LayoutProcessor { this.parentLM = lm; } + public LayoutProcessor getParent() { + return this.parentLM; + } + + public LayoutManagerLS getLayoutManagerLS() { + return getParent().getLayoutManagerLS(); + } + // /** // * Ask the parent LayoutManager to add the current (full) area to the // * appropriate parent area. diff --git a/src/java/org/apache/fop/layoutmgr/AddLMVisitor.java b/src/java/org/apache/fop/layoutmgr/AddLMVisitor.java index 36278a558..600ca2449 100644 --- a/src/java/org/apache/fop/layoutmgr/AddLMVisitor.java +++ b/src/java/org/apache/fop/layoutmgr/AddLMVisitor.java @@ -159,6 +159,22 @@ public class AddLMVisitor extends FOTreeVisitor { fobj.acceptVisitor(this); } + /** + * Accessor for the currentLMList. + * @return the currentLMList. + */ + public List getCurrentLMList() { + return currentLMList; + } + + /** + * Accessor for the saveLMList. + * @return the saveLMList. + */ + public List getSaveLMList() { + return saveLMList; + } + public void serveVisitor(FOText node) { if (node.length == 0) { return; @@ -180,7 +196,7 @@ public class AddLMVisitor extends FOTreeVisitor { Document doc = (Document)node.getFOTreeControl(); lm.setUserAgent(node.getUserAgent()); lm.setFObj(node); - lm.setLMiter(new LMiter(node.getChildren())); + lm.setLMiter(new LMiter(lm, node.getChildren())); currentLMList.add(lm); } } @@ -249,7 +265,7 @@ public class AddLMVisitor extends FOTreeVisitor { }; lm.setUserAgent(node.getUserAgent()); lm.setFObj(node); - lm.setLMiter(new LMiter(node.getChildren())); + lm.setLMiter(new LMiter(lm, node.getChildren())); currentLMList.add(lm); } @@ -357,7 +373,7 @@ public class AddLMVisitor extends FOTreeVisitor { lm = new InlineStackingLayoutManager(); lm.setUserAgent(node.getUserAgent()); lm.setFObj(node); - lm.setLMiter(new LMiter(node.getChildren())); + lm.setLMiter(new LMiter(lm, node.getChildren())); lm.init(); // get breaks then add areas to FilledArea diff --git a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java index 7b0cf26a0..0681fdb27 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java @@ -94,8 +94,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager { private ListIterator proxy; - public BlockLMiter(ListIterator pr) { - super(null); + public BlockLMiter(LayoutProcessor lp, ListIterator pr) { + super(lp, null); proxy = pr; } @@ -152,7 +152,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager { */ public void setFObj(FObj fo) { super.setFObj(fo); - childLMiter = new BlockLMiter(childLMiter); + childLMiter = new BlockLMiter(this, childLMiter); } public void setBlockTextInfo(TextInfo ti) { diff --git a/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java index c6d07d335..ad92d7ca8 100644 --- a/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/ContentLayoutManager.java @@ -208,6 +208,14 @@ public class ContentLayoutManager implements LayoutProcessor { parentLM = lm; } + public LayoutProcessor getParent() { + return this.parentLM; + } + + public LayoutManagerLS getLayoutManagerLS() { + return getParent().getLayoutManagerLS(); + } + /** @see org.apache.fop.layoutmgr.LayoutManager */ public boolean canBreakBefore(LayoutContext lc) { return false; diff --git a/src/java/org/apache/fop/layoutmgr/LMiter.java b/src/java/org/apache/fop/layoutmgr/LMiter.java index 0fee8cdf7..8ace2a2ad 100644 --- a/src/java/org/apache/fop/layoutmgr/LMiter.java +++ b/src/java/org/apache/fop/layoutmgr/LMiter.java @@ -64,9 +64,11 @@ public class LMiter implements ListIterator { private FObj curFO; protected List listLMs; protected int curPos = 0; - private AddLMVisitor addLMVisitor = new AddLMVisitor(); + /** The LayoutProcessor to which this LMiter is attached **/ + private LayoutProcessor lp; - public LMiter(ListIterator bIter) { + public LMiter(LayoutProcessor lp, ListIterator bIter) { + this.lp = lp; baseIter = bIter; listLMs = new ArrayList(10); } @@ -76,6 +78,7 @@ public class LMiter implements ListIterator { } protected boolean preLoadNext() { + AddLMVisitor addLMVisitor = lp.getLayoutManagerLS().getAddLMVisitor(); // skip over child FObj's that don't add lms while (baseIter != null && baseIter.hasNext()) { Object theobj = baseIter.next(); diff --git a/src/java/org/apache/fop/layoutmgr/LayoutManagerLS.java b/src/java/org/apache/fop/layoutmgr/LayoutManagerLS.java index 1f8dd7dc7..fc78984a1 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutManagerLS.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutManagerLS.java @@ -67,6 +67,9 @@ import org.apache.fop.fo.FOTreeHandler; public class LayoutManagerLS extends LayoutStrategy { private static String name = "layoutmgr"; + /** Useful only for allowing subclasses of AddLMVisitor to be set by those + extending FOP **/ + private AddLMVisitor addLMVisitor = null; public LayoutManagerLS(Document document) { super(document); @@ -106,7 +109,7 @@ public class LayoutManagerLS extends LayoutStrategy { pageSeq.initPageNumber(); // This will layout pages and add them to the area tree - PageLayoutManager pageLM = new PageLayoutManager(areaTree, pageSeq); + PageLayoutManager pageLM = new PageLayoutManager(areaTree, pageSeq, this); pageLM.setUserAgent(pageSeq.getUserAgent()); pageLM.setFObj(pageSeq); pageLM.setPageCounting(pageSeq.getCurrentPageNumber(), @@ -181,7 +184,7 @@ public class LayoutManagerLS extends LayoutStrategy { lm = new InlineStackingLayoutManager(); lm.setUserAgent(foTitle.getUserAgent()); lm.setFObj(foTitle); - lm.setLMiter(new LMiter(foTitle.children.listIterator())); + lm.setLMiter(new LMiter(lm, foTitle.children.listIterator())); lm.init(); // get breaks then add areas to title @@ -195,4 +198,25 @@ public class LayoutManagerLS extends LayoutStrategy { return title; } + /** + * Public accessor to set the AddLMVisitor object that should be used. + * This allows subclasses of AddLMVisitor to be used, which can be useful + * for extensions to the FO Tree. + * @param addLMVisitor the AddLMVisitor object that should be used. + */ + public void setAddLMVisitor(AddLMVisitor addLMVisitor) { + this.addLMVisitor = addLMVisitor; + } + + /** + * Public accessor to get the AddLMVisitor object that should be used. + * @return the AddLMVisitor object that should be used. + */ + public AddLMVisitor getAddLMVisitor() { + if (this.addLMVisitor == null) { + this.addLMVisitor = new AddLMVisitor(); + } + return this.addLMVisitor; + } + } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutProcessor.java b/src/java/org/apache/fop/layoutmgr/LayoutProcessor.java index 1f3902df2..e4c85ffb6 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutProcessor.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutProcessor.java @@ -73,6 +73,18 @@ public interface LayoutProcessor extends LayoutManager { */ void setParent(LayoutProcessor lm); + /** + * Get the parent layout manager. + * @return the parent layout manager. + */ + LayoutProcessor getParent(); + + /** + * Get the LayoutManagerLS object that is at the top of the LM Tree + * @return the LayoutManagerLS object that is at the top of the LM Tree + */ + LayoutManagerLS getLayoutManagerLS(); + /** * Initialise this layout manager. */ diff --git a/src/java/org/apache/fop/layoutmgr/PageLayoutManager.java b/src/java/org/apache/fop/layoutmgr/PageLayoutManager.java index 76cb1ceca..9861423c5 100644 --- a/src/java/org/apache/fop/layoutmgr/PageLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/PageLayoutManager.java @@ -155,6 +155,8 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable */ private HashMap staticContentLMs = new HashMap(4); + private LayoutManagerLS lmls; + /** * This is the top level layout manager. * It is created by the PageSequence FO. @@ -162,9 +164,11 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable * @param areaTree the area tree to add pages to * @param pageseq the page sequence fo */ - public PageLayoutManager(AreaTree areaTree, PageSequence pageseq) { + public PageLayoutManager(AreaTree areaTree, PageSequence pageseq, + LayoutManagerLS lmls) { this.areaTree = areaTree; pageSequence = pageseq; + this.lmls = lmls; } /** @@ -911,4 +915,8 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable return lm; } + public LayoutManagerLS getLayoutManagerLS() { + return lmls; + } + } -- 2.39.5