]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
incorporated rest of Arved Sandstrom's simple-link implementation: the FO and layout...
authorjtauber <jtauber@unknown>
Fri, 3 Dec 1999 08:12:59 +0000 (08:12 +0000)
committerjtauber <jtauber@unknown>
Fri, 3 Dec 1999 08:12:59 +0000 (08:12 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193259 13f79535-47bb-0310-9956-ffa450edef68

12 files changed:
STATUS
src/codegen/properties.xml
src/org/apache/fop/fo/FONode.java
src/org/apache/fop/fo/FOText.java
src/org/apache/fop/fo/PropertyListBuilder.java
src/org/apache/fop/fo/StandardElementMapping.java
src/org/apache/fop/fo/flow/Makefile
src/org/apache/fop/fo/flow/PageNumber.java
src/org/apache/fop/fo/flow/SimpleLink.java [new file with mode: 0644]
src/org/apache/fop/layout/BlockArea.java
src/org/apache/fop/layout/LineArea.java
src/org/apache/fop/layout/LinkSet.java

diff --git a/STATUS b/STATUS
index 633b0460946a64f5c11ef8d24fca56859e6a6818..ae3c4dd810543016a0686a009c2edd65091d964a 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -6,13 +6,14 @@ Things to do:
 
 Get images working
 [PARTIAL] Get padding working
-[PARTIAL] Incorporate Arved Sandstrom's simple-link implementation
+[DONE] Incorporate Arved Sandstrom's simple-link implementation
 [PARTIAL] Implement basic keeps
 [PARTIAL] Incorporate Eric Schaeffer's further table fixes
 
 Other Bugs to fix:
 
 colour not continued onto subsequent pages if coloured block goes over page
+simple-link doesn't seem to work (I think I, JKT, broke it)
 
 Todo's and problems with AWT Previewer:
 
index df9e36c5135ed82f32d9323f90b5590dac07e449..e23bcd41e30b397b2c47464094b430130512c249 100644 (file)
     <datatype>Length</datatype>
     <default>0pt</default>
   </property>
+  <property>
+    <name>external-destination</name>
+    <class-name>ExternalDestination</class-name>
+    <inherited>false</inherited>
+    <datatype>String</datatype>
+    <default></default>
+  </property>
 </property-list>
  
index 9e04e66bc8fb5ca4ce8bb064a5de14a7d6e93d5d..0c7fa6b04eb7c63e84e5da25e5c3a289af957346 100644 (file)
@@ -54,6 +54,7 @@ package org.apache.fop.fo;
 // FOP
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.layout.Area;
+import org.apache.fop.layout.LinkSet;
 
 // Java
 import java.util.Vector;
@@ -90,6 +91,8 @@ abstract public class FONode {
     protected int forcedStartOffset = 0;
     protected int forcedWidth = 0;
 
+    protected LinkSet linkSet;
+
     protected FONode(FObj parent) {
        this.parent = parent;
     }
@@ -146,6 +149,14 @@ abstract public class FONode {
        return this.parent;
     }
 
+    public void setLinkSet(LinkSet linkSet) {
+       this.linkSet = linkSet;
+    }
+
+    public LinkSet getLinkSet() {
+       return this.linkSet;
+    }
+
     abstract public Status layout(Area area)
        throws FOPException;
 }
index ad6703f518aeb94241468ea16ee671655282bc12..a35b164866c75007e6e306b008d3b2d302c681b1 100644 (file)
@@ -118,6 +118,7 @@ public class FOText extends FONode {
        int orig_start = this.marker;
        this.marker = ((BlockArea) area).addText(fs, red, green, blue,
                                                 wrapOption,
+                                                this.getLinkSet(),
                                                 whiteSpaceTreatment,
                                                 ca, this.marker, length);
        if (this.marker == -1) {
index bffb5d3e9c087bc952c414489cfb3ecabfcfc144..ebec11f1cf08132aa34aeb3d931ca6f522748f8d 100644 (file)
@@ -109,7 +109,7 @@ public class PropertyListBuilder {
        propertyTable.put("padding-bottom",PaddingBottom.maker());
        propertyTable.put("padding-left",PaddingLeft.maker());
        propertyTable.put("padding-right",PaddingRight.maker());
-
+       propertyTable.put("external-destination",ExternalDestination.maker());
        propertyTable.put("height",SVGLength.maker());
        propertyTable.put("width",SVGLength.maker());
        propertyTable.put("x",SVGLength.maker());
index 006c3bd4ec787784eeea8b82ae88d1a8be3a9a87..515c96ab9d713fa4e3422c92b06b019e0b09aa7a 100644 (file)
@@ -22,7 +22,7 @@
     Alternately, this  acknowledgment may  appear in the software itself,  if
     and wherever such third-party acknowledgments normally appear.
  
- 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+ 4. The names "FOP" and  "Apache Software Foundation"  must not be used to
     endorse  or promote  products derived  from this  software without  prior
     written permission. For written permission, please contact
     apache@apache.org.
@@ -48,6 +48,7 @@
  Software Foundation, please see <http://www.apache.org/>.
  
  */
+
 package org.apache.fop.fo;
 
 import org.apache.fop.fo.flow.*;
@@ -98,5 +99,6 @@ public class StandardElementMapping implements ElementMapping {
        builder.addMapping(uri, "table-body", TableBody.maker());
        builder.addMapping(uri, "table-row", TableRow.maker());
        builder.addMapping(uri, "table-cell", TableCell.maker());
+       builder.addMapping(uri, "simple-link", SimpleLink.maker());
     }
 }
index 974d43270bdb516c08890d58394e5759a047ebe4..8615c2ef50f7468399156cccf8ef19d5e7d2d26b 100644 (file)
@@ -17,6 +17,7 @@ SOURCES=Block.java \
        ListItemBody.java \
        ListItemLabel.java \
        PageNumber.java \
+       SimpleLink.java \
        StaticContent.java \
        Table.java \
        TableBody.java \
index 2844b5d98afbdccd23bb7046031b7227f59f0301..7a5c53ffa290098736900a1d92f07e81ac6a881a 100644 (file)
@@ -111,7 +111,12 @@ public class PageNumber extends FObj {
            this.marker = 0;
        }
        String p = Integer.toString(area.getPage().getNumber());
-       this.marker = ((BlockArea) area).addText(fs, red, green, blue, wrapOption, whiteSpaceTreatment, p.toCharArray(), 0, p.length());
+       this.marker = ((BlockArea) area).addText(fs, red, green, blue,
+                                                wrapOption,
+                                                null,
+                                                whiteSpaceTreatment,
+                                                p.toCharArray(), 0,
+                                                p.length());
        return new Status(Status.OK);
     }
 }
diff --git a/src/org/apache/fop/fo/flow/SimpleLink.java b/src/org/apache/fop/fo/flow/SimpleLink.java
new file mode 100644 (file)
index 0000000..370a66b
--- /dev/null
@@ -0,0 +1,131 @@
+/*-- $Id$ --
+
+ ============================================================================
+                   The Apache Software License, Version 1.1
+ ============================================================================
+    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of  source code must  retain the above copyright  notice,
+    this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+    include  the following  acknowledgment:  "This product includes  software
+    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
+    Alternately, this  acknowledgment may  appear in the software itself,  if
+    and wherever such third-party acknowledgments normally appear.
+ 4. The names "FOP" and  "Apache Software Foundation"  must not be used to
+    endorse  or promote  products derived  from this  software without  prior
+    written permission. For written permission, please contact
+    apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+    "Apache" appear  in their name,  without prior written permission  of the
+    Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software  Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+
+/* this class contributed by Arved Sandstrom with minor modifications
+   by James Tauber */
+
+package org.apache.fop.fo.flow;
+
+// FOP
+import org.apache.fop.fo.*;
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.fo.properties.*;
+import org.apache.fop.layout.*;
+import org.apache.fop.datatypes.ColorType;
+
+// Java
+import java.util.Enumeration;
+import java.awt.Rectangle;
+
+public class SimpleLink extends FObjMixed {
+
+    public static class Maker extends FObj.Maker {
+       public FObj make(FObj parent, PropertyList propertyList)
+           throws FOPException { 
+           return new SimpleLink(parent, propertyList);
+       }
+    }
+
+    public static FObj.Maker maker() {
+       return new SimpleLink.Maker();
+    }
+    
+    public SimpleLink(FObj parent, PropertyList propertyList)
+       throws FOPException {
+       super(parent, propertyList);
+       this.name = "fo:simple-link";
+               
+       if (parent.getName().equals("fo:flow")) {
+           throw new FOPException("simple-link can't be directly"
+                                  + " under flow"); 
+       }
+    }
+
+    public Status layout(Area area) throws FOPException {
+       
+       String externalDest =
+           this.properties.get("external-destination").getString();
+       
+       if (this.marker == START) {
+           this.marker = 0;
+       }
+       
+       // new LinkedArea to gather up inlines
+       LinkSet ls = new LinkSet(externalDest);
+               
+       Page p = area.getPage();
+
+       // assumption - AS
+       // should be able to retrieve this from somewhere - JT
+       AreaContainer ac = p.getBody();
+               
+       int numChildren = this.children.size();
+       for (int i = this.marker; i < numChildren; i++) {
+           FONode fo = (FONode) children.elementAt(i);
+           fo.setLinkSet(ls);
+                   
+           Status status;
+           if ((status = fo.layout(area)).isIncomplete()) {
+               this.marker = i;
+               return status;
+           }
+       }
+               
+       ls.applyAreaContainerOffsets(ac);
+               
+       // comment this out to see individual words linked
+       ls.mergeLinks();
+               
+       p.addLinkSet(ls);
+
+       return new Status(Status.OK);
+    }
+}
index a9242bbbbe17ccf2a346ed9a1216606818c1aa86..2532e9567527018d23cfba6ee85f6926f8684e9a 100644 (file)
@@ -113,7 +113,7 @@ public class BlockArea extends Area {
     }
 
     public int addText(FontState fontState, float red, float green,
-                      float blue, int wrapOption,
+                      float blue, int wrapOption, LinkSet ls,
                       int whiteSpaceTreatment, char data[],
                       int start, int end) { 
        int ts, te;
@@ -131,7 +131,12 @@ public class BlockArea extends Area {
        this.currentLineArea.changeColor(red, green, blue);
        this.currentLineArea.changeWrapOption(wrapOption);
        this.currentLineArea.changeWhiteSpaceTreatment(whiteSpaceTreatment);
-       ts = this.currentLineArea.addText(ca, ts, te);
+
+       if (ls != null) {
+           ls.setYOffset(currentHeight);
+       }
+
+       ts = this.currentLineArea.addText(ca, ts, te, ls);
        this.hasLines = true;
                
        while (ts != -1) {
@@ -148,7 +153,11 @@ public class BlockArea extends Area {
            this.currentLineArea.changeColor(red, green, blue);
            this.currentLineArea.changeWrapOption(wrapOption);
            this.currentLineArea.changeWhiteSpaceTreatment(whiteSpaceTreatment);
-           ts = this.currentLineArea.addText(ca, ts, te);
+           if (ls != null) {
+               ls.setYOffset(currentHeight);
+           }
+
+           ts = this.currentLineArea.addText(ca, ts, te, ls);
        }
        return -1;
     }
index c2993f38e5ebc246d8dd0d904863a253ecd7b833..64b8c21a0e37f5bd50ef982a48634459e9d023c5 100644 (file)
@@ -22,7 +22,7 @@
     Alternately, this  acknowledgment may  appear in the software itself,  if
     and wherever such third-party acknowledgments normally appear.
  
- 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+ 4. The names "FOP" and  "Apache Software Foundation"  must not be used to
     endorse  or promote  products derived  from this  software without  prior
     written permission. For written permission, please contact
     apache@apache.org.
  Software Foundation, please see <http://www.apache.org/>.
  
  */
+
 package org.apache.fop.layout;
 
 import org.apache.fop.render.Renderer;
 
 import java.util.Vector;
 import java.util.Enumeration;
+import java.awt.Rectangle;
 
 import org.apache.fop.fo.properties.WrapOption; // for enumerated
 // values 
@@ -143,7 +145,7 @@ public class LineArea extends Area {
        renderer.renderLineArea(this);
     }
 
-    public int addText(char data[], int start, int end) {
+    public int addText(char data[], int start, int end, LinkSet ls) {
        boolean overrun = false;
 
        wordStart = start;
@@ -212,6 +214,16 @@ public class LineArea extends Area {
                    Enumeration e = pendingAreas.elements();
                    while (e.hasMoreElements()) {
                        InlineArea inlineArea = (InlineArea) e.nextElement();
+                       if (ls != null) {
+                           Rectangle lr =
+                               new Rectangle(startIndent +
+                                             finalWidth,
+                                             0,
+                                             inlineArea.getContentWidth(),
+                                             lineHeight);
+                           ls.addRect(lr);
+                       }
+
                        addChild(inlineArea);
                    }
                    finalWidth += pendingWidth;
@@ -223,12 +235,22 @@ public class LineArea extends Area {
                    // add the current word
 
                    if (wordLength > 0) {
-                       addChild(new InlineArea(currentFontState,
-                                               this.red, this.green,
-                                               this.blue, new
-                                               String(data, wordStart,
-                                                      wordLength),
-                                               wordWidth)); 
+                       InlineArea ia = new InlineArea(currentFontState,
+                                                      this.red, this.green,
+                                                      this.blue, new
+                                                      String(data, wordStart,
+                                                             wordLength),
+                                                      wordWidth);
+                       addChild(ia);
+                       if (ls != null) {
+                           Rectangle lr =
+                               new Rectangle(startIndent +
+                                             finalWidth,
+                                             0,
+                                             ia.getContentWidth(),
+                                             lineHeight);
+                           ls.addRect(lr);
+                       }
                        finalWidth += wordWidth;
 
                        // reset word width
@@ -318,10 +340,19 @@ public class LineArea extends Area {
        } // end of iteration over text
 
        if (prev == TEXT) {
-           pendingAreas.addElement(new InlineArea(currentFontState, this.red,
+           InlineArea pia = new InlineArea(currentFontState, this.red,
                                    this.green, this.blue, new
                                    String(data, wordStart,
-                                          wordLength), wordWidth)); 
+                                          wordLength), wordWidth); 
+           if (ls != null) {
+               Rectangle lr =
+                   new Rectangle(startIndent + finalWidth,
+                                 spaceWidth,
+                                 pia.getContentWidth(),
+                                 lineHeight);
+               ls.addRect(lr);
+           }
+           pendingAreas.addElement(pia);
            pendingWidth += wordWidth;
            wordWidth = 0;
        }
index 9f2b66309f6ab541b03c9f699301970db968e4e4..66e6141491366adb82b9d425908d396d7f4345a5 100644 (file)
@@ -79,7 +79,7 @@ public class LinkSet {
        this.externalDestination = externalDest;
     }
     
-    public void addLinkedRect(Rectangle r) {
+    public void addRect(Rectangle r) {
        r.y = yoffset;
        rects.addElement(r);
     }