]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
1. FOTreeBuilder modified to handle more of the renderer initialization.
authorGlen Mazza <gmazza@apache.org>
Fri, 18 Jun 2004 04:13:54 +0000 (04:13 +0000)
committerGlen Mazza <gmazza@apache.org>
Fri, 18 Jun 2004 04:13:54 +0000 (04:13 +0000)
2. AreaTree now takes a Renderer as a constructor, handles RenderPagesModel initialization.
3. FontInfo object moved from Driver/Document to fo.FOInputHandler.
4. getFontState/getFontInfo now take a fontInfo object directly instead of a apps.Document.
5. validity checking added to PageSequence.java

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

16 files changed:
src/java/org/apache/fop/apps/Document.java
src/java/org/apache/fop/apps/Driver.java
src/java/org/apache/fop/area/AreaTree.java
src/java/org/apache/fop/fo/FOInputHandler.java
src/java/org/apache/fop/fo/FOTreeHandler.java
src/java/org/apache/fop/fo/FObjMixed.java
src/java/org/apache/fop/fo/PropertyManager.java
src/java/org/apache/fop/fo/flow/Leader.java
src/java/org/apache/fop/fo/flow/PageNumber.java
src/java/org/apache/fop/fo/flow/PageNumberCitation.java
src/java/org/apache/fop/fo/pagination/PageSequence.java
src/java/org/apache/fop/fo/pagination/Title.java
src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
src/java/org/apache/fop/render/mif/MIFHandler.java
src/java/org/apache/fop/render/rtf/RTFHandler.java
src/java/org/apache/fop/tools/AreaTreeBuilder.java

index 141ed65265dcfd6794c3f3ba87a89ce627320c89..a910084d62dee666ea52c102cc2a071899ec2db9 100644 (file)
@@ -20,7 +20,6 @@ package org.apache.fop.apps;
 
 // FOP
 import org.apache.fop.fo.FOInputHandler;
-import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.render.Renderer;
 
 // SAX
