jeremias 2002/11/11 03:01:42 Modified: src/org/apache/fop/layout Tag: fop-0_20_2-maintain LinkSet.java Log: Fix ArrayOutOfBoundException when number of rects is zero in mergeLinks(). Fix line endings ArrayList --> List Revision Changes Path No revision No revision 1.11.2.2 +151 -151 xml-fop/src/org/apache/fop/layout/Attic/LinkSet.java Index: LinkSet.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/layout/Attic/LinkSet.java,v retrieving revision 1.11.2.1 retrieving revision 1.11.2.2 diff -u -r1.11.2.1 -r1.11.2.2 --- LinkSet.java 2 Aug 2002 20:28:52 -0000 1.11.2.1 +++ LinkSet.java 11 Nov 2002 11:01:41 -0000 1.11.2.2 @@ -1,151 +1,151 @@ -/* - * $Id$ - * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. - * For details on use and redistribution please refer to the - * LICENSE file included with these sources. - */ - -package org.apache.fop.layout; - -import org.apache.fop.layout.inline.InlineArea; - -// Java -import java.util.ArrayList; -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 destination; - - /** - * the set of rectangles - */ - ArrayList rects = new ArrayList(); - - private int xoffset = 0; - private int yoffset = 0; - - /* the maximum Y offset value encountered for this LinkSet */ - private int maxY = 0; - - protected int startIndent; - protected int endIndent; - - private int linkType; - - private Area area; - - public final static int INTERNAL = 0, // represents internal link - EXTERNAL = 1; // represents external link - - // property required for alignment adjustments - int contentRectangleWidth = 0; - - public LinkSet(String destination, Area area, int linkType) { - this.destination = destination; - this.area = area; - this.linkType = linkType; - } - - public void addRect(Rectangle r, LineArea lineArea, - InlineArea inlineArea) { - LinkedRectangle linkedRectangle = new LinkedRectangle(r, lineArea, - inlineArea); - linkedRectangle.setY(this.yoffset); - if (this.yoffset > maxY) { - maxY = this.yoffset; - } - rects.add(linkedRectangle); - } - - public void setYOffset(int y) { - this.yoffset = y; - } - - public void setXOffset(int x) { - this.xoffset = x; - } - - public void setContentRectangleWidth(int contentRectangleWidth) { - this.contentRectangleWidth = contentRectangleWidth; - } - - public void applyAreaContainerOffsets(AreaContainer ac, Area area) { - int height = area.getAbsoluteHeight(); - BlockArea ba = (BlockArea)area; - for (int i = 0; i < rects.size(); i++ ) { - LinkedRectangle r = (LinkedRectangle)rects.get(i); - r.setX(r.getX() + ac.getXPosition() + area.getTableCellXOffset()); - r.setY(ac.getYPosition() - height + (maxY - r.getY()) - - ba.getHalfLeading()); - } - } - - // intermediate implementation for joining all sublinks on same line - public void mergeLinks() { - int numRects = rects.size(); - if (numRects == 1) - return; - - LinkedRectangle curRect = - new LinkedRectangle((LinkedRectangle)rects.get(0)); - ArrayList nv = new ArrayList(); - - for (int ri = 1; ri < numRects; ri++) { - LinkedRectangle r = (LinkedRectangle)rects.get(ri); - - // yes, I'm really happy with comparing refs... - if (r.getLineArea() == curRect.getLineArea()) { - curRect.setWidth(r.getX() + r.getWidth() - curRect.getX()); - } else { - nv.add(curRect); - curRect = new LinkedRectangle(r); - } - - if (ri == numRects - 1) - nv.add(curRect); - } - - rects = nv; - } - - public void align() { - for (int i = 0; i < rects.size(); i++ ) { - LinkedRectangle r = (LinkedRectangle)rects.get(i); - r.setX(r.getX() + r.getLineArea().getStartIndent() - + r.getInlineArea().getXOffset()); - } - } - - public String getDest() { - return this.destination; - } - - public ArrayList getRects() { - return this.rects; - } - - public int getEndIndent() { - return endIndent; - } - - public int getStartIndent() { - return startIndent; - } - - public Area getArea() { - return area; - } - - public int getLinkType() { - return linkType; - } - -} +/* + * $Id$ + * Copyright (C) 2001-2002 The Apache Software Foundation. All rights reserved. + * For details on use and redistribution please refer to the + * LICENSE file included with these sources. + */ + +package org.apache.fop.layout; + +import org.apache.fop.layout.inline.InlineArea; + +// Java +import java.util.List; +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 + */ + private String destination; + + /** + * the set of rectangles + */ + private List rects = new java.util.ArrayList(); + + private int xoffset = 0; + private int yoffset = 0; + + /* the maximum Y offset value encountered for this LinkSet */ + private int maxY = 0; + + protected int startIndent; + protected int endIndent; + + private int linkType; + + private Area area; + + public static final int INTERNAL = 0; // represents internal link + public static final int EXTERNAL = 1; // represents external link + + // property required for alignment adjustments + private int contentRectangleWidth = 0; + + public LinkSet(String destination, Area area, int linkType) { + this.destination = destination; + this.area = area; + this.linkType = linkType; + } + + public void addRect(Rectangle r, LineArea lineArea, + InlineArea inlineArea) { + LinkedRectangle linkedRectangle = new LinkedRectangle(r, lineArea, + inlineArea); + linkedRectangle.setY(this.yoffset); + if (this.yoffset > maxY) { + maxY = this.yoffset; + } + rects.add(linkedRectangle); + } + + public void setYOffset(int y) { + this.yoffset = y; + } + + public void setXOffset(int x) { + this.xoffset = x; + } + + public void setContentRectangleWidth(int contentRectangleWidth) { + this.contentRectangleWidth = contentRectangleWidth; + } + + public void applyAreaContainerOffsets(AreaContainer ac, Area area) { + int height = area.getAbsoluteHeight(); + BlockArea ba = (BlockArea)area; + for (int i = 0; i < rects.size(); i++ ) { + LinkedRectangle r = (LinkedRectangle)rects.get(i); + r.setX(r.getX() + ac.getXPosition() + area.getTableCellXOffset()); + r.setY(ac.getYPosition() - height + (maxY - r.getY()) + - ba.getHalfLeading()); + } + } + + // intermediate implementation for joining all sublinks on same line + public void mergeLinks() { + int numRects = rects.size(); + if (numRects < 1) return; + + LinkedRectangle curRect = + new LinkedRectangle((LinkedRectangle)rects.get(0)); + List nv = new java.util.ArrayList(); + + for (int ri = 1; ri < numRects; ri++) { + LinkedRectangle r = (LinkedRectangle)rects.get(ri); + + // yes, I'm really happy with comparing refs... + if (r.getLineArea() == curRect.getLineArea()) { + curRect.setWidth(r.getX() + r.getWidth() - curRect.getX()); + } else { + nv.add(curRect); + curRect = new LinkedRectangle(r); + } + + if (ri == numRects - 1) { + nv.add(curRect); + } + } + + rects = nv; + } + + public void align() { + for (int i = 0; i < rects.size(); i++ ) { + LinkedRectangle r = (LinkedRectangle)rects.get(i); + r.setX(r.getX() + r.getLineArea().getStartIndent() + + r.getInlineArea().getXOffset()); + } + } + + public String getDest() { + return this.destination; + } + + public List getRects() { + return this.rects; + } + + public int getEndIndent() { + return endIndent; + } + + public int getStartIndent() { + return startIndent; + } + + public Area getArea() { + return area; + } + + public int getLinkType() { + return linkType; + } + +}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]