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
* @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);
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;
break;
}
return shape;
- }
+ }
}
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
\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
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;
protected TextBytesAtom _byteAtom;
protected TextCharsAtom _charAtom;
protected StyleTextPropAtom _styleAtom;
+ protected TextSpecInfoAtom _specAtom;
protected boolean _isUnicode;
protected RichTextRun[] _rtRuns;
private SlideShow slideShow;
// 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());
+ }
+
+ }
}
/**