From ff886e3d91f9acffee6c8f0607012acac6601b20 Mon Sep 17 00:00:00 2001 From: jtauber Date: Fri, 3 Dec 1999 08:12:59 +0000 Subject: incorporated rest of Arved Sandstrom's simple-link implementation: the FO and layout class modifications git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193259 13f79535-47bb-0310-9956-ffa450edef68 --- STATUS | 3 +- src/codegen/properties.xml | 7 ++ src/org/apache/fop/fo/FONode.java | 11 ++ src/org/apache/fop/fo/FOText.java | 1 + src/org/apache/fop/fo/PropertyListBuilder.java | 2 +- src/org/apache/fop/fo/StandardElementMapping.java | 4 +- src/org/apache/fop/fo/flow/Makefile | 1 + src/org/apache/fop/fo/flow/PageNumber.java | 7 +- src/org/apache/fop/fo/flow/SimpleLink.java | 131 ++++++++++++++++++++++ src/org/apache/fop/layout/BlockArea.java | 15 ++- src/org/apache/fop/layout/LineArea.java | 51 +++++++-- src/org/apache/fop/layout/LinkSet.java | 2 +- 12 files changed, 217 insertions(+), 18 deletions(-) create mode 100644 src/org/apache/fop/fo/flow/SimpleLink.java diff --git a/STATUS b/STATUS index 633b04609..ae3c4dd81 100644 --- 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: diff --git a/src/codegen/properties.xml b/src/codegen/properties.xml index df9e36c51..e23bcd41e 100644 --- a/src/codegen/properties.xml +++ b/src/codegen/properties.xml @@ -358,5 +358,12 @@ Length 0pt + + external-destination + ExternalDestination + false + String + + diff --git a/src/org/apache/fop/fo/FONode.java b/src/org/apache/fop/fo/FONode.java index 9e04e66bc..0c7fa6b04 100644 --- a/src/org/apache/fop/fo/FONode.java +++ b/src/org/apache/fop/fo/FONode.java @@ -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; } diff --git a/src/org/apache/fop/fo/FOText.java b/src/org/apache/fop/fo/FOText.java index ad6703f51..a35b16486 100644 --- a/src/org/apache/fop/fo/FOText.java +++ b/src/org/apache/fop/fo/FOText.java @@ -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) { diff --git a/src/org/apache/fop/fo/PropertyListBuilder.java b/src/org/apache/fop/fo/PropertyListBuilder.java index bffb5d3e9..ebec11f1c 100644 --- a/src/org/apache/fop/fo/PropertyListBuilder.java +++ b/src/org/apache/fop/fo/PropertyListBuilder.java @@ -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()); diff --git a/src/org/apache/fop/fo/StandardElementMapping.java b/src/org/apache/fop/fo/StandardElementMapping.java index 006c3bd4e..515c96ab9 100644 --- a/src/org/apache/fop/fo/StandardElementMapping.java +++ b/src/org/apache/fop/fo/StandardElementMapping.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.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()); } } diff --git a/src/org/apache/fop/fo/flow/Makefile b/src/org/apache/fop/fo/flow/Makefile index 974d43270..8615c2ef5 100644 --- a/src/org/apache/fop/fo/flow/Makefile +++ b/src/org/apache/fop/fo/flow/Makefile @@ -17,6 +17,7 @@ SOURCES=Block.java \ ListItemBody.java \ ListItemLabel.java \ PageNumber.java \ + SimpleLink.java \ StaticContent.java \ Table.java \ TableBody.java \ diff --git a/src/org/apache/fop/fo/flow/PageNumber.java b/src/org/apache/fop/fo/flow/PageNumber.java index 2844b5d98..7a5c53ffa 100644 --- a/src/org/apache/fop/fo/flow/PageNumber.java +++ b/src/org/apache/fop/fo/flow/PageNumber.java @@ -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 index 000000000..370a66b5a --- /dev/null +++ b/src/org/apache/fop/fo/flow/SimpleLink.java @@ -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 . 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.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); + } +} diff --git a/src/org/apache/fop/layout/BlockArea.java b/src/org/apache/fop/layout/BlockArea.java index a9242bbbb..2532e9567 100644 --- a/src/org/apache/fop/layout/BlockArea.java +++ b/src/org/apache/fop/layout/BlockArea.java @@ -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; } diff --git a/src/org/apache/fop/layout/LineArea.java b/src/org/apache/fop/layout/LineArea.java index c2993f38e..64b8c21a0 100644 --- a/src/org/apache/fop/layout/LineArea.java +++ b/src/org/apache/fop/layout/LineArea.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,12 +48,14 @@ Software Foundation, please see . */ + 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; } diff --git a/src/org/apache/fop/layout/LinkSet.java b/src/org/apache/fop/layout/LinkSet.java index 9f2b66309..66e614149 100644 --- a/src/org/apache/fop/layout/LinkSet.java +++ b/src/org/apache/fop/layout/LinkSet.java @@ -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); } -- cgit v1.2.3