From b85a365bfee0a45ad0f5914ad7211addcfca747b Mon Sep 17 00:00:00 2001 From: jtauber Date: Thu, 2 Dec 1999 09:37:50 +0000 Subject: [PATCH] added more of Arved Sandtrom's simple-link implementation. New class LinkSet and modifications to Page and PDFRenderer to contain and make use of this class respectively 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 | 132 ++++++++++++++++++ src/org/apache/fop/layout/Makefile | 1 + src/org/apache/fop/layout/Page.java | 17 ++- .../apache/fop/render/pdf/PDFRenderer.java | 18 ++- 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/org/apache/fop/layout/LinkSet.java diff --git a/src/org/apache/fop/layout/LinkSet.java b/src/org/apache/fop/layout/LinkSet.java new file mode 100644 index 000000000..9f2b66309 --- /dev/null +++ b/src/org/apache/fop/layout/LinkSet.java @@ -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 . For more information on the Apache + Software Foundation, please see . + + */ + +/* 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; + } +} diff --git a/src/org/apache/fop/layout/Makefile b/src/org/apache/fop/layout/Makefile index 3139558d1..c4ffccba0 100644 --- a/src/org/apache/fop/layout/Makefile +++ b/src/org/apache/fop/layout/Makefile @@ -18,6 +18,7 @@ SOURCES=AlternatingPageMasterFactory.java \ InlineArea.java \ InlineSpace.java \ LineArea.java \ + LinkSet.java \ Page.java \ PageMaster.java \ PageMasterFactory.java \ diff --git a/src/org/apache/fop/layout/Page.java b/src/org/apache/fop/layout/Page.java index c283b0d5c..18db9fa64 100644 --- a/src/org/apache/fop/layout/Page.java +++ b/src/org/apache/fop/layout/Page.java @@ -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 . */ + 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()); + } } diff --git a/src/org/apache/fop/render/pdf/PDFRenderer.java b/src/org/apache/fop/render/pdf/PDFRenderer.java index 03bf6d40e..f8265f1b1 100644 --- a/src/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/org/apache/fop/render/pdf/PDFRenderer.java @@ -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); + } + } + } } /** -- 2.39.5