aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Beeker <kiwiwings@apache.org>2017-04-15 12:14:26 +0000
committerAndreas Beeker <kiwiwings@apache.org>2017-04-15 12:14:26 +0000
commit19fe5590908aeb95214bc9a17cbd7a440fdccbec (patch)
tree85146fa9c55761246ddf41f1a5ad4d1ed69b30b5
parent8fa92c2e6a0266f67f55a3db31fb84893c68f855 (diff)
downloadpoi-19fe5590908aeb95214bc9a17cbd7a440fdccbec.tar.gz
poi-19fe5590908aeb95214bc9a17cbd7a440fdccbec.zip
#60993 - HSLF: Grid and rowspan calculation in table cells is wrong
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1791500 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/ooxml/testcases/org/apache/poi/sl/TestTable.java62
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java13
-rw-r--r--test-data/slideshow/bug60993.pptbin0 -> 121344 bytes
-rw-r--r--test-data/slideshow/bug60993.pptxbin0 -> 21942 bytes
4 files changed, 63 insertions, 12 deletions
diff --git a/src/ooxml/testcases/org/apache/poi/sl/TestTable.java b/src/ooxml/testcases/org/apache/poi/sl/TestTable.java
index 0b02b74783..5b45f9973e 100644
--- a/src/ooxml/testcases/org/apache/poi/sl/TestTable.java
+++ b/src/ooxml/testcases/org/apache/poi/sl/TestTable.java
@@ -20,6 +20,10 @@
package org.apache.poi.sl;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import java.awt.geom.Rectangle2D;
@@ -30,6 +34,7 @@ import java.io.InputStream;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.usermodel.SlideShowFactory;
import org.apache.poi.sl.usermodel.TableCell;
@@ -66,7 +71,7 @@ public class TestTable {
}
@Test
- public void testColWidthRowHeight() throws IOException {
+ public void colWidthRowHeight() throws IOException {
assumeFalse(xslfOnly);
// Test of table dimensions of same slideshow saved as ppt/x
@@ -110,7 +115,7 @@ public class TestTable {
}
@Test
- public void testTextDirectionHSLF() throws IOException {
+ public void textDirectionHSLF() throws IOException {
assumeFalse(xslfOnly);
SlideShow<?,?> ppt1 = new HSLFSlideShow();
testTextDirection(ppt1);
@@ -118,7 +123,7 @@ public class TestTable {
}
@Test
- public void testTextDirectionXSLF() throws IOException {
+ public void textDirectionXSLF() throws IOException {
SlideShow<?,?> ppt1 = new XMLSlideShow();
testTextDirection(ppt1);
ppt1.close();
@@ -160,4 +165,53 @@ public class TestTable {
}
ppt2.close();
}
-}
+
+ @Test
+ public void tableSpan() throws IOException {
+ String files[] = (xslfOnly) ? new String[]{ "bug60993.pptx" } : new String[]{ "bug60993.pptx", "bug60993.ppt" };
+ for (String f : files) {
+ SlideShow<?,?> ppt = openSampleSlideshow(f);
+ Slide<?,?> slide = ppt.getSlides().get(0);
+ TableShape<?,?> ts = (TableShape<?,?>)slide.getShapes().get(0);
+ int cols = ts.getNumberOfColumns();
+ int rows = ts.getNumberOfRows();
+ for (int r=0; r<rows; r++) {
+ for (int c=0; c<cols; c++) {
+ TableCell<?,?> tc = ts.getCell(r, c);
+ int rc = r*10+c;
+ String msg = f+" (r"+r+",c"+c+")";
+ switch (rc) {
+ case 22:
+ case 51:
+ if (f.endsWith("ppt")) {
+ assertNull(msg, tc);
+ } else {
+ assertNotNull(msg, tc);
+ assertTrue(msg, tc.isMerged());
+ }
+ break;
+ case 21:
+ assertNotNull(msg, tc);
+ assertEquals(msg, 1, tc.getRowSpan());
+ assertEquals(msg, 2, tc.getGridSpan());
+ assertFalse(msg, tc.isMerged());
+ break;
+ case 41:
+ assertNotNull(msg, tc);
+ assertEquals(msg, 2, tc.getRowSpan());
+ assertEquals(msg, 1, tc.getGridSpan());
+ assertFalse(msg, tc.isMerged());
+ break;
+ default:
+ assertNotNull(msg, tc);
+ assertEquals(msg, 1, tc.getRowSpan());
+ assertEquals(msg, 1, tc.getGridSpan());
+ assertFalse(msg, tc.isMerged());
+ break;
+ }
+ }
+ }
+ ppt.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
index f908739080..b159e7ca6f 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
@@ -21,6 +21,7 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.ListIterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -218,15 +219,11 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> {
}
private int calcSpan(List<Double> spaces, double totalSpace, int idx) {
- if (idx == spaces.size()-1) {
- return 1;
- }
- int span = 0;
- double remainingSpace = totalSpace;
- while (idx+1 < spaces.size() && remainingSpace > 0) {
- remainingSpace -= spaces.get(idx+1)-spaces.get(idx);
+ int span = 1;
+ ListIterator<Double> li = spaces.listIterator(idx);
+ double start = li.next();
+ while (li.hasNext() && li.next()-start < totalSpace) {
span++;
- idx++;
}
return span;
}
diff --git a/test-data/slideshow/bug60993.ppt b/test-data/slideshow/bug60993.ppt
new file mode 100644
index 0000000000..58abe1f0e1
--- /dev/null
+++ b/test-data/slideshow/bug60993.ppt
Binary files differ
diff --git a/test-data/slideshow/bug60993.pptx b/test-data/slideshow/bug60993.pptx
new file mode 100644
index 0000000000..68a73b251c
--- /dev/null
+++ b/test-data/slideshow/bug60993.pptx
Binary files differ