[prev in list] [next in list] [prev in thread] [next in thread]
List: fop-dev
Subject: AreaFactory patch
From: "Tibor Vyletel" <tivy () centrum ! sk>
Date: 2004-10-31 19:31:18
Message-ID: 00f101c4bf80$31d183f0$3b00a8c0 () cassino
[Download RAW message or body]
Hello Fopsters,
I have attached first phase (a working example) of the refactoring I was
talking about in my previous mails. Please let me know, if this change is
acceptable for you. If it is, I will finish it afterwards.
Change description:
1) new interface: org.apache.fop.area.AreaFactory & default implementation:
org.apache.fop.area.DefaultAreaFactory
- new definition how new areas should be created and accessed.
2) FOUserAgent - addition of setAreaFactory(AreaFactory) &
AreaFactory getAreaFactor() methods
- configuration for new "feature"
3) LayoutManagers
- in several managers (in fact, in those I had had my private code) area
instantiation was changed to proposed factory pattern.
Best regards,
Tibor Vyletel
ICQ# 79458455
["AreaFactoryPhase1.patch" (application/octet-stream)]
Index: apps/FOUserAgent.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/apps/FOUserAgent.java,v
retrieving revision 1.19
diff -u -r1.19 FOUserAgent.java
--- apps/FOUserAgent.java 24 Oct 2004 00:03:49 -0000 1.19
+++ apps/FOUserAgent.java 31 Oct 2004 19:05:14 -0000
@@ -35,6 +35,8 @@
import org.apache.commons.logging.LogFactory;
// FOP
+import org.apache.fop.area.AreaFactory;
+import org.apache.fop.area.DefaultAreaFactory;
import org.apache.fop.fo.ElementMapping;
import org.apache.fop.fo.FOEventHandler;
import org.apache.fop.pdf.PDFEncryptionParams;
@@ -74,6 +76,8 @@
private InputHandler inputHandler = null;
private Renderer rendererOverride = null;
private FOEventHandler foEventHandlerOverride = null;
+ private AreaFactory areaFactory = null;
+
/* user configuration */
private Configuration userConfig = null;
private Log log = LogFactory.getLog("FOP");
@@ -341,6 +345,17 @@
*/
public boolean linkToFootnotes() {
return true;
+ }
+
+ public void setAreaFactory(AreaFactory factory) {
+ this.areaFactory = factory;
+ }
+
+ public AreaFactory getAreaFactory() {
+ if (areaFactory == null)
+ return DefaultAreaFactory.getInstance();
+ else
+ return areaFactory;
}
}
Index: layoutmgr/BlockContainerLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java,v
retrieving revision 1.26
diff -u -r1.26 BlockContainerLayoutManager.java
--- layoutmgr/BlockContainerLayoutManager.java 28 Oct 2004 15:21:54 -0000 1.26
+++ layoutmgr/BlockContainerLayoutManager.java 31 Oct 2004 19:05:15 -0000
@@ -275,7 +275,9 @@
*/
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
- viewportBlockArea = new BlockViewport();
+ viewportBlockArea = (BlockViewport)fobj.getUserAgent().getAreaFactory()
+ .create(BlockViewport.class, fobj, this);
+
TraitSetter.addBorders(viewportBlockArea, fobj.getCommonBorderPaddingBackground());
TraitSetter.addBackground(viewportBlockArea, fobj.getCommonBorderPaddingBackground());
@@ -316,7 +318,8 @@
}
}
- curBlockArea = new Block();
+ curBlockArea = (Block)fobj.getUserAgent().getAreaFactory()
+ .create(Block.class, fobj, this);
if (abProps.absolutePosition == AbsolutePosition.ABSOLUTE) {
viewportBlockArea.setPositioning(Block.ABSOLUTE);
Index: layoutmgr/BlockLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java,v
retrieving revision 1.32
diff -u -r1.32 BlockLayoutManager.java
--- layoutmgr/BlockLayoutManager.java 20 Oct 2004 11:55:32 -0000 1.32
+++ layoutmgr/BlockLayoutManager.java 31 Oct 2004 19:05:15 -0000
@@ -18,18 +18,18 @@
package org.apache.fop.layoutmgr;
-import java.util.ListIterator;
import java.util.ArrayList;
import java.util.List;
+import java.util.ListIterator;
-import org.apache.fop.datatypes.PercentBase;
-import org.apache.fop.fonts.Font;
import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.area.BlockParent;
import org.apache.fop.area.LineArea;
-import org.apache.fop.traits.SpaceVal;
+import org.apache.fop.datatypes.PercentBase;
+import org.apache.fop.fonts.Font;
import org.apache.fop.traits.MinOptMax;
+import org.apache.fop.traits.SpaceVal;
/**
* LayoutManager for a block FO.
@@ -312,7 +312,8 @@
*/
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
- curBlockArea = new Block();
+ curBlockArea = (Block)fobj.getUserAgent().getAreaFactory()
+ .create(Block.class, fobj, this);
// set traits
TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground());
Index: layoutmgr/InlineStackingLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/InlineStackingLayoutManager.java,v
retrieving revision 1.15
diff -u -r1.15 InlineStackingLayoutManager.java
--- layoutmgr/InlineStackingLayoutManager.java 20 Oct 2004 21:07:02 -0000 1.15
+++ layoutmgr/InlineStackingLayoutManager.java 31 Oct 2004 19:05:15 -0000
@@ -56,6 +56,7 @@
}
+ private FObj fobj;
/**
* Size of any start or end borders and padding.
*/
@@ -88,6 +89,7 @@
*/
public InlineStackingLayoutManager(FObj node) {
super(node);
+ this.fobj = node;
}
/**
@@ -410,7 +412,8 @@
*****/
protected InlineParent createArea() {
- return new InlineParent();
+ return (InlineParent)fobj.getUserAgent().getAreaFactory()
+ .create(InlineParent.class, fobj, this);
}
/**
Index: layoutmgr/table/Cell.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/table/Cell.java,v
retrieving revision 1.11
diff -u -r1.11 Cell.java
--- layoutmgr/table/Cell.java 19 Oct 2004 21:48:17 -0000 1.11
+++ layoutmgr/table/Cell.java 31 Oct 2004 19:05:15 -0000
@@ -223,7 +223,9 @@
*/
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
- curBlockArea = new Block();
+ curBlockArea = (Block)fobj.getUserAgent().getAreaFactory()
+ .create(Block.class, fobj, this);
+
curBlockArea.setPositioning(Block.ABSOLUTE);
// set position
curBlockArea.setXOffset(xoffset);
Index: layoutmgr/table/TableLayoutManager.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java,v
retrieving revision 1.14
diff -u -r1.14 TableLayoutManager.java
--- layoutmgr/table/TableLayoutManager.java 19 Oct 2004 21:48:17 -0000 1.14
+++ layoutmgr/table/TableLayoutManager.java 31 Oct 2004 19:05:16 -0000
@@ -116,17 +116,17 @@
*/
public BreakPoss getNextBreakPoss(LayoutContext context) {
Body curLM; // currently active LM
-
+
MinOptMax stackSize = new MinOptMax();
// if starting add space before
// stackSize.add(spaceBefore);
BreakPoss lastPos = null;
-
+
fobj.setLayoutDimension(PercentBase.BLOCK_IPD, context.getRefIPD());
fobj.setLayoutDimension(PercentBase.BLOCK_BPD, context.getStackLimit().opt);
fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, context.getRefIPD());
fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, context.getStackLimit().opt);
-
+
// either works out table of column widths or if proportional-column-width function
// is used works out total factor, so that value of single unit can be computed.
int sumCols = 0;
@@ -155,7 +155,7 @@
headerSize = headerBreak.getStackingSize();
stackSize.add(headerSize);
}
-
+
MinOptMax footerSize = null;
if (tableFooter != null) {
tableFooter.resetPosition(null);
@@ -163,7 +163,7 @@
footerSize = footerBreak.getStackingSize();
stackSize.add(footerSize);
}
-
+
if (stackSize.opt > context.getStackLimit().max) {
BreakPoss breakPoss = new BreakPoss(
new LeafPosition(this, 0));
@@ -171,21 +171,21 @@
breakPoss.setStackingSize(stackSize);
return breakPoss;
}
-
+
while ((curLM = (Body)getChildLM()) != null) {
// Make break positions
// Set up a LayoutContext
int ipd = context.getRefIPD();
BreakPoss bp;
-
+
LayoutContext childLC = new LayoutContext(0);
childLC.setStackLimit(
MinOptMax.subtract(context.getStackLimit(),
stackSize));
childLC.setRefIPD(ipd);
-
+
curLM.setColumns(columns);
-
+
boolean over = false;
while (!curLM.isFinished()) {
if ((bp = curLM.getNextBreakPoss(childLC)) != null) {
@@ -206,12 +206,12 @@
stackSize.add(bp.getStackingSize());
lastPos = bp;
bodyBreaks.add(bp);
-
+
if (bp.nextBreakOverflows()) {
over = true;
break;
}
-
+
childLC.setStackLimit(MinOptMax.subtract(
context.getStackLimit(), stackSize));
}
@@ -344,7 +344,9 @@
*/
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
- curBlockArea = new Block();
+ curBlockArea = (Block)fobj.getUserAgent().getAreaFactory()
+ .create(Block.class, fobj, this);
+
// Set up dimensions
// Must get dimensions from parent area
Area parentArea = parentLM.getParentArea(curBlockArea);
Index: render/awt/AWTRenderer.java
===================================================================
RCS file: /home/cvspublic/xml-fop/src/java/org/apache/fop/render/awt/AWTRenderer.java,v
retrieving revision 1.32
diff -u -r1.32 AWTRenderer.java
--- render/awt/AWTRenderer.java 22 Sep 2004 13:12:38 -0000 1.32
+++ render/awt/AWTRenderer.java 31 Oct 2004 19:05:16 -0000
@@ -113,6 +113,7 @@
return userAgent;
}
+
/**
* @see org.apache.fop.render.Renderer
*/
@@ -159,8 +160,10 @@
public void stopRenderer()
throws IOException {
- frame.setStatus(translator.getString("Status.Show"));
- frame.showPage();
+ if (frame != null){
+ frame.setStatus(translator.getString("Status.Show"));
+ frame.showPage();
+ }
}
// Printable Interface
@@ -180,7 +183,7 @@
return 0;
}
- private PreviewDialog createPreviewDialog() {
+ protected PreviewDialog createPreviewDialog() {
frame = new PreviewDialog(userAgent);
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent we) {
Index: area/AreaFactory.java
===================================================================
RCS file: area/AreaFactory.java
diff -N area/AreaFactory.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ area/AreaFactory.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,32 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fop.area;
+
+import org.apache.fop.fo.FObj;
+import org.apache.fop.layoutmgr.LayoutManager;
+
+/**
+ * Interface for objects serving as creators of area classes.
+ *
+ * The create method with shorter signature (two arguments) is here just for
+ * convenience.
+ *
+ */
+public interface AreaFactory {
+
+ Area create(Class areaType, FObj fobj, LayoutManager caller);
+}
Index: area/DefaultAreaFactory.java
===================================================================
RCS file: area/DefaultAreaFactory.java
diff -N area/DefaultAreaFactory.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ area/DefaultAreaFactory.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,89 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fop.area;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.fop.area.inline.InlineParent;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.layoutmgr.LayoutManager;
+
+public class DefaultAreaFactory implements AreaFactory {
+
+ private static DefaultAreaFactory instance;
+
+ protected Map registry;
+
+ public DefaultAreaFactory() {
+ registry = new HashMap();
+ initialize();
+ }
+
+ public static AreaFactory getInstance() {
+ if (instance == null)
+ instance = new DefaultAreaFactory();
+
+ return instance;
+ }
+
+ public Area create(Class type, FObj fobj, LayoutManager caller) {
+ if (registry.containsKey(type))
+ return ((AreaMaker)registry.get(type)).create(fobj, caller);
+
+ return null;
+ }
+
+ protected void initialize() {
+ register(Block.class, new BlockMaker());
+ register(BlockViewport.class, new BlockViewportMaker());
+ register(InlineParent.class, new InlineParentMaker());
+ }
+
+ protected void register(Class areaType, AreaMaker maker) {
+ registry.put(areaType, maker);
+ }
+
+ protected void unregister(Class areaType) {
+ registry.remove(areaType);
+ }
+
+/* ***************************** CREATOR INTERFACE ************************** */
+
+ protected interface AreaMaker {
+ Area create(FObj fobj, LayoutManager caller);
+ }
+
+/* ******************************* AREA CREATORS **************************** */
+ class BlockMaker implements AreaMaker {
+ public Area create(FObj fobj, LayoutManager caller) {
+ return new Block();
+ }
+ }
+
+ class BlockViewportMaker implements AreaMaker {
+ public Area create(FObj fobj, LayoutManager caller) {
+ return new BlockViewport();
+ }
+ }
+
+ class InlineParentMaker implements AreaMaker {
+ public Area create(FObj fobj, LayoutManager caller) {
+ return new InlineParent();
+ }
+ }
+}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic