]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
1. fo:leader layout initialization logic moved from AddLMVisitor to
authorGlen Mazza <gmazza@apache.org>
Mon, 16 Aug 2004 04:11:42 +0000 (04:11 +0000)
committerGlen Mazza <gmazza@apache.org>
Mon, 16 Aug 2004 04:11:42 +0000 (04:11 +0000)
fo.flow.Leader.

2. fo:leader layout logic moved from AddLMVisitor to new
layoutmgr.LayoutLeaderManager class.

3. validateChildNode() for fo:list-block implemented.

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

13 files changed:
fop.bat
src/java/org/apache/fop/fo/flow/ExternalGraphic.java
src/java/org/apache/fop/fo/flow/Float.java
src/java/org/apache/fop/fo/flow/Footnote.java
src/java/org/apache/fop/fo/flow/FootnoteBody.java
src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
src/java/org/apache/fop/fo/flow/Leader.java
src/java/org/apache/fop/fo/flow/ListBlock.java
src/java/org/apache/fop/fo/pagination/Flow.java
src/java/org/apache/fop/fo/pagination/StaticContent.java
src/java/org/apache/fop/layoutmgr/AddLMVisitor.java
src/java/org/apache/fop/layoutmgr/LeaderLayoutManager.java [new file with mode: 0644]
src/java/org/apache/fop/layoutmgr/PageNumberCitationLayoutManager.java

diff --git a/fop.bat b/fop.bat
index ac51e7af41b49555ccbceccb488b3231b39f7546..459d3d164dfb922de24c7dc43faa55e994e67676 100644 (file)
--- a/fop.bat
+++ b/fop.bat
@@ -43,7 +43,7 @@ set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xercesImpl-2.2.1.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xalan-2.4.1.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\batik.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\avalon-framework-4.1.4.jar
-set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-io-dev-20040206.jar
+set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-io-1.0.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-logging-1.0.3.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jimi-1.0.jar
 set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_core.jar
