properly set shapeId for new shapes
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@649797 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
76a479f668
commit
4ff1e84247
@ -197,6 +197,7 @@ public class Picture extends SimpleShape {
|
|||||||
* By default set the orininal image size
|
* By default set the orininal image size
|
||||||
*/
|
*/
|
||||||
protected void afterInsert(Sheet sh){
|
protected void afterInsert(Sheet sh){
|
||||||
|
super.afterInsert(sh);
|
||||||
java.awt.Rectangle anchor = getAnchor();
|
java.awt.Rectangle anchor = getAnchor();
|
||||||
if (anchor.equals(new java.awt.Rectangle())){
|
if (anchor.equals(new java.awt.Rectangle())){
|
||||||
setDefaultSize();
|
setDefaultSize();
|
||||||
|
@ -18,10 +18,11 @@ package org.apache.poi.hslf.model;
|
|||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
import org.apache.poi.hslf.record.ColorSchemeAtom;
|
import org.apache.poi.hslf.record.ColorSchemeAtom;
|
||||||
|
import org.apache.poi.hslf.record.PPDrawing;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
@ -324,7 +325,58 @@ public abstract class Shape {
|
|||||||
* @param sh - owning shape
|
* @param sh - owning shape
|
||||||
*/
|
*/
|
||||||
protected void afterInsert(Sheet sh){
|
protected void afterInsert(Sheet sh){
|
||||||
|
PPDrawing ppdrawing = sh.getPPDrawing();
|
||||||
|
|
||||||
|
EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
||||||
|
|
||||||
|
EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
|
||||||
|
|
||||||
|
int id = allocateShapeId(dg);
|
||||||
|
setShapeId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates new shape id for the new drawing group id.
|
||||||
|
*
|
||||||
|
* @param dg EscherDgRecord of the sheet that owns the shape being created
|
||||||
|
*
|
||||||
|
* @return a new shape id.
|
||||||
|
*/
|
||||||
|
protected int allocateShapeId(EscherDgRecord dg)
|
||||||
|
{
|
||||||
|
EscherDggRecord dgg = _sheet.getSlideShow().getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
|
||||||
|
if(dgg == null){
|
||||||
|
logger.log(POILogger.ERROR, "EscherDggRecord not found");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dgg.setNumShapesSaved( dgg.getNumShapesSaved() + 1 );
|
||||||
|
|
||||||
|
// Add to existing cluster if space available
|
||||||
|
for (int i = 0; i < dgg.getFileIdClusters().length; i++)
|
||||||
|
{
|
||||||
|
EscherDggRecord.FileIdCluster c = dgg.getFileIdClusters()[i];
|
||||||
|
if (c.getDrawingGroupId() == dg.getDrawingGroupId() && c.getNumShapeIdsUsed() != 1024)
|
||||||
|
{
|
||||||
|
int result = c.getNumShapeIdsUsed() + (1024 * (i+1));
|
||||||
|
c.incrementShapeId();
|
||||||
|
dg.setNumShapes( dg.getNumShapes() + 1 );
|
||||||
|
dg.setLastMSOSPID( result );
|
||||||
|
if (result >= dgg.getShapeIdMax())
|
||||||
|
dgg.setShapeIdMax( result + 1 );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create new cluster
|
||||||
|
dgg.addCluster( dg.getDrawingGroupId(), 0 );
|
||||||
|
dgg.getFileIdClusters()[dgg.getFileIdClusters().length-1].incrementShapeId();
|
||||||
|
dg.setNumShapes( dg.getNumShapes() + 1 );
|
||||||
|
int result = (1024 * dgg.getFileIdClusters().length);
|
||||||
|
dg.setLastMSOSPID( result );
|
||||||
|
if (result >= dgg.getShapeIdMax())
|
||||||
|
dgg.setShapeIdMax( result + 1 );
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -353,6 +405,24 @@ public abstract class Shape {
|
|||||||
return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed(), alpha);
|
return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed(), alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return id for the shape.
|
||||||
|
*/
|
||||||
|
public int getShapeId(){
|
||||||
|
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
|
return spRecord == null ? 0 : spRecord.getShapeId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets shape ID
|
||||||
|
*
|
||||||
|
* @param id of the shape
|
||||||
|
*/
|
||||||
|
public void setShapeId(int id){
|
||||||
|
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
|
if(spRecord != null) spRecord.setShapeId(id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill properties of this shape
|
* Fill properties of this shape
|
||||||
*
|
*
|
||||||
|
@ -247,14 +247,6 @@ public abstract class Sheet {
|
|||||||
EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
|
EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
|
||||||
spgr.addChildRecord(shape.getSpContainer());
|
spgr.addChildRecord(shape.getSpContainer());
|
||||||
|
|
||||||
EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
|
|
||||||
dg.setNumShapes(dg.getNumShapes() + 1);
|
|
||||||
|
|
||||||
int shapeId = dg.getLastMSOSPID()+1;
|
|
||||||
dg.setLastMSOSPID(shapeId);
|
|
||||||
|
|
||||||
EscherSpRecord sp = shape.getSpContainer().getChildById(EscherSpRecord.RECORD_ID);
|
|
||||||
if(sp != null) sp.setShapeId(shapeId);
|
|
||||||
shape.setSheet(this);
|
shape.setSheet(this);
|
||||||
shape.afterInsert(this);
|
shape.afterInsert(this);
|
||||||
|
|
||||||
|
@ -112,6 +112,8 @@ public class Table extends ShapeGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void afterInsert(Sheet sh){
|
protected void afterInsert(Sheet sh){
|
||||||
|
super.afterInsert(sh);
|
||||||
|
|
||||||
EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0);
|
EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0);
|
||||||
List lst = spCont.getChildRecords();
|
List lst = spCont.getChildRecords();
|
||||||
EscherOptRecord opt = (EscherOptRecord)lst.get(lst.size()-2);
|
EscherOptRecord opt = (EscherOptRecord)lst.get(lst.size()-2);
|
||||||
|
@ -184,6 +184,8 @@ public abstract class TextShape extends SimpleShape {
|
|||||||
* @param sh the sheet we are adding to
|
* @param sh the sheet we are adding to
|
||||||
*/
|
*/
|
||||||
protected void afterInsert(Sheet sh){
|
protected void afterInsert(Sheet sh){
|
||||||
|
super.afterInsert(sh);
|
||||||
|
|
||||||
EscherTextboxWrapper _txtbox = getEscherTextboxWrapper();
|
EscherTextboxWrapper _txtbox = getEscherTextboxWrapper();
|
||||||
if(_txtbox != null){
|
if(_txtbox != null){
|
||||||
PPDrawing ppdrawing = sh.getPPDrawing();
|
PPDrawing ppdrawing = sh.getPPDrawing();
|
||||||
|
@ -37,6 +37,8 @@ public class PPDrawingGroup extends RecordAtom {
|
|||||||
|
|
||||||
private byte[] _header;
|
private byte[] _header;
|
||||||
private EscherContainerRecord dggContainer;
|
private EscherContainerRecord dggContainer;
|
||||||
|
//cached dgg
|
||||||
|
private EscherDggRecord dgg;
|
||||||
|
|
||||||
protected PPDrawingGroup(byte[] source, int start, int len) {
|
protected PPDrawingGroup(byte[] source, int start, int len) {
|
||||||
// Get the header
|
// Get the header
|
||||||
@ -116,4 +118,17 @@ public class PPDrawingGroup extends RecordAtom {
|
|||||||
public EscherContainerRecord getDggContainer(){
|
public EscherContainerRecord getDggContainer(){
|
||||||
return dggContainer;
|
return dggContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EscherDggRecord getEscherDggRecord(){
|
||||||
|
if(dgg == null){
|
||||||
|
for(Iterator it = dggContainer.getChildRecords().iterator(); it.hasNext();){
|
||||||
|
EscherRecord r = (EscherRecord) it.next();
|
||||||
|
if(r instanceof EscherDggRecord){
|
||||||
|
dgg = (EscherDggRecord)r;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dgg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -307,4 +307,22 @@ public class TestShapes extends TestCase {
|
|||||||
sl = ppt.getSlides()[0];
|
sl = ppt.getSlides()[0];
|
||||||
assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length);
|
assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testShapeId() throws IOException {
|
||||||
|
SlideShow ppt = new SlideShow();
|
||||||
|
Slide slide = ppt.createSlide();
|
||||||
|
Shape shape;
|
||||||
|
|
||||||
|
shape = new Line();
|
||||||
|
assertEquals(0, shape.getShapeId());
|
||||||
|
slide.addShape(shape);
|
||||||
|
assertTrue(shape.getShapeId() > 0);
|
||||||
|
|
||||||
|
int shapeId = shape.getShapeId();
|
||||||
|
|
||||||
|
shape = new Line();
|
||||||
|
assertEquals(0, shape.getShapeId());
|
||||||
|
slide.addShape(shape);
|
||||||
|
assertEquals(shapeId + 1, shape.getShapeId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user