From: Simon Pepping Date: Mon, 27 Dec 2004 10:13:05 +0000 (+0000) Subject: Changed LayoutManagerMaker.makeLayoutManager(FONode node) to throw a X-Git-Tag: Root_Temp_KnuthStylePageBreaking~295 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=65abdf24e54462f82a694a909f820031b6f33b9c;p=xmlgraphics-fop.git Changed LayoutManagerMaker.makeLayoutManager(FONode node) to throw a FOPException, and removed LayoutManagerMaker.makeLayoutManager(FONode node, boolean checkLength). Adapted LayoutManagerMapping, PageSequenceLM and AreaTreeHandler. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198212 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/fop/area/AreaTreeHandler.java b/src/java/org/apache/fop/area/AreaTreeHandler.java index fe0972da9..949d6a2e4 100644 --- a/src/java/org/apache/fop/area/AreaTreeHandler.java +++ b/src/java/org/apache/fop/area/AreaTreeHandler.java @@ -229,9 +229,15 @@ public class AreaTreeHandler extends FOEventHandler { // If no main flow, nothing to layout! if (pageSequence.getMainFlow() != null) { - PageSequenceLayoutManager pageSLM = - (PageSequenceLayoutManager) + PageSequenceLayoutManager pageSLM; + try { + pageSLM = (PageSequenceLayoutManager) getLayoutManagerMaker().makeLayoutManager(pageSequence); + } catch (FOPException e) { + log.error("Failed to create a PageSequenceLayoutManager; no pages will be laid out:"); + log.error(e.getMessage()); + return; + } pageSLM.setAreaTreeHandler(this); pageSLM.activateLayout(); } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutManagerMaker.java b/src/java/org/apache/fop/layoutmgr/LayoutManagerMaker.java index 4da081c08..43b62d6c6 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutManagerMaker.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutManagerMaker.java @@ -19,14 +19,29 @@ package org.apache.fop.layoutmgr; import java.util.List; import org.apache.fop.fo.FONode; +import org.apache.fop.apps.FOPException; +/** + * The interface for all LayoutManager makers + */ public interface LayoutManagerMaker { + /** + * Make LayoutManagers for the node and add them to the list lms. + * @param node the FO node for which the LayoutManagers are made + * @param lms the list to which the LayoutManagers are added + */ public void makeLayoutManagers(FONode node, List lms); - public LayoutManager makeLayoutManager(FONode node); - - public LayoutManager makeLayoutManager(FONode node, boolean checkLength); + /** + * Make the LayoutManager for the node. + * If not exactly one LayoutManagers is made, + * a FOPException is thrown. + * @param node the FO node for which the LayoutManagers are made + * @return The created LayoutManager + */ + public LayoutManager makeLayoutManager(FONode node) + throws FOPException; } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java b/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java index c119c9a01..4a6f002fb 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java @@ -17,9 +17,6 @@ /* $Id$ */ package org.apache.fop.layoutmgr; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.util.ArrayList; import java.util.Map; import java.util.HashMap; @@ -27,6 +24,11 @@ import java.util.List; import java.util.ListIterator; import java.util.Iterator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.fop.apps.FOPException; + import org.apache.fop.fo.FONode; import org.apache.fop.fo.FOText; import org.apache.fop.fo.FObj; @@ -74,7 +76,7 @@ import org.apache.fop.layoutmgr.table.Row; import org.apache.fop.layoutmgr.table.TableLayoutManager; /** - * The default class for creating layout managers. + * The default LayoutManager maker class */ public class LayoutManagerMapping implements LayoutManagerMaker { @@ -92,175 +94,179 @@ public class LayoutManagerMapping implements LayoutManagerMaker { * Initializes the set of maker objects associated with this LayoutManagerMapping */ private void initialize() { - makers.put(FOText.class, new FOTextLayoutManagerMaker()); - makers.put(FObjMixed.class, new Maker()); - makers.put(BidiOverride.class, new BidiOverrideLayoutManagerMaker()); - makers.put(Inline.class, new InlineLayoutManagerMaker()); - makers.put(Footnote.class, new FootnodeLayoutManagerMaker()); - makers.put(InlineContainer.class, + makers.put(FOText.class, new FOTextLayoutManagerMaker()); + makers.put(FObjMixed.class, new Maker()); + makers.put(BidiOverride.class, new BidiOverrideLayoutManagerMaker()); + makers.put(Inline.class, new InlineLayoutManagerMaker()); + makers.put(Footnote.class, new FootnodeLayoutManagerMaker()); + makers.put(InlineContainer.class, new InlineContainerLayoutManagerMaker()); - makers.put(BasicLink.class, new BasicLinkLayoutManagerMaker()); - makers.put(Block.class, new BlockLayoutManagerMaker()); - makers.put(Leader.class, new LeaderLayoutManagerMaker()); - makers.put(RetrieveMarker.class, new WrapperLayoutManagerMaker()); - makers.put(Character.class, new CharacterLayoutManagerMaker()); - makers.put(ExternalGraphic.class, + makers.put(BasicLink.class, new BasicLinkLayoutManagerMaker()); + makers.put(Block.class, new BlockLayoutManagerMaker()); + makers.put(Leader.class, new LeaderLayoutManagerMaker()); + makers.put(RetrieveMarker.class, new WrapperLayoutManagerMaker()); + makers.put(Character.class, new CharacterLayoutManagerMaker()); + makers.put(ExternalGraphic.class, new ExternalGraphicLayoutManagerMaker()); - makers.put(BlockContainer.class, + makers.put(BlockContainer.class, new BlockContainerLayoutManagerMaker()); - makers.put(ListItem.class, new ListItemLayoutManagerMaker()); - makers.put(ListBlock.class, new ListBlockLayoutManagerMaker()); - makers.put(InstreamForeignObject.class, + makers.put(ListItem.class, new ListItemLayoutManagerMaker()); + makers.put(ListBlock.class, new ListBlockLayoutManagerMaker()); + makers.put(InstreamForeignObject.class, new InstreamForeignObjectLayoutManagerMaker()); - makers.put(PageNumber.class, new PageNumberLayoutManagerMaker()); - makers.put(PageNumberCitation.class, + makers.put(PageNumber.class, new PageNumberLayoutManagerMaker()); + makers.put(PageNumberCitation.class, new PageNumberCitationLayoutManagerMaker()); - makers.put(PageSequence.class, new PageSequenceLayoutManagerMaker()); - makers.put(Table.class, new TableLayoutManagerMaker()); - makers.put(TableBody.class, new TableBodyLayoutManagerMaker()); - makers.put(TableColumn.class, new TableColumnLayoutManagerMaker()); - makers.put(TableRow.class, new TableRowLayoutManagerMaker()); - makers.put(TableCell.class, new TableCellLayoutManagerMaker()); - makers.put(TableFooter.class, new TableBodyLayoutManagerMaker()); - makers.put(TableHeader.class, new TableBodyLayoutManagerMaker()); - makers.put(Flow.class, new FlowLayoutManagerMaker()); - makers.put(StaticContent.class, new StaticContentLayoutManagerMaker()); - makers.put(Wrapper.class, new WrapperLayoutManagerMaker()); - makers.put(Title.class, new InlineLayoutManagerMaker()); + makers.put(PageSequence.class, new PageSequenceLayoutManagerMaker()); + makers.put(Table.class, new TableLayoutManagerMaker()); + makers.put(TableBody.class, new TableBodyLayoutManagerMaker()); + makers.put(TableColumn.class, new TableColumnLayoutManagerMaker()); + makers.put(TableRow.class, new TableRowLayoutManagerMaker()); + makers.put(TableCell.class, new TableCellLayoutManagerMaker()); + makers.put(TableFooter.class, new TableBodyLayoutManagerMaker()); + makers.put(TableHeader.class, new TableBodyLayoutManagerMaker()); + makers.put(Flow.class, new FlowLayoutManagerMaker()); + makers.put(StaticContent.class, new StaticContentLayoutManagerMaker()); + makers.put(Wrapper.class, new WrapperLayoutManagerMaker()); + makers.put(Title.class, new InlineLayoutManagerMaker()); } + /** + * @see org.apache.fop.layoutmgr.LayoutManagerMaker#makeLayoutManagers(FONode, List) + */ public void makeLayoutManagers(FONode node, List lms) { - Maker maker = (Maker) makers.get(node.getClass()); - if (maker == null) { + Maker maker = (Maker) makers.get(node.getClass()); + if (maker == null) { log.error("No LayoutManager maker for class " + node.getClass()); } else { - maker.make(node, lms); - } - } - - public LayoutManager makeLayoutManager(FONode node) { - return makeLayoutManager(node, false); + maker.make(node, lms); + } } - public LayoutManager makeLayoutManager(FONode node, boolean checkLength) { + /** + * @see org.apache.fop.layoutmgr.LayoutManagerMaker#makeLayoutManager(FONode) + */ + public LayoutManager makeLayoutManager(FONode node) + throws FOPException { List lms = new ArrayList(); makeLayoutManagers(node, lms); - LayoutManager lm = null; - if (checkLength && lms.size() != 1) { - log.error("More than 1 LayoutManager for class " - + node.getClass() - + "; 1 was requested"); - } else if (lms.size() != 0) { - lm = (LayoutManager) lms.get(0); + if (lms.size() == 0) { + throw new FOPException("No LayoutManager for class " + + node.getClass() + + "; 1 was required"); + } else if (lms.size() > 1) { + throw new FOPException("More than 1 LayoutManager for class " + + node.getClass() + + "; 1 was required"); } - return lm; + return (LayoutManager) lms.get(0); } - public static class Maker { - public void make(FONode node, List lms) { + public static class Maker { + public void make(FONode node, List lms) { // no layout manager - return; - } - } - - public static class FOTextLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - FOText foText = (FOText) node; - if (foText.endIndex - foText.startIndex > 0) { - lms.add(new TextLayoutManager(foText)); - } - } - } + return; + } + } + + public static class FOTextLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + FOText foText = (FOText) node; + if (foText.endIndex - foText.startIndex > 0) { + lms.add(new TextLayoutManager(foText)); + } + } + } /* - public static class FObjMixedLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - if (node.getChildNodes() != null) { - InlineStackingLayoutManager lm; - lm = new InlineStackingLayoutManager((FObjMixed) node); - lms.add(lm); - } - } - } + public static class FObjMixedLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + if (node.getChildNodes() != null) { + InlineStackingLayoutManager lm; + lm = new InlineStackingLayoutManager((FObjMixed) node); + lms.add(lm); + } + } + } */ - public static class BidiOverrideLayoutManagerMaker extends Maker { + public static class BidiOverrideLayoutManagerMaker extends Maker { // public static class BidiOverrideLayoutManagerMaker extends FObjMixedLayoutManagerMaker { - public void make(BidiOverride node, List lms) { - if (false) { + public void make(BidiOverride node, List lms) { + if (false) { // this is broken; it does nothing // it should make something like an InlineStackingLM - super.make(node, lms); - } else { - ArrayList childList = new ArrayList(); + super.make(node, lms); + } else { + ArrayList childList = new ArrayList(); // this is broken; it does nothing // it should make something like an InlineStackingLM - super.make(node, childList); - for (int count = childList.size() - 1; count >= 0; count--) { - LayoutManager lm = (LayoutManager) childList.get(count); - if (lm.generatesInlineAreas()) { - LayoutManager blm = new BidiLayoutManager + super.make(node, childList); + for (int count = childList.size() - 1; count >= 0; count--) { + LayoutManager lm = (LayoutManager) childList.get(count); + if (lm.generatesInlineAreas()) { + LayoutManager blm = new BidiLayoutManager (node, (InlineLayoutManager) lm); - lms.add(blm); - } else { - lms.add(lm); - } - } - } - } - } - - public static class InlineLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + lms.add(blm); + } else { + lms.add(lm); + } + } + } + } + } + + public static class InlineLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { if (node.getChildNodes() != null) { lms.add(new InlineLayoutManager((InlineLevel) node)); } - } - } + } + } - public static class FootnodeLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public static class FootnodeLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { Inline citation = ((Footnote) node).getInlineFO(); - if (citation != null) { + if (citation != null) { lms.add(new InlineLayoutManager(citation)); } - } - } - - public static class InlineContainerLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - ArrayList childList = new ArrayList(); - super.make(node, childList); - lms.add(new ICLayoutManager((InlineContainer) node, childList)); - } - } - - public static class BasicLinkLayoutManagerMaker extends Maker { + } + } + + public static class InlineContainerLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + ArrayList childList = new ArrayList(); + super.make(node, childList); + lms.add(new ICLayoutManager((InlineContainer) node, childList)); + } + } + + public static class BasicLinkLayoutManagerMaker extends Maker { public void make(FONode node, List lms) { lms.add(new BasicLinkLayoutManager((BasicLink) node)); } } - public static class BlockLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new BlockLayoutManager((Block) node)); - } - } + public static class BlockLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new BlockLayoutManager((Block) node)); + } + } - public static class LeaderLayoutManagerMaker extends Maker { + public static class LeaderLayoutManagerMaker extends Maker { public void make(FONode node, List lms) { lms.add(new LeaderLayoutManager((Leader) node)); } } - public static class CharacterLayoutManagerMaker extends Maker { + public static class CharacterLayoutManagerMaker extends Maker { public void make(FONode node, List lms) { lms.add(new CharacterLayoutManager((Character) node)); } } - public static class ExternalGraphicLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public static class ExternalGraphicLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { ExternalGraphic eg = (ExternalGraphic) node; if (!eg.getSrc().equals("")) { lms.add(new ExternalGraphicLayoutManager(eg)); @@ -268,120 +274,120 @@ public class LayoutManagerMapping implements LayoutManagerMaker { } } - public static class BlockContainerLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new BlockContainerLayoutManager((BlockContainer) node)); - } - } + public static class BlockContainerLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new BlockContainerLayoutManager((BlockContainer) node)); + } + } - public static class ListItemLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public static class ListItemLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { lms.add(new ListItemLayoutManager((ListItem) node)); - } - } + } + } - public static class ListBlockLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new ListBlockLayoutManager((ListBlock) node)); - } - } + public static class ListBlockLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new ListBlockLayoutManager((ListBlock) node)); + } + } - public static class InstreamForeignObjectLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public static class InstreamForeignObjectLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { lms.add(new InstreamForeignObjectLM((InstreamForeignObject) node)); } } - public static class PageNumberLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public static class PageNumberLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { lms.add(new PageNumberLayoutManager((PageNumber) node)); - } - } + } + } - public static class PageNumberCitationLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new PageNumberCitationLayoutManager((PageNumberCitation) node)); - } + public static class PageNumberCitationLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new PageNumberCitationLayoutManager((PageNumberCitation) node)); + } } public static class PageSequenceLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public void make(FONode node, List lms) { lms.add(new PageSequenceLayoutManager((PageSequence) node)); } } - public static class TableLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - Table table = (Table) node; - TableLayoutManager tlm = new TableLayoutManager(table); - ArrayList columns = table.getColumns(); - if (columns != null) { - ArrayList columnLMs = new ArrayList(); - ListIterator iter = columns.listIterator(); - while (iter.hasNext()) { + public static class TableLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + Table table = (Table) node; + TableLayoutManager tlm = new TableLayoutManager(table); + ArrayList columns = table.getColumns(); + if (columns != null) { + ArrayList columnLMs = new ArrayList(); + ListIterator iter = columns.listIterator(); + while (iter.hasNext()) { columnLMs.add(new Column((TableColumn) iter.next())); - } - tlm.setColumns(columnLMs); - } - if (table.getTableHeader() != null) { - tlm.setTableHeader(new Body(table.getTableHeader())); - } - if (table.getTableFooter() != null) { - tlm.setTableFooter(new Body(table.getTableFooter())); - } - lms.add(tlm); - } + } + tlm.setColumns(columnLMs); + } + if (table.getTableHeader() != null) { + tlm.setTableHeader(new Body(table.getTableHeader())); + } + if (table.getTableFooter() != null) { + tlm.setTableFooter(new Body(table.getTableFooter())); + } + lms.add(tlm); + } + } + + public static class TableBodyLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new Body((TableBody) node)); + } + } - - public static class TableBodyLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new Body((TableBody) node)); - } - - } - + public static class TableColumnLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { + public void make(FONode node, List lms) { lms.add(new Column((TableColumn) node)); - } - } - - public static class TableRowLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new Row((TableRow) node)); - } - } - - public static class TableCellLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new Cell((TableCell) node)); - } - } - - public static class FlowLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new FlowLayoutManager((Flow) node)); - } - } - - public static class StaticContentLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - lms.add(new StaticContentLayoutManager((StaticContent) node)); - } - } - - public class WrapperLayoutManagerMaker extends Maker { - public void make(FONode node, List lms) { - Iterator baseIter; - baseIter = node.getChildNodes(); - if (baseIter == null) { + } + } + + public static class TableRowLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new Row((TableRow) node)); + } + } + + public static class TableCellLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new Cell((TableCell) node)); + } + } + + public static class FlowLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new FlowLayoutManager((Flow) node)); + } + } + + public static class StaticContentLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + lms.add(new StaticContentLayoutManager((StaticContent) node)); + } + } + + public class WrapperLayoutManagerMaker extends Maker { + public void make(FONode node, List lms) { + Iterator baseIter; + baseIter = node.getChildNodes(); + if (baseIter == null) { return; } - while (baseIter.hasNext()) { - FONode child = (FONode) baseIter.next(); - makeLayoutManagers(child, lms); - } - } - } + while (baseIter.hasNext()) { + FONode child = (FONode) baseIter.next(); + makeLayoutManagers(child, lms); + } + } + } } diff --git a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java index 2d5515e08..a94fb03ef 100644 --- a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java @@ -502,7 +502,17 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager { } RegionViewport reg = curPage.getPage().getRegionViewport(region.getNameId()); - StaticContentLayoutManager lm = getStaticContentLayoutManager(flow); + StaticContentLayoutManager lm; + try { + lm = getStaticContentLayoutManager(flow); + } catch (FOPException e) { + log.error + ("Failed to create a StaticContentLayoutManager for flow " + + flow.getFlowName() + + "; no static content will be laid out:"); + log.error(e.getMessage()); + return; + } lm.initialize(); lm.setRegionReference(reg.getRegion()); lm.setParent(this); @@ -515,9 +525,9 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager { List vecBreakPoss = new ArrayList(); vecBreakPoss.add(bp); lm.addAreas(new BreakPossPosIter(vecBreakPoss, 0, - vecBreakPoss.size()), null); + vecBreakPoss.size()), null); } else { - log.error("bp==null cls=" + region.getRegionName()); + log.error("bp==null cls=" + region.getRegionName()); } } //lm.flush(); @@ -905,14 +915,13 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager { /** * @return a StaticContent layout manager */ - private StaticContentLayoutManager getStaticContentLayoutManager(StaticContent sc) { + private StaticContentLayoutManager getStaticContentLayoutManager(StaticContent sc) + throws FOPException { StaticContentLayoutManager lm = - (StaticContentLayoutManager) - staticContentLMs.get(sc.getFlowName()); + (StaticContentLayoutManager) staticContentLMs.get(sc.getFlowName()); if (lm == null) { lm = (StaticContentLayoutManager) - getAreaTreeHandler().getLayoutManagerMaker(). - makeLayoutManager(sc); + getAreaTreeHandler().getLayoutManagerMaker().makeLayoutManager(sc); staticContentLMs.put(sc.getFlowName(), lm); } return lm;