[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