From: Andreas Beeker Date: Sat, 15 Apr 2017 12:14:26 +0000 (+0000) Subject: #60993 - HSLF: Grid and rowspan calculation in table cells is wrong X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=160fb550c143f9cb068156f1ac2a6ebc53fd5f34;p=poi.git #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 --- 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 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 { } private int calcSpan(List 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 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 Binary files /dev/null and b/test-data/slideshow/bug60993.ppt differ diff --git a/test-data/slideshow/bug60993.pptx b/test-data/slideshow/bug60993.pptx new file mode 100644 index 0000000000..68a73b251c Binary files /dev/null and b/test-data/slideshow/bug60993.pptx differ