]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
added more of Arved Sandtrom's simple-link implementation. New class LinkSet and...
authorjtauber <jtauber@unknown>
Thu, 2 Dec 1999 09:37:50 +0000 (09:37 +0000)
committerjtauber <jtauber@unknown>
Thu, 2 Dec 1999 09:37:50 +0000 (09:37 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193258 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/layout/LinkSet.java [new file with mode: 0644]
src/org/apache/fop/layout/Makefile
src/org/apache/fop/layout/Page.java
src/org/apache/fop/render/pdf/PDFRenderer.java

diff --git a/src/org/apache/fop/layout/LinkSet.java b/src/org/apache/fop/layout/LinkSet.java
new file mode 100644 (file)
index 0000000..9f2b663
--- /dev/null
@@ -0,0 +1,132 @@
+/*-- $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.layout;
+
+// Java
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Rectangle;
+
+/**
+ * a set of rectangles on a page that are linked to a common
+ * destination
+ */
+public class LinkSet {
+
+    /** the destination of the links */
+    String externalDestination;
+
+    /** the set of rectangles */
+    Vector rects = new Vector();
+
+    int xoffset = 0;
+
+    int yoffset = 0;
+       
+    public LinkSet(String externalDest) {
+       this.externalDestination = externalDest;
+    }
+    
+    public void addLinkedRect(Rectangle r) {
+       r.y = yoffset;
+       rects.addElement(r);
+    }
+       
+    public void setYOffset(int y) {
+       this.yoffset = y;
+    }
+       
+    public void applyAreaContainerOffsets(AreaContainer ac) {
+       Enumeration re = rects.elements();
+       while (re.hasMoreElements()) {
+           Rectangle r = (Rectangle)re.nextElement();
+           r.x += ac.getXPosition();
+           r.y = ac.getYPosition() - ac.getHeight() - r.y;
+       }
+    }
+       
+    // intermediate implementation for joining all sublinks on same line
+    public void mergeLinks() {
+       int numRects = rects.size();
+       if (numRects == 1)
+           return;
+       
+       Rectangle curRect = new Rectangle((Rectangle)rects.elementAt(0));
+       Vector nv = new Vector();
+               
+       for (int ri=1; ri < numRects; ri++) {
+           Rectangle r = (Rectangle)rects.elementAt(ri);
+           
+           if ((r.y != curRect.y) || (curRect.height != r.height)) {
+               nv.addElement(curRect);
+               curRect = new Rectangle(r);
+           } else {
+               curRect.width = r.x + r.width - curRect.x;
+           }
+           if (ri == numRects-1)
+               nv.addElement(curRect);
+       }
+       
+       rects = nv;
+    }
+       
+    public String getDest() {
+       return this.externalDestination;
+    }
+
+    public Vector getRects() {
+       return this.rects;
+    }
+}
index 3139558d1d33085e7ac0db1fbc882c60c02a8e72..c4ffccba041c16c742471d0fd48179510455bb67 100644 (file)
@@ -18,6 +18,7 @@ SOURCES=AlternatingPageMasterFactory.java \
        InlineArea.java \
        InlineSpace.java \
        LineArea.java \
+       LinkSet.java \
        Page.java \
        PageMaster.java \
        PageMasterFactory.java \
index c283b0d5ca53111550d09a8d9e0ec9edd764f8f5..18db9fa64c2d07d7a6ef7e6ed7804cec635c705a 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.layout;
 
 // FOP
@@ -72,6 +73,8 @@ public class Page {
 
     protected int pageNumber = 0;
 
+    protected Vector linkSets = new Vector();
+
     Page(AreaTree areaTree, int height, int width) {
        this.areaTree = areaTree;
        this.height = height;
@@ -138,4 +141,16 @@ public class Page {
     public FontInfo getFontInfo() {
        return this.areaTree.getFontInfo();
     }
+
+    public void addLinkSet(LinkSet linkSet) {
+       this.linkSets.addElement(linkSet);
+    }
+
+    public Vector getLinkSets() {
+       return this.linkSets;
+    }
+
+    public boolean hasLinks() {
+       return (!this.linkSets.isEmpty());
+    }
 }
index 03bf6d40e24ec8e9918261588463ec2661178019..f8265f1b14fba09e1dda8629a8a0234b7cc37813 100644 (file)
@@ -64,6 +64,8 @@ import org.apache.fop.pdf.*;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Enumeration;
+import java.awt.Rectangle;
+import java.util.Vector;
 
 /**
  * Renderer that renders areas to PDF
@@ -457,7 +459,21 @@ public class PDFRenderer implements Renderer {
        currentStream.add("ET\n");
 
        this.pdfDoc.makePage(this.pdfResources, currentStream,
-                            page.getWidth()/1000, page.getHeight()/1000);
+                            page.getWidth()/1000,
+                            page.getHeight()/1000);
+
+       if (page.hasLinks()) {
+           Enumeration e = page.getLinkSets().elements();
+           while (e.hasMoreElements()) {
+               LinkSet linkSet = (LinkSet) e.nextElement();
+               String dest = linkSet.getDest();
+               Enumeration f = linkSet.getRects().elements();
+               while (f.hasMoreElements()) {
+                   Rectangle rect = (Rectangle) f.nextElement();
+                   this.pdfDoc.makeLink(rect, dest);
+               }
+           }
+       }
     }
 
     /**