]> source.dussan.org Git - poi.git/commitdiff
#60993 - HSLF: Grid and rowspan calculation in table cells is wrong
authorAndreas Beeker <kiwiwings@apache.org>
Sat, 15 Apr 2017 12:14:26 +0000 (12:14 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sat, 15 Apr 2017 12:14:26 +0000 (12:14 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1791500 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/testcases/org/apache/poi/sl/TestTable.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
test-data/slideshow/bug60993.ppt [new file with mode: 0644]
test-data/slideshow/bug60993.pptx [new file with mode: 0644]

index 0b02b74783f230204d17176ea61956e119d395cb..5b45f9973e3822e2128c43326a61f6ccbfdd5a0a 100644 (file)
 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
index f908739080c2c3b1eb287ed67b602d7953a23d64..b159e7ca6f991accacdb8dbb5c85b598dcee05e2 100644 (file)
@@ -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 (file)
index 0000000..58abe1f
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 (file)
index 0000000..68a73b2
Binary files /dev/null and b/test-data/slideshow/bug60993.pptx differ