diff options
Diffstat (limited to 'src/java/org/apache/poi/hssf/model/TextboxShape.java')
-rw-r--r-- | src/java/org/apache/poi/hssf/model/TextboxShape.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/java/org/apache/poi/hssf/model/TextboxShape.java b/src/java/org/apache/poi/hssf/model/TextboxShape.java new file mode 100644 index 0000000000..02143974db --- /dev/null +++ b/src/java/org/apache/poi/hssf/model/TextboxShape.java @@ -0,0 +1,151 @@ +package org.apache.poi.hssf.model; + +import org.apache.poi.ddf.*; +import org.apache.poi.hssf.record.*; +import org.apache.poi.hssf.usermodel.*; + +/** + * Represents an textbox shape and converts between the highlevel records + * and lowlevel records for an oval. + * + * @author Glen Stampoultzis (glens at apache.org) + */ +public class TextboxShape + extends AbstractShape +{ + private EscherContainerRecord spContainer; + private TextObjectRecord textObjectRecord; + private ObjRecord objRecord; + private EscherTextboxRecord escherTextbox; + + /** + * Creates the low evel records for an textbox. + * + * @param hssfShape The highlevel shape. + * @param shapeId The shape id to use for this shape. + */ + TextboxShape( HSSFTextbox hssfShape, int shapeId ) + { + spContainer = createSpContainer( hssfShape, shapeId ); + objRecord = createObjRecord( hssfShape, shapeId ); + textObjectRecord = createTextObjectRecord( hssfShape, shapeId ); + } + + /** + * Creates the low level OBJ record for this shape. + */ + private ObjRecord createObjRecord( HSSFTextbox hssfShape, int shapeId ) + { + HSSFShape shape = hssfShape; + + ObjRecord obj = new ObjRecord(); + CommonObjectDataSubRecord c = new CommonObjectDataSubRecord(); + c.setObjectType( (short) ( (HSSFSimpleShape) shape ).getShapeType() ); + c.setObjectId( (short) ( shapeId ) ); + c.setLocked( true ); + c.setPrintable( true ); + c.setAutofill( true ); + c.setAutoline( true ); + EndSubRecord e = new EndSubRecord(); + + obj.addSubRecord( c ); + obj.addSubRecord( e ); + + return obj; + } + + /** + * Generates the escher shape records for this shape. + * + * @param hssfShape + * @param shapeId + * @return + */ + private EscherContainerRecord createSpContainer( HSSFTextbox hssfShape, int shapeId ) + { + HSSFTextbox shape = hssfShape; + + EscherContainerRecord spContainer = new EscherContainerRecord(); + EscherSpRecord sp = new EscherSpRecord(); + EscherOptRecord opt = new EscherOptRecord(); + EscherRecord anchor = new EscherClientAnchorRecord(); + EscherClientDataRecord clientData = new EscherClientDataRecord(); + escherTextbox = new EscherTextboxRecord(); + + spContainer.setRecordId( EscherContainerRecord.SP_CONTAINER ); + spContainer.setOptions( (short) 0x000F ); + sp.setRecordId( EscherSpRecord.RECORD_ID ); + sp.setOptions( (short) ( ( EscherAggregate.ST_TEXTBOX << 4 ) | 0x2 ) ); + + sp.setShapeId( shapeId ); + sp.setFlags( EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE ); + opt.setRecordId( EscherOptRecord.RECORD_ID ); + // opt.addEscherProperty( new EscherBoolProperty( EscherProperties.PROTECTION__LOCKAGAINSTGROUPING, 262144 ) ); + opt.addEscherProperty( new EscherSimpleProperty( EscherProperties.TEXT__TEXTID, 0 ) ); + opt.addEscherProperty( new EscherSimpleProperty( EscherProperties.TEXT__TEXTLEFT, shape.getMarginLeft() ) ); + opt.addEscherProperty( new EscherSimpleProperty( EscherProperties.TEXT__TEXTRIGHT, shape.getMarginRight() ) ); + opt.addEscherProperty( new EscherSimpleProperty( EscherProperties.TEXT__TEXTBOTTOM, shape.getMarginBottom() ) ); + opt.addEscherProperty( new EscherSimpleProperty( EscherProperties.TEXT__TEXTTOP, shape.getMarginTop() ) ); + addStandardOptions( shape, opt ); + HSSFAnchor userAnchor = shape.getAnchor(); + // if (userAnchor.isHorizontallyFlipped()) + // sp.setFlags(sp.getFlags() | EscherSpRecord.FLAG_FLIPHORIZ); + // if (userAnchor.isVerticallyFlipped()) + // sp.setFlags(sp.getFlags() | EscherSpRecord.FLAG_FLIPVERT); + anchor = createAnchor( userAnchor ); + clientData.setRecordId( EscherClientDataRecord.RECORD_ID ); + clientData.setOptions( (short) 0x0000 ); + escherTextbox.setRecordId( EscherTextboxRecord.RECORD_ID ); + escherTextbox.setOptions( (short) 0x0000 ); + + spContainer.addChildRecord( sp ); + spContainer.addChildRecord( opt ); + spContainer.addChildRecord( anchor ); + spContainer.addChildRecord( clientData ); + spContainer.addChildRecord( escherTextbox ); + + return spContainer; + } + + /** + * Textboxes also have an extra TXO record associated with them that most + * other shapes dont have. + */ + private TextObjectRecord createTextObjectRecord( HSSFTextbox hssfShape, int shapeId ) + { + HSSFTextbox shape = hssfShape; + + TextObjectRecord obj = new TextObjectRecord(); + obj.setHorizontalTextAlignment( TextObjectRecord.HORIZONTAL_TEXT_ALIGNMENT_LEFT_ALIGNED ); + obj.setVerticalTextAlignment( TextObjectRecord.VERTICAL_TEXT_ALIGNMENT_TOP ); + obj.setTextLocked( true ); + obj.setTextOrientation( TextObjectRecord.TEXT_ORIENTATION_NONE ); + int frLength = ( shape.getString().numFormattingRuns() + 1 ) * 8; + obj.setFormattingRunLength( (short) frLength ); + obj.setTextLength( (short) shape.getString().length() ); + obj.setStr( shape.getString() ); + obj.setReserved7( 0 ); + + return obj; + } + + public EscherContainerRecord getSpContainer() + { + return spContainer; + } + + public ObjRecord getObjRecord() + { + return objRecord; + } + + public TextObjectRecord getTextObjectRecord() + { + return textObjectRecord; + } + + public EscherRecord getEscherTextbox() + { + return escherTextbox; + } +} |