diff options
Diffstat (limited to 'src/java/org/apache')
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 <jtauber@jtauber.com>. For more information on the Apache * Software Foundation, please see <http://www.apache.org/>. - */ + */ 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 @@ -74,6 +74,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. */ void init(); 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; + } + } |