]> source.dussan.org Git - poi.git/commitdiff
Improved factoring of ppt objects. For ppt tabels Slide.getShapes() returns the Table...
authorYegor Kozlov <yegor@apache.org>
Tue, 15 Apr 2008 15:12:58 +0000 (15:12 +0000)
committerYegor Kozlov <yegor@apache.org>
Tue, 15 Apr 2008 15:12:58 +0000 (15:12 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@648276 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java
src/scratchpad/src/org/apache/poi/hslf/model/Table.java
src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java

index 0c36bf053a3ac40ff28deb46b57e3bee3dd552ce..76b43ebb8acae89773df3990942e1faab194ce89 100644 (file)
 package org.apache.poi.hslf.model;
 
 import org.apache.poi.ddf.*;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
+
+import java.util.List;
 
 /**
  * Create a <code>Shape</code> object depending on its type
@@ -24,15 +28,46 @@ import org.apache.poi.ddf.*;
  * @author Yegor Kozlov
  */
 public class ShapeFactory {
+    // For logging
+    protected static POILogger logger = POILogFactory.getLogger(ShapeFactory.class);
 
     /**
      * Create a new shape from the data provided.  
      */
     public static Shape createShape(EscherContainerRecord spContainer, Shape parent){
         if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){
-            return new ShapeGroup(spContainer, parent);
+            return createShapeGroup(spContainer, parent);
+        } else {
+            return createSimpeShape(spContainer, parent);
+
+        }
+    }
+
+    public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, Shape parent){
+        ShapeGroup group = null;
+        UnknownEscherRecord opt = (UnknownEscherRecord)Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
+        if(opt != null){
+            try {
+                EscherPropertyFactory f = new EscherPropertyFactory();
+                List props = f.createProperties( opt.getData(), 0, opt.getInstance() );
+                EscherSimpleProperty p = (EscherSimpleProperty)props.get(0);
+                if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){
+                    group = new ShapeGroup(spContainer, parent);
+                } else {
+                    group = new ShapeGroup(spContainer, parent);
+                }
+            } catch (Exception e){
+                logger.log(POILogger.WARN, e.getMessage());
+                group = new ShapeGroup(spContainer, parent);
+            }
+        }  else {
+            group = new ShapeGroup(spContainer, parent);
         }
 
+        return group;
+     }
+
+    public static Shape createSimpeShape(EscherContainerRecord spContainer, Shape parent){
         Shape shape;
         EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
 
@@ -48,12 +83,13 @@ public class ShapeFactory {
                 shape = new Line(spContainer, parent);
                 break;
             case ShapeTypes.NotPrimitive:
-                if ((spRecord.getFlags() & EscherSpRecord.FLAG_GROUP) != 0)
-                    //TODO: check if the shape group is a Table 
-                    shape = new ShapeGroup(spContainer, parent);
+                EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
+                EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
+                if(prop != null)
+                    shape = new Freeform(spContainer, parent);
                 else {
-                    //TODO: check if the shape has GEOMETRY__VERTICES or GEOMETRY__SEGMENTINFO properties.
-                    //if it does, then return Freeform or Polygon
+
+                    logger.log(POILogger.WARN, "Creating AutoShape for a NotPrimitive shape");
                     shape = new AutoShape(spContainer, parent);
                 }
                 break;
@@ -62,6 +98,6 @@ public class ShapeFactory {
                 break;
         }
         return shape;
-    }
 
+    }
 }
index a9f21b54f3924c8a71b2e1595d676f5627f1660b..947c41af63e06e61aae0f7b4dc4623088a2eb5e4 100755 (executable)
@@ -20,10 +20,10 @@ package org.apache.poi.hslf.model;
 import org.apache.poi.ddf.*;\r
 import org.apache.poi.util.LittleEndian;\r
 \r
-import java.util.ArrayList;\r
+import java.util.*;\r
 import java.util.List;\r
-import java.util.Iterator;\r
 import java.awt.*;\r
+import java.awt.geom.Rectangle2D;\r
 \r
 /**\r
  * Represents a table in a PowerPoint presentation\r
@@ -144,6 +144,54 @@ public class Table extends ShapeGroup {
 \r
     }\r
 \r
+    protected void initTable(){\r
+        Shape[] sh = getShapes();\r
+        Arrays.sort(sh, new Comparator(){\r
+            public int compare( Object o1, Object o2 ) {\r
+                Rectangle anchor1 = ((Shape)o1).getAnchor();\r
+                Rectangle anchor2 = ((Shape)o2).getAnchor();\r
+                int delta = anchor1.y - anchor2.y;\r
+                if(delta == 0) delta = anchor1.x - anchor2.y;\r
+                return delta;\r
+            }\r
+        });\r
+        int y0 = -1;\r
+        int maxrowlen = 0;\r
+        ArrayList lst = new ArrayList();\r
+        ArrayList row = null;\r
+        for (int i = 0; i < sh.length; i++) {\r
+            if(sh[i] instanceof TextShape){\r
+                Rectangle anchor = sh[i].getAnchor();\r
+                if(anchor.y != y0){\r
+                    y0 = anchor.y;\r
+                    if(row != null) maxrowlen = Math.max(maxrowlen, row.size());\r
+                    row = new ArrayList();\r
+                    lst.add(row);\r
+                }\r
+                row.add(sh[i]);\r
+            }\r
+        }\r
+        cells = new TableCell[lst.size()][maxrowlen];\r
+        for (int i = 0; i < lst.size(); i++) {\r
+            row = (ArrayList)lst.get(i);\r
+            for (int j = 0; j < row.size(); j++) {\r
+                TextShape tx = (TextShape)row.get(j);\r
+                cells[i][j] = new TableCell(tx.getSpContainer(), getParent());\r
+                cells[i][j].setSheet(tx.getSheet());\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Assign the <code>SlideShow</code> this shape belongs to\r
+     *\r
+     * @param sheet owner of this shape\r
+     */\r
+    public void setSheet(Sheet sheet){\r
+        super.setSheet(sheet);\r
+        if(cells == null) initTable();\r
+    }\r
+\r
     /**\r
      * Sets the row height.\r
      *\r
index 586932e739803672388eda184a8e3909b000dbb5..5834e2eaecbf0e9da4960bfc833ca98daea36970 100644 (file)
@@ -24,12 +24,7 @@ import java.util.LinkedList;
 import java.util.Vector;
 
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordContainer;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.usermodel.RichTextRun;
 import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.util.StringUtil;
@@ -50,6 +45,7 @@ public class TextRun
        protected TextBytesAtom  _byteAtom;
        protected TextCharsAtom  _charAtom;
        protected StyleTextPropAtom _styleAtom;
+    protected TextSpecInfoAtom  _specAtom;
        protected boolean _isUnicode;
        protected RichTextRun[] _rtRuns;
        private SlideShow slideShow;
@@ -477,6 +473,18 @@ public class TextRun
                        // Recreate rich text run with no styling
                        _rtRuns[0] = new RichTextRun(this,0,s.length());
                }
+
+        /**
+         * If TextSpecInfoAtom is present, we must update the text size,
+         * otherwise the ppt will be corrupted
+         */
+        if(_records != null) for (int i = 0; i < _records.length; i++) {
+            if(_records[i] instanceof TextSpecInfoAtom){
+                TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_records[i];
+                specAtom.setTextSize(s.length());
+            }
+
+        }
        }
 
        /**