2004-04-09 09:05:39 -04:00
|
|
|
/* ====================================================================
|
2006-12-22 14:18:16 -05:00
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
|
|
this work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
|
|
(the "License"); you may not use this file except in compliance with
|
|
|
|
the License. You may obtain a copy of the License at
|
2004-04-09 09:05:39 -04:00
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
==================================================================== */
|
2004-08-23 04:52:54 -04:00
|
|
|
|
2004-04-09 07:45:38 -04:00
|
|
|
package org.apache.poi.hssf.usermodel;
|
|
|
|
|
2012-06-18 16:59:32 -04:00
|
|
|
import org.apache.poi.ddf.*;
|
2012-07-11 08:08:38 -04:00
|
|
|
import org.apache.poi.hssf.record.*;
|
2012-06-26 07:21:13 -04:00
|
|
|
import org.apache.poi.hssf.usermodel.drawing.HSSFShapeType;
|
2012-07-11 08:08:38 -04:00
|
|
|
import org.apache.poi.ss.usermodel.RichTextString;
|
2012-06-26 07:21:13 -04:00
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
2012-06-18 16:59:32 -04:00
|
|
|
|
2004-04-09 07:45:38 -04:00
|
|
|
/**
|
|
|
|
* Represents a simple shape such as a line, rectangle or oval.
|
|
|
|
*
|
|
|
|
* @author Glen Stampoultzis (glens at apache.org)
|
|
|
|
*/
|
2012-07-01 05:38:08 -04:00
|
|
|
public class HSSFSimpleShape extends HSSFShape
|
2004-04-09 07:45:38 -04:00
|
|
|
{
|
|
|
|
// The commented out ones haven't been tested yet or aren't supported
|
|
|
|
// by HSSFSimpleShape.
|
|
|
|
|
|
|
|
public final static short OBJECT_TYPE_LINE = 1;
|
|
|
|
public final static short OBJECT_TYPE_RECTANGLE = 2;
|
|
|
|
public final static short OBJECT_TYPE_OVAL = 3;
|
|
|
|
// public final static short OBJECT_TYPE_ARC = 4;
|
|
|
|
// public final static short OBJECT_TYPE_CHART = 5;
|
|
|
|
// public final static short OBJECT_TYPE_TEXT = 6;
|
|
|
|
// public final static short OBJECT_TYPE_BUTTON = 7;
|
2005-05-01 07:26:18 -04:00
|
|
|
public final static short OBJECT_TYPE_PICTURE = 8;
|
2004-04-09 07:45:38 -04:00
|
|
|
// public final static short OBJECT_TYPE_POLYGON = 9;
|
|
|
|
// public final static short OBJECT_TYPE_CHECKBOX = 11;
|
|
|
|
// public final static short OBJECT_TYPE_OPTION_BUTTON = 12;
|
|
|
|
// public final static short OBJECT_TYPE_EDIT_BOX = 13;
|
|
|
|
// public final static short OBJECT_TYPE_LABEL = 14;
|
|
|
|
// public final static short OBJECT_TYPE_DIALOG_BOX = 15;
|
|
|
|
// public final static short OBJECT_TYPE_SPINNER = 16;
|
|
|
|
// public final static short OBJECT_TYPE_SCROLL_BAR = 17;
|
|
|
|
// public final static short OBJECT_TYPE_LIST_BOX = 18;
|
|
|
|
// public final static short OBJECT_TYPE_GROUP_BOX = 19;
|
2010-08-08 07:11:38 -04:00
|
|
|
public final static short OBJECT_TYPE_COMBO_BOX = 20;
|
2007-01-01 16:02:22 -05:00
|
|
|
public final static short OBJECT_TYPE_COMMENT = 25;
|
2004-04-09 07:45:38 -04:00
|
|
|
// public final static short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30;
|
|
|
|
|
2012-06-26 07:21:13 -04:00
|
|
|
private static final Map <Short, Short> objTypeToShapeType = new HashMap<Short, Short>();
|
|
|
|
|
2012-07-11 08:08:38 -04:00
|
|
|
private TextObjectRecord _textObjectRecord;
|
|
|
|
|
2012-06-26 07:21:13 -04:00
|
|
|
static {
|
|
|
|
objTypeToShapeType.put(OBJECT_TYPE_RECTANGLE, HSSFShapeType.RECTANGLE.getType());
|
|
|
|
objTypeToShapeType.put(OBJECT_TYPE_PICTURE, HSSFShapeType.PICTURE.getType());
|
|
|
|
objTypeToShapeType.put(OBJECT_TYPE_LINE, HSSFShapeType.LINE.getType());
|
2012-07-06 13:00:20 -04:00
|
|
|
objTypeToShapeType.put(OBJECT_TYPE_OVAL, HSSFShapeType.OVAL.getType());
|
2012-06-26 07:21:13 -04:00
|
|
|
}
|
|
|
|
|
2012-07-19 15:02:43 -04:00
|
|
|
public HSSFSimpleShape(EscherContainerRecord spContainer, ObjRecord objRecord, TextObjectRecord textObjectRecord) {
|
2012-07-11 08:08:38 -04:00
|
|
|
super(spContainer, objRecord);
|
2012-07-19 15:02:43 -04:00
|
|
|
this._textObjectRecord = textObjectRecord;
|
2012-07-11 08:08:38 -04:00
|
|
|
}
|
|
|
|
|
2012-06-18 16:59:32 -04:00
|
|
|
public HSSFSimpleShape(EscherContainerRecord spContainer, ObjRecord objRecord) {
|
|
|
|
super(spContainer, objRecord);
|
|
|
|
}
|
|
|
|
|
|
|
|
public HSSFSimpleShape( HSSFShape parent, HSSFAnchor anchor)
|
2004-04-09 07:45:38 -04:00
|
|
|
{
|
|
|
|
super( parent, anchor );
|
2012-07-11 08:08:38 -04:00
|
|
|
_textObjectRecord = createTextObjRecord();
|
|
|
|
}
|
|
|
|
|
|
|
|
public TextObjectRecord getTextObjectRecord() {
|
|
|
|
return _textObjectRecord;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected TextObjectRecord createTextObjRecord(){
|
|
|
|
TextObjectRecord obj = new TextObjectRecord();
|
|
|
|
obj.setTextLocked(true);
|
|
|
|
obj.setTextOrientation(TextObjectRecord.TEXT_ORIENTATION_NONE);
|
2012-07-19 15:02:43 -04:00
|
|
|
obj.setStr(new HSSFRichTextString(""));
|
2012-07-11 08:08:38 -04:00
|
|
|
return obj;
|
2012-06-26 07:21:13 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected EscherContainerRecord createSpContainer() {
|
|
|
|
EscherContainerRecord spContainer = new EscherContainerRecord();
|
|
|
|
spContainer.setRecordId( EscherContainerRecord.SP_CONTAINER );
|
|
|
|
spContainer.setOptions( (short) 0x000F );
|
|
|
|
|
|
|
|
EscherSpRecord sp = new EscherSpRecord();
|
|
|
|
sp.setRecordId( EscherSpRecord.RECORD_ID );
|
|
|
|
sp.setFlags( EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE );
|
2012-07-11 08:08:38 -04:00
|
|
|
sp.setVersion((short) 0x2);
|
2012-06-26 07:21:13 -04:00
|
|
|
|
|
|
|
EscherClientDataRecord clientData = new EscherClientDataRecord();
|
|
|
|
clientData.setRecordId( EscherClientDataRecord.RECORD_ID );
|
2012-07-11 08:08:38 -04:00
|
|
|
clientData.setOptions( (short) (0x0000) );
|
2012-06-26 07:21:13 -04:00
|
|
|
|
2012-06-28 06:56:55 -04:00
|
|
|
EscherOptRecord optRecord = new EscherOptRecord();
|
2012-07-01 05:38:08 -04:00
|
|
|
optRecord.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
|
2012-07-06 13:00:20 -04:00
|
|
|
optRecord.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
|
|
|
// optRecord.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
|
2012-07-01 05:38:08 -04:00
|
|
|
optRecord.setEscherProperty(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
|
|
|
|
optRecord.setEscherProperty(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
|
2012-07-11 08:08:38 -04:00
|
|
|
optRecord.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, NO_FILLHITTEST_FALSE));
|
2012-07-06 13:00:20 -04:00
|
|
|
optRecord.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
|
|
|
|
|
|
|
optRecord.setEscherProperty( new EscherShapePathProperty( EscherProperties.GEOMETRY__SHAPEPATH, EscherShapePathProperty.COMPLEX ) );
|
|
|
|
optRecord.setEscherProperty(new EscherBoolProperty( EscherProperties.GROUPSHAPE__PRINT, 0x080000));
|
2012-06-28 06:56:55 -04:00
|
|
|
optRecord.setRecordId( EscherOptRecord.RECORD_ID );
|
|
|
|
|
2012-07-19 15:02:43 -04:00
|
|
|
EscherTextboxRecord escherTextbox = new EscherTextboxRecord();
|
|
|
|
escherTextbox.setRecordId(EscherTextboxRecord.RECORD_ID);
|
|
|
|
escherTextbox.setOptions((short) 0x0000);
|
|
|
|
|
2012-06-26 07:21:13 -04:00
|
|
|
spContainer.addChildRecord(sp);
|
2012-06-28 06:56:55 -04:00
|
|
|
spContainer.addChildRecord(optRecord);
|
2012-06-26 07:21:13 -04:00
|
|
|
spContainer.addChildRecord(anchor.getEscherAnchor());
|
|
|
|
spContainer.addChildRecord(clientData);
|
2012-07-19 15:02:43 -04:00
|
|
|
spContainer.addChildRecord(escherTextbox);
|
2012-06-26 07:21:13 -04:00
|
|
|
return spContainer;
|
2004-04-09 07:45:38 -04:00
|
|
|
}
|
|
|
|
|
2012-06-26 07:21:13 -04:00
|
|
|
@Override
|
|
|
|
protected ObjRecord createObjRecord() {
|
|
|
|
ObjRecord obj = new ObjRecord();
|
|
|
|
CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
|
|
|
|
c.setLocked(true);
|
|
|
|
c.setPrintable(true);
|
|
|
|
c.setAutofill(true);
|
|
|
|
c.setAutoline(true);
|
|
|
|
EndSubRecord e = new EndSubRecord();
|
|
|
|
|
|
|
|
obj.addSubRecord(c);
|
|
|
|
obj.addSubRecord(e);
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
2012-07-11 08:08:38 -04:00
|
|
|
@Override
|
|
|
|
protected void afterRemove(HSSFPatriarch patriarch) {
|
2012-07-19 16:29:42 -04:00
|
|
|
patriarch._getBoundAggregate().removeShapeToObjRecord(getEscherContainer().getChildById(EscherClientDataRecord.RECORD_ID));
|
|
|
|
if (null != getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID)){
|
|
|
|
patriarch._getBoundAggregate().removeShapeToObjRecord(getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID));
|
|
|
|
}
|
2012-07-11 08:08:38 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return the rich text string for this textbox.
|
|
|
|
*/
|
|
|
|
public HSSFRichTextString getString() {
|
|
|
|
return _textObjectRecord.getStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string Sets the rich text string used by this object.
|
|
|
|
*/
|
|
|
|
public void setString(RichTextString string) {
|
2012-07-11 18:22:24 -04:00
|
|
|
//TODO add other shape types which can not contain text
|
|
|
|
if (getShapeType() == 0 || getShapeType() == OBJECT_TYPE_LINE){
|
|
|
|
throw new IllegalStateException("Cannot set text for shape type: "+getShapeType());
|
|
|
|
}
|
2012-07-11 08:08:38 -04:00
|
|
|
HSSFRichTextString rtr = (HSSFRichTextString) string;
|
|
|
|
// If font is not set we must set the default one
|
|
|
|
if (rtr.numFormattingRuns() == 0) rtr.applyFont((short) 0);
|
|
|
|
_textObjectRecord.setStr(rtr);
|
2012-07-23 05:06:56 -04:00
|
|
|
if (string.getString() != null){
|
|
|
|
setPropertyValue(new EscherSimpleProperty(EscherProperties.TEXT__TEXTID, string.getString().hashCode()));
|
|
|
|
}
|
2012-07-11 08:08:38 -04:00
|
|
|
}
|
|
|
|
|
2012-06-26 07:21:13 -04:00
|
|
|
@Override
|
|
|
|
void afterInsert(HSSFPatriarch patriarch){
|
|
|
|
EscherAggregate agg = patriarch._getBoundAggregate();
|
2012-07-11 08:08:38 -04:00
|
|
|
agg.associateShapeToObjRecord(getEscherContainer().getChildById(EscherClientDataRecord.RECORD_ID), getObjRecord());
|
2012-07-19 15:02:43 -04:00
|
|
|
|
|
|
|
//used only when clone shapes
|
|
|
|
if (null != getTextObjectRecord()){
|
|
|
|
agg.associateShapeToObjRecord(getEscherContainer().getChildById(EscherTextboxRecord.RECORD_ID), getTextObjectRecord());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public HSSFShape cloneShape() {
|
|
|
|
TextObjectRecord txo = null;
|
|
|
|
EscherContainerRecord spContainer = new EscherContainerRecord();
|
|
|
|
byte [] inSp = getEscherContainer().serialize();
|
|
|
|
spContainer.fillFields(inSp, 0, new DefaultEscherRecordFactory());
|
|
|
|
ObjRecord obj = (ObjRecord) getObjRecord().cloneViaReserialise();
|
|
|
|
if (getTextObjectRecord() != null && getString() != null && !"".equals(getString().getString())){
|
|
|
|
txo = (TextObjectRecord) getTextObjectRecord().cloneViaReserialise();
|
|
|
|
}
|
|
|
|
return new HSSFSimpleShape(spContainer, obj, txo);
|
2012-06-26 07:21:13 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-04-09 07:45:38 -04:00
|
|
|
/**
|
|
|
|
* Gets the shape type.
|
|
|
|
* @return One of the OBJECT_TYPE_* constants.
|
|
|
|
*
|
|
|
|
* @see #OBJECT_TYPE_LINE
|
|
|
|
* @see #OBJECT_TYPE_OVAL
|
|
|
|
* @see #OBJECT_TYPE_RECTANGLE
|
2005-05-01 07:26:18 -04:00
|
|
|
* @see #OBJECT_TYPE_PICTURE
|
2007-01-01 16:02:22 -05:00
|
|
|
* @see #OBJECT_TYPE_COMMENT
|
2004-04-09 07:45:38 -04:00
|
|
|
*/
|
2012-06-26 07:21:13 -04:00
|
|
|
public int getShapeType() {
|
2012-07-11 08:08:38 -04:00
|
|
|
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) getObjRecord().getSubRecords().get(0);
|
2012-06-26 07:21:13 -04:00
|
|
|
return cod.getObjectType();
|
|
|
|
}
|
2004-04-09 07:45:38 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the shape types.
|
|
|
|
*
|
|
|
|
* @param shapeType One of the OBJECT_TYPE_* constants.
|
|
|
|
*
|
|
|
|
* @see #OBJECT_TYPE_LINE
|
|
|
|
* @see #OBJECT_TYPE_OVAL
|
|
|
|
* @see #OBJECT_TYPE_RECTANGLE
|
2005-05-01 07:26:18 -04:00
|
|
|
* @see #OBJECT_TYPE_PICTURE
|
2007-01-01 16:02:22 -05:00
|
|
|
* @see #OBJECT_TYPE_COMMENT
|
2004-04-09 07:45:38 -04:00
|
|
|
*/
|
2012-06-26 07:21:13 -04:00
|
|
|
public void setShapeType( int shapeType ){
|
2012-07-11 08:08:38 -04:00
|
|
|
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) getObjRecord().getSubRecords().get(0);
|
2012-06-26 07:21:13 -04:00
|
|
|
cod.setObjectType((short) shapeType);
|
2012-07-11 08:08:38 -04:00
|
|
|
EscherSpRecord spRecord = getEscherContainer().getChildById(EscherSpRecord.RECORD_ID);
|
2012-06-26 07:21:13 -04:00
|
|
|
if (null == objTypeToShapeType.get((short)shapeType)){
|
|
|
|
System.out.println("Unknown shape type: "+shapeType);
|
|
|
|
return;
|
|
|
|
}
|
2012-06-28 06:56:55 -04:00
|
|
|
spRecord.setShapeType(objTypeToShapeType.get((short) shapeType));
|
2012-06-26 07:21:13 -04:00
|
|
|
}
|
2004-04-09 07:45:38 -04:00
|
|
|
}
|