<fop fofile="${foDir}/table.fo" pdffile="${testDir}/table.pdf"/>
<fop fofile="${foDir}/list.fo" pdffile="${testDir}/list.pdf"/>
<fop fofile="${foDir}/link.fo" pdffile="${testDir}/link.pdf"/>
+ <fop fofile="${foDir}/newlinktest.fo" pdffile="${testDir}/newlinktest.pdf"/>
<fop fofile="${foDir}/border.fo" pdffile="${testDir}/border.pdf"/>
<fop fofile="${foDir}/extensive.fo" pdffile="${testDir}/extensive.pdf"/>
<fop fofile="${foDir}/images.fo" pdffile="${testDir}/images.pdf"/>
<fop fofile="${foDir}/table.fo" pdffile="${referenceDir}/table.pdf"/>
<fop fofile="${foDir}/list.fo" pdffile="${referenceDir}/list.pdf"/>
<fop fofile="${foDir}/link.fo" pdffile="${referenceDir}/link.pdf"/>
+ <fop fofile="${foDir}/newlinktest.fo" pdffile="${referenceDir}/newlinktest.pdf"/>
<fop fofile="${foDir}/border.fo" pdffile="${referenceDir}/border.pdf"/>
<fop fofile="${foDir}/extensive.fo" pdffile="${referenceDir}/extensive.pdf"/>
<fop fofile="${foDir}/images.fo" pdffile="${referenceDir}/images.pdf"/>
--- /dev/null
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+
+ <!-- layout for the first page -->
+ <fo:simple-page-master master-name="first"
+ margin-top="1in"
+ margin-bottom="1in"
+ margin-left="1in"
+ margin-right="1in">
+ <fo:region-body/>
+ </fo:simple-page-master>
+
+
+ </fo:layout-master-set>
+ <!-- end: defines page layout -->
+
+ <!-- actual layout -->
+ <fo:page-sequence master-name="first">
+
+
+
+
+<fo:flow flow-name="xsl-region-body">
+
+ <fo:block space-after.optimum="3pt" font-family="serif" id="block1">
+ FOP is the world's first print formatter driven by XSL formatting
+ objects. It is a Java 1.1 application that reads a formatting object
+ tree and then turns it into a PDF document. The formatting object
+ tree, can be in the form of an XML document (output by an XSLT engine
+ like XT or Xalan) or can be passed in memory as a DOM Document or (in
+ the case of XT) SAX events.
+ </fo:block>
+
+ <fo:block space-after.optimum="12pt" font-family="serif">FOP is part of Apache's XML project. The homepage of FOP is
+ <fo:inline font-style="italic" font-family="serif"><fo:basic-link color="blue" external-destination="http://xml.apache.org/fop">http://xml.apache.org/fop</fo:basic-link></fo:inline>
+ </fo:block>
+
+<fo:block space-after.optimum="12pt" font-family="serif" font-weight="bold" text-align="center">
+align="start"
+</fo:block>
+
+<fo:block space-after.optimum="12pt" font-family="serif" text-align="start">
+ Apache FOP is the world's first print formatter driven by XSL formatting
+ objects. It is a Java 1.1 application that reads a <fo:basic-link internal-destination="block1" color="blue">formatting object</fo:basic-link>
+ tree and then turns it into a <fo:basic-link internal-destination="block1" color="blue">PDF document</fo:basic-link>. The formatting object
+ tree, can be in the form of an XML <fo:basic-link internal-destination="block1" color="blue">document</fo:basic-link> (output by an XSLT engine
+ like XT or Xalan) or can be passed in memory as a DOM Document or (in
+ the case of XT) SAX events.
+
+ </fo:block>
+
+<fo:block space-after.optimum="12pt" font-family="serif" font-weight="bold" text-align="center">
+align="center"
+</fo:block>
+
+<fo:block space-after.optimum="12pt" font-family="serif" text-align="center">
+ Apache FOP is the world's first print formatter driven by XSL formatting
+ objects. It is a Java 1.1 application that reads a <fo:basic-link internal-destination="block1" color="blue">formatting object</fo:basic-link>
+ tree and then turns it into a <fo:basic-link internal-destination="block1" color="blue">PDF document</fo:basic-link>. The formatting object
+ tree, can be in the form of an XML <fo:basic-link internal-destination="block1" color="blue">document</fo:basic-link> (output by an XSLT engine
+ like XT or Xalan) or can be passed in memory as a DOM Document or (in
+ the case of XT) SAX events.
+
+ </fo:block>
+
+<fo:block space-after.optimum="12pt" font-family="serif" font-weight="bold" text-align="center">
+align="justify"
+</fo:block>
+
+ <fo:block space-after.optimum="12pt" font-family="serif" text-align="justify">
+ Apache FOP is the world's first print formatter driven by XSL formatting
+ objects. It is a Java 1.1 application that reads a <fo:basic-link internal-destination="block1" color="blue">formatting object</fo:basic-link>
+ tree and then turns it into a <fo:basic-link internal-destination="block1" color="blue">PDF document</fo:basic-link>. The formatting object
+ tree, can be in the form of an XML <fo:basic-link internal-destination="block1" color="blue">document</fo:basic-link> (output by an XSLT engine
+ like XT or Xalan) or can be passed in memory as a DOM Document or (in
+ the case of XT) SAX events.
+
+ </fo:block>
+
+<!-- table start -->
+ <fo:table>
+ <fo:table-column column-width="50mm"/>
+ <fo:table-column column-width="50mm"/>
+ <fo:table-column column-width="50mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell ><fo:block>good</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block>bad</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block><fo:basic-link internal-destination="block1" color="blue">ugly</fo:basic-link></fo:block></fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell ><fo:block>nice</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block><fo:basic-link internal-destination="block1" color="blue">dice</fo:basic-link></fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block>vice</fo:block></fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell ><fo:block>literature</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block>music</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block><fo:basic-link internal-destination="block1" color="blue">art</fo:basic-link></fo:block></fo:table-cell>
+ </fo:table-row>
+ <fo:table-row>
+ <fo:table-cell ><fo:block><fo:basic-link internal-destination="block1" color="blue">java</fo:basic-link></fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block>perl</fo:block></fo:table-cell>
+ <fo:table-cell ><fo:block>python</fo:block></fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ <!-- table end -->
+
+
+</fo:flow>
+
+</fo:page-sequence>
+</fo:root>
((InlineArea) box).
getContentWidth(),
fontState.getFontSize());
- ls.addRect(lr, this);
+ ls.addRect(lr, this, (InlineArea)box);
}
}
addChild(box);
Rectangle lr = new Rectangle(finalWidth, 0,
ia.getContentWidth(),
fontState.getFontSize());
- ls.addRect(lr, this);
+ ls.addRect(lr, this, ia);
}
finalWidth += wordWidth;
Rectangle lr = new Rectangle(finalWidth + spaceWidth +
embeddedLinkStart, spaceWidth,
pia.getContentWidth(), fontState.getFontSize());
- ls.addRect(lr, this);
+ ls.addRect(lr, this, pia);
}
embeddedLinkStart += wordWidth;
endIndent += padding;
break;
case TextAlign.JUSTIFY: // justify
- Vector spaceList = new Vector();
-
+ // first pass - count the spaces
int spaceCount = 0;
Enumeration e = children.elements();
while (e.hasMoreElements()) {
if (b instanceof InlineSpace) {
InlineSpace space = (InlineSpace) b;
if (space.getResizeable()) {
- spaceList.addElement(space);
spaceCount++;
}
}
} else { // no spaces
padding = 0;
}
- Enumeration f = spaceList.elements();
- while (f.hasMoreElements()) {
- InlineSpace space2 = (InlineSpace) f.nextElement();
- int i = space2.getSize();
- space2.setSize(i + padding);
+ // second pass - add additional space
+ spaceCount = 0;
+ e = children.elements();
+ while (e.hasMoreElements()) {
+ Box b = (Box) e.nextElement();
+ if (b instanceof InlineSpace) {
+ InlineSpace space = (InlineSpace) b;
+ if (space.getResizeable()) {
+ space.setSize(space.getSize() + padding);
+ spaceCount++;
+ }
+ }
+ else if (b instanceof InlineArea) {
+ ((InlineArea)b).setXOffset(spaceCount * padding);
+ }
+
}
}
}
import java.util.Enumeration;
import java.awt.Rectangle;
+import org.apache.fop.layout.inline.InlineArea;
+
import org.apache.fop.fo.properties.WrapOption; // for enumerated
// values
// import org.apache.fop.fo.properties.WhiteSpaceCollapse; // for
this.linkType = linkType;
}
- public void addRect(Rectangle r, LineArea lineArea) {
- LinkedRectangle linkedRectangle = new LinkedRectangle(r, lineArea);
+ 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;
Enumeration re = rects.elements();
while (re.hasMoreElements()) {
LinkedRectangle r = (LinkedRectangle) re.nextElement();
- r.setX(r.getX() + r.getLineArea().getStartIndent());
+ r.setX(r.getX() +
+ r.getLineArea().getStartIndent() +
+ r.getInlineArea().getXOffset());
}
}
// Java
import java.awt.Rectangle;
+import org.apache.fop.layout.inline.InlineArea;
+
/**
* an object that stores a rectangle that is linked, and the LineArea
* that it is logically associated with
/** the associated LineArea */
protected LineArea lineArea;
- public LinkedRectangle(Rectangle link, LineArea lineArea) {
+ /** the associated InlineArea */
+ protected InlineArea inlineArea;
+
+ public LinkedRectangle(Rectangle link, LineArea lineArea, InlineArea inlineArea) {
this.link = link;
this.lineArea = lineArea;
+ this.inlineArea = inlineArea;
}
public LinkedRectangle(LinkedRectangle lr) {
this.link = new Rectangle( lr.getRectangle() );
this.lineArea = lr.getLineArea();
+ this.inlineArea = lr.getInlineArea();
}
public void setRectangle(Rectangle link) {
return this.lineArea;
}
- public void setLineArea() {
+ public void setLineArea(LineArea lineArea) {
this.lineArea = lineArea;
}
+
+ public InlineArea getInlineArea() {
+ return this.inlineArea;
+ }
+
+ public void setLineArea(InlineArea inlineArea) {
+ this.inlineArea = inlineArea;
+ }
public void setX(int x) {
this.link.x = x;
public abstract class InlineArea extends Area {
private int yOffset = 0;
+
+ /** amount of space added since the original layout - needed by links */
+ private int xOffset = 0;
protected int height = 0;
private int verticalAlign = 0;
protected String pageNumberId = null;
return this.yOffset;
}
+ public void setXOffset(int xOffset) {
+ this.xOffset = xOffset;
+ }
+
+ public int getXOffset() {
+ return this.xOffset;
+ }
+
public String getPageNumberID() {
return pageNumberId;
}