index 581ab9fc20a023d2c8eb8029e662de33e3f1c612..99bb8bedb62255c9830874f5f8fd13a6bb9d35b6 100644 (file)
@@ -72,7 +72,7 @@ public class ExternalGraphic extends FObj {
 
     /**
      * @see org.apache.fop.fo.FObj#addLayoutManager(List)
-    */
+     */
     public void addLayoutManager(List list) {
         if (getURL() != null) {
             ExternalGraphicLayoutManager lm = new ExternalGraphicLayoutManager(this);
index 31c4b93cc9c4ce489a0a08db931660c832a25144..56acb0ce9865307ab8dce077a69f08d739d375b1 100644 (file)
@@ -52,7 +52,7 @@ public class Float extends ToBeImplementedElement {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index 024c49ff1120cdfffd93341a915f8311a1134400..252f31d9308332e32e255973b4a1f749c8133537 100644 (file)
@@ -82,7 +82,7 @@ public class Footnote extends FObj {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index a7f86b6f5f209239fe0e216b1da603fc721a3eb9..d8734f4d479725cd2a6d4a7e68d734c91f2c8b43 100644 (file)
@@ -60,7 +60,7 @@ public class FootnoteBody extends FObj {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index 5c7264aa4949c639e7c023bda8efd9eb21e066d0..8bd5a5f49f9c26a5e78d4b550b5364ce93fe2b0f 100644 (file)
@@ -66,7 +66,7 @@ public class InstreamForeignObject extends FObj {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index 77c8e4c3fe7c989b9eea6a20f04e1ca7a9fa221f..1aa240c6bccf0dc02c0fd418c8e4aeeebc5231e2 100644 (file)
 
 package org.apache.fop.fo.flow;
 
+// Java
+import java.util.List;
+
+// FOP
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.datatypes.Length;
 import org.apache.fop.fo.FONode;
-import org.apache.fop.layoutmgr.AddLMVisitor;
 import org.apache.fop.fo.FObjMixed;
 import org.apache.fop.fo.properties.PercentLength;
 import org.apache.fop.fonts.Font;
-import org.apache.fop.fo.LMVisited;
+import org.apache.fop.layoutmgr.LeaderLayoutManager;
 
 /**
- * Class modelling fo:leader object. See Sec. 6.6.9 of the XSL-FO Standard.
+ * Class modelling fo:leader object.
  * The main property of fo:leader is leader-pattern.
  * The following patterns are treated: rule, space, dots and use-content.
  */
-public class Leader extends FObjMixed implements LMVisited {
+public class Leader extends FObjMixed {
 
     private int ruleStyle;
     private int ruleThickness;
@@ -89,12 +92,14 @@ public class Leader extends FObjMixed implements LMVisited {
 
     }
 
+    /**
+     * @todo check need for each of these accessors (should be LM instead?)
+     */
     public int getLength(int propId, int dim) {
         int length;
         Length maxlength = propertyList.get(propId).getLength();
         if (maxlength instanceof PercentLength) {
-            length = (int)(((PercentLength)maxlength).value()
-                                      * dim);
+            length = (int)(((PercentLength)maxlength).value() * dim);
         } else {
             length = maxlength.getValue();
         }
@@ -121,20 +126,22 @@ public class Leader extends FObjMixed implements LMVisited {
         return patternWidth;
     }
 
-    public String getName() {
-        return "fo:leader";
-    }
-    
     /**
-     * This is a hook for the AddLMVisitor class to be able to access
-     * this object.
-     * @param aLMV the AddLMVisitor object that can access this object.
+     * @see org.apache.fop.fo.FObj#addLayoutManager(List)
      */
-    public void acceptVisitor(AddLMVisitor aLMV) {
+    public void addLayoutManager(List list) {
         setup();
-        aLMV.serveLeader(this);
+        LeaderLayoutManager lm = new LeaderLayoutManager(this);
+        list.add(lm);
     }
-    
+
+    /**
+     * @see org.apache.fop.fo.FObj#getName()
+     */
+    public String getName() {
+        return "fo:leader";
+    }
+
     /**
      * @see org.apache.fop.fo.FObj#getNameId()
      */
index e16d39ce73208c792dcbb9e60bf04bc7e3256196..86d6b70e83ef17d9e0641d05e983fb2b50acdd2d 100644 (file)
@@ -23,6 +23,7 @@ import java.util.List;
 
 // XML
 import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
 import org.xml.sax.SAXParseException;
 
 // FOP
@@ -30,12 +31,6 @@ import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObj;
 import org.apache.fop.layoutmgr.list.ListBlockLayoutManager;
-import org.apache.fop.fo.properties.CommonAccessibility;
-import org.apache.fop.fo.properties.CommonAural;
-import org.apache.fop.fo.properties.CommonBackground;
-import org.apache.fop.fo.properties.CommonBorderAndPadding;
-import org.apache.fop.fo.properties.CommonMarginBlock;
-import org.apache.fop.fo.properties.CommonRelativePosition;
 
 /**
  * Class modelling the fo:list-block object. See Sec. 6.8.2 of the XSL-FO
@@ -54,6 +49,9 @@ public class ListBlock extends FObj {
     private int spaceAfter;
     private int spaceBetweenListRows = 0;
     private ColorType backgroundColor;
+    
+    // used for child node validation
+    private boolean hasListItem = false;
 
     /**
      * @param parent FONode that is the parent of this object
@@ -86,6 +84,35 @@ public class ListBlock extends FObj {
         getFOInputHandler().startList(this);
     }
 
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
+     * XSL Content Model: marker* (list-item)+
+     */
+    protected void validateChildNode(Locator loc, String nsURI, String localName) 
+        throws SAXParseException {
+            if (nsURI == FO_URI && localName.equals("marker")) {
+                if (hasListItem) {
+                    nodesOutOfOrderError(loc, "fo:marker", "fo:list-item");
+                }
+            } else if (nsURI == FO_URI && localName.equals("list-item")) {
+                hasListItem = true;
+            } else {
+                invalidChildError(loc, nsURI, localName);
+            }
+    }
+
+    /**
+     * Make sure content model satisfied, if so then tell the
+     * FOInputHandler that we are at the end of the flow.
+     * @see org.apache.fop.fo.FONode#end
+     */
+    protected void endOfNode() throws SAXParseException {
+        if (!hasListItem) {
+            missingChildElementError("marker* (list-item)+");
+        }
+        getFOInputHandler().endList(this);
+    }
+
     /**
      * @return false (ListBlock does not generate inline areas)
      */
@@ -101,11 +128,6 @@ public class ListBlock extends FObj {
         list.add(lm);   
     }
 
-    protected void endOfNode() throws SAXParseException {
-        super.endOfNode();
-        getFOInputHandler().endList(this);
-    }
-
     public String getName() {
         return "fo:list-block";
     }
index b659d1e5b460b023686870ede074f2ee5905245d..37233ca14fc691d84ccbd80be0b6cb0ceb1ed58f 100644 (file)
@@ -86,7 +86,7 @@ public class Flow extends FObj {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index 3a1b96820db3998ab5dca26a3628ac273a3862f0..405e8d014382bb2fd20c5eede24a55375d27989e 100644 (file)
@@ -55,7 +55,7 @@ public class StaticContent extends Flow {
 
     /**
      * Make sure content model satisfied, if so then tell the
-     * StructureRenderer that we are at the end of the flow.
+     * FOInputHandler that we are at the end of the flow.
      * @see org.apache.fop.fo.FONode#end
      */
     protected void endOfNode() throws SAXParseException {
index fd2d684fa2f68eda7d5df6eb82c207f373e0c974..db84ef953ba0516ce750647fe835540c311302f6 100644 (file)
@@ -21,18 +21,8 @@ package org.apache.fop.layoutmgr;
 import java.util.List;
 import java.util.ListIterator;
 
-import org.apache.fop.area.Trait;
-import org.apache.fop.area.inline.FilledArea;
-import org.apache.fop.area.inline.InlineArea;
-import org.apache.fop.area.inline.Space;
-import org.apache.fop.area.inline.TextArea;
-import org.apache.fop.datatypes.Length;
-import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FObj;
-import org.apache.fop.fo.flow.Inline;
-import org.apache.fop.fo.flow.Leader;
 import org.apache.fop.fo.flow.Wrapper;
-import org.apache.fop.traits.MinOptMax;
 import org.apache.fop.fo.LMVisited;
 
 /**
@@ -100,104 +90,4 @@ public class AddLMVisitor {
             }
         }
     }
-
-     public void serveLeader(final Leader node) {
-         LeafNodeLayoutManager lm = new LeafNodeLayoutManager(node) {
-             public InlineArea get(LayoutContext context) {
-                 return getLeaderInlineArea(node, this);
-             }
-
-             protected MinOptMax getAllocationIPD(int refIPD) {
-                return getLeaderAllocIPD(node, refIPD);
-             }
-
-             /*protected void offsetArea(LayoutContext context) {
-                 if(leaderPattern == LeaderPattern.DOTS) {
-                     curArea.setOffset(context.getBaseline());
-                 }
-             }*/
-         };
-         lm.setAlignment(node.getProperty(Constants.PR_LEADER_ALIGNMENT).getEnum());
-         currentLMList.add(lm);
-     }
-
-     public MinOptMax getLeaderAllocIPD(Leader node, int ipd) {
-         // length of the leader
-         int opt = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_OPTIMUM, ipd);
-         int min = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_MINIMUM, ipd);
-         int max = node.getLength(Constants.PR_LEADER_LENGTH | Constants.CP_MAXIMUM, ipd);
-
-         return new MinOptMax(min, opt, max);
-     }
-
-     private InlineArea getLeaderInlineArea(Leader node, LayoutManager parentLM) {
-         InlineArea leaderArea = null;
-
-         if (node.getLeaderPattern() == Constants.LeaderPattern.RULE) {
-             org.apache.fop.area.inline.Leader leader = new org.apache.fop.area.inline.Leader();
-             leader.setRuleStyle(node.getRuleStyle());
-             leader.setRuleThickness(node.getRuleThickness());
-             leaderArea = leader;
-         } else if (node.getLeaderPattern() == Constants.LeaderPattern.SPACE) {
-             leaderArea = new Space();
-         } else if (node.getLeaderPattern() == Constants.LeaderPattern.DOTS) {
-             TextArea t = new TextArea();
-             char dot = '.'; // userAgent.getLeaderDotCharacter();
-
-             t.setTextArea("" + dot);
-             t.addTrait(Trait.FONT_NAME, node.getFontState().getFontName());
-             t.addTrait(Trait.FONT_SIZE,
-                              new Integer(node.getFontState().getFontSize()));
-             // set offset of dot within inline parent
-             t.setOffset(node.getFontState().getAscender());
-             int width = node.getFontState().getCharWidth(dot);
-             Space spacer = null;
-             if (node.getPatternWidth() > width) {
-                 spacer = new Space();
-                 spacer.setWidth(node.getPatternWidth() - width);
-                 width = node.getPatternWidth();
-             }
-             FilledArea fa = new FilledArea();
-             fa.setUnitWidth(width);
-             fa.addChild(t);
-             if (spacer != null) {
-                 fa.addChild(spacer);
-             }
-             fa.setHeight(node.getFontState().getAscender());
-
-             leaderArea = fa;
-         } else if (node.getLeaderPattern() == Constants.LeaderPattern.USECONTENT) {
-             if (node.getChildNodes() == null) {
-                 node.getLogger().error("Leader use-content with no content");
-                 return null;
-             }
-             InlineStackingLayoutManager lm;
-             lm = new InlineStackingLayoutManager(node);
-             lm.setLMiter(new LMiter(lm, node.getChildNodes()));
-             lm.initialize();
-
-             // get breaks then add areas to FilledArea
-             FilledArea fa = new FilledArea();
-
-             ContentLayoutManager clm = new ContentLayoutManager(fa);
-             clm.setParent(parentLM);
-             clm.setUserAgent(node.getUserAgent());
-             lm.setParent(clm);
-
-             clm.fillArea(lm);
-             int width = clm.getStackingSize();
-             Space spacer = null;
-             if (node.getPatternWidth() > width) {
-                 spacer = new Space();
-                 spacer.setWidth(node.getPatternWidth() - width);
-                 width = node.getPatternWidth();
-             }
-             fa.setUnitWidth(width);
-             if (spacer != null) {
-                 fa.addChild(spacer);
-             }
-             leaderArea = fa;
-         }
-         return leaderArea;
-     }
 }
diff --git a/src/java/org/apache/fop/layoutmgr/LeaderLayoutManager.java b/src/java/org/apache/fop/layoutmgr/LeaderLayoutManager.java
new file mode 100644 (file)
index 0000000..e1b9442
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr;
+
+import org.apache.fop.area.Trait;
+import org.apache.fop.area.inline.FilledArea;
+import org.apache.fop.area.inline.InlineArea;
+import org.apache.fop.area.inline.Space;
+import org.apache.fop.area.inline.TextArea;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.fo.Constants;
+import org.apache.fop.fo.flow.Inline;
+import org.apache.fop.fo.flow.Leader;
+import org.apache.fop.fonts.Font;
+import org.apache.fop.traits.MinOptMax;
+
+/**
+ * LayoutManager for the fo:leader formatting object
+ */
+public class LeaderLayoutManager extends LeafNodeLayoutManager {
+
+    Leader ldrNode;
+    Font font = null;
+    
+    /**
+     * Constructor
+     *
+     * @param node the formatting object that creates this area
+     * @todo better null checking of font object
+     */
+    public LeaderLayoutManager(Leader node) {
+        super(node);
+        ldrNode = node;
+        font = node.getFontState();
+        setAlignment(node.getProperty(PR_LEADER_ALIGNMENT).getEnum());
+    }
+
+    public InlineArea get(LayoutContext context) {
+        return getLeaderInlineArea();
+    }
+
+    protected MinOptMax getAllocationIPD(int refIPD) {
+        return getLeaderAllocIPD(refIPD);
+    }
+
+    private MinOptMax getLeaderAllocIPD(int ipd) {
+        // length of the leader
+        int opt = ldrNode.getLength(PR_LEADER_LENGTH | CP_OPTIMUM, ipd);
+        int min = ldrNode.getLength(PR_LEADER_LENGTH | CP_MINIMUM, ipd);
+        int max = ldrNode.getLength(PR_LEADER_LENGTH | CP_MAXIMUM, ipd);
+        return new MinOptMax(min, opt, max);
+    }
+
+    private InlineArea getLeaderInlineArea() {
+        InlineArea leaderArea = null;
+
+        if (ldrNode.getLeaderPattern() == LeaderPattern.RULE) {
+            org.apache.fop.area.inline.Leader leader = 
+                new org.apache.fop.area.inline.Leader();
+            leader.setRuleStyle(ldrNode.getRuleStyle());
+            leader.setRuleThickness(ldrNode.getRuleThickness());
+            leaderArea = leader;
+        } else if (ldrNode.getLeaderPattern() == LeaderPattern.SPACE) {
+            leaderArea = new Space();
+        } else if (ldrNode.getLeaderPattern() == LeaderPattern.DOTS) {
+            TextArea t = new TextArea();
+            char dot = '.'; // userAgent.getLeaderDotCharacter();
+
+            t.setTextArea("" + dot);
+            t.addTrait(Trait.FONT_NAME, font.getFontName());
+            t.addTrait(Trait.FONT_SIZE, new Integer(font.getFontSize()));
+            // set offset of dot within inline parent
+            t.setOffset(font.getAscender());
+            int width = font.getCharWidth(dot);
+            Space spacer = null;
+            if (ldrNode.getPatternWidth() > width) {
+                spacer = new Space();
+                spacer.setWidth(ldrNode.getPatternWidth() - width);
+                width = ldrNode.getPatternWidth();
+            }
+            FilledArea fa = new FilledArea();
+            fa.setUnitWidth(width);
+            fa.addChild(t);
+            if (spacer != null) {
+                fa.addChild(spacer);
+            }
+            fa.setHeight(font.getAscender());
+
+            leaderArea = fa;
+        } else if (ldrNode.getLeaderPattern() == LeaderPattern.USECONTENT) {
+            if (ldrNode.getChildNodes() == null) {
+                ldrNode.getLogger().error("Leader use-content with no content");
+                return null;
+            }
+            InlineStackingLayoutManager lm;
+            lm = new InlineStackingLayoutManager(ldrNode);
+            lm.setLMiter(new LMiter(lm, ldrNode.getChildNodes()));
+            lm.initialize();
+
+            // get breaks then add areas to FilledArea
+            FilledArea fa = new FilledArea();
+            
+            ContentLayoutManager clm = new ContentLayoutManager(fa);
+            clm.setParent(this);
+            clm.setUserAgent(ldrNode.getUserAgent());
+            lm.setParent(clm);
+
+            clm.fillArea(lm);
+            int width = clm.getStackingSize();
+            Space spacer = null;
+            if (ldrNode.getPatternWidth() > width) {
+                spacer = new Space();
+                spacer.setWidth(ldrNode.getPatternWidth() - width);
+                width = ldrNode.getPatternWidth();
+            }
+            fa.setUnitWidth(width);
+            if (spacer != null) {
+                fa.addChild(spacer);
+            }
+            leaderArea = fa;
+        }
+        return leaderArea;
+     }
+}
index 06185a33afdd5811e4097f38094240101a9ea763..9d1163520913b0df9d3de4ab5b206746c91ea120 100644 (file)
@@ -28,7 +28,7 @@ import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.fonts.Font;
 
 /**
- * LayoutManager for the fo:basic-link formatting object
+ * LayoutManager for the fo:page-number-citation formatting object
  */
 public class PageNumberCitationLayoutManager extends LeafNodeLayoutManager {
 
@@ -39,7 +39,7 @@ public class PageNumberCitationLayoutManager extends LeafNodeLayoutManager {
      * Constructor
      *
      * @param node the formatting object that creates this area
-     * @todo better null checking font
+     * @todo better null checking of font object
      */
     public PageNumberCitationLayoutManager(PageNumberCitation node) {
         super(node);