Browse Source

Merged revisions 707631,708012 via svnmerge from

https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk

........
  r707631 | jeremias | 2008-10-24 14:42:59 +0100 (Fri, 24 Oct 2008) | 2 lines
  
  Fixed a problem where the BPD or a block area could be wrong if there is a nested, absolutely positioned area (for example a block-container).
  This was most probably introduced by rev 618992.
........
  r708012 | adelmelle | 2008-10-26 16:32:16 +0000 (Sun, 26 Oct 2008) | 5 lines
  
  Bugzilla 45113:
  Added PDF /Launch action, which is used in case of references to URIs using the file:// protocol.
  Thanks to Alexander Stamenov (astamenov.AT.gmail.com) for the input!
........


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@708153 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-1_0
Adrian Cumiskey 15 years ago
parent
commit
55b2038293

+ 1
- 1
src/java/org/apache/fop/area/Block.java View File

@@ -79,7 +79,7 @@ public class Block extends BlockParent {
* @param autoHeight increase the height of the block.
*/
public void addBlock(Block block, boolean autoHeight) {
if (autoHeight && allowBPDUpdate) {
if (autoHeight && allowBPDUpdate && block.isStacked()) {
bpd += block.getAllocBPD();
}
addChildArea(block);

+ 7
- 10
src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java View File

@@ -26,6 +26,7 @@ import java.util.ListIterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.fop.area.Area;
import org.apache.fop.area.Block;
import org.apache.fop.fo.flow.ListItem;
@@ -537,14 +538,6 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager
label.addAreas(labelIter, lc);
}

// reset the area bpd after adding the label areas and before adding the body areas
int savedBPD = 0;
if (labelFirstIndex <= labelLastIndex
&& bodyFirstIndex <= bodyLastIndex) {
savedBPD = curBlockArea.getBPD();
curBlockArea.setBPD(0);
}

// add body areas
if (bodyFirstIndex <= bodyLastIndex) {
KnuthPossPosIter bodyIter = new KnuthPossPosIter(bodyList,
@@ -559,9 +552,13 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager
}

// after adding body areas, set the maximum area bpd
if (curBlockArea.getBPD() < savedBPD) {
curBlockArea.setBPD(savedBPD);
int childCount = curBlockArea.getChildAreas().size();
assert childCount >= 1 && childCount <= 2;
int itemBPD = ((Block)curBlockArea.getChildAreas().get(0)).getAllocBPD();
if (childCount == 2) {
itemBPD = Math.max(itemBPD, ((Block)curBlockArea.getChildAreas().get(1)).getAllocBPD());
}
curBlockArea.setBPD(itemBPD);

addMarkersToPage(false, isFirst(firstPos), isLast(lastPos));


+ 24
- 11
src/java/org/apache/fop/pdf/PDFDocument.java View File

@@ -223,6 +223,11 @@ public class PDFDocument {
*/
protected List gotos = new java.util.ArrayList();

/**
* List of PDFLaunch objects.
*/
protected List launches = new java.util.ArrayList();

/**
* The PDFDests object for the name dictionary.
* Note: This object is not a list.
@@ -486,6 +491,9 @@ public class PDFDocument {
if (obj instanceof PDFPage) {
this.pages.notifyKidRegistered((PDFPage)obj);
}
if (obj instanceof PDFLaunch) {
this.launches.add(obj);
}
if (obj instanceof PDFLink) {
this.links.add(obj);
}
@@ -656,6 +664,15 @@ public class PDFDocument {
return (PDFGoTo)findPDFObject(gotos, compare);
}

/**
* Finds a launch.
* @param compare reference object to use as search template
* @return the launch if found, null otherwise
*/
protected PDFLaunch findLaunch(PDFLaunch compare) {
return (PDFLaunch) findPDFObject(launches, compare);
}

/**
* Looks for an existing GState to use
* @param wanted requested features
@@ -703,7 +720,6 @@ public class PDFDocument {
*/
public void setColorSpace(int theColorspace) {
this.colorspace.setColorSpace(theColorspace);
return;
}

/**
@@ -1019,12 +1035,6 @@ public class PDFDocument {
by the table's length */
this.position += outputXref(stream);

// Determine existance of encryption dictionary
String encryptEntry = "";
if (this.encryption != null) {
encryptEntry = this.encryption.getTrailerEntry();
}

/* construct the trailer */
String pdf =
"trailer\n"
@@ -1037,10 +1047,13 @@ public class PDFDocument {
+ "\n"
+ "/Info "
+ this.info.referencePDF()
+ "\n"
+ getIDEntry()
+ "\n"
+ encryptEntry
+ "\n";
if (this.encryption != null) {
pdf += this.encryption.getTrailerEntry();
} else {
pdf += getIDEntry();
}
pdf += "\n"
+ ">>\n"
+ "startxref\n"
+ this.xref

+ 35
- 0
src/java/org/apache/fop/pdf/PDFFactory.java View File

@@ -1011,6 +1011,10 @@ public class PDFFactory {
// HTTP URL?
if (targetLo.startsWith("http://")) {
return new PDFUri(target);
// Non PDF files. Try to /Launch them.
} else if (targetLo.startsWith("file://")) {
target = target.substring("file://".length());
return getLaunchAction(target);
// Bare PDF file name?
} else if (targetLo.endsWith(".pdf")) {
return getGoToPDFAction(target, null, -1, newWindow);
@@ -1104,6 +1108,37 @@ public class PDFFactory {
return remote;
}

/**
* Creates and returns a launch pdf document action using
* <code>file</code> to create a file spcifiaciton for
* the document/file to be opened with an external application.
*
* @param file the pdf file name
* @return the pdf launch object
*/
private PDFLaunch getLaunchAction(String file) {
getDocument().getProfile().verifyActionAllowed();

PDFFileSpec fileSpec = new PDFFileSpec(file);
PDFFileSpec oldSpec = getDocument().findFileSpec(fileSpec);

if (oldSpec == null) {
getDocument().registerObject(fileSpec);
} else {
fileSpec = oldSpec;
}
PDFLaunch launch = new PDFLaunch(fileSpec);
PDFLaunch oldLaunch = getDocument().findLaunch(launch);

if (oldLaunch == null) {
getDocument().registerObject(launch);
} else {
launch = oldLaunch;
}

return launch;
}

/**
* Make an outline object and add it to the given parent
*

+ 68
- 0
src/java/org/apache/fop/pdf/PDFLaunch.java View File

@@ -0,0 +1,68 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at

* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.pdf;

/**
* This class represents the /Launch action.
*/
public class PDFLaunch extends PDFAction {

private PDFFileSpec externalFileSpec;

public PDFLaunch(PDFFileSpec fileSpec) {
this.externalFileSpec = fileSpec;
}

public String getAction() {
return this.referencePDF();
}

public String toPDFString() {
StringBuffer sb = new StringBuffer(64);
sb.append(getObjectID());
sb.append("<<\n/S /Launch\n/F ");
sb.append(externalFileSpec.referencePDF());
sb.append(" \n>>\nendobj\n");

return sb.toString();
}

/**
* Check if this equals another object.
*
* @param obj the object to compare
* @return true if this equals other object
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
}

if (obj == null || !(obj instanceof PDFLaunch)) {
return false;
}

PDFLaunch launch = (PDFLaunch) obj;

if (!launch.externalFileSpec.referencePDF().equals(externalFileSpec.referencePDF())) {
return false;
}

return true;
}
}

+ 9
- 0
status.xml View File

@@ -53,6 +53,15 @@

<changes>
<release version="FOP Trunk" date="TBD">
<action context="Renderers" dev="AD" type="add" fixes-bug="45113" due-to="Alexander Stamenov">
Added PDF /Launch action: references to URIs using the file:// protocol will now generate
a /Launch action as opposed to a more general /URI (which doesn't yield the expected result
for this protocol).
</action>
<action context="Layout" dev="JM" type="fix">
Fixed a problem where the BPD or a block area could be wrong if there is a nested,
absolutely positioned area (for example a block-container).
</action>
<action context="Layout" dev="AD" type="fix" fixes-bug="40798">
Bugzilla 40798: A conditional-page-master-reference with page-position="last" qualifies
for a first page, if it is also the last. Additionally: also added support for

+ 59
- 0
test/layoutengine/standard-testcases/block-container_area-bpd.xml View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- $Id$ -->
<testcase>
<info>
<p>
This test checks bpd values on block-containers.
</p>
</info>
<fo>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="normal">
<fo:flow flow-name="xsl-region-body">
<fo:block>Testing area BPDs...</fo:block>
<fo:block-container id="bc1" absolute-position="absolute" top="0.15cm" left="0.25cm">
<fo:block>
<fo:inline background-color="grey">bc1</fo:inline>
</fo:block>
</fo:block-container>
<fo:block background-color="orange">
<fo:block color="red" background-color="yellow">Below
<fo:block-container id="bc2" absolute-position="absolute" top="0.35cm" left="0.25cm">
<fo:block>
<fo:inline background-color="grey">Above</fo:inline>
</fo:block>
</fo:block-container>
</fo:block>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</fo>
<checks>
<eval expected="28800" xpath="//flow/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc1']/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc2']/@bpd"/>
<eval expected="14400" xpath="//block[@prod-id='bc2']/../@bpd"/>
</checks>
</testcase>

Loading…
Cancel
Save