From 07e720a15035219c8e9fddd25784043fa2f4619e Mon Sep 17 00:00:00 2001 From: Oleg Tkachenko Date: Sun, 22 Dec 2002 22:40:31 +0000 Subject: [PATCH] AreaTreeModel and its implementations moved out of AreaTree class. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195789 13f79535-47bb-0310-9956-ffa450edef68 --- src/org/apache/fop/apps/LayoutHandler.java | 8 +- src/org/apache/fop/area/AreaTree.java | 319 ------------------ src/org/apache/fop/area/AreaTreeModel.java | 39 +++ .../fop/area/CachedRenderPagesModel.java | 2 +- src/org/apache/fop/area/RenderPagesModel.java | 179 ++++++++++ src/org/apache/fop/area/StorePagesModel.java | 137 ++++++++ src/org/apache/fop/tools/AreaTreeBuilder.java | 17 +- 7 files changed, 369 insertions(+), 332 deletions(-) create mode 100644 src/org/apache/fop/area/AreaTreeModel.java create mode 100644 src/org/apache/fop/area/RenderPagesModel.java create mode 100644 src/org/apache/fop/area/StorePagesModel.java diff --git a/src/org/apache/fop/apps/LayoutHandler.java b/src/org/apache/fop/apps/LayoutHandler.java index 3ea82f855..523fef946 100644 --- a/src/org/apache/fop/apps/LayoutHandler.java +++ b/src/org/apache/fop/apps/LayoutHandler.java @@ -17,9 +17,7 @@ import org.xml.sax.SAXException; // FOP import org.apache.fop.layout.FontInfo; -import org.apache.fop.area.AreaTree; -import org.apache.fop.area.Title; -import org.apache.fop.area.TreeExt; +import org.apache.fop.area.*; import org.apache.fop.render.Renderer; import org.apache.fop.fo.pagination.PageSequence; import org.apache.fop.fo.pagination.LayoutMasterSet; @@ -78,7 +76,7 @@ public class LayoutHandler extends StructureHandler { * The current AreaTree for the PageSequence being rendered. */ private AreaTree areaTree; - private AreaTree.AreaTreeModel atModel; + private AreaTreeModel atModel; /** * @param outputStream the stream that the result is rendered to @@ -225,7 +223,7 @@ public class LayoutHandler extends StructureHandler { * @param model the store pages model * @throws FOPException if there is an error */ - private void processAreaTree(AreaTree.StorePagesModel model) throws FOPException { + private void processAreaTree(StorePagesModel model) throws FOPException { int count = 0; int seqc = model.getPageSequenceCount(); while (count < seqc) { diff --git a/src/org/apache/fop/area/AreaTree.java b/src/org/apache/fop/area/AreaTree.java index afb5c72e1..2fc4ddd04 100644 --- a/src/org/apache/fop/area/AreaTree.java +++ b/src/org/apache/fop/area/AreaTree.java @@ -192,324 +192,5 @@ public class AreaTree { } model.endDocument(); } - - /** - * This is the model for the area tree object. - * The model implementation can handle the page sequence, - * page and extensions. - */ - public abstract static class AreaTreeModel { - /** - * Start a page sequence on this model. - * @param title the title of the new page sequence - */ - public abstract void startPageSequence(Title title); - - /** - * Add a page to this moel. - * @param page the page to add to the model. - */ - public abstract void addPage(PageViewport page); - - /** - * Add an extension to this model. - * @param ext the extension to add - * @param when when the extension should be handled - */ - public abstract void addExtension(TreeExt ext, int when); - - /** - * Signal the end of the document for any processing. - */ - public abstract void endDocument(); - } - - /** - * This class stores all the pages in the document - * for interactive agents. - * The pages are stored and can be retrieved in any order. - */ - public static class StorePagesModel extends AreaTreeModel { - private List pageSequence = null; - private List titles = new ArrayList(); - private List currSequence; - private List extensions = new ArrayList(); - - /** - * Create a new store pages model - */ - public StorePagesModel() { - } - - /** - * Start a new page sequence. - * This creates a new list for the pages in the new page sequence. - * @param title the title of the page sequence. - */ - public void startPageSequence(Title title) { - titles.add(title); - if (pageSequence == null) { - pageSequence = new ArrayList(); - } - currSequence = new ArrayList(); - pageSequence.add(currSequence); - } - - /** - * Add a page. - * @param page the page to add to the current page sequence - */ - public void addPage(PageViewport page) { - currSequence.add(page); - } - - /** - * Get the page sequence count. - * @return the number of page sequences in the document. - */ - public int getPageSequenceCount() { - return pageSequence.size(); - } - - /** - * Get the title for a page sequence. - * @param count the page sequence count - * @return the title of the page sequence - */ - public Title getTitle(int count) { - return (Title) titles.get(count); - } - - /** - * Get the page count. - * @param seq the page sequence to count. - * @return returns the number of pages in a page sequence - */ - public int getPageCount(int seq) { - List sequence = (List) pageSequence.get(seq); - return sequence.size(); - } - - /** - * Get the page for a position in the document. - * @param seq the page sequence number - * @param count the page count in the sequence - * @return the PageViewport for the particular page - */ - public PageViewport getPage(int seq, int count) { - List sequence = (List) pageSequence.get(seq); - return (PageViewport) sequence.get(count); - } - - /** - * Add an extension to the store page model. - * The extension is stored so that it can be retrieved in the - * appropriate position. - * @param ext the extension to add - * @param when when the extension should be handled - */ - public void addExtension(TreeExt ext, int when) { - int seq, page; - switch(when) { - case TreeExt.IMMEDIATELY: - seq = pageSequence == null ? 0 : pageSequence.size(); - page = currSequence == null ? 0 : currSequence.size(); - break; - case TreeExt.AFTER_PAGE: - break; - case TreeExt.END_OF_DOC: - break; - } - extensions.add(ext); - } - - /** - * Get the list of extensions that apply at a particular - * position in the document. - * @param seq the page sequence number - * @param count the page count in the sequence - * @return the list of extensions - */ - public List getExtensions(int seq, int count) { - return null; - } - - /** - * Get the end of document extensions for this stroe pages model. - * @return the list of end extensions - */ - public List getEndExtensions() { - return extensions; - } - - /** - * End document, do nothing. - */ - public void endDocument() { - } - } - - /** - * This uses the store pages model to store the pages - * each page is either rendered if ready or prepared - * for later rendering. - * Once a page is rendered it is cleared to release the - * contents but the PageViewport is retained. So even - * though the pages are stored the contents are discarded. - */ - public static class RenderPagesModel extends StorePagesModel { - /** - * The renderer that will render the pages. - */ - protected Renderer renderer; - /** - * Pages that have been prepared but not rendered yet. - */ - protected List prepared = new ArrayList(); - private List pendingExt = new ArrayList(); - private List endDocExt = new ArrayList(); - - /** - * Create a new render pages model with the given renderer. - * @param rend the renderer to render pages to - */ - public RenderPagesModel(Renderer rend) { - renderer = rend; - } - - /** - * Start a new page sequence. - * This tells the renderer that a new page sequence has - * started with the given title. - * @param title the title of the new page sequence - */ - public void startPageSequence(Title title) { - super.startPageSequence(title); - renderer.startPageSequence(title); - } - - /** - * Add a page to the render page model. - * If the page is finished it can be rendered immediately. - * If the page needs resolving then if the renderer supports - * out of order rendering it can prepare the page. Otherwise - * the page is added to a queue. - * @param page the page to add to the model - */ - public void addPage(PageViewport page) { - super.addPage(page); - - // for links the renderer needs to prepare the page - // it is more appropriate to do this after queued pages but - // it will mean that the renderer has not prepared a page that - // could be referenced - boolean done = renderer.supportsOutOfOrder() && page.isResolved(); - if (done) { - try { - renderer.renderPage(page); - } catch (Exception e) { - // use error handler to handle this FOP or IO Exception - e.printStackTrace(); - } - page.clear(); - } else { - preparePage(page); - } - - - // check prepared pages - boolean cont = checkPreparedPages(page); - - if (cont) { - renderExtensions(pendingExt); - pendingExt.clear(); - } - } - - /** - * Check prepared pages - * @return true if the current page should be rendered - * false if the renderer doesn't support out of order - * rendering and there are pending pages - */ - protected boolean checkPreparedPages(PageViewport newpage) { - for (Iterator iter = prepared.iterator(); iter.hasNext();) { - PageViewport p = (PageViewport)iter.next(); - if (p.isResolved()) { - try { - renderer.renderPage(p); - } catch (Exception e) { - // use error handler to handle this FOP or IO Exception - e.printStackTrace(); - } - p.clear(); - iter.remove(); - } else { - // if keeping order then stop at first page not resolved - if (!renderer.supportsOutOfOrder()) { - break; - } - } - } - return renderer.supportsOutOfOrder() || prepared.isEmpty(); - } - - /** - * Prepare a page. - * An unresolved page can be prepared if the renderer supports - * it and the page will be rendered later. - * @param page the page to prepare - */ - protected void preparePage(PageViewport page) { - if (renderer.supportsOutOfOrder()) { - renderer.preparePage(page); - } - prepared.add(page); - } - - /** - * Add an extension to this model. - * If handle immediately then send directly to the renderer. - * The after page ones are handled after the next page is added. - * End of document extensions are added to a list to be - * handled at the end. - * @param ext the extension - * @param when when to render the extension - */ - public void addExtension(TreeExt ext, int when) { - switch(when) { - case TreeExt.IMMEDIATELY: - renderer.renderExtension(ext); - break; - case TreeExt.AFTER_PAGE: - pendingExt.add(ext); - break; - case TreeExt.END_OF_DOC: - endDocExt.add(ext); - break; - } - } - - private void renderExtensions(List list) { - for (int count = 0; count < list.size(); count++) { - TreeExt ext = (TreeExt)list.get(count); - renderer.renderExtension(ext); - } - } - - /** - * End the document. Render any end document extensions. - */ - public void endDocument() { - // render any pages that had unresolved ids - checkPreparedPages(null); - - renderExtensions(pendingExt); - pendingExt.clear(); - - renderExtensions(endDocExt); - } - } - } diff --git a/src/org/apache/fop/area/AreaTreeModel.java b/src/org/apache/fop/area/AreaTreeModel.java new file mode 100644 index 000000000..2c99f1d3d --- /dev/null +++ b/src/org/apache/fop/area/AreaTreeModel.java @@ -0,0 +1,39 @@ +/* +* $Id$ +* Copyright (C) 2002 The Apache Software Foundation. All rights reserved. +* For details on use and redistribution please refer to the +* LICENSE file included with these sources. +*/ + +package org.apache.fop.area; + +/** + * This is the model for the area tree object. + * The model implementation can handle the page sequence, + * page and extensions. + */ +public abstract class AreaTreeModel { + /** + * Start a page sequence on this model. + * @param title the title of the new page sequence + */ + public abstract void startPageSequence(Title title); + + /** + * Add a page to this moel. + * @param page the page to add to the model. + */ + public abstract void addPage(PageViewport page); + + /** + * Add an extension to this model. + * @param ext the extension to add + * @param when when the extension should be handled + */ + public abstract void addExtension(TreeExt ext, int when); + + /** + * Signal the end of the document for any processing. + */ + public abstract void endDocument(); +} diff --git a/src/org/apache/fop/area/CachedRenderPagesModel.java b/src/org/apache/fop/area/CachedRenderPagesModel.java index f18c66967..32130341e 100644 --- a/src/org/apache/fop/area/CachedRenderPagesModel.java +++ b/src/org/apache/fop/area/CachedRenderPagesModel.java @@ -27,7 +27,7 @@ import java.io.BufferedInputStream; * the page contents to a file and once the page is resolved * the contents a reloaded. */ -public class CachedRenderPagesModel extends AreaTree.RenderPagesModel { +public class CachedRenderPagesModel extends RenderPagesModel { private Map pageMap = new HashMap(); /** diff --git a/src/org/apache/fop/area/RenderPagesModel.java b/src/org/apache/fop/area/RenderPagesModel.java new file mode 100644 index 000000000..6292227e5 --- /dev/null +++ b/src/org/apache/fop/area/RenderPagesModel.java @@ -0,0 +1,179 @@ +/* +* $Id$ +* Copyright (C) 2002 The Apache Software Foundation. All rights reserved. +* For details on use and redistribution please refer to the +* LICENSE file included with these sources. +*/ + +package org.apache.fop.area; + +// FOP +import org.apache.fop.render.Renderer; + +// Java +import java.util.List; +import java.util.ArrayList; +import java.util.Iterator; + +/** + * This uses the store pages model to store the pages + * each page is either rendered if ready or prepared + * for later rendering. + * Once a page is rendered it is cleared to release the + * contents but the PageViewport is retained. So even + * though the pages are stored the contents are discarded. + */ +public class RenderPagesModel extends StorePagesModel { + /** + * The renderer that will render the pages. + */ + protected Renderer renderer; + /** + * Pages that have been prepared but not rendered yet. + */ + protected List prepared = new ArrayList(); + private List pendingExt = new ArrayList(); + private List endDocExt = new ArrayList(); + + /** + * Create a new render pages model with the given renderer. + * @param rend the renderer to render pages to + */ + public RenderPagesModel(Renderer rend) { + renderer = rend; + } + + /** + * Start a new page sequence. + * This tells the renderer that a new page sequence has + * started with the given title. + * @param title the title of the new page sequence + */ + public void startPageSequence(Title title) { + super.startPageSequence(title); + renderer.startPageSequence(title); + } + + /** + * Add a page to the render page model. + * If the page is finished it can be rendered immediately. + * If the page needs resolving then if the renderer supports + * out of order rendering it can prepare the page. Otherwise + * the page is added to a queue. + * @param page the page to add to the model + */ + public void addPage(PageViewport page) { + super.addPage(page); + + // for links the renderer needs to prepare the page + // it is more appropriate to do this after queued pages but + // it will mean that the renderer has not prepared a page that + // could be referenced + boolean done = renderer.supportsOutOfOrder() && page.isResolved(); + if (done) { + try { + renderer.renderPage(page); + } catch (Exception e) { + // use error handler to handle this FOP or IO Exception + e.printStackTrace(); + } + page.clear(); + } else { + preparePage(page); + } + + + // check prepared pages + boolean cont = checkPreparedPages(page); + + if (cont) { + renderExtensions(pendingExt); + pendingExt.clear(); + } + } + + /** + * Check prepared pages + * @return true if the current page should be rendered + * false if the renderer doesn't support out of order + * rendering and there are pending pages + */ + protected boolean checkPreparedPages(PageViewport newpage) { + for (Iterator iter = prepared.iterator(); iter.hasNext();) { + PageViewport p = (PageViewport)iter.next(); + if (p.isResolved()) { + try { + renderer.renderPage(p); + } catch (Exception e) { + // use error handler to handle this FOP or IO Exception + e.printStackTrace(); + } + p.clear(); + iter.remove(); + } else { + // if keeping order then stop at first page not resolved + if (!renderer.supportsOutOfOrder()) { + break; + } + } + } + return renderer.supportsOutOfOrder() || prepared.isEmpty(); + } + + /** + * Prepare a page. + * An unresolved page can be prepared if the renderer supports + * it and the page will be rendered later. + * @param page the page to prepare + */ + protected void preparePage(PageViewport page) { + if (renderer.supportsOutOfOrder()) { + renderer.preparePage(page); + } + prepared.add(page); + } + + /** + * Add an extension to this model. + * If handle immediately then send directly to the renderer. + * The after page ones are handled after the next page is added. + * End of document extensions are added to a list to be + * handled at the end. + * @param ext the extension + * @param when when to render the extension + */ + public void addExtension(TreeExt ext, int when) { + switch(when) { + case TreeExt.IMMEDIATELY: + renderer.renderExtension(ext); + break; + case TreeExt.AFTER_PAGE: + pendingExt.add(ext); + break; + case TreeExt.END_OF_DOC: + endDocExt.add(ext); + break; + } + } + + private void renderExtensions(List list) { + for (int count = 0; count < list.size(); count++) { + TreeExt ext = (TreeExt)list.get(count); + renderer.renderExtension(ext); + } + } + + /** + * End the document. Render any end document extensions. + */ + public void endDocument() { + // render any pages that had unresolved ids + checkPreparedPages(null); + + renderExtensions(pendingExt); + pendingExt.clear(); + + renderExtensions(endDocExt); + } +} + diff --git a/src/org/apache/fop/area/StorePagesModel.java b/src/org/apache/fop/area/StorePagesModel.java new file mode 100644 index 000000000..0005ad315 --- /dev/null +++ b/src/org/apache/fop/area/StorePagesModel.java @@ -0,0 +1,137 @@ +/* +* $Id$ +* Copyright (C) 2002 The Apache Software Foundation. All rights reserved. +* For details on use and redistribution please refer to the +* LICENSE file included with these sources. +*/ + +package org.apache.fop.area; + +// Java +import java.util.List; +import java.util.ArrayList; + +/** + * This class stores all the pages in the document + * for interactive agents. + * The pages are stored and can be retrieved in any order. + */ +public class StorePagesModel extends AreaTreeModel { + private List pageSequence = null; + private List titles = new ArrayList(); + private List currSequence; + private List extensions = new ArrayList(); + + /** + * Create a new store pages model + */ + public StorePagesModel() { + } + + /** + * Start a new page sequence. + * This creates a new list for the pages in the new page sequence. + * @param title the title of the page sequence. + */ + public void startPageSequence(Title title) { + titles.add(title); + if (pageSequence == null) { + pageSequence = new ArrayList(); + } + currSequence = new ArrayList(); + pageSequence.add(currSequence); + } + + /** + * Add a page. + * @param page the page to add to the current page sequence + */ + public void addPage(PageViewport page) { + currSequence.add(page); + } + + /** + * Get the page sequence count. + * @return the number of page sequences in the document. + */ + public int getPageSequenceCount() { + return pageSequence.size(); + } + + /** + * Get the title for a page sequence. + * @param count the page sequence count + * @return the title of the page sequence + */ + public Title getTitle(int count) { + return (Title) titles.get(count); + } + + /** + * Get the page count. + * @param seq the page sequence to count. + * @return returns the number of pages in a page sequence + */ + public int getPageCount(int seq) { + List sequence = (List) pageSequence.get(seq); + return sequence.size(); + } + + /** + * Get the page for a position in the document. + * @param seq the page sequence number + * @param count the page count in the sequence + * @return the PageViewport for the particular page + */ + public PageViewport getPage(int seq, int count) { + List sequence = (List) pageSequence.get(seq); + return (PageViewport) sequence.get(count); + } + + /** + * Add an extension to the store page model. + * The extension is stored so that it can be retrieved in the + * appropriate position. + * @param ext the extension to add + * @param when when the extension should be handled + */ + public void addExtension(TreeExt ext, int when) { + int seq, page; + switch(when) { + case TreeExt.IMMEDIATELY: + seq = pageSequence == null ? 0 : pageSequence.size(); + page = currSequence == null ? 0 : currSequence.size(); + break; + case TreeExt.AFTER_PAGE: + break; + case TreeExt.END_OF_DOC: + break; + } + extensions.add(ext); + } + + /** + * Get the list of extensions that apply at a particular + * position in the document. + * @param seq the page sequence number + * @param count the page count in the sequence + * @return the list of extensions + */ + public List getExtensions(int seq, int count) { + return null; + } + + /** + * Get the end of document extensions for this stroe pages model. + * @return the list of end extensions + */ + public List getEndExtensions() { + return extensions; + } + + /** + * End document, do nothing. + */ + public void endDocument() { + } +} \ No newline at end of file diff --git a/src/org/apache/fop/tools/AreaTreeBuilder.java b/src/org/apache/fop/tools/AreaTreeBuilder.java index 467c40b0a..ce7d67199 100644 --- a/src/org/apache/fop/tools/AreaTreeBuilder.java +++ b/src/org/apache/fop/tools/AreaTreeBuilder.java @@ -7,7 +7,7 @@ package org.apache.fop.tools; -import org.apache.fop.apps.*; +// FOP import org.apache.fop.area.*; import org.apache.fop.area.inline.*; import org.apache.fop.area.inline.Character; @@ -21,21 +21,24 @@ import org.apache.fop.layout.FontMetric; import org.apache.fop.fo.FOUserAgent; import org.apache.fop.fo.properties.RuleStyle; +// Avalon import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.AbstractLogEnabled; +// Java import java.io.*; import java.util.*; - import java.awt.geom.Rectangle2D; import java.util.StringTokenizer; +// JAXP import javax.xml.parsers.DocumentBuilderFactory; +// DOM import org.w3c.dom.*; +// Batik import org.apache.batik.dom.svg.SVGDOMImplementation; -import org.apache.batik.dom.util.DOMUtilities; /** * Area tree tester. @@ -88,7 +91,7 @@ public class AreaTreeBuilder extends AbstractLogEnabled { setupLogger(ua); rend.setUserAgent(ua); - AreaTree.StorePagesModel sm = AreaTree.createStorePagesModel(); + StorePagesModel sm = AreaTree.createStorePagesModel(); TreeLoader tl = new TreeLoader(fi); tl.setTreeModel(sm); try { @@ -101,7 +104,7 @@ public class AreaTreeBuilder extends AbstractLogEnabled { } } - protected void renderAreaTree(AreaTree.StorePagesModel sm, + protected void renderAreaTree(StorePagesModel sm, Renderer rend, String out) { try { OutputStream os = @@ -153,7 +156,7 @@ public class AreaTreeBuilder extends AbstractLogEnabled { // the xml format is the same as the xml renderer output class TreeLoader { AreaTree areaTree; - AreaTree.AreaTreeModel model; + AreaTreeModel model; FontInfo fontInfo; FontState currentFontState; @@ -161,7 +164,7 @@ class TreeLoader { fontInfo = fi; } - public void setTreeModel(AreaTree.AreaTreeModel mo) { + public void setTreeModel(AreaTreeModel mo) { model = mo; } -- 2.39.5