@@ -35,9 +34,6 @@ public class Document {
     /** The parent Driver object */
     private Driver driver;
 
-    /** The Font information relevant for this document */
-    private FontInfo fontInfo;
-    
     /** The Renderer being used for this document */
     protected Renderer renderer;
 
@@ -53,15 +49,6 @@ public class Document {
      */
     public Document(Driver driver) {
         this.driver = driver;
-        this.fontInfo = new FontInfo();
-    }
-
-    /**
-     * Retrieve the font information for this document
-     * @return the FontInfo instance for this document
-     */
-    public FontInfo getFontInfo() {
-        return this.fontInfo;
     }
 
     /**
@@ -74,7 +61,6 @@ public class Document {
 
     /**
      * Get the renderer for this document
-     *
      * @return the renderer for this document
      */
     public Renderer getRenderer() {
index afdee0e4d85aca6470de15b3f415a53d9597810b..9808c1cdf265ecf76d880d8f681c47fa6f0d191c 100644 (file)
@@ -488,19 +488,7 @@ public class Driver {
             }
 
             currentDocument.renderer = renderer;
-            foInputHandler = new FOTreeHandler(currentDocument, true);
-
-            try {
-                renderer.setupFontInfo(currentDocument.getFontInfo());
-                // check that the "any,normal,400" font exists
-                if (!currentDocument.getFontInfo().isSetupValid()) {
-                    throw new FOPException(
-                            "No default font defined by OutputConverter");
-                }
-                renderer.startRenderer(stream);
-            } catch (IOException e) {
-                throw new FOPException(e);
-            }
+            foInputHandler = new FOTreeHandler(currentDocument, stream, true);
         }
         currentDocument.foInputHandler = foInputHandler;
 
index 2c5d57b05a886e5e4a9bac2d7d395d69b876bb6c..ab7c1562cf03c07c79afc472dbb3829829c102ff 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.area;
 import org.apache.fop.area.extensions.BookmarkData;
 import org.apache.fop.fo.extensions.Outline;
 import org.apache.fop.fo.extensions.Bookmarks;
+import org.apache.fop.render.Renderer;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -67,7 +68,9 @@ public class AreaTree {
     /**
      * Constructor.
      */
-    public AreaTree () {
+    public AreaTree (Renderer renderer) {
+        // this.atModel = new CachedRenderPagesModel(renderer);
+        setTreeModel(new RenderPagesModel(renderer));
     }
 
 
index 67176aa2b419c63b6f6a846f0f5d406ef943433d..8616185dd577932c4b5861049527ac60d9c2d1a1 100644 (file)
@@ -45,6 +45,7 @@ import org.apache.fop.fo.flow.TableCell;
 import org.apache.fop.fo.flow.TableRow;
 import org.apache.fop.fo.pagination.Flow;
 import org.apache.fop.fo.pagination.PageSequence;
+import org.apache.fop.fonts.FontInfo;
 import org.apache.commons.logging.Log;
 
 import org.xml.sax.SAXException;
@@ -67,6 +68,11 @@ public abstract class FOInputHandler {
      */
     public Document doc = null;
 
+    /** 
+     * The Font information relevant for this document
+     */
+    protected FontInfo fontInfo;
+
     /**
      * logging instance
      */
@@ -85,6 +91,7 @@ public abstract class FOInputHandler {
      */
     public FOInputHandler(Document document) {
         doc = document;
+        this.fontInfo = new FontInfo();
     }
 
     /**
@@ -127,6 +134,14 @@ public abstract class FOInputHandler {
         return doc.getDriver();
     }
 
+    /**
+     * Retrieve the font information for this document
+     * @return the FontInfo instance for this document
+     */
+    public FontInfo getFontInfo() {
+        return this.fontInfo;
+    }
+
     /**
      * This method is called to indicate the start of a new document run.
      * @throws SAXException In case of a problem
index 549c73d3be06bc19b2a56fd901b3c91d907431ff..71433631bdeab7f179eff2798f9fe882239e9808 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.fop.fo;
 
 // Java
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.HashSet;
 import java.util.Iterator;
 
@@ -30,7 +31,6 @@ import org.xml.sax.SAXException;
 import org.apache.fop.apps.Document;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.area.AreaTree;
-import org.apache.fop.area.RenderPagesModel;
 import org.apache.fop.area.Title;
 import org.apache.fop.fo.extensions.Bookmarks;
 import org.apache.fop.fo.flow.BasicLink;
@@ -104,15 +104,27 @@ public class FOTreeHandler extends FOInputHandler {
      * Main constructor
      * @param document the apps.Document implementation that governs this
      * FO Tree
+     * @param OutputStream stream to use to output results of renderer
+     *              
      * @param store if true then use the store pages model and keep the
      *              area tree in memory
      */
-    public FOTreeHandler(Document doc, boolean store) {
+    public FOTreeHandler(Document doc, OutputStream stream, boolean store) throws FOPException {
         super(doc);
         
-        areaTree = new AreaTree();
-        // this.atModel = new CachedRenderPagesModel(renderer);
-        areaTree.setTreeModel(new RenderPagesModel(doc.getRenderer()));
+        areaTree = new AreaTree(doc.getRenderer());
+
+        try {
+            doc.getRenderer().setupFontInfo(fontInfo);
+            // check that the "any,normal,400" font exists
+            if (!fontInfo.isSetupValid()) {
+                throw new FOPException(
+                        "No default font defined by OutputConverter");
+            }
+            doc.getRenderer().startRenderer(stream);
+        } catch (IOException e) {
+            throw new FOPException(e);
+        }
         
         if (collectStatistics) {
             runtime = Runtime.getRuntime();
@@ -482,15 +494,6 @@ public class FOTreeHandler extends FOInputHandler {
     public void characters(char[] data, int start, int length) {
     }
 
-    /**
-     * Get the font information for the layout handler.
-     *
-     * @return the font information
-     */
-    public Document getFontInfo() {
-        return doc;
-    }
-
     /**
      * Runs the formatting of this page sequence into the given area tree
      *
index 343787701e482c00e8540cbd934c0cbd9dff0ef2..18ddcf4e4b6e34faf3e114462462333977b6d7a9 100644 (file)
@@ -46,8 +46,8 @@ public class FObjMixed extends FObj {
         if (textInfo == null) {
             // Really only need one of these, but need to get fontInfo
             // stored in propMgr for later use.
-            propMgr.setFontInfo(getFOInputHandler().getDocument());
-            textInfo = propMgr.getTextLayoutProps(getFOInputHandler().getDocument());
+            propMgr.setFontInfo(getFOInputHandler().getFontInfo());
+            textInfo = propMgr.getTextLayoutProps(getFOInputHandler().getFontInfo());
         }
 
         FOText ft = new FOText(data, start, length, textInfo, this);
index 972a224f491e2b8b903db53e3d982e7900c1b1d6..00033b28cc65b54374d65baf0e41f209ab551119 100644 (file)
@@ -19,9 +19,9 @@
 package org.apache.fop.fo;
 
 // FOP
-import org.apache.fop.apps.Document;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fo.properties.Property;
 import org.apache.fop.fo.properties.CommonBorderAndPadding;
 import org.apache.fop.fo.properties.CommonMarginBlock;
@@ -45,7 +45,7 @@ import org.xml.sax.Attributes;
 public class PropertyManager implements Constants {
 
     private PropertyList propertyList;
-    private Document document = null;
+    private FontInfo fontInfo = null;
     private Font fontState = null;
     private CommonBorderAndPadding borderAndPadding = null;
     private CommonHyphenation hyphProps = null;
@@ -71,13 +71,12 @@ public class PropertyManager implements Constants {
     }
 
     /**
-     * Sets the Document object telling the property manager which fonts are
+     * Sets the FontInfo object telling the property manager which fonts are
      * available.
-     * @param document apps.Document implementation containing font
-     * information
+     * @param fontInfo FontInfo object
      */
-    public void setFontInfo(Document document) {
-        this.document = document;
+    public void setFontInfo(FontInfo fontInfo) {
+        this.fontInfo = fontInfo;
     }
 
 
@@ -88,12 +87,12 @@ public class PropertyManager implements Constants {
      * information
      * @return a FontState object
      */
-    public Font getFontState(Document document) {
+    public Font getFontState(FontInfo fontInfo) {
         if (fontState == null) {
-            if (document == null) {
-                document = this.document;
-            } else if (this.document == null) {
-                this.document = document;
+            if (fontInfo == null) {
+                fontInfo = this.fontInfo;
+            } else if (this.fontInfo == null) {
+                this.fontInfo = fontInfo;
             }
             /**@todo this is ugly. need to improve. */
 
@@ -122,9 +121,9 @@ public class PropertyManager implements Constants {
             // various kinds of keywords too
             int fontSize = propertyList.get(PR_FONT_SIZE).getLength().getValue();
             //int fontVariant = propertyList.get("font-variant").getEnum();
-            String fname = document.getFontInfo().fontLookup(fontFamily, fontStyle,
+            String fname = fontInfo.fontLookup(fontFamily, fontStyle,
                                                fontWeight);
-            FontMetrics metrics = document.getFontInfo().getMetricsFor(fname);
+            FontMetrics metrics = fontInfo.getMetricsFor(fname);
             fontState = new Font(fname, metrics, fontSize);
         }
         return fontState;
@@ -458,14 +457,13 @@ public class PropertyManager implements Constants {
     /**
      * Constructs a TextInfo objects. If it was constructed before it is
      * reused.
-     * @param document apps.Document implementation containing list of
-     * available fonts
+     * @param fontInfo FontInfo object containing list of available fonts
      * @return a TextInfo object
      */
-    public TextInfo getTextLayoutProps(Document document) {
+    public TextInfo getTextLayoutProps(FontInfo fontInfo) {
         if (textInfo == null) {
             textInfo = new TextInfo();
-            textInfo.fs = getFontState(document);
+            textInfo.fs = getFontState(fontInfo);
             textInfo.color = propertyList.get(PR_COLOR).getColorType();
 
             textInfo.verticalAlign =
index 3ba0eade2dfbdf9d202d05c77753db8d58372417..42837265e0b1f782a7de5e81b42d42e6bd4dcabd 100644 (file)
@@ -66,7 +66,7 @@ public class Leader extends FObjMixed {
         CommonBackground bProps = propMgr.getBackgroundProps();
 
         // Common Font Properties
-        this.fontState = propMgr.getFontState(getFOInputHandler().getDocument());
+        this.fontState = propMgr.getFontState(getFOInputHandler().getFontInfo());
 
         // Common Margin Properties-Inline
         CommonMarginInline mProps = propMgr.getMarginInlineProps();
index 593c10df442eb3283ca3213f3ae72c0ffd06e4c2..c9b60f3d5cc6df8ccf4896411eaed7fb4696f40a 100644 (file)
@@ -77,7 +77,7 @@ public class PageNumber extends FObj {
         CommonBackground bProps = propMgr.getBackgroundProps();
 
         // Common Font Properties
-        this.fontState = propMgr.getFontState(getFOInputHandler().getDocument());
+        this.fontState = propMgr.getFontState(getFOInputHandler().getFontInfo());
 
         // Common Margin Properties-Inline
         CommonMarginInline mProps = propMgr.getMarginInlineProps();
index 7b343d66ce2230767b54cdeac6f01ce5b675a509..7084305fcbfd1bf66f9c7aafb5280b00642fff30 100644 (file)
@@ -82,7 +82,7 @@ public class PageNumberCitation extends FObj {
         CommonBackground bProps = propMgr.getBackgroundProps();
 
         // Common Font Properties
-        this.fontState = propMgr.getFontState(getFOInputHandler().getDocument());
+        this.fontState = propMgr.getFontState(getFOInputHandler().getFontInfo());
 
         // Common Margin Properties-Inline
         CommonMarginInline mProps = propMgr.getMarginInlineProps();
index fc4d041d75ea14883d4b4d0a70f1fb62e34ad7cc..33e8e044ae0b2957731679acf6bb5ca1fc225aab 100644 (file)
@@ -23,10 +23,12 @@ import java.util.HashMap;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
 
 // FOP
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FOElementMapping;
 import org.apache.fop.fo.FOTreeVisitor;
 import org.apache.fop.apps.FOPException;
 
@@ -130,6 +132,103 @@ public class PageSequence extends FObj {
         super(parent);
     }
 
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
+        XSL/FOP Content Model: (title?,static-content*,flow)
+     */
+    protected void validateChildNode(Locator loc, String nsURI, String localName) {
+        if (nsURI == FOElementMapping.URI) {
+            if (localName.equals("title")) {
+                if (titleFO != null) {
+                    tooManyNodesError(loc, "fo:title");
+                } else if (flowMap.size() > 0) {
+                    nodesOutOfOrderError(loc, "fo:title", "fo:static-content");
+                } else if (mainFlow != null) {
+                    nodesOutOfOrderError(loc, "fo:title", "fo:flow");
+                }
+            } else if (localName.equals("static-content")) {
+                if (mainFlow != null) {
+                    nodesOutOfOrderError(loc, "fo:static-content", "fo:flow");
+                }                
+            } else if (localName.equals("flow")) {
+                if (mainFlow != null) {
+                    tooManyNodesError(loc, "fo:flow");
+                }
+            } else {
+                invalidChildError(loc, nsURI, localName);
+            }
+        } else {
+            invalidChildError(loc, nsURI, localName);
+        }
+    }
+
+    /**
+     * Signal end of this xml element.
+     * This passes the end page sequence to the structure handler
+     * so it can act upon that.
+     */
+    protected void end() {
+        if (mainFlow == null) {
+           missingChildElementError("(title?,static-content*,flow)");
+        }
+        try {
+            getFOInputHandler().endPageSequence(this);
+        } catch (FOPException fopex) {
+            getLogger().error("Error in PageSequence.end(): "
+              + fopex.getMessage(), fopex);
+        }
+    }
+
+    /**
+     * Validate the child being added and initialize internal variables.
+     * XSL content model for page-sequence:
+     * <pre>(title?,static-content*,flow)</pre>
+     *
+     * @param child The flow object child to be added to the PageSequence.
+     */
+    public void addChild(FONode child) {
+        try {
+            String childName = child.getName();
+            if (childName.equals("fo:title")) {
+               this.titleFO = (Title)child;
+            } else if (childName.equals("fo:flow")) {
+                this.mainFlow = (Flow)child;
+                String flowName = this.mainFlow.getFlowName();
+                if (flowMap.containsKey(flowName)) {
+                    throw new FOPException("flow-name "
+                        + flowName
+                        + " is not unique within an fo:page-sequence");
+                }
+                if (!this.layoutMasterSet.regionNameExists(flowName)) {
+                    getLogger().error("region-name '"
+                        + flowName
+                        + "' doesn't exist in the layout-master-set.");
+                }
+                // Don't add main flow to the flow map
+//              addFlow(mainFlow);
+                startStructuredPageSequence();
+                super.addChild(child); // For getChildren
+            } else if (childName.equals("fo:static-content")) {
+                String flowName = ((StaticContent)child).getFlowName();
+                if (flowMap.containsKey(flowName)) {
+                    throw new FOPException("flow-name " + flowName
+                              + " is not unique within an fo:page-sequence");
+                }
+                if (!this.layoutMasterSet.regionNameExists(flowName)) {
+                    throw new FOPException("region-name '" + flowName
+                              + "' doesn't exist in the layout-master-set.");
+                }
+                flowMap.put(flowName, child);
+//              addFlow((Flow)child);
+                startStructuredPageSequence();
+            } 
+        } catch (FOPException fopex) {
+            getLogger().error("Error in PageSequence.addChild(): "
+                + fopex.getMessage(), fopex);
+        }
+    }
+
+
     /**
      * @see org.apache.fop.fo.FObj#addProperties
      */
@@ -220,73 +319,6 @@ public class PageSequence extends FObj {
 //      }
 
 
-    /**
-     * Validate the child being added and initialize internal variables.
-     * XSL content model for page-sequence:
-     * <pre>(title?,static-content*,flow)</pre>
-     *
-     * @param child The flow object child to be added to the PageSequence.
-     */
-    public void addChild(FONode child) {
-        try {
-            String childName = child.getName();
-            if (childName.equals("fo:title")) {
-                if (this.flowMap.size() > 0) {
-                    getLogger().warn("fo:title should be first in page-sequence");
-                } else {
-                    this.titleFO = (Title)child;
-                }
-            } else if (childName.equals("fo:flow")) {
-                if (this.mainFlow != null) {
-                    throw new FOPException("Only a single fo:flow permitted"
-                                           + " per fo:page-sequence");
-                } else {
-                    this.mainFlow = (Flow)child;
-                    String flowName = this.mainFlow.getFlowName();
-                    if (flowMap.containsKey(flowName)) {
-                        throw new FOPException("flow-name "
-                                               + flowName
-                                               + " is not unique within an fo:page-sequence");
-                    }
-                    if (!this.layoutMasterSet.regionNameExists(flowName)) {
-                        getLogger().error("region-name '"
-                                          + flowName
-                                          + "' doesn't exist in the layout-master-set.");
-                    }
-                    // Don't add main flow to the flow map
-//                    addFlow(mainFlow);
-                    startStructuredPageSequence();
-                    super.addChild(child); // For getChildren
-                }
-            } else if (childName.equals("fo:static-content")) {
-                if (this.mainFlow != null) {
-                  throw new FOPException(childName
-                                         + " must precede fo:flow; ignoring");
-                }
-                String flowName = ((StaticContent)child).getFlowName();
-                if (flowMap.containsKey(flowName)) {
-                  throw new FOPException("flow-name " + flowName
-                                         + " is not unique within an fo:page-sequence");
-                }
-                if (!this.layoutMasterSet.regionNameExists(flowName)) {
-                    getLogger().error("region-name '" + flowName
-                                      + "' doesn't exist in the layout-master-set.");
-                }
-                flowMap.put(flowName, child);
-//                    addFlow((Flow)child);
-                startStructuredPageSequence();
-            } else {
-                // Ignore it!
-                getLogger().warn("FO '" + childName
-                    + "' not a legal page-sequence child.");
-                return;
-            }
-        } catch (FOPException fopex) {
-            getLogger().error("Error in PageSequence.addChild(): "
-                + fopex.getMessage(), fopex);
-        }
-    }
-
     /**
      * Start the page-sequence logic in the Structured Handler
      */
@@ -297,19 +329,6 @@ public class PageSequence extends FObj {
         }
     }
 
-    /**
-     * Signal end of this xml element.
-     * This passes the end page sequence to the structure handler
-     * so it can act upon that.
-     */
-    protected void end() {
-        try {
-            getFOInputHandler().endPageSequence(this);
-        } catch (FOPException fopex) {
-            getLogger().error("Error in PageSequence.end(): "
-              + fopex.getMessage(), fopex);
-        }
-    }
 
     /**
      * Initialize the current page number for the start of the page sequence.
index a3b45b74b35f86b53ba8946b111116e2b2ab58f5..70a24b9ccdcb897da093735232b48d6719963377 100644 (file)
@@ -59,7 +59,7 @@ public class Title extends FObjMixed {
         CommonBackground bProps = propMgr.getBackgroundProps();
 
         // Common Font Properties
-        Font fontState = propMgr.getFontState(getFOInputHandler().getDocument());
+        Font fontState = propMgr.getFontState(getFOInputHandler().getFontInfo());
 
         // Common Margin Properties-Inline
         CommonMarginInline mProps = propMgr.getMarginInlineProps();
index 35d640c4d576d4077d3faccd36fd214867fb3533..422da40d93e3e6385379f702ba2bb37c5ab3d8a0 100644 (file)
@@ -74,7 +74,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
         childLMiter = new BlockLMiter(this, childLMiter);
         userAgent = inBlock.getUserAgent();
         setBlockTextInfo(inBlock.getPropertyManager().getTextLayoutProps(
-            inBlock.getFOInputHandler().getDocument()));
+            inBlock.getFOInputHandler().getFontInfo()));
     }
 
     private void setBlockTextInfo(TextInfo ti) {
index c4283f5666f6c78ace5c85bf7796e50430a96988..4bfd23f3af62de7f1ccc746f75607e3809f98c90 100644 (file)
@@ -75,7 +75,7 @@ public class MIFHandler extends FOInputHandler {
     public MIFHandler(Document doc, OutputStream os) {
         super(doc);
         outStream = os;
-        FontSetup.setup(doc.getFontInfo(), null);
+        FontSetup.setup(fontInfo, null);
     }
 
     /**
index a57f91fbabff75bd1bbc3c3a31b3185c53ad2f68..3f508ea351037271241c0c98c69b96ecd9332edf 100644 (file)
@@ -131,7 +131,7 @@ public class RTFHandler extends FOInputHandler {
         bDefer = false;
         bDeferredExecution = false;
         iNestCount=0;
-        FontSetup.setup(doc.getFontInfo(), null);
+        FontSetup.setup(fontInfo, null);
         log.warn(ALPHA_WARNING);
     }
 
index 71b36ecbf55eb188ad871ee3c18fab5866d62a7f..d2d0baff951f7694fca8590460d0cbfc51e2cb8a 100644 (file)
@@ -160,13 +160,13 @@ public class AreaTreeBuilder {
         }
 
         rend.setLogger(logger);
-        org.apache.fop.apps.Document doc = new org.apache.fop.apps.Document(null);
-        rend.setupFontInfo(doc.getFontInfo());
+        FontInfo fontInfo = new FontInfo();
+        rend.setupFontInfo(fontInfo);
         FOUserAgent ua = new FOUserAgent();
         rend.setUserAgent(ua);
 
         StorePagesModel sm = AreaTree.createStorePagesModel();
-        TreeLoader tl = new TreeLoader(doc);
+        TreeLoader tl = new TreeLoader(rend, fontInfo);
         tl.setLogger(logger);
         tl.setTreeModel(sm);
         try {
@@ -238,12 +238,14 @@ public class AreaTreeBuilder {
 class TreeLoader {
     private AreaTree areaTree;
     private AreaTreeModel model;
-    private org.apache.fop.apps.Document document;
+    private Renderer renderer;
+    private FontInfo fontInfo;
     private Font currentFontState;
     private Log logger = null;
 
-    TreeLoader(org.apache.fop.apps.Document doc) {
-        document = doc;
+    TreeLoader(Renderer renderer, FontInfo fontInfo) {
+        this.renderer = renderer;
+        this.fontInfo = fontInfo;
     }
 
     /**
@@ -271,7 +273,7 @@ class TreeLoader {
         Element root = null;
         root = doc.getDocumentElement();
 
-        areaTree = new AreaTree();
+        areaTree = new AreaTree(renderer);
         areaTree.setTreeModel(model);
 
         readAreaTree(root);
@@ -558,8 +560,8 @@ class TreeLoader {
                 Character ch =
                   new Character(getString((Element) obj).charAt(0));
                 addTraits((Element) obj, ch);
-                String fname = document.getFontInfo().fontLookup("sans-serif", "normal", Font.NORMAL);
-                FontMetrics metrics = document.getFontInfo().getMetricsFor(fname);
+                String fname = fontInfo.fontLookup("sans-serif", "normal", Font.NORMAL);
+                FontMetrics metrics = fontInfo.getMetricsFor(fname);
                 currentFontState =
                     new Font(fname, metrics, 12000);
 
@@ -583,8 +585,8 @@ class TreeLoader {
                     list.add(leader);
                 }
             } else if (obj.getNodeName().equals("word")) {
-                String fname = document.getFontInfo().fontLookup("sans-serif", "normal", Font.NORMAL);
-                FontMetrics metrics = document.getFontInfo().getMetricsFor(fname);
+                String fname = fontInfo.fontLookup("sans-serif", "normal", Font.NORMAL);
+                FontMetrics metrics = fontInfo.getMetricsFor(fname);
                 currentFontState =
                     new Font(fname, metrics, 12000);
                 TextArea text = getText((Element) obj);