+++ /dev/null
-/* ====================================================================
- 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
-
- 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.
-==================================================================== */
-
-
-package org.apache.poi.hssf.dev;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.IOException;
-
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.hssf.record.*;
-import org.apache.poi.hssf.eventmodel.*;
-import org.apache.poi.hssf.eventusermodel.*;
-import org.apache.poi.hssf.usermodel.*;
-
-import org.apache.poi.hssf.eventusermodel.HSSFRequest;
-import org.apache.poi.hssf.eventusermodel.HSSFListener;
-import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
-
-/**
- * Event Factory version of HSSF test class.
- * @author andy
- */
-//JMH
-//public class EFHSSF
-//{
-// String infile;
-// String outfile;
-// HSSFWorkbook workbook = null;
-// HSSFSheet cursheet = null;
-//
-// /** Creates a new instance of EFHSSF */
-//
-// public EFHSSF()
-// {
-// }
-//
-// public void setInputFile(String infile)
-// {
-// this.infile = infile;
-// }
-//
-// public void setOutputFile(String outfile)
-// {
-// this.outfile = outfile;
-// }
-//
-// public void run()
-// throws IOException
-// {
-// FileInputStream fin = new FileInputStream(infile);
-// POIFSFileSystem poifs = new POIFSFileSystem(fin);
-// InputStream din = poifs.createDocumentInputStream("Workbook");
-// HSSFRequest req = new HSSFRequest();
-//
-// req.addListenerForAllRecords(new EFHSSFListener(this));
-// HSSFEventFactory factory = new HSSFEventFactory();
-//
-// factory.processEvents(req, din);
-// fin.close();
-// din.close();
-// FileOutputStream fout = new FileOutputStream(outfile);
-//
-// workbook.write(fout);
-// fout.close();
-// System.out.println("done.");
-// }
-//
-// public void recordHandler(Record record)
-// {
-// HSSFRow row = null;
-// HSSFCell cell = null;
-// int sheetnum = -1;
-//
-// switch (record.getSid())
-// {
-//
-// case BOFRecord.sid :
-// BOFRecord bof = ( BOFRecord ) record;
-//
-// if (bof.getType() == bof.TYPE_WORKBOOK)
-// {
-// workbook = new HSSFWorkbook();
-// }
-// else if (bof.getType() == bof.TYPE_WORKSHEET)
-// {
-// sheetnum++;
-// cursheet = workbook.getSheetAt(sheetnum);
-// }
-// break;
-//
-// case BoundSheetRecord.sid :
-// BoundSheetRecord bsr = ( BoundSheetRecord ) record;
-//
-// workbook.createSheet(bsr.getSheetname());
-// break;
-//
-// case RowRecord.sid :
-// RowRecord rowrec = ( RowRecord ) record;
-//
-// cursheet.createRow(rowrec.getRowNumber());
-// break;
-//
-// case NumberRecord.sid :
-// NumberRecord numrec = ( NumberRecord ) record;
-//
-// row = cursheet.getRow(numrec.getRow());
-// cell = row.createCell(numrec.getColumn(),
-// HSSFCell.CELL_TYPE_NUMERIC);
-// cell.setCellValue(numrec.getValue());
-// break;
-//
-// case SSTRecord.sid :
-// SSTRecord sstrec = ( SSTRecord ) record;
-//
-// for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
-// {
-// workbook.addSSTString(new UnicodeString(sstrec.getString(k)));
-// }
-// break;
-//
-// case LabelSSTRecord.sid :
-// LabelSSTRecord lrec = ( LabelSSTRecord ) record;
-//
-// row = cursheet.getRow(lrec.getRow());
-// cell = row.createCell(lrec.getColumn(),
-// HSSFCell.CELL_TYPE_STRING);
-// cell.setCellValue(workbook.getSSTString(lrec.getSSTIndex()));
-// break;
-// }
-// }
-//
-// public static void main(String [] args)
-// {
-// if ((args.length < 2) || !args[ 0 ].equals("--help"))
-// {
-// try
-// {
-// EFHSSF viewer = new EFHSSF();
-//
-// viewer.setInputFile(args[ 0 ]);
-// viewer.setOutputFile(args[ 1 ]);
-// viewer.run();
-// }
-// catch (IOException e)
-// {
-// e.printStackTrace();
-// }
-// }
-// else
-// {
-// System.out.println("EFHSSF");
-// System.out.println(
-// "General testbed for HSSFEventFactory based testing and "
-// + "Code examples");
-// System.out.println("Usage: java org.apache.poi.hssf.dev.EFHSSF "
-// + "file1 file2");
-// System.out.println(
-// " --will rewrite the file reading with the event api");
-// System.out.println("and writing with the standard API");
-// }
-// }
-//}
-//
-//class EFHSSFListener
-// implements HSSFListener
-//{
-// EFHSSF efhssf;
-//
-// public EFHSSFListener(EFHSSF efhssf)
-// {
-// this.efhssf = efhssf;
-// }
-//
-// public void processRecord(Record record)
-// {
-// efhssf.recordHandler(record);
-// }
-//}
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
+
package org.apache.poi.hssf.model;
-import org.apache.poi.hssf.record.*;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.poi.ddf.EscherOptRecord;
+import org.apache.poi.ddf.EscherProperties;
+import org.apache.poi.ddf.EscherProperty;
+import org.apache.poi.ddf.EscherSimpleProperty;
+import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
+import org.apache.poi.hssf.record.NoteRecord;
+import org.apache.poi.hssf.record.NoteStructureSubRecord;
+import org.apache.poi.hssf.record.ObjRecord;
+import org.apache.poi.hssf.record.SubRecord;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFShape;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.ddf.*;
-
-import java.util.List;
-import java.util.Iterator;
/**
* Represents a cell comment.
*
* @author Yegor Kozlov
*/
-public class CommentShape extends TextboxShape {
+public final class CommentShape extends TextboxShape {
- private NoteRecord note;
+ private NoteRecord _note;
/**
* Creates the low-level records for a comment.
{
super(hssfShape, shapeId);
- note = createNoteRecord(hssfShape, shapeId);
+ _note = createNoteRecord(hssfShape, shapeId);
ObjRecord obj = getObjRecord();
- List records = obj.getSubRecords();
+ List<SubRecord> records = obj.getSubRecords();
int cmoIdx = 0;
for (int i = 0; i < records.size(); i++) {
Object r = records.get(i);
super.addStandardOptions(shape, opt);
//remove unnecessary properties inherited from TextboxShape
- java.util.List props = opt.getEscherProperties();
- for ( Iterator iterator = props.iterator(); iterator.hasNext(); ) {
- EscherProperty prop = (EscherProperty) iterator.next();
+ List<EscherProperty> props = opt.getEscherProperties();
+ for (Iterator<EscherProperty> iterator = props.iterator(); iterator.hasNext(); ) {
+ EscherProperty prop = iterator.next();
switch (prop.getId()){
case EscherProperties.TEXT__TEXTLEFT:
case EscherProperties.TEXT__TEXTRIGHT:
*/
public NoteRecord getNoteRecord()
{
- return note;
+ return _note;
}
-
}
import org.apache.poi.hssf.record.SupBookRecord;
import org.apache.poi.hssf.record.TabIdRecord;
import org.apache.poi.hssf.record.UnicodeString;
-import org.apache.poi.hssf.record.UnknownRecord;
import org.apache.poi.hssf.record.UseSelFSRecord;
import org.apache.poi.hssf.record.WindowOneRecord;
import org.apache.poi.hssf.record.WindowProtectRecord;
case WindowOneRecord.sid:
if (log.check( POILogger.DEBUG ))
log.log(DEBUG, "found WindowOneRecord at " + k);
- retval.windowOne = (WindowOneRecord) rec;
+ retval.windowOne = (WindowOneRecord) rec;
break;
- case WriteAccessRecord.sid:
+ case WriteAccessRecord.sid:
if (log.check( POILogger.DEBUG ))
log.log(DEBUG, "found WriteAccess at " + k);
retval.writeAccess = (WriteAccessRecord) rec;
break;
- case WriteProtectRecord.sid:
+ case WriteProtectRecord.sid:
if (log.check( POILogger.DEBUG ))
log.log(DEBUG, "found WriteProtect at " + k);
retval.writeProtect = (WriteProtectRecord) rec;
break;
- case FileSharingRecord.sid:
+ case FileSharingRecord.sid:
if (log.check( POILogger.DEBUG ))
log.log(DEBUG, "found FileSharing at " + k);
retval.fileShare = (FileSharingRecord) rec;
// retval.records.supbookpos = retval.records.bspos + 1;
// retval.records.namepos = retval.records.supbookpos + 1;
// }
-
+
// Look for other interesting values that
// follow the EOFRecord
for ( ; k < recs.size(); k++) {
break;
}
}
-
+
if (retval.windowOne == null) {
retval.windowOne = createWindowOne();
}
retval.records.setBspos(records.size() - 1);
}
records.add( retval.createCountry() );
- for ( int k = 0; k < nBoundSheets; k++ ) {
+ for ( int k = 0; k < nBoundSheets; k++ ) {
retval.getOrCreateLinkTable().checkExternSheet(k);
}
retval.sst = new SSTRecord();
return retval;
}
-
+
/**
* Retrieves the index of the given font
*/
return i;
}
}
- throw new IllegalArgumentException("Could not find that font!");
+ throw new IllegalArgumentException("Could not find that font!");
}
/**
numfonts++;
return rec;
}
-
+
/**
* Removes the given font record from the
- * file's list. This will make all
+ * file's list. This will make all
* subsequent font indicies drop by one,
* so you'll need to update those yourself!
*/
}
/**
- * Determines whether a workbook contains the provided sheet name. For the purpose of
+ * Determines whether a workbook contains the provided sheet name. For the purpose of
* comparison, long names are truncated to 31 chars.
*
* @param name the name to test (case insensitive match)
}
return false;
}
-
+
/**
* sets the order of appearance for a given sheet.
*
* @param sheetname the name of the sheet to reorder
* @param pos the position that we want to insert the sheet into (0 based)
*/
-
+
public void setSheetOrder(String sheetname, int pos ) {
int sheetNumber = getSheetIndex(sheetname);
//remove the sheet that needs to be reordered and place it in the spot we want
- boundsheets.add(pos, boundsheets.remove(sheetNumber));
+ boundsheets.add(pos, boundsheets.remove(sheetNumber));
}
/**
/**
* Gets the hidden flag for a given sheet.
- * Note that a sheet could instead be
+ * Note that a sheet could instead be
* set to be very hidden, which is different
* ({@link #isSheetVeryHidden(int)})
*
/**
* Gets the very hidden flag for a given sheet.
- * This is different from the normal
- * hidden flag
+ * This is different from the normal
+ * hidden flag
* ({@link #isSheetHidden(int)})
*
* @param sheetnum the sheet number (0 based)
/**
* Hide or unhide a sheet
- *
+ *
* @param sheetnum The sheet number
* @param hidden True to mark the sheet as hidden, false otherwise
*/
public void setSheetHidden(int sheetnum, boolean hidden) {
getBoundSheetRec(sheetnum).setHidden(hidden);
}
-
+
/**
* Hide or unhide a sheet.
* 0 = not hidden
* 1 = hidden
* 2 = very hidden.
- *
+ *
* @param sheetnum The sheet number
* @param hidden 0 for not hidden, 1 for hidden, 2 for very hidden
*/
bsr.setHidden(h);
bsr.setVeryHidden(vh);
}
-
-
+
+
/**
* get the sheet's index
* @param name sheet name
boundsheets.remove(sheetIndex);
fixTabIdRecord();
}
-
+
// Within NameRecords, it's ok to have the formula
// part point at deleted sheets. It's also ok to
// have the ExternSheetNumber point at deleted
- // sheets.
+ // sheets.
// However, the sheet index must be adjusted, or
// excel will break. (Sheet index is either 0 for
// global, or 1 based index to sheet)
int sheetNum1Based = sheetIndex + 1;
for(int i=0; i<getNumNames(); i++) {
NameRecord nr = getNameRecord(i);
-
+
if(nr.getSheetNumber() == sheetNum1Based) {
// Excel re-writes these to point to no sheet
nr.setSheetNumber(0);
return retval;
}
-
+
/**
* Removes the given ExtendedFormatRecord record from the
- * file's list. This will make all
+ * file's list. This will make all
* subsequent font indicies drop by one,
* so you'll need to update those yourself!
*/
numxfs++;
return xf;
}
-
+
/**
* Returns the StyleRecord for the given
* xfIndex, or null if that ExtendedFormat doesn't
* have a Style set.
*/
public StyleRecord getStyleRecord(int xfIndex) {
- // Style records always follow after
+ // Style records always follow after
// the ExtendedFormat records
for(int i=records.getXfpos(); i<records.size(); i++) {
Record r = records.get(i);
* records collection
*/
public StyleRecord createStyleRecord(int xfIndex) {
- // Style records always follow after
+ // Style records always follow after
// the ExtendedFormat records
StyleRecord newSR = new StyleRecord();
newSR.setXFIndex(xfIndex);
-
+
// Find the spot
int addAt = -1;
for(int i=records.getXfpos(); i<records.size() &&
throw new IllegalStateException("No XF Records found!");
}
records.add(addAt, newSR);
-
+
return newSR;
}
// Let's skip RECALCID records, as they are only use for optimization
if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() )
{
- int len = 0;
+ int len = 0;
if (record instanceof SSTRecord)
{
sst = (SSTRecord)record;
}
/**
- * creates the TabId record containing an array
+ * creates the TabId record containing an array
*/
private static TabIdRecord createTabId() {
return new TabIdRecord();
private static ProtectRecord createProtect() {
// by default even when we support it we won't
// want it to be protected
- return new ProtectRecord(false);
+ return new ProtectRecord(false);
}
/**
* @param id the number of the format record to create (meaning its position in
* a file as M$ Excel would create it.)
*/
- private static FormatRecord createFormat(int id) {
+ private static FormatRecord createFormat(int id) {
// we'll need multiple editions for
// the different formats
private static PaletteRecord createPalette() {
return new PaletteRecord();
}
-
+
/**
* @return a new UseSelFS object with the use natural language flag set to 0 (false)
*/
retval.setNumStringsPerBucket(( short ) 0x8);
return retval;
}
-
+
/**
* lazy initialization
* Note - creating the link table causes creation of 1 EXTERNALBOOK and 1 EXTERNALSHEET record
public int getExternalSheetIndex(String workbookName, String sheetName) {
return getOrCreateLinkTable().getExternalSheetIndex(workbookName, sheetName);
}
-
+
/** gets the total number of names
* @return number of names
*/
public NameRecord addName(NameRecord name)
{
-
+
LinkTable linkTable = getOrCreateLinkTable();
if(linkTable.nameAlreadyExists(name)) {
throw new IllegalArgumentException(
return name;
}
-
+
/**
* Generates a NameRecord to represent a built-in region
* @return a new NameRecord
if (sheetNumber < 0 || sheetNumber+1 > Short.MAX_VALUE) {
throw new IllegalArgumentException("Sheet number ["+sheetNumber+"]is not valid ");
}
-
+
NameRecord name = new NameRecord(builtInName, sheetNumber);
-
+
while(linkTable.nameAlreadyExists(name)) {
- throw new RuntimeException("Builtin (" + builtInName
+ throw new RuntimeException("Builtin (" + builtInName
+ ") already exists for sheet (" + sheetNumber + ")");
}
addName(name);
* @param nameIndex name index
*/
public void removeName(int nameIndex){
-
+
if (linkTable.getNumNames() > nameIndex) {
int idx = findFirstRecordLocBySid(NameRecord.sid);
records.remove(idx + nameIndex);
return maxformatid;
}
-
+
/**
* Returns the first occurance of a record matching a particular sid.
public Record findFirstRecordBySid(short sid) {
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) {
Record record = ( Record ) iterator.next();
-
+
if (record.getSid() == sid) {
return record;
}
{
return hyperlinks;
}
-
+
public List<Record> getRecords() {
return records.getRecords();
}
public boolean isUsing1904DateWindowing() {
return uses1904datewindowing;
}
-
+
/**
* Returns the custom palette in use for this workbook; if a custom palette record
* does not exist, then it is created.
}
return palette;
}
-
+
/**
* Finds the primary drawing group, if one already exists
*/
}
/**
- * Creates a primary drawing group record. If it already
+ * Creates a primary drawing group record. If it already
* exists then it's modified.
*/
public void createDrawingGroup() {
}
}
-
+
public WindowOneRecord getWindowOne() {
return windowOne;
}
if (writeProtect == null) {
writeProtect = new WriteProtectRecord();
int i = 0;
- for (i = 0;
- i < records.size() && !(records.get(i) instanceof BOFRecord);
+ for (i = 0;
+ i < records.size() && !(records.get(i) instanceof BOFRecord);
i++) {
}
records.add(i+1, writeProtect);
if (writeAccess == null) {
writeAccess = createWriteAccess();
int i = 0;
- for (i = 0;
- i < records.size() && !(records.get(i) instanceof InterfaceEndRecord);
+ for (i = 0;
+ i < records.size() && !(records.get(i) instanceof InterfaceEndRecord);
i++) {
}
records.add(i+1, writeAccess);
if (fileShare == null) {
fileShare = new FileSharingRecord();
int i = 0;
- for (i = 0;
- i < records.size() && !(records.get(i) instanceof WriteAccessRecord);
+ for (i = 0;
+ i < records.size() && !(records.get(i) instanceof WriteAccessRecord);
i++) {
}
records.add(i+1, fileShare);
}
return fileShare;
}
-
+
/**
* is the workbook protected with a password (not encrypted)?
*/
import org.apache.poi.hssf.record.cf.FontFormatting;
import org.apache.poi.hssf.record.cf.PatternFormatting;
import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.formula.Formula;
import org.apache.poi.ss.formula.FormulaType;
/**
* Conditional Formatting Rule Record (0x01B1).<br/>
- *
+ *
* @author Dmitriy Kumshayev
*/
public final class CFRuleRecord extends StandardRecord {
private BorderFormatting borderFormatting;
private PatternFormatting patternFormatting;
-
+
private Formula field_17_formula1;
private Formula field_18_formula2;
-
+
/** Creates new CFRuleRecord */
private CFRuleRecord(byte conditionType, byte comparisonOperation)
{
field_17_formula1=Formula.create(Ptg.EMPTY_PTG_ARRAY);
field_18_formula2=Formula.create(Ptg.EMPTY_PTG_ARRAY);
}
-
+
private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
- this(conditionType, comparisonOperation);
+ this(conditionType, comparisonOperation);
field_17_formula1 = Formula.create(formula1);
field_18_formula2 = Formula.create(formula2);
}
return null;
}
}
-
+
public boolean containsAlignFormattingBlock()
{
return getOptionFlag(align);
{
setOptionFlag(false,align);
}
-
+
public boolean containsBorderFormattingBlock()
{
return getOptionFlag(bord);
return null;
}
}
-
+
public boolean containsPatternFormattingBlock()
{
return getOptionFlag(patt);
return null;
}
}
-
+
public boolean containsProtectionFormattingBlock()
{
return getOptionFlag(prot);
{
setOptionFlag(false,prot);
}
-
+
public void setComparisonOperation(byte operation)
{
field_2_comparison_operator = operation;
{
return field_2_comparison_operator;
}
-
+
/**
* get the option flags
public int getOptions()
{
return field_5_options;
- }
+ }
private boolean isModified(BitField field)
{
{
field_5_options = field.setBoolean(field_5_options, !modified);
}
-
+
public boolean isLeftBorderModified()
{
return isModified(bordLeft);
{
setModified(modified,bordLeft);
}
-
+
public boolean isRightBorderModified()
{
return isModified(bordRight);
{
setModified(modified,bordRight);
}
-
+
public boolean isTopBorderModified()
{
return isModified(bordTop);
{
setModified(modified,bordTop);
}
-
+
public boolean isBottomBorderModified()
{
return isModified(bordBot);
{
setModified(modified,bordBot);
}
-
+
public boolean isTopLeftBottomRightBorderModified()
{
return isModified(bordTlBr);
{
setModified(modified,bordTlBr);
}
-
+
public boolean isBottomLeftTopRightBorderModified()
{
return isModified(bordBlTr);
{
setModified(modified,bordBlTr);
}
-
+
public boolean isPatternStyleModified()
{
return isModified(pattStyle);
{
setModified(modified,pattStyle);
}
-
+
public boolean isPatternColorModified()
{
return isModified(pattCol);
{
setModified(modified,pattCol);
}
-
+
public boolean isPatternBackgroundColorModified()
{
return isModified(pattBgCol);
{
setModified(modified,pattBgCol);
}
-
+
private boolean getOptionFlag(BitField field)
{
return field.isSet(field_5_options);
{
field_5_options = field.setBoolean(field_5_options, flag);
}
-
+
/**
* get the stack of the 1st expression as a list
*
* @return list of tokens (casts stack to a list and returns it!)
- * this method can return null is we are unable to create Ptgs from
+ * this method can return null is we are unable to create Ptgs from
* existing excel file
* callers should check for null!
*/
private static int getFormulaSize(Formula formula) {
return formula.getEncodedTokenSize();
}
-
+
/**
* called by the class that is responsible for writing this sucker.
* Subclasses should implement this so that their data is passed back in a
* @param out the stream to write to
*/
public void serialize(LittleEndianOutput out) {
-
+
int formula1Len=getFormulaSize(field_17_formula1);
int formula2Len=getFormulaSize(field_18_formula2);
-
+
out.writeByte(field_1_condition_type);
out.writeByte(field_2_comparison_operator);
out.writeShort(formula1Len);
out.writeShort(formula2Len);
out.writeInt(field_5_options);
out.writeShort(field_6_not_used);
-
+
if (containsFontFormattingBlock()) {
byte[] fontFormattingRawRecord = fontFormatting.getRawRecord();
out.write(fontFormattingRawRecord);
}
-
+
if (containsBorderFormattingBlock()) {
borderFormatting.serialize(out);
}
-
+
if (containsPatternFormattingBlock()) {
patternFormatting.serialize(out);
}
-
+
field_17_formula1.serializeTokens(out);
field_18_formula2.serializeTokens(out);
}
}
return buffer.toString();
}
-
+
public Object clone() {
CFRuleRecord rec = new CFRuleRecord(field_1_condition_type, field_2_comparison_operator);
rec.field_5_options = field_5_options;
* this call will produce the wrong results if the formula contains any cell references
* One approach might be to apply the inverse of SharedFormulaRecord.convertSharedFormulas(Stack, int, int)
* Note - two extra parameters (rowIx & colIx) will be required. They probably come from one of the Region objects.
- *
+ *
* @return <code>null</code> if <tt>formula</tt> was null.
*/
private static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
package org.apache.poi.hssf.record;
import org.apache.poi.util.HexDump;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianOutput;
/**
package org.apache.poi.hssf.record;
-import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.apache.poi.hssf.util.CellRangeAddress8Bit;
import org.apache.poi.util.HexDump;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianOutput;
/**
field_3_col_active_cell = in.readShort();
field_4_active_cell_ref_index = in.readShort();
int field_5_num_refs = in.readUShort();
-
+
field_6_refs = new CellRangeAddress8Bit[field_5_num_refs];
for (int i = 0; i < field_6_refs.length; i++) {
field_6_refs[i] = new CellRangeAddress8Bit(in);
return sb.toString();
}
protected int getDataSize() {
- return 9 // 1 byte + 4 shorts
+ return 9 // 1 byte + 4 shorts
+ CellRangeAddress8Bit.getEncodedSize(field_6_refs.length);
}
public void serialize(LittleEndianOutput out) {
package org.apache.poi.hssf.record;
-import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.formula.Ref3DPtg;
import org.apache.poi.hssf.record.formula.RefPtg;
import org.apache.poi.util.HexDump;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianByteArrayInputStream;
import org.apache.poi.util.LittleEndianInput;
import org.apache.poi.util.LittleEndianOutput;
*/
public abstract class SubRecord {
protected SubRecord() {
+ // no fields to initialise
}
public static SubRecord createSubRecord(LittleEndianInput in) {
public abstract void serialize(LittleEndianOutput out);
public abstract Object clone();
-
-
+
+
private static final class UnknownSubRecord extends SubRecord {
private final int _sid;
private static final class LbsDataSubRecord extends SubRecord {
public static final int sid = 0x0013;
-
+
private int _unknownShort1;
private int _unknownInt4;
private Ptg _linkPtg;
if (linkSize > 0) {
int formulaSize = in.readUShort();
_unknownInt4 = in.readInt();
-
-
+
+
byte[] buf = new byte[formulaSize];
in.readFully(buf);
_linkPtg = readRefPtg(buf);
default:
throw new RecordFormatException("Unexpected leftover bytes");
}
-
+
} else {
_unknownInt4 = 0;
_linkPtg = null;
_comboStyle = in.readUShort();
_lineCount = in.readUShort();
_unknownShort13 = in.readUShort();
-
+
}
protected int getDataSize() {
int result = 2; // 2 initial shorts
-
+
// optional link formula
if (_linkPtg != null) {
result += 2; // encoded Ptg size
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.record.UnicodeString;
import org.apache.poi.hssf.record.constant.ConstantValueParser;
import org.apache.poi.hssf.record.constant.ErrorConstant;
import org.apache.poi.util.LittleEndianInput;
/**
* ArrayPtg - handles arrays
- *
+ *
* The ArrayPtg is a little weird, the size of the Ptg when parsing initially only
* includes the Ptg sid and the reserved bytes. The next Ptg in the expression then follows.
* It is only after the "size" of all the Ptgs is met, that the ArrayPtg data is actually
- * held after this. So Ptg.createParsedExpression keeps track of the number of
+ * held after this. So Ptg.createParsedExpression keeps track of the number of
* ArrayPtg elements and need to parse the data upto the FORMULA record size.
- *
+ *
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class ArrayPtg extends Ptg {
public static final byte sid = 0x20;
private static final int RESERVED_FIELD_LEN = 7;
- /**
+ /**
* The size of the plain tArray token written within the standard formula tokens
* (not including the data which comes after all formula tokens)
*/
// TODO - fix up field visibility and subclasses
private final byte[] field_1_reserved;
-
+
// data from these fields comes after the Ptg data of all tokens in current formula
private int token_1_columns;
private short token_2_rows;
vv[getValueIndex(c, r)] = rowData[c];
}
}
-
+
token_3_arrayValues = vv;
field_1_reserved = DEFAULT_RESERVED_DATA;
}
}
return result;
}
-
+
public boolean isBaseToken() {
return false;
}
-
- /**
- * Read in the actual token (array) values. This occurs
+
+ /**
+ * Read in the actual token (array) values. This occurs
* AFTER the last Ptg in the expression.
* See page 304-305 of Excel97-2007BinaryFileFormat(xls)Specification.pdf
*/
//Which is not explicitly documented.
nColumns++;
nRows++;
-
+
token_1_columns = nColumns;
token_2_rows = nRows;
-
+
int totalCount = nRows * nColumns;
token_3_arrayValues = ConstantValueParser.parse(in, totalCount);
}
*/
/* package */ int getValueIndex(int colIx, int rowIx) {
if(colIx < 0 || colIx >= token_1_columns) {
- throw new IllegalArgumentException("Specified colIx (" + colIx
+ throw new IllegalArgumentException("Specified colIx (" + colIx
+ ") is outside the allowed range (0.." + (token_1_columns-1) + ")");
}
if(rowIx < 0 || rowIx >= token_2_rows) {
- throw new IllegalArgumentException("Specified rowIx (" + rowIx
+ throw new IllegalArgumentException("Specified rowIx (" + rowIx
+ ") is outside the allowed range (0.." + (token_2_rows-1) + ")");
}
return rowIx * token_1_columns + colIx;
/** This size includes the size of the array Ptg plus the Array Ptg Token value size*/
public int getSize() {
- return PLAIN_TOKEN_SIZE
+ return PLAIN_TOKEN_SIZE
// data written after the all tokens:
+ 1 + 2 // column, row
+ ConstantValueParser.getEncodedSize(token_3_arrayValues);
b.append("}");
return b.toString();
}
-
+
private static String getConstantText(Object o) {
if (o == null) {
}
throw new IllegalArgumentException("Unexpected constant class (" + o.getClass().getName() + ")");
}
-
+
public byte getDefaultOperandClass() {
return Ptg.CLASS_ARRAY;
}
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndianInput;
import org.apache.poi.util.LittleEndianOutput;
-import org.apache.poi.ss.SpreadsheetVersion;
/**
* ReferencePtgBase - handles references (such as A1, A2, IA4)
- *
+ *
* @author Andrew C. Oliver (acoliver@apache.org)
* @author Jason Height (jheight at chariot dot net dot au)
*/
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
-import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import java.util.regex.Pattern;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
-import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
import org.apache.poi.hssf.record.formula.eval.NumberEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.StringEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.functions.FreeRefFunction;
-import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.formula.EvaluationWorkbook;
+import org.apache.poi.ss.usermodel.DateUtil;
/**
* Implementation of Excel 'Analysis ToolPak' function YEARFRAC()<br/>
*
package org.apache.poi.hssf.usermodel;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherClientAnchorRecord;
-import org.apache.poi.ddf.EscherChildAnchorRecord;
-public class HSSFChildAnchor
- extends HSSFAnchor
-{
+public final class HSSFChildAnchor extends HSSFAnchor {
public HSSFChildAnchor()
{
}
{
return dy1 > dy2;
}
-
}
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
+
package org.apache.poi.hssf.usermodel;
import org.apache.poi.ss.usermodel.CreationHelper;
-import org.apache.poi.ss.usermodel.Sheet;
public class HSSFCreationHelper implements CreationHelper {
private HSSFWorkbook workbook;
- private HSSFDataFormat dataFormat;
-
+ private HSSFDataFormat dataFormat;
+
HSSFCreationHelper(HSSFWorkbook wb) {
workbook = wb;
-
+
// Create the things we only ever need one of
dataFormat = new HSSFDataFormat(workbook.getWorkbook());
}
-
- /**
- * Creates a new HSSFRichTextString for you.
- */
+
public HSSFRichTextString createRichTextString(String text) {
return new HSSFRichTextString(text);
}
-
+
public HSSFDataFormat createDataFormat() {
return dataFormat;
}
-
+
public HSSFHyperlink createHyperlink(int type) {
return new HSSFHyperlink(type);
}
- /**
- * Creates a HSSFFormulaEvaluator, the object that evaluates formula cells.
- *
- * @return a HSSFFormulaEvaluator instance
- */
- public HSSFFormulaEvaluator createFormulaEvaluator(){
- return new HSSFFormulaEvaluator(workbook);
- }
-
- /**
- * Creates a HSSFClientAnchor. Use this object to position drawing object in a sheet
- *
- * @return a HSSFClientAnchor instance
- * @see org.apache.poi.ss.usermodel.Drawing
- */
- public HSSFClientAnchor createClientAnchor(){
- return new HSSFClientAnchor();
- }
+ /**
+ * Creates a HSSFFormulaEvaluator, the object that evaluates formula cells.
+ *
+ * @return a HSSFFormulaEvaluator instance
+ */
+ public HSSFFormulaEvaluator createFormulaEvaluator(){
+ return new HSSFFormulaEvaluator(workbook);
+ }
+ /**
+ * Creates a HSSFClientAnchor. Use this object to position drawing object in a sheet
+ *
+ * @return a HSSFClientAnchor instance
+ * @see org.apache.poi.ss.usermodel.Drawing
+ */
+ public HSSFClientAnchor createClientAnchor(){
+ return new HSSFClientAnchor();
+ }
}
package org.apache.poi.hssf.usermodel;
-import org.apache.poi.ss.usermodel.DataFormatter;
-
import java.text.DecimalFormat;
-import java.text.FieldPosition;
import java.text.Format;
-import java.text.ParsePosition;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
+import org.apache.poi.ss.usermodel.DataFormatter;
/**
* HSSFDataFormatter contains methods for formatting the value stored in an
* cell's data format string.
*
* @author James May (james dot may at fmr dot com)
- *
*/
public final class HSSFDataFormatter extends DataFormatter {
import org.apache.poi.ss.usermodel.RichTextString;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
-
/**
* A textbox is a shape that may hold a rich text string.
*
import java.io.IOException;
import java.util.Iterator;
-import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentNode;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* A lister of the entries in POIFS files.
- *
+ *
* Much simpler than {@link POIFSViewer}
*/
public class POIFSLister {
- /**
- * Display the entries of multiple POIFS files
- *
- * @param args the names of the files to be displayed
- */
- public static void main(final String args[]) throws IOException {
- if (args.length == 0)
- {
- System.err.println("Must specify at least one file to view");
- System.exit(1);
- }
+ /**
+ * Display the entries of multiple POIFS files
+ *
+ * @param args the names of the files to be displayed
+ */
+ public static void main(final String args[]) throws IOException {
+ if (args.length == 0) {
+ System.err.println("Must specify at least one file to view");
+ System.exit(1);
+ }
- boolean withSizes = false;
- for (int j = 0; j < args.length; j++) {
- if(args[j].equalsIgnoreCase("-size") ||
- args[j].equalsIgnoreCase("-sizes")) {
- withSizes = true;
- } else {
- viewFile(args[j], withSizes);
- }
- }
- }
+ boolean withSizes = false;
+ for (int j = 0; j < args.length; j++) {
+ if (args[j].equalsIgnoreCase("-size") || args[j].equalsIgnoreCase("-sizes")) {
+ withSizes = true;
+ } else {
+ viewFile(args[j], withSizes);
+ }
+ }
+ }
- public static void viewFile(final String filename, boolean withSizes) throws IOException
- {
- POIFSFileSystem fs = new POIFSFileSystem(
- new FileInputStream(filename)
- );
- displayDirectory(fs.getRoot(), "", withSizes);
- }
-
- public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) {
- System.out.println(indent + dir.getName() + " -");
- String newIndent = indent + " ";
-
- boolean hadChildren = false;
- for(Iterator it = dir.getEntries(); it.hasNext(); ) {
- hadChildren = true;
- Object entry = it.next();
- if(entry instanceof DirectoryNode) {
- displayDirectory((DirectoryNode)entry, newIndent, withSizes);
- } else {
- DocumentNode doc = (DocumentNode)entry;
- String name = doc.getName();
- String size = "";
- if(name.charAt(0) < 10) {
- String altname = "(0x0" + (int)name.charAt(0) + ")" + name.substring(1);
- name = name.substring(1) + " <" + altname + ">";
- }
- if(withSizes) {
- size = " [" +
- doc.getSize() + " / 0x" +
- Integer.toHexString(doc.getSize()) +
- "]";
- }
- System.out.println(newIndent + name + size);
- }
- }
- if(!hadChildren) {
- System.out.println(newIndent + "(no children)");
- }
- }
-}
\ No newline at end of file
+ public static void viewFile(final String filename, boolean withSizes) throws IOException {
+ POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename));
+ displayDirectory(fs.getRoot(), "", withSizes);
+ }
+
+ public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) {
+ System.out.println(indent + dir.getName() + " -");
+ String newIndent = indent + " ";
+
+ boolean hadChildren = false;
+ for (Iterator it = dir.getEntries(); it.hasNext();) {
+ hadChildren = true;
+ Object entry = it.next();
+ if (entry instanceof DirectoryNode) {
+ displayDirectory((DirectoryNode) entry, newIndent, withSizes);
+ } else {
+ DocumentNode doc = (DocumentNode) entry;
+ String name = doc.getName();
+ String size = "";
+ if (name.charAt(0) < 10) {
+ String altname = "(0x0" + (int) name.charAt(0) + ")" + name.substring(1);
+ name = name.substring(1) + " <" + altname + ">";
+ }
+ if (withSizes) {
+ size = " [" + doc.getSize() + " / 0x" + Integer.toHexString(doc.getSize())
+ + "]";
+ }
+ System.out.println(newIndent + name + size);
+ }
+ }
+ if (!hadChildren) {
+ System.out.println(newIndent + "(no children)");
+ }
+ }
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.property;
-import java.util.*;
-
import java.io.IOException;
-
-import org.apache.poi.poifs.storage.SmallDocumentBlock;
+import java.util.*;
/**
* Directory property
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
+public class DirectoryProperty extends Property implements Parent { // TODO - fix instantiable superclass
-public class DirectoryProperty
- extends Property
- implements Parent
-{
-
- // List of Property instances
- private List _children;
+ /** List of Property instances */
+ private List<Property> _children;
- // set of children's names
- private Set _children_names;
+ /** set of children's names */
+ private Set<String> _children_names;
/**
* Default constructor
*
* @param name the name of the directory
*/
-
public DirectoryProperty(String name)
{
super();
- _children = new ArrayList();
- _children_names = new HashSet();
+ _children = new ArrayList<Property>();
+ _children_names = new HashSet<String>();
setName(name);
setSize(0);
setPropertyType(PropertyConstants.DIRECTORY_TYPE);
* @param array byte data
* @param offset offset into byte data
*/
-
protected DirectoryProperty(final int index, final byte [] array,
final int offset)
{
super(index, array, offset);
- _children = new ArrayList();
- _children_names = new HashSet();
+ _children = new ArrayList<Property>();
+ _children_names = new HashSet<String>();
}
/**
*
* @return true if the name change could be made, else false
*/
-
- public boolean changeName(final Property property, final String newName)
+ public boolean changeName(Property property, String newName)
{
boolean result;
String oldName = property.getName();
*
* @return true if the Property could be deleted, else false
*/
-
- public boolean deleteChild(final Property property)
+ public boolean deleteChild(Property property)
{
boolean result = _children.remove(property);
return result;
}
- public static class PropertyComparator
- implements Comparator
- {
+ public static class PropertyComparator implements Comparator<Property> {
/**
* Object equality, implemented as object identity
*
* @return true if identical, else false
*/
-
public boolean equals(Object o)
{
return this == o;
* zero if o1 == o2,
* positive value if o1 > o2.
*/
-
- public int compare(Object o1, Object o2)
+ public int compare(Property o1, Property o2)
{
String VBA_PROJECT = "_VBA_PROJECT";
- String name1 = (( Property ) o1).getName();
- String name2 = (( Property ) o2).getName();
+ String name1 = o1.getName();
+ String name2 = o2.getName();
int result = name1.length() - name2.length();
if (result == 0)
}
return result;
}
- } // end private class PropertyComparator
-
- /* ********** START extension of Property ********** */
+ }
/**
* @return true if a directory type Property
*/
-
public boolean isDirectory()
{
return true;
* Perform whatever activities need to be performed prior to
* writing
*/
-
protected void preWrite()
{
if (_children.size() > 0)
{
- Property[] children =
- ( Property [] ) _children.toArray(new Property[ 0 ]);
+ Property[] children = _children.toArray(new Property[ 0 ]);
Arrays.sort(children, new PropertyComparator());
int midpoint = children.length / 2;
}
}
- /* ********** END extension of Property ********** */
- /* ********** START implementation of Parent ********** */
-
/**
* Get an iterator over the children of this Parent; all elements
* are instances of Property.
*
* @return Iterator of children; may refer to an empty collection
*/
-
- public Iterator getChildren()
+ public Iterator<Property> getChildren()
{
return _children.iterator();
}
* @exception IOException if we already have a child with the same
* name
*/
-
public void addChild(final Property property)
throws IOException
{
_children_names.add(name);
_children.add(property);
}
-
- /* ********** END implementation of Parent ********** */
-} // end public class DirectoryProperty
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.property;
import java.io.IOException;
import java.io.OutputStream;
-
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.filesystem.BATManaged;
import org.apache.poi.poifs.storage.BlockWritable;
import org.apache.poi.poifs.storage.PropertyBlock;
-import org.apache.poi.poifs.storage.RawDataBlock;
import org.apache.poi.poifs.storage.RawDataBlockList;
/**
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class PropertyTable
- implements BATManaged, BlockWritable
-{
+public final class PropertyTable implements BATManaged, BlockWritable {
private int _start_block;
- private List _properties;
+ private List<Property> _properties;
private BlockWritable[] _blocks;
- /**
- * Default constructor
- */
-
public PropertyTable()
{
_start_block = POIFSConstants.END_OF_CHAIN;
- _properties = new ArrayList();
+ _properties = new ArrayList<Property>();
addProperty(new RootProperty());
_blocks = null;
}
* @exception IOException if anything goes wrong (which should be
* a result of the input being NFG)
*/
-
public PropertyTable(final int startBlock,
final RawDataBlockList blockList)
throws IOException
*
* @param property the new Property to manage
*/
-
- public void addProperty(final Property property)
+ public void addProperty(Property property)
{
_properties.add(property);
}
*
* @param property the Property to be removed
*/
-
public void removeProperty(final Property property)
{
_properties.remove(property);
*
* @return the root property
*/
-
public RootProperty getRoot()
{
/**
* Prepare to be written
*/
-
public void preWrite()
{
- Property[] properties =
- ( Property [] ) _properties.toArray(new Property[ 0 ]);
+ Property[] properties = _properties.toArray(new Property[ 0 ]);
// give each property its index
for (int k = 0; k < properties.length; k++)
*
* @return start block index
*/
-
public int getStartBlock()
{
return _start_block;
// property has no children
return;
}
- Stack children = new Stack();
+ Stack<Property> children = new Stack<Property>();
children.push(_properties.get(index));
while (!children.empty())
{
- Property property = ( Property ) children.pop();
+ Property property = children.pop();
root.addChild(property);
if (property.isDirectory())
}
}
- /* ********** START implementation of BATManaged ********** */
-
/**
* Return the number of BigBlock's this instance uses
*
* @return count of BigBlock instances
*/
-
public int countBlocks()
{
return (_blocks == null) ? 0
* @param index index into the array of BigBlock instances making
* up the the filesystem
*/
-
public void setStartBlock(final int index)
{
_start_block = index;
}
- /* ********** END implementation of BATManaged ********** */
- /* ********** START implementation of BlockWritable ********** */
-
/**
* Write the storage to an OutputStream
*
* @exception IOException on problems writing to the specified
* stream
*/
-
public void writeBlocks(final OutputStream stream)
throws IOException
{
}
}
}
-
- /* ********** END implementation of BlockWritable ********** */
-} // end public class PropertyTable
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.property;
-import java.util.*;
-
-import java.io.IOException;
-
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.storage.SmallDocumentBlock;
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class RootProperty
- extends DirectoryProperty
-{
-
- /**
- * Default constructor
- */
+public final class RootProperty extends DirectoryProperty {
RootProperty()
{
* @param array byte data
* @param offset offset into byte data
*/
-
protected RootProperty(final int index, final byte [] array,
final int offset)
{
*
* @param size size in terms of small blocks
*/
-
public void setSize(int size)
{
super.setSize(SmallDocumentBlock.calcSize(size));
}
-} // end public class RootProperty
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.util.IntegerField;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianConsts;
/**
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class BATBlock
- extends BigBlock
-{
+public final class BATBlock extends BigBlock {
private static final int _entries_per_block =
POIFSConstants.BIG_BLOCK_SIZE / LittleEndianConsts.INT_SIZE;
private static final int _entries_per_xbat_block = _entries_per_block
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class BlockAllocationTableReader
-{
+public final class BlockAllocationTableReader {
private IntList _entries;
/**
setEntries(blocks, raw_block_list);
}
- /**
- * Constructor BlockAllocationTableReader
- *
- *
- */
-
BlockAllocationTableReader()
{
_entries = new IntList();
*
* @exception IOException if there is a problem acquiring the blocks
*/
-
ListManagedBlock [] fetchBlocks(final int startBlock,
final int headerPropertiesStartBlock,
final BlockList blockList)
throws IOException
{
- List blocks = new ArrayList();
+ List<ListManagedBlock> blocks = new ArrayList<ListManagedBlock>();
int currentBlock = startBlock;
boolean firstPass = true;
ListManagedBlock dataBlock = null;
-
+
// Process the chain from the start to the end
// Normally we have header, data, end
// Sometimes we have data, header, end
}
}
}
-
- return ( ListManagedBlock [] ) blocks
- .toArray(new ListManagedBlock[ blocks.size() ]);
+
+ return blocks.toArray(new ListManagedBlock[blocks.size()]);
}
// methods for debugging reader
*
* @return true if the specific block is used, else false
*/
-
boolean isUsed(final int index)
{
boolean rval = false;
try
{
rval = _entries.get(index) != -1;
- }
- catch (IndexOutOfBoundsException ignored)
- {
+ } catch (IndexOutOfBoundsException e) {
+ // ignored
}
return rval;
}
*
* @exception IOException if the current block is unused
*/
-
int getNextBlockIndex(final int index)
throws IOException
{
{
return _entries.get(index);
}
- else
- {
- throw new IOException("index " + index + " is unused");
- }
+ throw new IOException("index " + index + " is unused");
}
/**
* @param blocks the array of blocks containing the indices
* @param raw_blocks the list of blocks being managed. Unused
* blocks will be eliminated from the list
- *
- * @exception IOException
*/
-
private void setEntries(final ListManagedBlock [] blocks,
final BlockList raw_blocks)
throws IOException
}
raw_blocks.setBAT(this);
}
-} // end class BlockAllocationTableReader
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.*;
-
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.filesystem.BATManaged;
import org.apache.poi.util.IntList;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.LittleEndianConsts;
/**
* This class manages and creates the Block Allocation Table, which is
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class BlockAllocationTableWriter
- implements BlockWritable, BATManaged
-{
+public final class BlockAllocationTableWriter implements BlockWritable, BATManaged {
private IntList _entries;
private BATBlock[] _blocks;
private int _start_block;
/**
* create a BlockAllocationTableWriter
*/
-
public BlockAllocationTableWriter()
{
_start_block = POIFSConstants.END_OF_CHAIN;
*
* @return start block index of BAT blocks
*/
-
public int createBlocks()
{
int xbat_blocks = 0;
// stable ... we're OK
break;
}
- else
- {
- bat_blocks = calculated_bat_blocks;
- xbat_blocks = calculated_xbat_blocks;
- }
+ bat_blocks = calculated_bat_blocks;
+ xbat_blocks = calculated_xbat_blocks;
}
int startBlock = allocateSpace(bat_blocks);
*
* @return the starting index of the blocks
*/
-
public int allocateSpace(final int blockCount)
{
int startBlock = _entries.size();
*
* @return the starting block index
*/
-
public int getStartBlock()
{
return _start_block;
/**
* create the BATBlocks
*/
-
void simpleCreateBlocks()
{
_blocks = BATBlock.createBATBlocks(_entries.toArray());
}
- /* ********** START implementation of BlockWritable ********** */
-
/**
* Write the storage to an OutputStream
*
* @exception IOException on problems writing to the specified
* stream
*/
-
public void writeBlocks(final OutputStream stream)
throws IOException
{
}
}
- /* ********** END implementation of BlockWritable ********** */
- /* ********** START implementation of BATManaged ********** */
-
/**
* Return the number of BigBlock's this instance uses
*
* @return count of BigBlock instances
*/
-
public int countBlocks()
{
return _blocks.length;
/**
* Set the start block for this instance
- *
- * @param start_block
*/
-
public void setStartBlock(int start_block)
{
_start_block = start_block;
}
-
- /* ********** END implementation of BATManaged ********** */
-} // end class BlockAllocationTableWriter
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
-import java.io.*;
-
-import java.util.*;
+import java.io.IOException;
/**
* A simple implementation of BlockList
*
* @author Marc Johnson (mjohnson at apache dot org
*/
-
-class BlockListImpl
- implements BlockList
-{
+abstract class BlockListImpl implements BlockList {
private ListManagedBlock[] _blocks;
private BlockAllocationTableReader _bat;
- /**
- * Constructor BlockListImpl
- */
-
protected BlockListImpl()
{
_blocks = new ListManagedBlock[ 0 ];
*
* @param blocks blocks to be managed
*/
-
protected void setBlocks(final ListManagedBlock [] blocks)
{
_blocks = blocks;
}
- /* ********** START implementation of BlockList ********** */
-
/**
* remove the specified block from the list
*
* @param index the index of the specified block; if the index is
* out of range, that's ok
*/
-
public void zap(final int index)
{
if ((index >= 0) && (index < _blocks.length))
_blocks[ index ] = null;
}
}
-
+
/**
* Unit testing method. Gets, without sanity checks or
* removing.
*/
- protected ListManagedBlock get(final int index) throws IOException {
- return _blocks[index];
+ protected ListManagedBlock get(final int index) {
+ return _blocks[index];
}
/**
* @exception IOException if the index is out of range or has
* already been removed
*/
-
public ListManagedBlock remove(final int index)
throws IOException
{
catch (ArrayIndexOutOfBoundsException ignored)
{
throw new IOException("Cannot remove block[ " + index
- + " ]; out of range[ 0 - " +
+ + " ]; out of range[ 0 - " +
(_blocks.length-1) + " ]");
}
return result;
*
* @exception IOException if blocks are missing
*/
-
public ListManagedBlock [] fetchBlocks(final int startBlock, final int headerPropertiesStartBlock)
throws IOException
{
* set the associated BlockAllocationTable
*
* @param bat the associated BlockAllocationTable
- *
- * @exception IOException
*/
-
public void setBAT(final BlockAllocationTableReader bat)
throws IOException
{
}
_bat = bat;
}
-
- /* ********** END implementation of BlockList ********** */
-} // end package-scope class BlockListImpl
-
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
import org.apache.poi.poifs.common.POIFSConstants;
-import org.apache.poi.util.IntegerField;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianConsts;
-import org.apache.poi.util.LongField;
-import org.apache.poi.util.ShortField;
/**
* Constants used in reading/writing the Header block
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
public interface HeaderBlockConstants
{
public static final long _signature = 0xE11AB1A1E011CFD0L;
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
-import java.io.*;
-
-import java.util.*;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.property.Property;
-import org.apache.poi.util.IntegerField;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.LittleEndianConsts;
/**
* A block of Property instances
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class PropertyBlock
- extends BigBlock
-{
+public final class PropertyBlock extends BigBlock {
private static final int _properties_per_block =
POIFSConstants.BIG_BLOCK_SIZE / POIFSConstants.PROPERTY_SIZE;
private Property[] _properties;
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
-import org.apache.poi.poifs.property.RootProperty;
-
-import java.util.*;
+import java.io.IOException;
-import java.io.*;
+import org.apache.poi.poifs.property.RootProperty;
/**
* This class implements reading the small document block list from an
*
* @author Marc Johnson (mjohnson at apache dot org)
*/
-
-public class SmallBlockTableReader
-{
+public final class SmallBlockTableReader {
/**
* fetch the small document block list from an existing file
*
* @exception IOException
*/
-
public static BlockList getSmallDocumentBlocks(
final RawDataBlockList blockList, final RootProperty root,
final int sbatStart)
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.util;
-import java.util.*;
-
/**
* A List of int's; as full an implementation of the java.util.List
* interface as possible, with an eye toward minimal creation of
*
* @author Marc Johnson
*/
-
public class IntList
{
private int[] _array;
public IntList()
{
this(_default_size);
- }
+ }
public IntList(final int initialCapacity)
{
this(initialCapacity,0);
}
-
-
+
+
/**
* create a copy of an existing IntList
*
_array = new int[ initialCapacity ];
if (fillval != 0) {
fillval = fillvalue;
- fillArray(fillval, _array, 0);
+ fillArray(fillval, _array, 0);
}
_limit = 0;
}
private void fillArray(int val, int[] array, int index) {
for (int k = index; k < array.length; k++) {
- array[k] = val;
+ array[k] = val;
}
}
-
+
/**
* add the specfied value at the specified index
*
int size = (new_size == _array.length) ? new_size + 1
: new_size;
int[] new_array = new int[ size ];
-
+
if (fillval != 0) {
- fillArray(fillval, new_array, _array.length);
+ fillArray(fillval, new_array, _array.length);
}
-
+
System.arraycopy(_array, 0, new_array, 0, _limit);
_array = new_array;
}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.util;
-import java.util.*;
-
/**
* A logger class that strives to make it as easy as possible for
* developers to write log calls, while simultaneously making those
* @author Glen Stampoultzis (glens at apache.org)
* @author Nicola Ken Barozzi (nicolaken at apache.org)
*/
-
public class NullLogger extends POILogger
{
public void initialize(final String cat)
{
- //do nothing
+ //do nothing
}
-
+
/**
* Log a message
*
//do nothing
}
-}
+}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.util;
-import java.util.*;
-
/**
* A List of short's; as full an implementation of the java.util.List
* interface as possible, with an eye toward minimal creation of
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.PackageHelper;
-import org.apache.xmlbeans.XmlException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.*;
import org.apache.poi.ss.usermodel.FontFamily;
import org.apache.poi.ss.usermodel.FontScheme;
import org.apache.poi.ss.usermodel.BuiltinFormats;
-import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
* Create a new, empty StylesTable
*/
public StylesTable() {
- super();
+ super();
doc = StyleSheetDocument.Factory.newInstance();
doc.addNewStyleSheet();
// Initialization required in order to make the document readable by MSExcel
initialize();
}
- public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
- super(part, rel);
- readFrom(part.getInputStream());
- }
+ public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
+ super(part, rel);
+ readFrom(part.getInputStream());
+ }
/**
* Read this shared styles table from an XML file.
numberFormats.put((int)nfmt.getNumFmtId(), nfmt.getFormatCode());
}
if(doc.getStyleSheet().getFonts() != null){
- int idx = 0;
- for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) {
- XSSFFont f = new XSSFFont(font, idx);
- fonts.add(f);
- idx++;
- }
- }
+ int idx = 0;
+ for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) {
+ XSSFFont f = new XSSFFont(font, idx);
+ fonts.add(f);
+ idx++;
+ }
+ }
if(doc.getStyleSheet().getFills() != null)
for (CTFill fill : doc.getStyleSheet().getFills().getFillArray()) {
fills.add(new XSSFCellFill(fill));
return numberFormats.get(idx);
}
- public int putNumberFormat(String fmt) {
+ public int putNumberFormat(String fmt) {
if (numberFormats.containsValue(fmt)) {
// Find the key, and return that
for(Integer key : numberFormats.keySet() ) {
}
public int putFont(XSSFFont font) {
- int idx = fonts.indexOf(font);
- if (idx != -1) {
- return idx;
- }
- fonts.add(font);
- return fonts.size() - 1;
+ int idx = fonts.indexOf(font);
+ if (idx != -1) {
+ return idx;
+ }
+ fonts.add(font);
+ return fonts.size() - 1;
}
public XSSFCellStyle getStyleAt(int idx) {
return borders.get(idx);
}
- public int putBorder(XSSFCellBorder border) {
- int idx = borders.indexOf(border);
- if (idx != -1) {
- return idx;
- }
- borders.add(border);
- return borders.size() - 1;
+ public int putBorder(XSSFCellBorder border) {
+ int idx = borders.indexOf(border);
+ if (idx != -1) {
+ return idx;
+ }
+ borders.add(border);
+ return borders.size() - 1;
}
- public XSSFCellFill getFillAt(int idx) {
- return fills.get(idx);
- }
+ public XSSFCellFill getFillAt(int idx) {
+ return fills.get(idx);
+ }
- public List<XSSFCellBorder> getBorders(){
- return borders;
- }
+ public List<XSSFCellBorder> getBorders(){
+ return borders;
+ }
- public List<XSSFCellFill> getFills(){
- return fills;
- }
+ public List<XSSFCellFill> getFills(){
+ return fills;
+ }
- public List<XSSFFont> getFonts(){
- return fonts;
- }
+ public List<XSSFFont> getFonts(){
+ return fonts;
+ }
- public Map<Integer, String> getNumberFormats(){
- return numberFormats;
- }
+ public Map<Integer, String> getNumberFormats(){
+ return numberFormats;
+ }
- public int putFill(XSSFCellFill fill) {
- int idx = fills.indexOf(fill);
- if (idx != -1) {
- return idx;
- }
- fills.add(fill);
- return fills.size() - 1;
+ public int putFill(XSSFCellFill fill) {
+ int idx = fills.indexOf(fill);
+ if (idx != -1) {
+ return idx;
+ }
+ fills.add(fill);
+ return fills.size() - 1;
}
public CTXf getCellXfAt(int idx) {
}
doc.getStyleSheet().setNumFmts(formats);
- int idx;
+ int idx;
// Fonts
CTFonts ctFonts = CTFonts.Factory.newInstance();
ctFonts.setCount(fonts.size());
- CTFont[] ctfnt = new CTFont[fonts.size()];
- idx = 0;
- for(XSSFFont f : fonts) ctfnt[idx++] = f.getCTFont();
- ctFonts.setFontArray(ctfnt);
+ CTFont[] ctfnt = new CTFont[fonts.size()];
+ idx = 0;
+ for(XSSFFont f : fonts) ctfnt[idx++] = f.getCTFont();
+ ctFonts.setFontArray(ctfnt);
doc.getStyleSheet().setFonts(ctFonts);
// Fills
CTFills ctFills = CTFills.Factory.newInstance();
ctFills.setCount(fills.size());
- CTFill[] ctf = new CTFill[fills.size()];
- idx = 0;
- for(XSSFCellFill f : fills) ctf[idx++] = f.getCTFill();
- ctFills.setFillArray(ctf);
+ CTFill[] ctf = new CTFill[fills.size()];
+ idx = 0;
+ for(XSSFCellFill f : fills) ctf[idx++] = f.getCTFill();
+ ctFills.setFillArray(ctf);
doc.getStyleSheet().setFills(ctFills);
// Borders
CTBorders ctBorders = CTBorders.Factory.newInstance();
ctBorders.setCount(borders.size());
- CTBorder[] ctb = new CTBorder[borders.size()];
- idx = 0;
- for(XSSFCellBorder b : borders) ctb[idx++] = b.getCTBorder();
+ CTBorder[] ctb = new CTBorder[borders.size()];
+ idx = 0;
+ for(XSSFCellBorder b : borders) ctb[idx++] = b.getCTBorder();
ctBorders.setBorderArray(ctb);
doc.getStyleSheet().setBorders(ctBorders);
doc.save(out, options);
}
- @Override
- protected void commit() throws IOException {
- PackagePart part = getPackagePart();
- OutputStream out = part.getOutputStream();
- writeTo(out);
- out.close();
- }
+ @Override
+ protected void commit() throws IOException {
+ PackagePart part = getPackagePart();
+ OutputStream out = part.getOutputStream();
+ writeTo(out);
+ out.close();
+ }
private void initialize() {
//CTFont ctFont = createDefaultFont();
return this.dxfs.size();
}
- public XSSFCellStyle createCellStyle() {
- CTXf xf = CTXf.Factory.newInstance();
- xf.setNumFmtId(0);
- xf.setFontId(0);
- xf.setFillId(0);
- xf.setBorderId(0);
- xf.setXfId(0);
- int xfSize = styleXfs.size();
- int indexXf = putCellXf(xf);
- return new XSSFCellStyle(indexXf - 1, xfSize - 1, this);
- }
-
- /**
- * Finds a font that matches the one with the supplied attributes
- */
- public XSSFFont findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) {
- for (XSSFFont font : fonts) {
- if ( (font.getBoldweight() == boldWeight)
- && font.getColor() == color
- && font.getFontHeight() == fontHeight
- && font.getFontName().equals(name)
- && font.getItalic() == italic
- && font.getStrikeout() == strikeout
- && font.getTypeOffset() == typeOffset
- && font.getUnderline() == underline)
- {
- return font;
- }
- }
- return null;
- }
+ public XSSFCellStyle createCellStyle() {
+ CTXf xf = CTXf.Factory.newInstance();
+ xf.setNumFmtId(0);
+ xf.setFontId(0);
+ xf.setFillId(0);
+ xf.setBorderId(0);
+ xf.setXfId(0);
+ int xfSize = styleXfs.size();
+ int indexXf = putCellXf(xf);
+ return new XSSFCellStyle(indexXf - 1, xfSize - 1, this);
+ }
+ /**
+ * Finds a font that matches the one with the supplied attributes
+ */
+ public XSSFFont findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) {
+ for (XSSFFont font : fonts) {
+ if ( (font.getBoldweight() == boldWeight)
+ && font.getColor() == color
+ && font.getFontHeight() == fontHeight
+ && font.getFontName().equals(name)
+ && font.getItalic() == italic
+ && font.getStrikeout() == strikeout
+ && font.getTypeOffset() == typeOffset
+ && font.getUnderline() == underline)
+ {
+ return font;
+ }
+ }
+ return null;
+ }
}
package org.apache.poi.xssf.usermodel;
import org.apache.poi.ss.usermodel.CreationHelper;
-import org.apache.poi.ss.usermodel.DataFormat;
-import org.apache.poi.ss.usermodel.Hyperlink;
-import org.apache.poi.ss.usermodel.RichTextString;
public class XSSFCreationHelper implements CreationHelper {
private XSSFWorkbook workbook;
+
XSSFCreationHelper(XSSFWorkbook wb) {
workbook = wb;
}
-
- /**
- * Creates a new XSSFRichTextString for you.
- */
+
+ /**
+ * Creates a new XSSFRichTextString for you.
+ */
public XSSFRichTextString createRichTextString(String text) {
- XSSFRichTextString rt = new XSSFRichTextString(text);
- rt.setStylesTableReference(workbook.getStylesSource());
- return rt;
+ XSSFRichTextString rt = new XSSFRichTextString(text);
+ rt.setStylesTableReference(workbook.getStylesSource());
+ return rt;
}
-
+
public XSSFDataFormat createDataFormat() {
return workbook.createDataFormat();
}
-
+
public XSSFHyperlink createHyperlink(int type) {
return new XSSFHyperlink(type);
}
- /**
- * Creates a XSSFFormulaEvaluator, the object that evaluates formula cells.
- *
- * @return a XSSFFormulaEvaluator instance
- */
- public XSSFFormulaEvaluator createFormulaEvaluator(){
- return new XSSFFormulaEvaluator(workbook);
- }
+ /**
+ * Creates a XSSFFormulaEvaluator, the object that evaluates formula cells.
+ *
+ * @return a XSSFFormulaEvaluator instance
+ */
+ public XSSFFormulaEvaluator createFormulaEvaluator() {
+ return new XSSFFormulaEvaluator(workbook);
+ }
- /**
- * Creates a XSSFClientAnchor. Use this object to position drawing object in a sheet
- *
- * @return a XSSFClientAnchor instance
- * @see org.apache.poi.ss.usermodel.Drawing
- */
- public XSSFClientAnchor createClientAnchor(){
- return new XSSFClientAnchor();
- }
+ /**
+ * Creates a XSSFClientAnchor. Use this object to position drawing object in
+ * a sheet
+ *
+ * @return a XSSFClientAnchor instance
+ * @see org.apache.poi.ss.usermodel.Drawing
+ */
+ public XSSFClientAnchor createClientAnchor() {
+ return new XSSFClientAnchor();
+ }
}
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.model.MapInfo;
-import org.apache.poi.xssf.extractor.XSSFExportToXml;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
throw new IllegalStateException("There are no defined names in this workbook");
}
if (nameIndex < 0 || nameIndex > nNames) {
- throw new IllegalArgumentException("Specified name index " + nameIndex
+ throw new IllegalArgumentException("Specified name index " + nameIndex
+ " is outside the allowable range (0.." + (nNames-1) + ").");
}
return namedRanges.get(nameIndex);
* @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java)
* @return String Null if no print area has been defined
*/
- public String getPrintArea(int sheetIndex) {
+ public String getPrintArea(int sheetIndex) {
XSSFName name = getBuiltInName(XSSFName.BUILTIN_PRINT_AREA, sheetIndex);
if (name == null) return null;
//adding one here because 0 indicates a global named region; doesnt make sense for print areas
r = escapedName + "!$" + rowRef.getCellRefParts()[1] + ":$" + rowRef2.getCellRefParts()[1];
}
}
-
+
StringBuffer rng = new StringBuffer();
rng.append(c);
if(rng.length() > 0 && r.length() > 0) rng.append(',');
}
return embedds;
}
-
+
public boolean isHidden() {
throw new RuntimeException("Not implemented yet");
}
* Fired when a formula is deleted from this workbook,
* for example when calling cell.setCellFormula(null)
*
- * @see XSSFCell#setCellFormula(String)
+ * @see XSSFCell#setCellFormula(String)
*/
protected void onDeleteFormula(XSSFCell cell){
if(calcChain != null) {
* <p>
* The calculation chain object specifies the order in which the cells in a workbook were last calculated
* </p>
- *
+ *
* @return the <code>CalculationChain</code> object or <code>null</code> if not defined
*/
public CalculationChain getCalculationChain(){
}
/**
- *
+ *
* @return a collection of custom XML mappings defined in this workbook
*/
public Collection<XSSFMap> getCustomXMLMappings(){
return mapInfo == null ? new ArrayList<XSSFMap>() : mapInfo.getAllXSSFMaps();
}
-
+
/**
- *
+ *
* @return the helper class used to query the custom XML mapping defined in this workbook
*/
public MapInfo getMapInfo(){
return mapInfo;
}
-
+
}
package org.apache.poi.xssf.usermodel.extensions;
import org.apache.poi.ss.usermodel.HeaderFooter;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.helpers.HeaderFooterHelper;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
/**
* Parent class of all XSSF headers and footers.
- *
- * For a list of all the different fields that can be
- * placed into a header or footer, such as page number,
- * bold, underline etc, see the follow formatting syntax
- *
+ *
+ * For a list of all the different fields that can be placed into a header or
+ * footer, such as page number, bold, underline etc, see the follow formatting
+ * syntax
+ *
*<b> Header/Footer Formatting Syntax</b>
*<p>
- * There are a number of formatting codes that can be written inline with the actual header / footer text, which
- * affect the formatting in the header or footer.
+ * There are a number of formatting codes that can be written inline with the
+ * actual header / footer text, which affect the formatting in the header or
+ * footer.
*</p>
*
- * This example shows the text "Center Bold Header" on the first line (center section), and the date on the second
- * line (center section).
- * &CCenter &"-,Bold"Bold &"-,Regular"Header_x000A_&D
- *
- * <b>General Rules:</b>
- * There is no required order in which these codes must appear.
- * The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again:
- *
+ * This example shows the text "Center Bold Header" on the first line (center
+ * section), and the date on the second line (center section). &CCenter
+ * &"-,Bold"Bold &"-,Regular"Header_x000A_&D
+ *
+ * <b>General Rules:</b> There is no required order in which these codes must
+ * appear. The first occurrence of the following codes turns the formatting ON,
+ * the second occurrence turns it OFF again:
+ *
* <dl>
- * <dt> &L </dt> <dd>code for "left section" (there are three header / footer locations, "left", "center", and "right"). When
- * two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the
- * order of appearance, and placed into the left section.</dd>
- * <dt> &P </dt> <dd> code for "current page #"</dd>
- * <dt> &N </dt> <dd> code for "total pages"</dd>
- * <dt>&font size </dt> <dd> code for "text font size", where font size is a font size in points.</dd>
- * <dt> &K </dt> <dd> code for "text font color"
- * RGB Color is specified as RRGGBB
- * Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade
- * value, NN is the tint/shade value.</dd>
- * <dt> &S </dt> <dd> code for "text strikethrough" on / off</dd>
- * <dt> &X </dt> <dd> code for "text super script" on / off</dd>
- * <dt> &Y </dt> <dd> code for "text subscript" on / off</dd>
- * <dt> &C </dt> <dd> code for "center section". When two or more occurrences of this section marker exist, the contents
- * from all markers are concatenated, in the order of appearance, and placed into the center section.
- * SpreadsheetML Reference Material - Worksheets 1966</dd>
- * <dt> &D </dt> <dd> code for "date"</dd>
- * <dt> &T </dt> <dd> code for "time"</dd>
- * <dt> &G </dt> <dd> code for "picture as background"</dd>
- * <dt> &U </dt> <dd> code for "text single underline"</dd>
- * <dt> &E </dt> <dd> code for "double underline"</dd>
- * <dt> &R </dt> <dd> code for "right section". When two or more occurrences of this section marker exist, the contents
- * from all markers are concatenated, in the order of appearance, and placed into the right section.</dd>
- * <dt> &Z </dt> <dd> code for "this workbook's file path"</dd>
- * <dt> &F </dt> <dd> code for "this workbook's file name"</dd>
- * <dt> &A </dt> <dd> code for "sheet tab name"</dd>
- * <dt> &+ </dt> <dd> code for add to page #.</dd>
- * <dt> &- </dt> <dd> code for subtract from page #.</dd>
- * <dt> &"font name,font type" - code for "text font name" and "text font type", where font name and font type
- * are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font
- * name, it means "none specified". Both of font name and font type can be localized values.</dd>
- * <dt> &"-,Bold" </dt> <dd> code for "bold font style"</dd>
- * <dt> &B </dt> <dd> also means "bold font style"</dd>
- * <dt> &"-,Regular" </dt> <dd> code for "regular font style"</dd>
- * <dt> &"-,Italic" </dt> <dd> code for "italic font style"</dd>
- * <dt> &I </dt> <dd> also means "italic font style"</dd>
- * <dt> &"-,Bold Italic" </dt> <dd> code for "bold italic font style"</dd>
- * <dt> &O </dt> <dd> code for "outline style"</dd>
- * <dt> &H </dt> <dd> code for "shadow style"</dd>
+ * <dt>&L</dt>
+ * <dd>code for "left section" (there are three header / footer locations,
+ * "left", "center", and "right"). When two or more occurrences of this section
+ * marker exist, the contents from all markers are concatenated, in the order of
+ * appearance, and placed into the left section.</dd>
+ * <dt>&P</dt>
+ * <dd>code for "current page #"</dd>
+ * <dt>&N</dt>
+ * <dd>code for "total pages"</dd>
+ * <dt>&font size</dt>
+ * <dd>code for "text font size", where font size is a font size in points.</dd>
+ * <dt>&K</dt>
+ * <dd>code for "text font color" RGB Color is specified as RRGGBB Theme Color
+ * is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-"
+ * of the tint/shade value, NN is the tint/shade value.</dd>
+ * <dt>&S</dt>
+ * <dd>code for "text strikethrough" on / off</dd>
+ * <dt>&X</dt>
+ * <dd>code for "text super script" on / off</dd>
+ * <dt>&Y</dt>
+ * <dd>code for "text subscript" on / off</dd>
+ * <dt>&C</dt>
+ * <dd>code for "center section". When two or more occurrences of this section
+ * marker exist, the contents from all markers are concatenated, in the order of
+ * appearance, and placed into the center section. SpreadsheetML Reference
+ * Material - Worksheets 1966</dd>
+ * <dt>&D</dt>
+ * <dd>code for "date"</dd>
+ * <dt>&T</dt>
+ * <dd>code for "time"</dd>
+ * <dt>&G</dt>
+ * <dd>code for "picture as background"</dd>
+ * <dt>&U</dt>
+ * <dd>code for "text single underline"</dd>
+ * <dt>&E</dt>
+ * <dd>code for "double underline"</dd>
+ * <dt>&R</dt>
+ * <dd>code for "right section". When two or more occurrences of this section
+ * marker exist, the contents from all markers are concatenated, in the order of
+ * appearance, and placed into the right section.</dd>
+ * <dt>&Z</dt>
+ * <dd>code for "this workbook's file path"</dd>
+ * <dt>&F</dt>
+ * <dd>code for "this workbook's file name"</dd>
+ * <dt>&A</dt>
+ * <dd>code for "sheet tab name"</dd>
+ * <dt>&+</dt>
+ * <dd>code for add to page #.</dd>
+ * <dt>&-</dt>
+ * <dd>code for subtract from page #.</dd>
+ * <dt>&"font name,font type" - code for "text font name" and "text font type",
+ * where font name and font type are strings specifying the name and type of the
+ * font, separated by a comma. When a hyphen appears in font name, it means
+ * "none specified". Both of font name and font type can be localized
+ * values.</dd>
+ * <dt>&"-,Bold"</dt>
+ * <dd>code for "bold font style"</dd>
+ * <dt>&B</dt>
+ * <dd>also means "bold font style"</dd>
+ * <dt>&"-,Regular"</dt>
+ * <dd>code for "regular font style"</dd>
+ * <dt>&"-,Italic"</dt>
+ * <dd>code for "italic font style"</dd>
+ * <dt>&I</dt>
+ * <dd>also means "italic font style"</dd>
+ * <dt>&"-,Bold Italic"</dt>
+ * <dd>code for "bold italic font style"</dd>
+ * <dt>&O</dt>
+ * <dd>code for "outline style"</dd>
+ * <dt>&H</dt>
+ * <dd>code for "shadow style"</dd>
* </dl>
- *
- *
+ *
+ *
*/
public abstract class XSSFHeaderFooter implements HeaderFooter {
- private HeaderFooterHelper helper;
- private CTHeaderFooter headerFooter;
+ private HeaderFooterHelper helper;
+ private CTHeaderFooter headerFooter;
private boolean stripFields = false;
/**
* Create an instance of XSSFHeaderFooter from the supplied XML bean
+ *
* @param headerFooter
*/
- public XSSFHeaderFooter(CTHeaderFooter headerFooter) {
- this.headerFooter = headerFooter;
- this.helper = new HeaderFooterHelper();
- }
-
- /**
- * Returns the underlying CTHeaderFooter xml bean
- *
- * @return the underlying CTHeaderFooter xml bean
- */
- public CTHeaderFooter getHeaderFooter() {
- return this.headerFooter;
- }
-
- public String getValue() {
- String value = getText();
- if(value == null)
- return "";
- return value;
- }
-
-
+ public XSSFHeaderFooter(CTHeaderFooter headerFooter) {
+ this.headerFooter = headerFooter;
+ this.helper = new HeaderFooterHelper();
+ }
+
+ /**
+ * Returns the underlying CTHeaderFooter xml bean
+ *
+ * @return the underlying CTHeaderFooter xml bean
+ */
+ public CTHeaderFooter getHeaderFooter() {
+ return this.headerFooter;
+ }
+
+ public String getValue() {
+ String value = getText();
+ if (value == null)
+ return "";
+ return value;
+ }
+
/**
- * Are fields currently being stripped from
- * the text that this {@link XSSFHeaderFooter} returns?
- * Default is false, but can be changed
+ * Are fields currently being stripped from the text that this
+ * {@link XSSFHeaderFooter} returns? Default is false, but can be changed
*/
public boolean areFieldsStripped() {
return stripFields;
}
+
/**
- * Should fields (eg macros) be stripped from
- * the text that this class returns?
- * Default is not to strip.
+ * Should fields (eg macros) be stripped from the text that this class
+ * returns? Default is not to strip.
+ *
* @param stripFields
*/
public void setAreFieldsStripped(boolean stripFields) {
}
/**
- * Removes any fields (eg macros, page markers etc)
- * from the string.
- * Normally used to make some text suitable for showing
- * to humans, and the resultant text should not normally
- * be saved back into the document!
+ * Removes any fields (eg macros, page markers etc) from the string.
+ * Normally used to make some text suitable for showing to humans, and the
+ * resultant text should not normally be saved back into the document!
*/
public static String stripFields(String text) {
return org.apache.poi.hssf.usermodel.HeaderFooter.stripFields(text);
}
-
- public abstract String getText();
-
- protected abstract void setText(String text);
-
- /**
- * get the text representing the center part of this element
- */
- public String getCenter() {
- String text = helper.getCenterSection(getText());
- if(stripFields)
- return stripFields(text);
- return text;
- }
-
- /**
- * get the text representing the left part of this element
- */
- public String getLeft() {
- String text = helper.getLeftSection(getText());
- if(stripFields)
- return stripFields(text);
- return text;
- }
-
- /**
- * get the text representing the right part of this element
- */
- public String getRight() {
- String text = helper.getRightSection(getText());
- if(stripFields)
- return stripFields(text);
- return text;
- }
-
- /**
- * set a centered string value for this element
- */
- public void setCenter(String newCenter) {
- setText(helper.setCenterSection(getText(), newCenter));
- }
-
- /**
- * set a left string value for this element
- */
- public void setLeft(String newLeft) {
- setText(helper.setLeftSection(getText(), newLeft));
- }
-
- /**
- * set a right string value for this element
- */
- public void setRight(String newRight) {
- setText(helper.setRightSection(getText(), newRight));
- }
+ public abstract String getText();
+
+ protected abstract void setText(String text);
+
+ /**
+ * get the text representing the center part of this element
+ */
+ public String getCenter() {
+ String text = helper.getCenterSection(getText());
+ if (stripFields)
+ return stripFields(text);
+ return text;
+ }
+
+ /**
+ * get the text representing the left part of this element
+ */
+ public String getLeft() {
+ String text = helper.getLeftSection(getText());
+ if (stripFields)
+ return stripFields(text);
+ return text;
+ }
+
+ /**
+ * get the text representing the right part of this element
+ */
+ public String getRight() {
+ String text = helper.getRightSection(getText());
+ if (stripFields)
+ return stripFields(text);
+ return text;
+ }
+
+ /**
+ * set a centered string value for this element
+ */
+ public void setCenter(String newCenter) {
+ setText(helper.setCenterSection(getText(), newCenter));
+ }
+
+ /**
+ * set a left string value for this element
+ */
+ public void setLeft(String newLeft) {
+ setText(helper.setLeftSection(getText(), newLeft));
+ }
+
+ /**
+ * set a right string value for this element
+ */
+ public void setRight(String newRight) {
+ setText(helper.setRightSection(getText(), newRight));
+ }
}
package org.apache.poi.openxml4j.opc;
-import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.openxml4j.opc.internal.ContentTypeManager;
import org.apache.poi.openxml4j.opc.internal.FileHelper;
import org.apache.poi.util.TempFile;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.POILogger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
//ZipFileAssert.assertEquals(originalFile, targetFile);
assertTrue(targetFile.delete());
}
-
+
/**
* Test that when we create a new Package, we give it
* the correct default content types
*/
public void testCreateGetsContentTypes() throws Exception {
File targetFile = OpenXML4JTestDataSamples.getOutputFile("TestCreatePackageTMP.docx");
-
+
// Zap the target file, in case of an earlier run
if(targetFile.exists()) targetFile.delete();
-
+
OPCPackage pkg = OPCPackage.create(targetFile);
-
+
// Check it has content types for rels and xml
ContentTypeManager ctm = getContentTypeManager(pkg);
assertEquals(
// Zap the target file, in case of an earlier run
if(targetFile.exists()) targetFile.delete();
-
+
// Create a package
OPCPackage pkg = OPCPackage.create(targetFile);
PackagePartName corePartName = PackagingURIHelper
//ZipFileAssert.assertEquals(expectedFile, targetFile);
assertTrue(targetFile.delete());
}
-
+
/**
* Tests that we can create a new package, add a core
* document and another part, save and re-load and
public void testCreatePackageWithCoreDocument() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OPCPackage pkg = OPCPackage.create(baos);
-
+
// Add a core document
PackagePartName corePartName = PackagingURIHelper.createPartName("/xl/workbook.xml");
// Create main part relationship
OutputStream coreOut = corePart.getOutputStream();
coreOut.write("<dummy-xml />".getBytes());
coreOut.close();
-
+
// And another bit
PackagePartName sheetPartName = PackagingURIHelper.createPartName("/xl/worksheets/sheet1.xml");
PackageRelationship rel =
assertEquals("/", coreRel.getSourceURI().toString());
assertEquals("/xl/workbook.xml", coreRel.getTargetURI().toString());
assertNotNull(pkg.getPart(coreRel));
-
-
+
+
// Save and re-load
pkg.close();
File tmp = TempFile.createTempFile("testCreatePackageWithCoreDocument", ".zip");
//ZipFileAssert.assertEquals(expectedFile, targetFile);
assertTrue(targetFile.delete());
}
-
+
/**
* Checks that we can write a package to a simple
* OutputStream, in addition to the normal writing
*/
public void testOpenFromInputStream() throws Exception {
String originalFile = OpenXML4JTestDataSamples.getSampleFileName("TestPackageCommon.docx");
-
+
FileInputStream finp = new FileInputStream(originalFile);
-
+
OPCPackage p = OPCPackage.open(finp);
-
+
assertNotNull(p);
assertNotNull(p.getRelationships());
assertEquals(12, p.getParts().size());
-
+
// Check it has the usual bits
assertTrue(p.hasRelationships());
assertTrue(p.containPart(PackagingURIHelper.createPartName("/_rels/.rels")));
// Don't save modifications
p.revert();
}
-
+
public void testDeletePartRecursive() throws InvalidFormatException {
TreeMap<PackagePartName, String> expectedValues;
TreeMap<PackagePartName, String> values;
// Don't save modifications
p.revert();
}
-
+
private static ContentTypeManager getContentTypeManager(OPCPackage pkg) throws Exception {
Field f = OPCPackage.class.getDeclaredField("contentTypeManager");
f.setAccessible(true);
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
String filename;
- protected void setUp() throws Exception {
- super.setUp();
+ protected void setUp() {
+
System.setProperty("org.apache.poi.util.POILogger", org.apache.poi.util.CommonsLogger.class.getName());
filename = System.getProperty("XSSF.testdata.path");
if (filename == null) {
Row row = sheet.getRow(0);
Cell cell = row.getCell((short) 1);
assertNotNull(cell);
- assertEquals(111.0, cell.getNumericCellValue());
+ assertEquals(111.0, cell.getNumericCellValue(), 0.0);
cell = row.getCell((short) 0);
assertEquals("Lorem", cell.getRichStringCellValue().getString());
}
- // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull.
+ // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successful.
public void testLoadStyles() throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "styles.xlsx").getAbsolutePath());
Sheet sheet = workbook.getSheetAt(0);
// assertNotNull(style);
}
- // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull.
+ // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successful.
public void testLoadPictures() throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "picture.xlsx").getAbsolutePath());
List<XSSFPictureData> pictures = workbook.getAllPictures();
assertEquals(1, pictures.size());
}
-
}
package org.apache.poi.xssf.usermodel;
-import java.io.File;
import java.util.List;
-import junit.framework.TestCase;
-
-import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
-import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
-import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.apache.poi.xssf.XSSFTestDataSamples;
-public class TestXSSFBugs extends BaseTestBugzillaIssues {
+public final class TestXSSFBugs extends BaseTestBugzillaIssues {
@Override
protected XSSFITestDataProvider getTestDataProvider(){
return XSSFITestDataProvider.getInstance();
package org.apache.poi.xssf.usermodel;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.apache.poi.hssf.usermodel.HSSFRichTextString;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.ITestDataProvider;
-import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.ss.usermodel.BaseTestDataFormat;
import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
/**
* Tests for {@link XSSFDataFormat}
*
*/
public final class TestXSSFDataFormat extends BaseTestDataFormat {
-
+
@Override
protected ITestDataProvider getTestDataProvider(){
return XSSFITestDataProvider.getInstance();
package org.apache.poi.xssf.usermodel;
-import junit.framework.TestCase;
-
import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.apache.poi.xssf.usermodel.XSSFColor;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBooleanProperty;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
public final class TestXSSFFont extends BaseTestFont{
- @Override
- protected XSSFITestDataProvider getTestDataProvider(){
- return XSSFITestDataProvider.getInstance();
- }
+ @Override
+ protected XSSFITestDataProvider getTestDataProvider() {
+ return XSSFITestDataProvider.getInstance();
+ }
- public void testDefaultFont() {
- baseTestDefaultFont("Calibri", (short)220, IndexedColors.BLACK.getIndex());
- }
+ public void testDefaultFont() {
+ baseTestDefaultFont("Calibri", (short) 220, IndexedColors.BLACK.getIndex());
+ }
public void testConstructor() {
XSSFFont xssfFont=new XSSFFont();
xssfFont.setUnderline(Font.U_DOUBLE);
assertEquals(ctFont.getUArray().length,1);
assertEquals(STUnderlineValues.DOUBLE,ctFont.getUArray(0).getVal());
-
+
xssfFont.setUnderline(FontUnderline.DOUBLE_ACCOUNTING);
assertEquals(ctFont.getUArray().length,1);
assertEquals(STUnderlineValues.DOUBLE_ACCOUNTING,ctFont.getUArray(0).getVal());
package org.apache.poi.xssf.usermodel;
-import junit.framework.TestCase;
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.ss.usermodel.BaseTestNamedRange;
// First test that setting RR&C for same sheet more than once only creates a
// single Print_Titles built-in record
XSSFWorkbook wb = getTestDataProvider().createWorkbook();
- XSSFSheet sheet = wb.createSheet("First Sheet");
+ wb.createSheet("First Sheet");
wb.setRepeatingRowsAndColumns(0, -1, -1, -1, -1);
// check that setting RR&C on a second sheet causes a new Print_Titles built-in
// name to be created
- sheet = nwb.createSheet("SecondSheet");
+ nwb.createSheet("SecondSheet");
nwb.setRepeatingRowsAndColumns(1, 1, 2, 0, 0);
assertEquals(2, nwb.getNumberOfNames());
nwb.setRepeatingRowsAndColumns(1, -1, -1, -1, -1);
}
-
-
}
package org.apache.poi.xssf.usermodel;
-import junit.framework.TestCase;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.BaseTestPicture;
import org.apache.poi.xssf.XSSFITestDataProvider;
package org.apache.poi.xssf.usermodel;
+import java.util.Arrays;
+import java.util.List;
+
import junit.framework.TestCase;
-import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.apache.poi.POIXMLDocumentPart;
-import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing;
-import java.util.List;
-import java.util.Arrays;
-import java.io.IOException;
+import org.apache.poi.xssf.XSSFTestDataSamples;
/**
* @author Yegor Kozlov
pMargins.setHeader(1.5);
pMargins.setFooter(2);
XSSFPrintSetup printSetup = new XSSFPrintSetup(worksheet);
- assertEquals(1.5, printSetup.getHeaderMargin());
- assertEquals(2.0, printSetup.getFooterMargin());
+ assertEquals(1.5, printSetup.getHeaderMargin(), 0.0);
+ assertEquals(2.0, printSetup.getFooterMargin(), 0.0);
printSetup.setHeaderMargin(5);
printSetup.setFooterMargin(3.5);
- assertEquals(5.0, pMargins.getHeader());
- assertEquals(3.5, pMargins.getFooter());
+ assertEquals(5.0, pMargins.getHeader(), 0.0);
+ assertEquals(3.5, pMargins.getFooter(), 0.0);
}
public void testSetGetCopies() {
package org.apache.poi.xssf.usermodel;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-
import junit.framework.TestCase;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Comment;
-import org.apache.poi.ss.usermodel.CreationHelper;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.model.CommentsTable;
-import org.apache.xmlbeans.XmlOptions;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
/**
* Tests functionality of the XSSFRichTextRun object
*/
public final class TestXSSFRichTextString extends TestCase {
- public void testCreate() throws Exception {
+ public void testCreate() {
XSSFRichTextString rt = new XSSFRichTextString("Apache POI");
assertEquals("Apache POI", rt.getString());
}
- public void testApplyFont() throws Exception {
+ public void testApplyFont() {
XSSFRichTextString rt = new XSSFRichTextString();
rt.append("123");
assertEquals(1, rt.getLengthOfFormattingRun(3));
}
- public void testClearFormatting() throws Exception {
+ public void testClearFormatting() {
XSSFRichTextString rt = new XSSFRichTextString("Apache POI");
assertEquals("Apache POI", rt.getString());
rt.clearFormatting();
assertEquals("Apache POI", rt.getString());
assertEquals(0, rt.numFormattingRuns());
-
}
- public void testGetFonts() throws Exception {
+ public void testGetFonts() {
XSSFRichTextString rt = new XSSFRichTextString();
XSSFFont font2$ = rt.getFontOfFormattingRun(1);
assertEquals(font2.getBold(), font2$.getBold());
assertEquals(font2.getFontName(), font2$.getFontName());
-
}
}
package org.apache.poi.xssf.usermodel;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.SpreadsheetVersion;
-import org.apache.poi.xssf.model.SharedStringsTable;
-import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.ss.usermodel.BaseTestRow;
import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.usermodel.HSSFCell;
/**
* Tests for XSSFRow
package org.apache.poi.xssf.usermodel;
import java.io.File;
-import java.util.Iterator;
-import junit.framework.TestCase;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.BaseTestSheet;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.model.CommentsTable;
import org.apache.poi.xssf.model.StylesTable;
-import org.apache.poi.xssf.model.CalculationChain;
import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
-import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane;
public class TestXSSFSheet extends BaseTestSheet {
CTWorksheet ctWorksheet = sheet.getCTWorksheet();
sheet.createFreezePane(2, 4);
- assertEquals((double) 2, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit());
+ assertEquals(2.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0);
assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane());
sheet.createFreezePane(3, 6, 10, 10);
- assertEquals((double) 3, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit());
+ assertEquals(3.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0);
// assertEquals(10, sheet.getTopRow());
// assertEquals(10, sheet.getLeftCol());
sheet.createSplitPane(4, 8, 12, 12, 1);
- assertEquals((double) 8, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getYSplit());
+ assertEquals(8.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getYSplit(), 0.0);
assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane());
}
public void testSetColumnGroupCollapsed(){
Workbook wb = new XSSFWorkbook();
XSSFSheet sheet1 =(XSSFSheet) wb.createSheet();
-
+
CTCols cols=sheet1.getCTWorksheet().getColsArray(0);
assertEquals(0,cols.sizeOfColArray());
-
+
sheet1.groupColumn( (short)4, (short)7 );
sheet1.groupColumn( (short)9, (short)12 );
assertEquals(2,cols.sizeOfColArray());
-
+
assertEquals(false,cols.getColArray(0).isSetHidden());
assertEquals(true, cols.getColArray(0).isSetCollapsed());
assertEquals(5, cols.getColArray(0).getMin()); // 1 based
sheet1.groupColumn( (short)10, (short)11 );
assertEquals(4,cols.sizeOfColArray());
-
+
assertEquals(false,cols.getColArray(0).isSetHidden());
assertEquals(true, cols.getColArray(0).isSetCollapsed());
assertEquals(5, cols.getColArray(0).getMin()); // 1 based
assertEquals(true, cols.getColArray(3).isSetCollapsed());
assertEquals(13, cols.getColArray(3).getMin()); // 1 based
assertEquals(13, cols.getColArray(3).getMax()); // 1 based
-
+
// collapse columns - 1
sheet1.setColumnGroupCollapsed( (short)5, true );
assertEquals(5,cols.sizeOfColArray());
-
+
assertEquals(true, cols.getColArray(0).isSetHidden());
assertEquals(true, cols.getColArray(0).isSetCollapsed());
assertEquals(5, cols.getColArray(0).getMin()); // 1 based
//outline level 2: the line under ==> collapsed==True
assertEquals(2,cols.getColArray(3).getOutlineLevel());
assertEquals(true,cols.getColArray(4).isSetCollapsed());
-
+
assertEquals(false,cols.getColArray(0).isSetHidden());
assertEquals(true, cols.getColArray(0).isSetCollapsed());
assertEquals(5, cols.getColArray(0).getMin()); // 1 based
sheet1.groupRow( 7, 14 );
sheet1.groupRow( 16, 19 );
- assertEquals(14,sheet1.getPhysicalNumberOfRows());
+ assertEquals(14,sheet1.getPhysicalNumberOfRows());
assertEquals(false,sheet1.getRow(6).getCTRow().isSetCollapsed());
assertEquals(false,sheet1.getRow(6).getCTRow().isSetHidden());
assertEquals(false,sheet1.getRow(7).getCTRow().isSetCollapsed());
assertEquals(false,sheet1.getRow(18).getCTRow().isSetHidden());
//collapsed
- sheet1.setRowGroupCollapsed( 7, true );
+ sheet1.setRowGroupCollapsed( 7, true );
assertEquals(false,sheet1.getRow(6).getCTRow().isSetCollapsed());
assertEquals(false,sheet1.getRow(6).getCTRow().isSetHidden());
// XML is 1 based, POI is 0 based
assertEquals(2, col.getMin());
assertEquals(2, col.getMax());
- assertEquals(22.0, col.getWidth());
+ assertEquals(22.0, col.getWidth(), 0.0);
// Now set another
sheet.setColumnWidth(3, 33 * 256);
col = cols.getColArray(0);
assertEquals(2, col.getMin()); // POI 1
assertEquals(2, col.getMax());
- assertEquals(22.0, col.getWidth());
+ assertEquals(22.0, col.getWidth(), 0.0);
col = cols.getColArray(1);
assertEquals(4, col.getMin()); // POI 3
assertEquals(4, col.getMax());
- assertEquals(33.0, col.getWidth());
+ assertEquals(33.0, col.getWidth(), 0.0);
}
-
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
-import java.util.zip.CRC32;
import java.util.List;
+import java.util.zip.CRC32;
-import junit.framework.TestCase;
-
+import org.apache.poi.POIXMLProperties;
import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.openxml4j.opc.*;
import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.TempFile;
-import org.apache.poi.POIXMLProperties;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.xssf.model.StylesTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr;
public final class TestXSSFWorkbook extends BaseTestWorkbook {
- @Override
- protected XSSFITestDataProvider getTestDataProvider(){
- return XSSFITestDataProvider.getInstance();
- }
+ @Override
+ protected XSSFITestDataProvider getTestDataProvider(){
+ return XSSFITestDataProvider.getInstance();
+ }
/**
public void testSaveLoadNew() throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook();
- //check that the default date system is set to 1900
- CTWorkbookPr pr = workbook.getCTWorkbook().getWorkbookPr();
- assertNotNull(pr);
- assertTrue(pr.isSetDate1904());
- assertFalse("XSSF must use the 1900 date system", pr.getDate1904());
+ //check that the default date system is set to 1900
+ CTWorkbookPr pr = workbook.getCTWorkbook().getWorkbookPr();
+ assertNotNull(pr);
+ assertTrue(pr.isSetDate1904());
+ assertFalse("XSSF must use the 1900 date system", pr.getDate1904());
- Sheet sheet1 = workbook.createSheet("sheet1");
+ Sheet sheet1 = workbook.createSheet("sheet1");
Sheet sheet2 = workbook.createSheet("sheet2");
workbook.createSheet("sheet3");
-
+
RichTextString rts = workbook.getCreationHelper().createRichTextString("hello world");
-
+
sheet1.createRow(0).createCell((short)0).setCellValue(1.2);
sheet1.createRow(1).createCell((short)0).setCellValue(rts);
sheet2.createRow(0);
-
+
assertEquals(0, workbook.getSheetAt(0).getFirstRowNum());
assertEquals(1, workbook.getSheetAt(0).getLastRowNum());
assertEquals(0, workbook.getSheetAt(1).getFirstRowNum());
assertEquals(0, workbook.getSheetAt(1).getLastRowNum());
assertEquals(0, workbook.getSheetAt(2).getFirstRowNum());
assertEquals(0, workbook.getSheetAt(2).getLastRowNum());
-
+
File file = TempFile.createTempFile("poi-", ".xlsx");
OutputStream out = new FileOutputStream(file);
workbook.write(out);
out.close();
-
+
// Check the package contains what we'd expect it to
OPCPackage pkg = OPCPackage.open(file.toString());
- PackagePart wbRelPart =
+ PackagePart wbRelPart =
pkg.getPart(PackagingURIHelper.createPartName("/xl/_rels/workbook.xml.rels"));
assertNotNull(wbRelPart);
assertTrue(wbRelPart.isRelationshipPart());
assertEquals(ContentTypes.RELATIONSHIPS_PART, wbRelPart.getContentType());
-
- PackagePart wbPart =
+
+ PackagePart wbPart =
pkg.getPart(PackagingURIHelper.createPartName("/xl/workbook.xml"));
// Links to the three sheets, shared strings and styles
assertTrue(wbPart.hasRelationships());
assertEquals(5, wbPart.getRelationships().size());
-
+
// Load back the XSSFWorkbook
workbook = new XSSFWorkbook(pkg);
assertEquals(3, workbook.getNumberOfSheets());
assertNotNull(workbook.getSheetAt(0));
assertNotNull(workbook.getSheetAt(1));
assertNotNull(workbook.getSheetAt(2));
-
+
assertNotNull(workbook.getSharedStringSource());
assertNotNull(workbook.getStylesSource());
-
+
assertEquals(0, workbook.getSheetAt(0).getFirstRowNum());
assertEquals(1, workbook.getSheetAt(0).getLastRowNum());
assertEquals(0, workbook.getSheetAt(1).getFirstRowNum());
assertEquals(0, workbook.getSheetAt(1).getLastRowNum());
assertEquals(0, workbook.getSheetAt(2).getFirstRowNum());
assertEquals(0, workbook.getSheetAt(2).getLastRowNum());
-
+
sheet1 = workbook.getSheetAt(0);
assertEquals(1.2, sheet1.getRow(0).getCell(0).getNumericCellValue(), 0.0001);
assertEquals("hello world", sheet1.getRow(1).getCell(0).getRichStringCellValue().getString());
}
-
+
public void testExisting() throws Exception {
-
+
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx");
assertNotNull(workbook.getSharedStringSource());
assertNotNull(workbook.getStylesSource());
-
+
// And check a few low level bits too
OPCPackage pkg = OPCPackage.open(HSSFTestDataSamples.openSampleFileStream("Formatting.xlsx"));
- PackagePart wbPart =
+ PackagePart wbPart =
pkg.getPart(PackagingURIHelper.createPartName("/xl/workbook.xml"));
-
+
// Links to the three sheets, shared, styles and themes
assertTrue(wbPart.hasRelationships());
assertEquals(6, wbPart.getRelationships().size());
}
-
+
public void testGetCellStyleAt(){
XSSFWorkbook workbook = new XSSFWorkbook();
short i = 0;
//get default style
CellStyle cellStyleAt = workbook.getCellStyleAt(i);
assertNotNull(cellStyleAt);
-
+
//get custom style
StylesTable styleSource = workbook.getStylesSource();
XSSFCellStyle customStyle = new XSSFCellStyle(styleSource);
customStyle.setFont(font);
int x = styleSource.putStyle(customStyle);
cellStyleAt = workbook.getCellStyleAt((short)x);
- assertNotNull(cellStyleAt);
+ assertNotNull(cellStyleAt);
}
-
+
public void testGetFontAt(){
XSSFWorkbook workbook = new XSSFWorkbook();
StylesTable styleSource = workbook.getStylesSource();
//get default font
Font fontAt = workbook.getFontAt(i);
assertNotNull(fontAt);
-
+
//get customized font
XSSFFont customFont = new XSSFFont();
customFont.setItalic(true);
fontAt = workbook.getFontAt((short)x);
assertNotNull(fontAt);
}
-
+
public void testGetNumCellStyles(){
XSSFWorkbook workbook = new XSSFWorkbook();
short i = workbook.getNumCellStyles();
//get default cellStyles
assertEquals(1, i);
//get wrong value
- assertNotSame(2, i);
+ assertNotSame(2, i);
}
-
+
public void testLoadSave() {
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx");
assertEquals(3, workbook.getNumberOfSheets());
assertEquals("dd/mm/yyyy", workbook.getSheetAt(0).getRow(1).getCell(0).getRichStringCellValue().getString());
assertNotNull(workbook.getSharedStringSource());
assertNotNull(workbook.getStylesSource());
-
+
// Write out, and check
// Load up again, check all still there
XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(workbook);
assertNotNull(wb2.getSheetAt(0));
assertNotNull(wb2.getSheetAt(1));
assertNotNull(wb2.getSheetAt(2));
-
+
assertEquals("dd/mm/yyyy", wb2.getSheetAt(0).getRow(1).getCell(0).getRichStringCellValue().getString());
assertEquals("yyyy/mm/dd", wb2.getSheetAt(0).getRow(2).getCell(0).getRichStringCellValue().getString());
assertEquals("yyyy-mm-dd", wb2.getSheetAt(0).getRow(3).getCell(0).getRichStringCellValue().getString());
assertNotNull(wb2.getSharedStringSource());
assertNotNull(wb2.getStylesSource());
}
-
+
public void testStyles() {
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx");
-
+
StylesTable ss = workbook.getStylesSource();
assertNotNull(ss);
StylesTable st = ss;
-
+
// Has 8 number formats
assertEquals(8, st._getNumberFormatSize());
// Has 2 fonts
assertEquals(2, st.getFills().size());
// Has 1 border
assertEquals(1, st.getBorders().size());
-
+
// Add two more styles
- assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8,
+ assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8,
st.putNumberFormat("testFORMAT"));
- assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8,
+ assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8,
st.putNumberFormat("testFORMAT"));
- assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 9,
+ assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 9,
st.putNumberFormat("testFORMAT2"));
assertEquals(10, st._getNumberFormatSize());
-
-
+
+
// Save, load back in again, and check
workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
-
+
ss = workbook.getStylesSource();
assertNotNull(ss);
assertEquals(1, st.getBorders().size());
}
- public void testIncrementSheetId() throws Exception {
- XSSFWorkbook wb = getTestDataProvider().createWorkbook();
- int sheetId = (int)wb.createSheet().sheet.getSheetId();
- assertEquals(1, sheetId);
- sheetId = (int)wb.createSheet().sheet.getSheetId();
- assertEquals(2, sheetId);
-
- //test file with gaps in the sheetId sequence
- wb = getTestDataProvider().openSampleWorkbook("47089.xlsm");
- int lastSheetId = (int)wb.getSheetAt(wb.getNumberOfSheets() - 1).sheet.getSheetId();
- sheetId = (int)wb.createSheet().sheet.getSheetId();
- assertEquals(lastSheetId+1, sheetId);
- }
-
- /**
- * Test setting of core properties such as Title and Author
- */
- public void testWorkbookProperties() throws Exception {
- XSSFWorkbook workbook = new XSSFWorkbook();
- POIXMLProperties props = workbook.getProperties();
- assertNotNull(props);
- //the Application property must be set for new workbooks, see Bugzilla #47559
- assertEquals("Apache POI", props.getExtendedProperties().getUnderlyingProperties().getApplication());
-
- PackagePropertiesPart opcProps = props.getCoreProperties().getUnderlyingProperties();
- assertNotNull(opcProps);
-
- opcProps.setTitleProperty("Testing Bugzilla #47460");
- assertEquals("Apache POI", opcProps.getCreatorProperty().getValue());
- opcProps.setCreatorProperty("poi-dev@poi.apache.org");
-
- workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
- assertEquals("Apache POI", workbook.getProperties().getExtendedProperties().getUnderlyingProperties().getApplication());
- opcProps = workbook.getProperties().getCoreProperties().getUnderlyingProperties();
- assertEquals("Testing Bugzilla #47460", opcProps.getTitleProperty().getValue());
- assertEquals("poi-dev@poi.apache.org", opcProps.getCreatorProperty().getValue());
- }
-
- /**
- * Verify that the attached test data was not modified. If this test method
- * fails, the test data is not working properly.
- */
- public void test47668() throws Exception {
- XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("47668.xlsx");
- List<XSSFPictureData> allPictures = workbook.getAllPictures();
- assertEquals(2, allPictures.size());
-
- PackagePartName imagePartName = PackagingURIHelper
- .createPartName("/xl/media/image1.jpeg");
- PackagePart imagePart = workbook.getPackage().getPart(imagePartName);
- assertNotNull(imagePart);
-
- for (XSSFPictureData pictureData : allPictures) {
- PackagePart picturePart = pictureData.getPackagePart();
- assertSame(imagePart, picturePart);
- }
-
- XSSFSheet sheet0 = workbook.getSheetAt(0);
- XSSFDrawing drawing0 = sheet0.createDrawingPatriarch();
- XSSFPictureData pictureData0 = (XSSFPictureData) drawing0.getRelations().get(0);
- byte[] data0 = pictureData0.getData();
- CRC32 crc0 = new CRC32();
- crc0.update(data0);
-
- XSSFSheet sheet1 = workbook.getSheetAt(1);
- XSSFDrawing drawing1 = sheet1.createDrawingPatriarch();
- XSSFPictureData pictureData1 = (XSSFPictureData) drawing1.getRelations().get(0);
- byte[] data1 = pictureData1.getData();
- CRC32 crc1 = new CRC32();
- crc1.update(data1);
-
- assertEquals(crc0.getValue(), crc1.getValue());
- }
+ public void testIncrementSheetId() {
+ XSSFWorkbook wb = getTestDataProvider().createWorkbook();
+ int sheetId = (int)wb.createSheet().sheet.getSheetId();
+ assertEquals(1, sheetId);
+ sheetId = (int)wb.createSheet().sheet.getSheetId();
+ assertEquals(2, sheetId);
+
+ //test file with gaps in the sheetId sequence
+ wb = getTestDataProvider().openSampleWorkbook("47089.xlsm");
+ int lastSheetId = (int)wb.getSheetAt(wb.getNumberOfSheets() - 1).sheet.getSheetId();
+ sheetId = (int)wb.createSheet().sheet.getSheetId();
+ assertEquals(lastSheetId+1, sheetId);
+ }
+
+ /**
+ * Test setting of core properties such as Title and Author
+ */
+ public void testWorkbookProperties() {
+ XSSFWorkbook workbook = new XSSFWorkbook();
+ POIXMLProperties props = workbook.getProperties();
+ assertNotNull(props);
+ //the Application property must be set for new workbooks, see Bugzilla #47559
+ assertEquals("Apache POI", props.getExtendedProperties().getUnderlyingProperties().getApplication());
+
+ PackagePropertiesPart opcProps = props.getCoreProperties().getUnderlyingProperties();
+ assertNotNull(opcProps);
+
+ opcProps.setTitleProperty("Testing Bugzilla #47460");
+ assertEquals("Apache POI", opcProps.getCreatorProperty().getValue());
+ opcProps.setCreatorProperty("poi-dev@poi.apache.org");
+
+ workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
+ assertEquals("Apache POI", workbook.getProperties().getExtendedProperties().getUnderlyingProperties().getApplication());
+ opcProps = workbook.getProperties().getCoreProperties().getUnderlyingProperties();
+ assertEquals("Testing Bugzilla #47460", opcProps.getTitleProperty().getValue());
+ assertEquals("poi-dev@poi.apache.org", opcProps.getCreatorProperty().getValue());
+ }
+
+ /**
+ * Verify that the attached test data was not modified. If this test method
+ * fails, the test data is not working properly.
+ */
+ public void test47668() throws Exception {
+ XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("47668.xlsx");
+ List<XSSFPictureData> allPictures = workbook.getAllPictures();
+ assertEquals(2, allPictures.size());
+
+ PackagePartName imagePartName = PackagingURIHelper
+ .createPartName("/xl/media/image1.jpeg");
+ PackagePart imagePart = workbook.getPackage().getPart(imagePartName);
+ assertNotNull(imagePart);
+
+ for (XSSFPictureData pictureData : allPictures) {
+ PackagePart picturePart = pictureData.getPackagePart();
+ assertSame(imagePart, picturePart);
+ }
+
+ XSSFSheet sheet0 = workbook.getSheetAt(0);
+ XSSFDrawing drawing0 = sheet0.createDrawingPatriarch();
+ XSSFPictureData pictureData0 = (XSSFPictureData) drawing0.getRelations().get(0);
+ byte[] data0 = pictureData0.getData();
+ CRC32 crc0 = new CRC32();
+ crc0.update(data0);
+
+ XSSFSheet sheet1 = workbook.getSheetAt(1);
+ XSSFDrawing drawing1 = sheet1.createDrawingPatriarch();
+ XSSFPictureData pictureData1 = (XSSFPictureData) drawing1.getRelations().get(0);
+ byte[] data1 = pictureData1.getData();
+ CRC32 crc1 = new CRC32();
+ crc1.update(data1);
+
+ assertEquals(crc0.getValue(), crc1.getValue());
+ }
}
import junit.framework.TestCase;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
-public class TestCTColComparator extends TestCase {
-
+public final class TestCTColComparator extends TestCase {
+
public void testCompare() {
CTColComparator comparator = new CTColComparator();
CTCol o1 = CTCol.Factory.newInstance();
o4.setMax(80);
assertEquals(-1, comparator.compare(o3, o4));
}
-
+
public void testArraysSort() {
CTColComparator comparator = new CTColComparator();
CTCol o1 = CTCol.Factory.newInstance();
assertEquals(8, cols[1].getMax());
assertEquals(80, cols[2].getMax());
}
-
}
import junit.framework.TestCase;
-import org.openxmlformats.schemas.officeDocument.x2006.math.STSpacingRule;
+import org.apache.poi.POIXMLDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
/**
* Tests for XWPF Paragraphs
*/
-public class TestXWPFParagraph extends TestCase {
+public final class TestXWPFParagraph extends TestCase {
/**
* A simple file
*/
private XWPFDocument xml;
- private File file;
-/*
+
protected void setUp() throws Exception {
super.setUp();
- file = new File(
+ File file = new File(
System.getProperty("HWPF.testdata.path") +
File.separator + "ThreeColHead.docx"
);
assertTrue(file.exists());
xml = new XWPFDocument(POIXMLDocument.openPackage(file.toString()));
}
-*/
+
/**
* Check that we get the right paragraph from the header
*/
- /*
- public void testHeaderParagraph() throws Exception {
+ public void disabled_testHeaderParagraph() {
XWPFHeader hdr = xml.getHeaderFooterPolicy().getDefaultHeader();
assertNotNull(hdr);
assertEquals("First header column!\tMid header\tRight header!", p
.getText());
}
-*/
+
/**
* Check that we get the right paragraphs from the document
*/
- /*
- public void testDocumentParagraph() throws Exception {
+ public void disabled_testDocumentParagraph() {
XWPFParagraph[] ps = xml.getParagraphs();
assertEquals(10, ps.length);
assertFalse(ps[4].isEmpty());
assertEquals("More on page one", ps[4].getText());
}
-*/
+
public void testSetGetBorderTop() {
//new clean instance of paragraph
XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph();
assertEquals(STBorder.NONE.intValue(), p.getBorderTop().getValue());
-
+
CTP ctp = p.getCTP();
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
-
+
//bordi
CTPBdr bdr = ppr.addNewPBdr();
CTBorder borderTop = bdr.addNewTop();
borderTop.setVal(STBorder.DOUBLE);
bdr.setTop(borderTop);
-
+
assertEquals(Borders.DOUBLE, p.getBorderTop());
p.setBorderTop(Borders.SINGLE);
assertEquals(STBorder.SINGLE, borderTop.getVal());
XWPFParagraph p = doc.createParagraph();
assertEquals(STJc.LEFT.intValue(), p.getAlignment().getValue());
-
+
CTP ctp = p.getCTP();
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
assertEquals(STJc.BOTH, ppr.getJc().getVal());
}
-
+
public void testSetGetSpacing() {
XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph();
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
assertEquals(-1, p.getSpacingAfter());
-
+
CTSpacing spacing = ppr.addNewSpacing();
spacing.setAfter(new BigInteger("10"));
assertEquals(10, p.getSpacingAfter());
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
assertEquals(STLineSpacingRule.INT_AUTO, p.getSpacingLineRule().getValue());
-
+
CTSpacing spacing = ppr.addNewSpacing();
spacing.setLineRule(STLineSpacingRule.AT_LEAST);
assertEquals(LineSpacingRule.AT_LEAST, p.getSpacingLineRule());
p.setSpacingAfter(100);
assertEquals(100, spacing.getAfter().intValue());
}
-
+
public void testSetGetIndentation() {
XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph();
assertEquals(-1, p.getIndentationLeft());
-
+
CTP ctp = p.getCTP();
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
assertEquals(-1, p.getIndentationLeft());
-
+
CTInd ind = ppr.addNewInd();
ind.setLeft(new BigInteger("10"));
assertEquals(10, p.getIndentationLeft());
p.setIndentationLeft(100);
assertEquals(100, ind.getLeft().intValue());
}
-
+
public void testSetGetVerticalAlignment() {
//new clean instance of paragraph
XWPFDocument doc = new XWPFDocument();
p.setPageBreak(true);
assertEquals(STOnOff.TRUE, ppr.getPageBreakBefore().getVal());
}
-
-
}
package org.apache.poi.hdf.extractor;
-import java.util.*;
-
/**
* Comment me
*
* @author Ryan Ackley
*/
-
-public final class StyleSheet
-{
+public final class StyleSheet {
private static final int NIL_STYLE = 4095;
private static final int PAP_TYPE = 1;
package org.apache.poi.hdf.model;
-
-//import java.io;
-
-import java.util.ArrayList;
-import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
import java.util.List;
-import java.util.TreeSet;
-
-import org.apache.poi.hdf.model.hdftypes.*;
import org.apache.poi.hdf.event.HDFLowLevelParsingListener;
-import org.apache.poi.hdf.model.util.BTreeSet;
+import org.apache.poi.hdf.model.hdftypes.*;
import org.apache.poi.hdf.model.util.ParsingState;
-
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.POIFSDocument;
import org.apache.poi.poifs.filesystem.DocumentEntry;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.LittleEndian;
-
-
-
/**
* The Object Factory takes in a stream and creates the low level objects
* that represent the data.
* @author andy
*/
-public final class HDFObjectFactory
-{
+public final class HDFObjectFactory {
/** OLE stuff*/
private POIFSFileSystem _filesystem;
{
throw new IOException("The text piece table is corrupted");
}
- else
- {
- //parse out the text pieces
- int pieceTableSize = LittleEndian.getInt(_tableBuffer, ++pos);
- pos += 4;
- int pieces = (pieceTableSize - 4) / 12;
- for (int x = 0; x < pieces; x++)
- {
- int filePos = LittleEndian.getInt(_tableBuffer, pos + ((pieces + 1) * 4) + (x * 8) + 2);
- boolean unicode = false;
- if ((filePos & 0x40000000) == 0)
- {
- unicode = true;
- }
- else
- {
- unicode = false;
- filePos &= ~(0x40000000);//gives me FC in doc stream
- filePos /= 2;
- }
- int totLength = LittleEndian.getInt(_tableBuffer, pos + (x + 1) * 4) -
- LittleEndian.getInt(_tableBuffer, pos + (x * 4));
-
- TextPiece piece = new TextPiece(filePos, totLength, unicode);
- _listener.text(piece);
-
+ //parse out the text pieces
+ int pieceTableSize = LittleEndian.getInt(_tableBuffer, ++pos);
+ pos += 4;
+ int pieces = (pieceTableSize - 4) / 12;
+ for (int x = 0; x < pieces; x++) {
+ int filePos = LittleEndian.getInt(_tableBuffer, pos + ((pieces + 1) * 4) + (x * 8) + 2);
+ boolean unicode = false;
+ if ((filePos & 0x40000000) == 0) {
+ unicode = true;
+ } else {
+ unicode = false;
+ filePos &= ~(0x40000000);//gives me FC in doc stream
+ filePos /= 2;
}
+ int totLength = LittleEndian.getInt(_tableBuffer, pos + (x + 1) * 4) -
+ LittleEndian.getInt(_tableBuffer, pos + (x * 4));
+ TextPiece piece = new TextPiece(filePos, totLength, unicode);
+ _listener.text(piece);
}
-
}
/**
* initializes all of the formatting properties for a Word Document
{
break;
}
- else
- {
- x++;
- }
+ x++;
}
//do the header sections
for (; x < arraySize; x++)// && sectionEnd <= end; x++)
package org.apache.poi.hdf.model.hdftypes;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.LittleEndian;
-
import org.apache.poi.hdf.model.hdftypes.definitions.FIBAbstractType;
package org.apache.poi.hdf.model.hdftypes;
-import java.util.*;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hdf.model.hdftypes.definitions.TCAbstractType;
*
* @author Ryan Ackley
*/
-
-public final class StyleSheet implements HDFType
-{
+public final class StyleSheet implements HDFType {
private static final int NIL_STYLE = 4095;
private static final int PAP_TYPE = 1;
package org.apache.poi.hdf.model.hdftypes.definitions;
-
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
/**
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
package org.apache.poi.hdf.model.hdftypes.definitions;
-
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
package org.apache.poi.hdf.model.hdftypes.definitions;
-
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
/**
package org.apache.poi.hdf.model.hdftypes.definitions;
-
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
/**
package org.apache.poi.hdf.model.hdftypes.definitions;
-
-
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
/**
package org.apache.poi.hdf.model.hdftypes.definitions;
-
-
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
/**
import org.apache.poi.hslf.record.Record;
import org.apache.poi.hslf.record.UserEditAtom;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.util.LittleEndian;
/**
* This class provides helper functions for determining if a
hss.getUnderlyingBytes(),
(int)cua.getCurrentEditOffset()
);
- } catch(ArrayIndexOutOfBoundsException e) {}
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return null;
+ }
if(r == null) { return null; }
if(! (r instanceof UserEditAtom)) { return null; }
UserEditAtom uea = (UserEditAtom)r;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.zip.InflaterInputStream;
-import java.util.zip.DeflaterOutputStream;
/**
* Represents EMF (Windows Enhanced Metafile) picture data.
import java.awt.*;
import java.io.*;
import java.util.zip.DeflaterOutputStream;
-import java.util.zip.InflaterInputStream;
/**
* Represents a metafile picture which can be one of the following types: EMF, WMF, or PICT.
package org.apache.poi.hslf.blip;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.InflaterInputStream;
+
+import org.apache.poi.hslf.exceptions.HSLFException;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.util.LittleEndian;
-
-import java.io.*;
-import java.util.zip.InflaterInputStream;
-import java.util.zip.DeflaterOutputStream;
/**
* Represents Macintosh PICT picture data.
import java.io.*;
import java.util.zip.InflaterInputStream;
-import java.util.zip.DeflaterOutputStream;
/**
* Represents a WMF (Windows Metafile) picture data.
package org.apache.poi.hslf.dev;
-import java.util.*;
import java.io.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.POIFSDocument;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.record.TextCharsAtom;
import org.apache.poi.hslf.record.TextBytesAtom;
import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.Record;
/**
* This class provides a way to view the contents of a powerpoint file.
import org.apache.poi.hslf.model.textproperties.TextProp;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
import java.util.LinkedList;
package org.apache.poi.hslf.dev;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.record.*;
+import java.io.ByteArrayOutputStream;
+import java.util.Hashtable;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.POIFSDocument;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
+import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.record.*;
import org.apache.poi.util.LittleEndian;
-import java.io.*;
-import java.util.Hashtable;
-
/**
* Uses record level code to locate UserEditAtom records, and other
* persistence related atoms. Tries to match them together, to help
import java.util.Vector;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.POIFSDocument;
import org.apache.poi.poifs.filesystem.DocumentEntry;
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hslf.record.CString;
import org.apache.poi.ddf.*;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.POILogger;
-import org.apache.poi.util.HexDump;
import java.awt.geom.*;
import java.util.ArrayList;
package org.apache.poi.hslf.model;
import org.apache.poi.hslf.record.SheetContainer;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.OEPlaceholderAtom;
import org.apache.poi.hslf.model.textproperties.TextProp;
/**
TextShape tx = (TextShape)shape;
return tx.getPlaceholderAtom() != null;
}
-
}
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.*;
-import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
-import java.util.Arrays;
/**
import org.apache.poi.hslf.record.OEPlaceholderAtom;
import org.apache.poi.hslf.exceptions.HSLFException;
-import java.util.List;
import java.io.ByteArrayOutputStream;
/**
import org.apache.poi.ddf.*;
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.POILogFactory;
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.POILogger;
import java.util.ArrayList;
import java.util.Iterator;
package org.apache.poi.hslf.model;
import org.apache.poi.ddf.*;
-import org.apache.poi.hslf.record.TextHeaderAtom;
import java.awt.*;
package org.apache.poi.hslf.model;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.record.TextRulerAtom;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
-
-import java.text.AttributedString;
-import java.text.AttributedCharacterIterator;
-import java.text.BreakIterator;
-import java.awt.font.TextAttribute;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
+import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
-import java.awt.font.FontRenderContext;
-import java.awt.*;
-import java.awt.geom.Rectangle2D;
import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hslf.record.TextRulerAtom;
+import org.apache.poi.hslf.usermodel.RichTextRun;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
/**
* Paint text into java.awt.Graphics2D
int paragraphStart = it.getBeginIndex();
int paragraphEnd = it.getEndIndex();
- ArrayList lines = new ArrayList();
+ List<TextElement> lines = new ArrayList<TextElement>();
LineBreakMeasurer measurer = new LineBreakMeasurer(it, frc);
measurer.setPosition(paragraphStart);
while (measurer.getPosition() < paragraphEnd) {
//finally draw the text fragments
TextElement[] elems = new TextElement[lines.size()];
- return (TextElement[])lines.toArray(elems);
+ return lines.toArray(elems);
}
public static class TextElement {
import java.util.LinkedList;
import java.util.Vector;
-import java.util.List;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.*;
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.io.IOException;
-import java.util.Iterator;
/**
* A common superclass of all shapes that can hold text.
/**
* Create a TextBox object and initialize it from the supplied Record container.
- *
+ *
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
* @param parent the parent of the shape
*/
String fntname = rt.getFontName();
Font font = new Font(fntname, style, size);
- float width = 0, height = 0, leading = 0;
- String[] lines = txt.split("\n");
+ float width = 0, height = 0, leading = 0;
+ String[] lines = txt.split("\n");
for (int i = 0; i < lines.length; i++) {
if(lines[i].length() == 0) continue;
-
+
TextLayout layout = new TextLayout(lines[i], font, _frc);
-
- leading = Math.max(leading, layout.getLeading());
+
+ leading = Math.max(leading, layout.getLeading());
width = Math.max(width, layout.getAdvance());
height = Math.max(height, (height + (layout.getDescent() + layout.getAscent())));
- }
-
+ }
+
// add one character to width
- Rectangle2D charBounds = font.getMaxCharBounds(_frc);
+ Rectangle2D charBounds = font.getMaxCharBounds(_frc);
width += getMarginLeft() + getMarginRight() + charBounds.getWidth();
-
- // add leading to height
+
+ // add leading to height
height += getMarginTop() + getMarginBottom() + leading;
Rectangle2D anchor = getAnchor2D();
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-import org.apache.poi.hslf.util.SystemTimeUtils;
import org.apache.poi.util.LittleEndian;
/**
*
* @author Yegor Kozlov
*/
-public final class AnimationInfoAtom extends RecordAtom
-{
+public final class AnimationInfoAtom extends RecordAtom {
/**
* whether the animation plays in the reverse direction
package org.apache.poi.hslf.record;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
import java.io.IOException;
*
* @author Nick Burch
*/
-
-public final class DocumentEncryptionAtom extends RecordAtom
-{
+public final class DocumentEncryptionAtom extends RecordAtom {
private byte[] _header;
private static long _type = 12052l;
package org.apache.poi.hslf.record;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
/**
* A container record that specifies information about a movie stored externally.
public long getRecordType() {
return RecordTypes.ExAviMovie.typeID;
}
-
}
package org.apache.poi.hslf.record;
-import java.io.OutputStream;
-import java.io.IOException;
-
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
/**
* A container record that specifies information about an ActiveX control. It contains:
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hslf.record;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-import org.apache.poi.hslf.util.SystemTimeUtils;
import org.apache.poi.util.LittleEndian;
/**
*
* @author Nick Burch
*/
-
-public class ExHyperlinkAtom extends RecordAtom
-{
+public final class ExHyperlinkAtom extends RecordAtom {
/**
* Record header.
*/
LittleEndian.putShort(_header, 2, (short)getRecordType());
LittleEndian.putInt(_header, 4, _data.length);
-
+
// It is fine for the other values to be zero
}
// Get the header.
_header = new byte[8];
System.arraycopy(source,start,_header,0,8);
-
+
// Get the record data.
_data = new byte[len-8];
System.arraycopy(source,start+8,_data,0,len-8);
-
+
// Must be at least 4 bytes long
if(_data.length < 4) {
throw new IllegalArgumentException("The length of the data for a ExHyperlinkAtom must be at least 4 bytes, but was only " + _data.length);
public void setNumber(int number) {
LittleEndian.putInt(_data,0,number);
}
-
+
/**
* Gets the record type.
* @return the record type.
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-import org.apache.poi.hslf.util.SystemTimeUtils;
import org.apache.poi.util.LittleEndian;
/**
package org.apache.poi.hslf.record;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hslf.record;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-import org.apache.poi.hslf.util.SystemTimeUtils;
import org.apache.poi.util.LittleEndian;
/**
* @author Nick Burch
* @author Yegor Kozlov
*/
-
-public class InteractiveInfoAtom extends RecordAtom
-{
+public class InteractiveInfoAtom extends RecordAtom {
/**
* Action Table
LittleEndian.putShort(_header, 2, (short)getRecordType());
LittleEndian.putInt(_header, 4, _data.length);
-
+
// It is fine for the other values to be zero
}
// Get the header.
_header = new byte[8];
System.arraycopy(source,start,_header,0,8);
-
+
// Get the record data.
_data = new byte[len-8];
System.arraycopy(source,start+8,_data,0,len-8);
-
+
// Must be at least 16 bytes long
if(_data.length < 16) {
throw new IllegalArgumentException("The length of the data for a InteractiveInfoAtom must be at least 16 bytes, but was only " + _data.length);
}
-
+
// First 4 bytes - no idea, normally 0
// Second 4 bytes - the id of the link (from 1 onwards)
// Third 4 bytes - no idea, normally 4
public void setHyperlinkID(int number) {
LittleEndian.putInt(_data,4,number);
}
-
+
/**
* a reference to a sound in the sound collection.
*/
import java.io.OutputStream;
import java.util.ArrayList;
-import org.apache.poi.util.LittleEndian;
-
/**
* Master slide
*
* @author Yegor Kozlov
*/
-
-public final class MainMaster extends SheetContainer
-{
+public final class MainMaster extends SheetContainer {
private byte[] _header;
private static long _type = 1016;
// Links to our more interesting children
private SlideAtom slideAtom;
private PPDrawing ppDrawing;
- private TxMasterStyleAtom[] txmasters;
- private ColorSchemeAtom[] clrscheme;
- private ColorSchemeAtom _colorScheme;
+ private TxMasterStyleAtom[] txmasters;
+ private ColorSchemeAtom[] clrscheme;
+ private ColorSchemeAtom _colorScheme;
/**
* Returns the SlideAtom of this Slide
*/
public PPDrawing getPPDrawing() { return ppDrawing; }
- public TxMasterStyleAtom[] getTxMasterStyleAtoms() { return txmasters; }
+ public TxMasterStyleAtom[] getTxMasterStyleAtoms() { return txmasters; }
- public ColorSchemeAtom[] getColorSchemeAtoms() { return clrscheme; }
+ public ColorSchemeAtom[] getColorSchemeAtoms() { return clrscheme; }
/**
* Set things up, and find our more interesting children
// Find our children
_children = Record.findChildRecords(source,start+8,len-8);
- ArrayList tx = new ArrayList();
- ArrayList clr = new ArrayList();
+ ArrayList tx = new ArrayList();
+ ArrayList clr = new ArrayList();
// Find the interesting ones in there
for(int i=0; i<_children.length; i++) {
if(_children[i] instanceof SlideAtom) {
slideAtom = (SlideAtom)_children[i];
} else if(_children[i] instanceof PPDrawing) {
ppDrawing = (PPDrawing)_children[i];
- } else if(_children[i] instanceof TxMasterStyleAtom) {
- tx.add(_children[i]);
- } else if(_children[i] instanceof ColorSchemeAtom) {
- clr.add(_children[i]);
+ } else if(_children[i] instanceof TxMasterStyleAtom) {
+ tx.add(_children[i]);
+ } else if(_children[i] instanceof ColorSchemeAtom) {
+ clr.add(_children[i]);
}
- if(ppDrawing != null && _children[i] instanceof ColorSchemeAtom) {
- _colorScheme = (ColorSchemeAtom)_children[i];
- }
+ if(ppDrawing != null && _children[i] instanceof ColorSchemeAtom) {
+ _colorScheme = (ColorSchemeAtom)_children[i];
+ }
}
- txmasters = (TxMasterStyleAtom[])tx.toArray(new TxMasterStyleAtom[tx.size()]);
- clrscheme = (ColorSchemeAtom[])clr.toArray(new ColorSchemeAtom[clr.size()]);
+ txmasters = (TxMasterStyleAtom[])tx.toArray(new TxMasterStyleAtom[tx.size()]);
+ clrscheme = (ColorSchemeAtom[])clr.toArray(new ColorSchemeAtom[clr.size()]);
}
/**
writeOut(_header[0],_header[1],_type,_children,out);
}
- public ColorSchemeAtom getColorScheme(){
- return _colorScheme;
- }
-
+ public ColorSchemeAtom getColorScheme(){
+ return _colorScheme;
+ }
}
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-import org.apache.poi.hslf.util.SystemTimeUtils;
import org.apache.poi.util.LittleEndian;
/**
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.model.ShapeTypes;
-import org.apache.poi.hslf.model.Shape;
import java.io.IOException;
import java.io.OutputStream;
// For now, pretending to be an atom. Might not always be, but that
// would require a wrapping class
-public final class PPDrawing extends RecordAtom
-{
+public final class PPDrawing extends RecordAtom {
private byte[] _header;
private long _type;
private EscherRecord[] childRecords;
private EscherTextboxWrapper[] textboxWrappers;
- //cached EscherDgRecord
- private EscherDgRecord dg;
+ //cached EscherDgRecord
+ private EscherDgRecord dg;
/**
* Get access to the underlying Escher Records
public PPDrawing(){
_header = new byte[8];
LittleEndian.putUShort(_header, 0, 15);
- LittleEndian.putUShort(_header, 2, (int)RecordTypes.PPDrawing.typeID);
+ LittleEndian.putUShort(_header, 2, RecordTypes.PPDrawing.typeID);
LittleEndian.putInt(_header, 4, 0);
textboxWrappers = new EscherTextboxWrapper[]{};
*/
private void findEscherChildren(DefaultEscherRecordFactory erf, byte[] source, int startPos, int lenToGo, Vector found) {
- int escherBytes = LittleEndian.getInt( source, startPos + 4 ) + 8;
+ int escherBytes = LittleEndian.getInt( source, startPos + 4 ) + 8;
// Find the record
EscherRecord r = erf.createRecord(source,startPos);
logger.log(POILogger.WARN, "Hit short DDF record at " + startPos + " - " + size);
}
- /**
- * Sanity check. Always advance the cursor by the correct value.
- *
- * getRecordSize() must return exatcly the same number of bytes that was written in fillFields.
- * Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size.
- */
- if(size != escherBytes){
- logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass());
- size = escherBytes;
- }
+ /**
+ * Sanity check. Always advance the cursor by the correct value.
+ *
+ * getRecordSize() must return exatcly the same number of bytes that was written in fillFields.
+ * Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size.
+ */
+ if(size != escherBytes){
+ logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass());
+ size = escherBytes;
+ }
startPos += size;
lenToGo -= size;
if(lenToGo >= 8) {
EscherTextboxRecord tbr = (EscherTextboxRecord)toSearch[i];
EscherTextboxWrapper w = new EscherTextboxWrapper(tbr);
found.add(w);
- for (int j = i; j >= 0; j--) {
- if(toSearch[j] instanceof EscherSpRecord){
- EscherSpRecord sp = (EscherSpRecord)toSearch[j];
- w.setShapeId(sp.getShapeId());
- break;
- }
- }
+ for (int j = i; j >= 0; j--) {
+ if(toSearch[j] instanceof EscherSpRecord){
+ EscherSpRecord sp = (EscherSpRecord)toSearch[j];
+ w.setShapeId(sp.getShapeId());
+ break;
+ }
+ }
} else {
// If it has children, walk them
if(toSearch[i].isContainerRecord()) {
textboxWrappers = tw;
}
- /**
- * Return EscherDgRecord which keeps track of the number of shapes and shapeId in this drawing group
- *
- * @return EscherDgRecord
- */
- public EscherDgRecord getEscherDgRecord(){
- if(dg == null){
- EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0];
- for(Iterator<EscherRecord> it = dgContainer.getChildIterator(); it.hasNext();){
- EscherRecord r = it.next();
- if(r instanceof EscherDgRecord){
- dg = (EscherDgRecord)r;
- break;
- }
- }
- }
- return dg;
- }
-
+ /**
+ * Return EscherDgRecord which keeps track of the number of shapes and shapeId in this drawing group
+ *
+ * @return EscherDgRecord
+ */
+ public EscherDgRecord getEscherDgRecord(){
+ if(dg == null){
+ EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0];
+ for(Iterator<EscherRecord> it = dgContainer.getChildIterator(); it.hasNext();){
+ EscherRecord r = it.next();
+ if(r instanceof EscherDgRecord){
+ dg = (EscherDgRecord)r;
+ break;
+ }
+ }
+ }
+ return dg;
+ }
}
import java.io.OutputStream;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
-import java.util.List;
import java.util.Iterator;
/**
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Date;
-
-import org.apache.poi.hslf.util.SystemTimeUtils;
-import org.apache.poi.util.LittleEndian;
/**
* An atom record that specifies that a shape is a header or footer placeholder shape
* @since PowerPoint 2007
* @author Yegor Kozlov
*/
-
-public final class RoundTripHFPlaceholder12 extends RecordAtom
-{
+public final class RoundTripHFPlaceholder12 extends RecordAtom {
/**
* Record header.
*/
package org.apache.poi.hslf.record;
-import org.apache.poi.util.ArrayUtil;
import org.apache.poi.util.LittleEndian;
import java.io.IOException;
*/
// For now, pretend to be an atom
-public final class SlideListWithText extends RecordContainer
-{
-
- /**
- * Instance filed of the record header indicates that this SlideListWithText stores
- * references to slides
- */
- public static final int SLIDES = 0;
- /**
- * Instance filed of the record header indicates that this SlideListWithText stores
- * references to master slides
- */
- public static final int MASTER = 1;
- /**
- * Instance filed of the record header indicates that this SlideListWithText stores
- * references to notes
- */
- public static final int NOTES = 2;
-
- private byte[] _header;
+public final class SlideListWithText extends RecordContainer {
+
+ /**
+ * Instance filed of the record header indicates that this SlideListWithText stores
+ * references to slides
+ */
+ public static final int SLIDES = 0;
+ /**
+ * Instance filed of the record header indicates that this SlideListWithText stores
+ * references to master slides
+ */
+ public static final int MASTER = 1;
+ /**
+ * Instance filed of the record header indicates that this SlideListWithText stores
+ * references to notes
+ */
+ public static final int NOTES = 2;
+
+ private byte[] _header;
private static long _type = 4080;
private SlideAtomsSet[] slideAtomsSets;
slideAtomsSets = sas;
}
- public int getInstance(){
- return LittleEndian.getShort(_header, 0) >> 4;
- }
+ public int getInstance(){
+ return LittleEndian.getShort(_header, 0) >> 4;
+ }
- public void setInstance(int inst){
- LittleEndian.putShort(_header, (short)((inst << 4) | 0xF));
- }
+ public void setInstance(int inst){
+ LittleEndian.putShort(_header, (short)((inst << 4) | 0xF));
+ }
- /**
+ /**
* Get access to the SlideAtomsSets of the children of this record
*/
public SlideAtomsSet[] getSlideAtomsSets() { return slideAtomsSets; }
- /**
- * Get access to the SlideAtomsSets of the children of this record
- */
- public void setSlideAtomsSets( SlideAtomsSet[] sas ) { slideAtomsSets = sas; }
+ /**
+ * Get access to the SlideAtomsSets of the children of this record
+ */
+ public void setSlideAtomsSets( SlideAtomsSet[] sas ) { slideAtomsSets = sas; }
/**
* Return the value we were given at creation
package org.apache.poi.hslf.record;
-import org.apache.poi.util.POILogger;
-
import java.io.OutputStream;
import java.io.IOException;
package org.apache.poi.hslf.record;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
-import java.util.zip.InflaterInputStream;
import org.apache.poi.util.LittleEndian;
package org.apache.poi.hslf.record;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
-import java.util.zip.InflaterInputStream;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.POILogger;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
-import org.apache.poi.util.ArrayUtil;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
/**
* This class is a friendly wrapper on top of the more scary HSLFSlideShow.
*
- * TODO:
- * - figure out how to match notes to their correct sheet
- * (will involve understanding DocSlideList and DocNotesList)
- * - handle Slide creation cleaner
+ * TODO: - figure out how to match notes to their correct sheet (will involve
+ * understanding DocSlideList and DocNotesList) - handle Slide creation cleaner
*
* @author Nick Burch
* @author Yegor kozlov
*/
public final class SlideShow {
- // What we're based on
- private HSLFSlideShow _hslfSlideShow;
-
- // Low level contents, as taken from HSLFSlideShow
- private Record[] _records;
-
- // Pointers to the most recent versions of the core records
- // (Document, Notes, Slide etc)
- private Record[] _mostRecentCoreRecords;
- // Lookup between the PersitPtr "sheet" IDs, and the position
- // in the mostRecentCoreRecords array
- private Hashtable _sheetIdToCoreRecordsLookup;
-
- // Records that are interesting
- private Document _documentRecord;
-
- // Friendly objects for people to deal with
- private SlideMaster[] _masters;
- private TitleMaster[] _titleMasters;
- private Slide[] _slides;
- private Notes[] _notes;
- private FontCollection _fonts;
-
- // For logging
- private POILogger logger = POILogFactory.getLogger(this.getClass());
-
-
- /* ===============================================================
- * Setup Code
- * ===============================================================
- */
-
-
- /**
- * Constructs a Powerpoint document from the underlying
- * HSLFSlideShow object. Finds the model stuff from this
- *
- * @param hslfSlideShow the HSLFSlideShow to base on
- */
- public SlideShow(HSLFSlideShow hslfSlideShow) {
+ // What we're based on
+ private HSLFSlideShow _hslfSlideShow;
+
+ // Low level contents, as taken from HSLFSlideShow
+ private Record[] _records;
+
+ // Pointers to the most recent versions of the core records
+ // (Document, Notes, Slide etc)
+ private Record[] _mostRecentCoreRecords;
+ // Lookup between the PersitPtr "sheet" IDs, and the position
+ // in the mostRecentCoreRecords array
+ private Hashtable _sheetIdToCoreRecordsLookup;
+
+ // Records that are interesting
+ private Document _documentRecord;
+
+ // Friendly objects for people to deal with
+ private SlideMaster[] _masters;
+ private TitleMaster[] _titleMasters;
+ private Slide[] _slides;
+ private Notes[] _notes;
+ private FontCollection _fonts;
+
+ // For logging
+ private POILogger logger = POILogFactory.getLogger(this.getClass());
+
+
+ /* ===============================================================
+ * Setup Code
+ * ===============================================================
+ */
+
+
+ /**
+ * Constructs a Powerpoint document from the underlying
+ * HSLFSlideShow object. Finds the model stuff from this
+ *
+ * @param hslfSlideShow the HSLFSlideShow to base on
+ */
+ public SlideShow(HSLFSlideShow hslfSlideShow) {
// Get useful things from our base slideshow
- _hslfSlideShow = hslfSlideShow;
- _records = _hslfSlideShow.getRecords();
+ _hslfSlideShow = hslfSlideShow;
+ _records = _hslfSlideShow.getRecords();
- // Handle Parent-aware Reocrds
- for(int i=0; i<_records.length; i++) {
- handleParentAwareRecords(_records[i]);
+ // Handle Parent-aware Reocrds
+ for (int i = 0; i < _records.length; i++) {
+ handleParentAwareRecords(_records[i]);
+ }
+
+ // Find the versions of the core records we'll want to use
+ findMostRecentCoreRecords();
+
+ // Build up the model level Slides and Notes
+ buildSlidesAndNotes();
}
- // Find the versions of the core records we'll want to use
- findMostRecentCoreRecords();
-
- // Build up the model level Slides and Notes
- buildSlidesAndNotes();
- }
-
- /**
- * Constructs a new, empty, Powerpoint document.
- */
- public SlideShow() {
- this(HSLFSlideShow.create());
- }
-
- /**
- * Constructs a Powerpoint document from an input stream.
- */
- public SlideShow(InputStream inputStream) throws IOException {
- this(new HSLFSlideShow(inputStream));
- }
-
- /**
- * Find the records that are parent-aware, and tell them
- * who their parent is
- */
- private void handleParentAwareRecords(Record baseRecord) {
- // Only need to do something if this is a container record
- if(baseRecord instanceof RecordContainer) {
- RecordContainer br = (RecordContainer)baseRecord;
- Record[] childRecords = br.getChildRecords();
-
- // Loop over child records, looking for interesting ones
- for(int i=0; i<childRecords.length; i++) {
- Record record = childRecords[i];
- // Tell parent aware records of their parent
- if(record instanceof ParentAwareRecord) {
- ((ParentAwareRecord)record).setParentRecord(br);
- }
- // Walk on down for the case of container records
- if(record instanceof RecordContainer) {
- handleParentAwareRecords(record);
+ /**
+ * Constructs a new, empty, Powerpoint document.
+ */
+ public SlideShow() {
+ this(HSLFSlideShow.create());
+ }
+
+ /**
+ * Constructs a Powerpoint document from an input stream.
+ */
+ public SlideShow(InputStream inputStream) throws IOException {
+ this(new HSLFSlideShow(inputStream));
+ }
+
+ /**
+ * Find the records that are parent-aware, and tell them who their parent is
+ */
+ private void handleParentAwareRecords(Record baseRecord) {
+ // Only need to do something if this is a container record
+ if (baseRecord instanceof RecordContainer) {
+ RecordContainer br = (RecordContainer) baseRecord;
+ Record[] childRecords = br.getChildRecords();
+
+ // Loop over child records, looking for interesting ones
+ for (int i = 0; i < childRecords.length; i++) {
+ Record record = childRecords[i];
+ // Tell parent aware records of their parent
+ if (record instanceof ParentAwareRecord) {
+ ((ParentAwareRecord) record).setParentRecord(br);
+ }
+ // Walk on down for the case of container records
+ if (record instanceof RecordContainer) {
+ handleParentAwareRecords(record);
+ }
}
}
- }
- }
-
-
- /**
- * Use the PersistPtrHolder entries to figure out what is
- * the "most recent" version of all the core records
- * (Document, Notes, Slide etc), and save a record of them.
- * Do this by walking from the oldest PersistPtr to the newest,
- * overwriting any references found along the way with newer ones
- */
- private void findMostRecentCoreRecords() {
- // To start with, find the most recent in the byte offset domain
- Hashtable mostRecentByBytes = new Hashtable();
- for(int i=0; i<_records.length; i++) {
- if(_records[i] instanceof PersistPtrHolder) {
- PersistPtrHolder pph = (PersistPtrHolder)_records[i];
-
- // If we've already seen any of the "slide" IDs for this
- // PersistPtr, remove their old positions
- int[] ids = pph.getKnownSlideIDs();
- for(int j=0; j<ids.length; j++) {
- Integer id = new Integer(ids[j]);
- if( mostRecentByBytes.containsKey(id)) {
- mostRecentByBytes.remove(id);
+ }
+
+ /**
+ * Use the PersistPtrHolder entries to figure out what is the "most recent"
+ * version of all the core records (Document, Notes, Slide etc), and save a
+ * record of them. Do this by walking from the oldest PersistPtr to the
+ * newest, overwriting any references found along the way with newer ones
+ */
+ private void findMostRecentCoreRecords() {
+ // To start with, find the most recent in the byte offset domain
+ Hashtable mostRecentByBytes = new Hashtable();
+ for (int i = 0; i < _records.length; i++) {
+ if (_records[i] instanceof PersistPtrHolder) {
+ PersistPtrHolder pph = (PersistPtrHolder) _records[i];
+
+ // If we've already seen any of the "slide" IDs for this
+ // PersistPtr, remove their old positions
+ int[] ids = pph.getKnownSlideIDs();
+ for (int j = 0; j < ids.length; j++) {
+ Integer id = new Integer(ids[j]);
+ if (mostRecentByBytes.containsKey(id)) {
+ mostRecentByBytes.remove(id);
+ }
}
- }
- // Now, update the byte level locations with their latest values
- Hashtable thisSetOfLocations = pph.getSlideLocationsLookup();
- for(int j=0; j<ids.length; j++) {
- Integer id = new Integer(ids[j]);
- mostRecentByBytes.put(id, thisSetOfLocations.get(id));
+ // Now, update the byte level locations with their latest values
+ Hashtable thisSetOfLocations = pph.getSlideLocationsLookup();
+ for (int j = 0; j < ids.length; j++) {
+ Integer id = new Integer(ids[j]);
+ mostRecentByBytes.put(id, thisSetOfLocations.get(id));
+ }
}
}
- }
- // We now know how many unique special records we have, so init
- // the array
- _mostRecentCoreRecords = new Record[mostRecentByBytes.size()];
-
- // We'll also want to be able to turn the slide IDs into a position
- // in this array
- _sheetIdToCoreRecordsLookup = new Hashtable();
- int[] allIDs = new int[_mostRecentCoreRecords.length];
- Enumeration ids = mostRecentByBytes.keys();
- for(int i=0; i<allIDs.length; i++) {
- Integer id = (Integer)ids.nextElement();
- allIDs[i] = id.intValue();
- }
- Arrays.sort(allIDs);
- for(int i=0; i<allIDs.length; i++) {
- _sheetIdToCoreRecordsLookup.put(new Integer(allIDs[i]), new Integer(i));
- }
+ // We now know how many unique special records we have, so init
+ // the array
+ _mostRecentCoreRecords = new Record[mostRecentByBytes.size()];
+
+ // We'll also want to be able to turn the slide IDs into a position
+ // in this array
+ _sheetIdToCoreRecordsLookup = new Hashtable();
+ int[] allIDs = new int[_mostRecentCoreRecords.length];
+ Enumeration ids = mostRecentByBytes.keys();
+ for (int i = 0; i < allIDs.length; i++) {
+ Integer id = (Integer) ids.nextElement();
+ allIDs[i] = id.intValue();
+ }
+ Arrays.sort(allIDs);
+ for (int i = 0; i < allIDs.length; i++) {
+ _sheetIdToCoreRecordsLookup.put(new Integer(allIDs[i]), new Integer(i));
+ }
- // Now convert the byte offsets back into record offsets
- for(int i=0; i<_records.length; i++) {
- if(_records[i] instanceof PositionDependentRecord) {
- PositionDependentRecord pdr = (PositionDependentRecord)_records[i];
- Integer recordAt = new Integer(pdr.getLastOnDiskOffset());
-
- // Is it one we care about?
- for(int j=0; j<allIDs.length; j++) {
- Integer thisID = new Integer(allIDs[j]);
- Integer thatRecordAt = (Integer)mostRecentByBytes.get(thisID);
-
- if(thatRecordAt.equals(recordAt)) {
- // Bingo. Now, where do we store it?
- Integer storeAtI =
- (Integer)_sheetIdToCoreRecordsLookup.get(thisID);
- int storeAt = storeAtI.intValue();
-
- // Tell it its Sheet ID, if it cares
- if(pdr instanceof PositionDependentRecordContainer) {
- PositionDependentRecordContainer pdrc =
- (PositionDependentRecordContainer)_records[i];
- pdrc.setSheetId(thisID.intValue());
+ // Now convert the byte offsets back into record offsets
+ for (int i = 0; i < _records.length; i++) {
+ if (_records[i] instanceof PositionDependentRecord) {
+ PositionDependentRecord pdr = (PositionDependentRecord) _records[i];
+ Integer recordAt = new Integer(pdr.getLastOnDiskOffset());
+
+ // Is it one we care about?
+ for (int j = 0; j < allIDs.length; j++) {
+ Integer thisID = new Integer(allIDs[j]);
+ Integer thatRecordAt = (Integer) mostRecentByBytes.get(thisID);
+
+ if (thatRecordAt.equals(recordAt)) {
+ // Bingo. Now, where do we store it?
+ Integer storeAtI = (Integer) _sheetIdToCoreRecordsLookup.get(thisID);
+ int storeAt = storeAtI.intValue();
+
+ // Tell it its Sheet ID, if it cares
+ if (pdr instanceof PositionDependentRecordContainer) {
+ PositionDependentRecordContainer pdrc = (PositionDependentRecordContainer) _records[i];
+ pdrc.setSheetId(thisID.intValue());
+ }
+
+ // Finally, save the record
+ _mostRecentCoreRecords[storeAt] = _records[i];
}
-
- // Finally, save the record
- _mostRecentCoreRecords[storeAt] = _records[i];
}
}
}
- }
- // Now look for the interesting records in there
- for(int i=0; i<_mostRecentCoreRecords.length; i++) {
- // Check there really is a record at this number
- if(_mostRecentCoreRecords[i] != null) {
- // Find the Document, and interesting things in it
- if(_mostRecentCoreRecords[i].getRecordType() == RecordTypes.Document.typeID) {
- _documentRecord = (Document)_mostRecentCoreRecords[i];
- _fonts = _documentRecord.getEnvironment().getFontCollection();
+ // Now look for the interesting records in there
+ for (int i = 0; i < _mostRecentCoreRecords.length; i++) {
+ // Check there really is a record at this number
+ if (_mostRecentCoreRecords[i] != null) {
+ // Find the Document, and interesting things in it
+ if (_mostRecentCoreRecords[i].getRecordType() == RecordTypes.Document.typeID) {
+ _documentRecord = (Document) _mostRecentCoreRecords[i];
+ _fonts = _documentRecord.getEnvironment().getFontCollection();
+ }
+ } else {
+ // No record at this number
+ // Odd, but not normally a problem
}
- } else {
- // No record at this number
- // Odd, but not normally a problem
}
}
- }
- /**
- * For a given SlideAtomsSet, return the core record, based on the refID from the
- * SlidePersistAtom
- */
+ /**
+ * For a given SlideAtomsSet, return the core record, based on the refID
+ * from the SlidePersistAtom
+ */
private Record getCoreRecordForSAS(SlideAtomsSet sas) {
SlidePersistAtom spa = sas.getSlidePersistAtom();
int refID = spa.getRefID();
}
/**
- * For a given refID (the internal, 0 based numbering scheme), return the
- * core record
- * @param refID the refID
+ * For a given refID (the internal, 0 based numbering scheme), return the
+ * core record
+ *
+ * @param refID
+ * the refID
*/
private Record getCoreRecordForRefID(int refID) {
- Integer coreRecordId = (Integer)
- _sheetIdToCoreRecordsLookup.get(new Integer(refID));
- if(coreRecordId != null) {
+ Integer coreRecordId = (Integer) _sheetIdToCoreRecordsLookup.get(new Integer(refID));
+ if (coreRecordId != null) {
Record r = _mostRecentCoreRecords[coreRecordId.intValue()];
return r;
} else {
- logger.log(POILogger.ERROR, "We tried to look up a reference to a core record, but there was no core ID for reference ID " + refID);
+ logger.log(POILogger.ERROR,
+ "We tried to look up a reference to a core record, but there was no core ID for reference ID "
+ + refID);
return null;
}
}
- /**
- * Build up model level Slide and Notes objects, from the underlying
- * records.
- */
- private void buildSlidesAndNotes() {
- // Ensure we really found a Document record earlier
- // If we didn't, then the file is probably corrupt
- if(_documentRecord == null) {
- throw new CorruptPowerPointFileException("The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt.");
- }
-
-
- // Fetch the SlideListWithTexts in the most up-to-date Document Record
- //
- // As far as we understand it:
- // * The first SlideListWithText will contain a SlideAtomsSet
- // for each of the master slides
- // * The second SlideListWithText will contain a SlideAtomsSet
- // for each of the slides, in their current order
- // These SlideAtomsSets will normally contain text
- // * The third SlideListWithText (if present), will contain a
- // SlideAtomsSet for each Notes
- // These SlideAtomsSets will not normally contain text
- //
- // Having indentified the masters, slides and notes + their orders,
- // we have to go and find their matching records
- // We always use the latest versions of these records, and use the
- // SlideAtom/NotesAtom to match them with the StyleAtomSet
-
- SlideListWithText masterSLWT = _documentRecord.getMasterSlideListWithText();
- SlideListWithText slidesSLWT = _documentRecord.getSlideSlideListWithText();
- SlideListWithText notesSLWT = _documentRecord.getNotesSlideListWithText();
-
- // Find master slides
- // These can be MainMaster records, but oddly they can also be
- // Slides or Notes, and possibly even other odd stuff....
- // About the only thing you can say is that the master details are in
- // the first SLWT.
- SlideAtomsSet[] masterSets = new SlideAtomsSet[0];
- if (masterSLWT != null){
- masterSets = masterSLWT.getSlideAtomsSets();
-
- ArrayList mmr = new ArrayList();
- ArrayList tmr = new ArrayList();
-
- for(int i=0; i<masterSets.length; i++) {
- Record r = getCoreRecordForSAS(masterSets[i]);
- SlideAtomsSet sas = masterSets[i];
- int sheetNo = sas.getSlidePersistAtom().getSlideIdentifier();
- if(r instanceof org.apache.poi.hslf.record.Slide) {
- TitleMaster master = new TitleMaster((org.apache.poi.hslf.record.Slide)r, sheetNo);
- master.setSlideShow(this);
- tmr.add(master);
- } else if(r instanceof org.apache.poi.hslf.record.MainMaster) {
- SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster)r, sheetNo);
- master.setSlideShow(this);
- mmr.add(master);
- }
+ /**
+ * Build up model level Slide and Notes objects, from the underlying
+ * records.
+ */
+ private void buildSlidesAndNotes() {
+ // Ensure we really found a Document record earlier
+ // If we didn't, then the file is probably corrupt
+ if (_documentRecord == null) {
+ throw new CorruptPowerPointFileException(
+ "The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt.");
}
- _masters = new SlideMaster[mmr.size()];
- mmr.toArray(_masters);
-
- _titleMasters = new TitleMaster[tmr.size()];
- tmr.toArray(_titleMasters);
-
- }
+ // Fetch the SlideListWithTexts in the most up-to-date Document Record
+ //
+ // As far as we understand it:
+ // * The first SlideListWithText will contain a SlideAtomsSet
+ // for each of the master slides
+ // * The second SlideListWithText will contain a SlideAtomsSet
+ // for each of the slides, in their current order
+ // These SlideAtomsSets will normally contain text
+ // * The third SlideListWithText (if present), will contain a
+ // SlideAtomsSet for each Notes
+ // These SlideAtomsSets will not normally contain text
+ //
+ // Having indentified the masters, slides and notes + their orders,
+ // we have to go and find their matching records
+ // We always use the latest versions of these records, and use the
+ // SlideAtom/NotesAtom to match them with the StyleAtomSet
+
+ SlideListWithText masterSLWT = _documentRecord.getMasterSlideListWithText();
+ SlideListWithText slidesSLWT = _documentRecord.getSlideSlideListWithText();
+ SlideListWithText notesSLWT = _documentRecord.getNotesSlideListWithText();
+
+ // Find master slides
+ // These can be MainMaster records, but oddly they can also be
+ // Slides or Notes, and possibly even other odd stuff....
+ // About the only thing you can say is that the master details are in
+ // the first SLWT.
+ SlideAtomsSet[] masterSets = new SlideAtomsSet[0];
+ if (masterSLWT != null) {
+ masterSets = masterSLWT.getSlideAtomsSets();
+
+ ArrayList mmr = new ArrayList();
+ ArrayList tmr = new ArrayList();
+
+ for (int i = 0; i < masterSets.length; i++) {
+ Record r = getCoreRecordForSAS(masterSets[i]);
+ SlideAtomsSet sas = masterSets[i];
+ int sheetNo = sas.getSlidePersistAtom().getSlideIdentifier();
+ if (r instanceof org.apache.poi.hslf.record.Slide) {
+ TitleMaster master = new TitleMaster((org.apache.poi.hslf.record.Slide) r,
+ sheetNo);
+ master.setSlideShow(this);
+ tmr.add(master);
+ } else if (r instanceof org.apache.poi.hslf.record.MainMaster) {
+ SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster) r,
+ sheetNo);
+ master.setSlideShow(this);
+ mmr.add(master);
+ }
+ }
+ _masters = new SlideMaster[mmr.size()];
+ mmr.toArray(_masters);
- // Having sorted out the masters, that leaves the notes and slides
+ _titleMasters = new TitleMaster[tmr.size()];
+ tmr.toArray(_titleMasters);
+ }
- // Start by finding the notes records to go with the entries in
- // notesSLWT
- org.apache.poi.hslf.record.Notes[] notesRecords;
- SlideAtomsSet[] notesSets = new SlideAtomsSet[0];
- Hashtable slideIdToNotes = new Hashtable();
- if(notesSLWT == null) {
- // None
- notesRecords = new org.apache.poi.hslf.record.Notes[0];
- } else {
- // Match up the records and the SlideAtomSets
- notesSets = notesSLWT.getSlideAtomsSets();
- ArrayList notesRecordsL = new ArrayList();
- for(int i=0; i<notesSets.length; i++) {
- // Get the right core record
- Record r = getCoreRecordForSAS(notesSets[i]);
+ // Having sorted out the masters, that leaves the notes and slides
- // Ensure it really is a notes record
- if(r instanceof org.apache.poi.hslf.record.Notes) {
- org.apache.poi.hslf.record.Notes notesRecord = (org.apache.poi.hslf.record.Notes)r;
- notesRecordsL.add( notesRecord );
+ // Start by finding the notes records to go with the entries in
+ // notesSLWT
+ org.apache.poi.hslf.record.Notes[] notesRecords;
+ SlideAtomsSet[] notesSets = new SlideAtomsSet[0];
+ Hashtable slideIdToNotes = new Hashtable();
+ if (notesSLWT == null) {
+ // None
+ notesRecords = new org.apache.poi.hslf.record.Notes[0];
+ } else {
+ // Match up the records and the SlideAtomSets
+ notesSets = notesSLWT.getSlideAtomsSets();
+ ArrayList notesRecordsL = new ArrayList();
+ for (int i = 0; i < notesSets.length; i++) {
+ // Get the right core record
+ Record r = getCoreRecordForSAS(notesSets[i]);
+
+ // Ensure it really is a notes record
+ if (r instanceof org.apache.poi.hslf.record.Notes) {
+ org.apache.poi.hslf.record.Notes notesRecord = (org.apache.poi.hslf.record.Notes) r;
+ notesRecordsL.add(notesRecord);
+
+ // Record the match between slide id and these notes
+ SlidePersistAtom spa = notesSets[i].getSlidePersistAtom();
+ Integer slideId = new Integer(spa.getSlideIdentifier());
+ slideIdToNotes.put(slideId, new Integer(i));
+ } else {
+ logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i
+ + " said its record was at refID "
+ + notesSets[i].getSlidePersistAtom().getRefID()
+ + ", but that was actually a " + r);
+ }
+ }
+ notesRecords = new org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
+ notesRecords = (org.apache.poi.hslf.record.Notes[]) notesRecordsL.toArray(notesRecords);
+ }
- // Record the match between slide id and these notes
- SlidePersistAtom spa = notesSets[i].getSlidePersistAtom();
- Integer slideId = new Integer(spa.getSlideIdentifier());
- slideIdToNotes.put(slideId, new Integer(i));
- } else {
- logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i + " said its record was at refID " + notesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+ // Now, do the same thing for our slides
+ org.apache.poi.hslf.record.Slide[] slidesRecords;
+ SlideAtomsSet[] slidesSets = new SlideAtomsSet[0];
+ if (slidesSLWT == null) {
+ // None
+ slidesRecords = new org.apache.poi.hslf.record.Slide[0];
+ } else {
+ // Match up the records and the SlideAtomSets
+ slidesSets = slidesSLWT.getSlideAtomsSets();
+ slidesRecords = new org.apache.poi.hslf.record.Slide[slidesSets.length];
+ for (int i = 0; i < slidesSets.length; i++) {
+ // Get the right core record
+ Record r = getCoreRecordForSAS(slidesSets[i]);
+
+ // Ensure it really is a slide record
+ if (r instanceof org.apache.poi.hslf.record.Slide) {
+ slidesRecords[i] = (org.apache.poi.hslf.record.Slide) r;
+ } else {
+ logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i
+ + " said its record was at refID "
+ + slidesSets[i].getSlidePersistAtom().getRefID()
+ + ", but that was actually a " + r);
+ }
}
}
- notesRecords = new org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
- notesRecords = (org.apache.poi.hslf.record.Notes[])
- notesRecordsL.toArray(notesRecords);
- }
- // Now, do the same thing for our slides
- org.apache.poi.hslf.record.Slide[] slidesRecords;
- SlideAtomsSet[] slidesSets = new SlideAtomsSet[0];
- if(slidesSLWT == null) {
- // None
- slidesRecords = new org.apache.poi.hslf.record.Slide[0];
- } else {
- // Match up the records and the SlideAtomSets
- slidesSets = slidesSLWT.getSlideAtomsSets();
- slidesRecords = new org.apache.poi.hslf.record.Slide[slidesSets.length];
- for(int i=0; i<slidesSets.length; i++) {
- // Get the right core record
- Record r = getCoreRecordForSAS(slidesSets[i]);
-
- // Ensure it really is a slide record
- if(r instanceof org.apache.poi.hslf.record.Slide) {
- slidesRecords[i] = (org.apache.poi.hslf.record.Slide)r;
- } else {
- logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+ // Finally, generate model objects for everything
+ // Notes first
+ _notes = new Notes[notesRecords.length];
+ for (int i = 0; i < _notes.length; i++) {
+ _notes[i] = new Notes(notesRecords[i]);
+ _notes[i].setSlideShow(this);
+ }
+ // Then slides
+ _slides = new Slide[slidesRecords.length];
+ for (int i = 0; i < _slides.length; i++) {
+ SlideAtomsSet sas = slidesSets[i];
+ int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier();
+
+ // Do we have a notes for this?
+ Notes notes = null;
+ // Slide.SlideAtom.notesId references the corresponding notes slide.
+ // 0 if slide has no notes.
+ int noteId = slidesRecords[i].getSlideAtom().getNotesID();
+ if (noteId != 0) {
+ Integer notesPos = (Integer) slideIdToNotes.get(new Integer(noteId));
+ if (notesPos != null)
+ notes = _notes[notesPos.intValue()];
+ else
+ logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
}
+
+ // Now, build our slide
+ _slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1));
+ _slides[i].setSlideShow(this);
}
}
- // Finally, generate model objects for everything
- // Notes first
- _notes = new Notes[notesRecords.length];
- for(int i=0; i<_notes.length; i++) {
- _notes[i] = new Notes(notesRecords[i]);
- _notes[i].setSlideShow(this);
- }
- // Then slides
- _slides = new Slide[slidesRecords.length];
- for(int i=0; i<_slides.length; i++) {
- SlideAtomsSet sas = slidesSets[i];
- int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier();
-
- // Do we have a notes for this?
- Notes notes = null;
- //Slide.SlideAtom.notesId references the corresponding notes slide. 0 if slide has no notes.
- int noteId = slidesRecords[i].getSlideAtom().getNotesID();
- if (noteId != 0){
- Integer notesPos = (Integer)slideIdToNotes.get(new Integer(noteId));
- if (notesPos != null) notes = _notes[notesPos.intValue()];
- else logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
- }
-
- // Now, build our slide
- _slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i+1));
- _slides[i].setSlideShow(this);
+ /**
+ * Writes out the slideshow file the is represented by an instance of this
+ * class
+ *
+ * @param out
+ * The OutputStream to write to.
+ * @throws IOException
+ * If there is an unexpected IOException from the passed in
+ * OutputStream
+ */
+ public void write(OutputStream out) throws IOException {
+ _hslfSlideShow.write(out);
}
- }
-
- /**
- * Writes out the slideshow file the is represented by an instance of
- * this class
- * @param out The OutputStream to write to.
- * @throws IOException If there is an unexpected IOException from the passed
- * in OutputStream
- */
- public void write(OutputStream out) throws IOException {
- _hslfSlideShow.write(out);
- }
-
-
- /* ===============================================================
- * Accessor Code
- * ===============================================================
- */
+ /*
+ * ===============================================================
+ * Accessor Code
+ * ===============================================================
+ */
/**
* Returns an array of the most recent version of all the interesting
- * records
+ * records
*/
- public Record[] getMostRecentCoreRecords() { return _mostRecentCoreRecords; }
+ public Record[] getMostRecentCoreRecords() {
+ return _mostRecentCoreRecords;
+ }
/**
* Returns an array of all the normal Slides found in the slideshow
*/
- public Slide[] getSlides() { return _slides; }
+ public Slide[] getSlides() {
+ return _slides;
+ }
/**
* Returns an array of all the normal Notes found in the slideshow
*/
- public Notes[] getNotes() { return _notes; }
+ public Notes[] getNotes() {
+ return _notes;
+ }
/**
- * Returns an array of all the normal Slide Masters found in the slideshow
+ * Returns an array of all the normal Slide Masters found in the slideshow
*/
- public SlideMaster[] getSlidesMasters() { return _masters; }
+ public SlideMaster[] getSlidesMasters() {
+ return _masters;
+ }
+
+ /**
+ * Returns an array of all the normal Title Masters found in the slideshow
+ */
+ public TitleMaster[] getTitleMasters() {
+ return _titleMasters;
+ }
- /**
- * Returns an array of all the normal Title Masters found in the slideshow
- */
- public TitleMaster[] getTitleMasters() { return _titleMasters; }
/**
* Returns the data of all the pictures attached to the SlideShow
*/
return _hslfSlideShow.getPictures();
}
- /**
- * Returns the data of all the embedded OLE object in the SlideShow
- */
- public ObjectData[] getEmbeddedObjects() {
- return _hslfSlideShow.getEmbeddedObjects();
- }
+ /**
+ * Returns the data of all the embedded OLE object in the SlideShow
+ */
+ public ObjectData[] getEmbeddedObjects() {
+ return _hslfSlideShow.getEmbeddedObjects();
+ }
- /**
- * Returns the data of all the embedded sounds in the SlideShow
- */
- public SoundData[] getSoundData() {
- return SoundData.find(_documentRecord);
- }
+ /**
+ * Returns the data of all the embedded sounds in the SlideShow
+ */
+ public SoundData[] getSoundData() {
+ return SoundData.find(_documentRecord);
+ }
/**
* Return the current page size
*/
- public Dimension getPageSize(){
+ public Dimension getPageSize() {
DocumentAtom docatom = _documentRecord.getDocumentAtom();
- int pgx = (int)docatom.getSlideSizeX()*Shape.POINT_DPI/Shape.MASTER_DPI;
- int pgy = (int)docatom.getSlideSizeY()*Shape.POINT_DPI/Shape.MASTER_DPI;
+ int pgx = (int) docatom.getSlideSizeX() * Shape.POINT_DPI / Shape.MASTER_DPI;
+ int pgy = (int) docatom.getSlideSizeY() * Shape.POINT_DPI / Shape.MASTER_DPI;
return new Dimension(pgx, pgy);
}
/**
* Change the current page size
*
- * @param pgsize page size (in points)
+ * @param pgsize
+ * page size (in points)
*/
- public void setPageSize(Dimension pgsize){
+ public void setPageSize(Dimension pgsize) {
DocumentAtom docatom = _documentRecord.getDocumentAtom();
- docatom.setSlideSizeX(pgsize.width*Shape.MASTER_DPI/Shape.POINT_DPI);
- docatom.setSlideSizeY(pgsize.height*Shape.MASTER_DPI/Shape.POINT_DPI);
+ docatom.setSlideSizeX(pgsize.width * Shape.MASTER_DPI / Shape.POINT_DPI);
+ docatom.setSlideSizeY(pgsize.height * Shape.MASTER_DPI / Shape.POINT_DPI);
}
/**
* Helper method for usermodel: Get the font collection
*/
- protected FontCollection getFontCollection() { return _fonts; }
+ protected FontCollection getFontCollection() {
+ return _fonts;
+ }
+
/**
* Helper method for usermodel and model: Get the document record
*/
- public Document getDocumentRecord() { return _documentRecord; }
-
+ public Document getDocumentRecord() {
+ return _documentRecord;
+ }
- /* ===============================================================
- * Re-ordering Code
+ /*
+ * ===============================================================
+ * Re-ordering Code
* ===============================================================
*/
-
/**
* Re-orders a slide, to a new position.
- * @param oldSlideNumber The old slide number (1 based)
- * @param newSlideNumber The new slide number (1 based)
+ *
+ * @param oldSlideNumber
+ * The old slide number (1 based)
+ * @param newSlideNumber
+ * The new slide number (1 based)
*/
public void reorderSlide(int oldSlideNumber, int newSlideNumber) {
// Ensure these numbers are valid
- if(oldSlideNumber < 1 || newSlideNumber < 1) {
+ if (oldSlideNumber < 1 || newSlideNumber < 1) {
throw new IllegalArgumentException("Old and new slide numbers must be greater than 0");
}
- if(oldSlideNumber > _slides.length || newSlideNumber > _slides.length) {
- throw new IllegalArgumentException("Old and new slide numbers must not exceed the number of slides (" + _slides.length + ")");
+ if (oldSlideNumber > _slides.length || newSlideNumber > _slides.length) {
+ throw new IllegalArgumentException(
+ "Old and new slide numbers must not exceed the number of slides ("
+ + _slides.length + ")");
}
- // The order of slides is defined by the order of slide atom sets in the SlideListWithText container.
- SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
- SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
-
- SlideAtomsSet tmp = sas[oldSlideNumber-1];
- sas[oldSlideNumber-1] = sas[newSlideNumber-1];
- sas[newSlideNumber-1] = tmp;
-
- ArrayList lst = new ArrayList();
- for (int i = 0; i < sas.length; i++) {
- lst.add(sas[i].getSlidePersistAtom());
- Record[] r = sas[i].getSlideRecords();
- for (int j = 0; j < r.length; j++) {
- lst.add(r[j]);
- }
- _slides[i].setSlideNumber(i+1);
- }
- Record[] r = (Record[])lst.toArray(new Record[lst.size()]);
- slwt.setChildRecord(r);
+ // The order of slides is defined by the order of slide atom sets in the
+ // SlideListWithText container.
+ SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+ SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
+
+ SlideAtomsSet tmp = sas[oldSlideNumber - 1];
+ sas[oldSlideNumber - 1] = sas[newSlideNumber - 1];
+ sas[newSlideNumber - 1] = tmp;
+
+ ArrayList lst = new ArrayList();
+ for (int i = 0; i < sas.length; i++) {
+ lst.add(sas[i].getSlidePersistAtom());
+ Record[] r = sas[i].getSlideRecords();
+ for (int j = 0; j < r.length; j++) {
+ lst.add(r[j]);
+ }
+ _slides[i].setSlideNumber(i + 1);
+ }
+ Record[] r = (Record[]) lst.toArray(new Record[lst.size()]);
+ slwt.setChildRecord(r);
}
- /**
- * Removes the slide at the given index (0-based).
- * <p>Shifts any subsequent slides to the left (subtracts one from their slide numbers).</p>
- *
- * @param index the index of the slide to remove (0-based)
- * @return the slide that was removed from the slide show.
- */
- public Slide removeSlide(int index) {
- int lastSlideIdx = _slides.length - 1;
- if(index < 0 || index > lastSlideIdx) {
- throw new IllegalArgumentException("Slide index ("
- + index +") is out of range (0.." + lastSlideIdx + ")");
- }
-
- SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
- SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
-
- Slide removedSlide = null;
- ArrayList<Record> records = new ArrayList<Record>();
- ArrayList<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>();
- ArrayList<Slide> sl = new ArrayList<Slide>();
-
- ArrayList<Notes> nt = new ArrayList<Notes>();
- for(Notes notes : getNotes()) nt.add(notes);
-
- for (int i = 0, num = 0; i < _slides.length; i++){
- if(i != index) {
- sl.add(_slides[i]);
- sa.add(sas[i]);
- _slides[i].setSlideNumber(num++);
- records.add(sas[i].getSlidePersistAtom());
- records.addAll(Arrays.asList(sas[i].getSlideRecords()));
- } else {
- removedSlide = _slides[i];
- nt.remove(_slides[i].getNotesSheet());
- }
- }
- if(sa.size() == 0){
- _documentRecord.removeSlideListWithText(slwt);
- } else {
- slwt.setSlideAtomsSets( sa.toArray(new SlideAtomsSet[sa.size()]) );
- slwt.setChildRecord(records.toArray(new Record[records.size()]));
- }
- _slides = sl.toArray(new Slide[sl.size()]);
-
- //if the removed slide had notes - remove references to them too
-
- if(removedSlide != null){
- int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
- if(notesId != 0){
- SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
- records = new ArrayList<Record>();
- ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
- for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()){
- if(ns.getSlidePersistAtom().getSlideIdentifier() != notesId) {
- na.add(ns);
- records.add(ns.getSlidePersistAtom());
- if(ns.getSlideRecords() != null) records.addAll(Arrays.asList(ns.getSlideRecords()));
- }
- }
- if(na.size() == 0){
- _documentRecord.removeSlideListWithText(nslwt);
- } else {
- nslwt.setSlideAtomsSets( na.toArray(new SlideAtomsSet[na.size()]) );
- nslwt.setChildRecord(records.toArray(new Record[records.size()]));
- }
-
- }
- }
- _notes = nt.toArray(new Notes[nt.size()]);
-
- return removedSlide;
- }
-
- /* ===============================================================
- * Addition Code
- * ===============================================================
+ /**
+ * Removes the slide at the given index (0-based).
+ * <p>
+ * Shifts any subsequent slides to the left (subtracts one from their slide
+ * numbers).
+ * </p>
+ *
+ * @param index
+ * the index of the slide to remove (0-based)
+ * @return the slide that was removed from the slide show.
*/
+ public Slide removeSlide(int index) {
+ int lastSlideIdx = _slides.length - 1;
+ if (index < 0 || index > lastSlideIdx) {
+ throw new IllegalArgumentException("Slide index (" + index + ") is out of range (0.."
+ + lastSlideIdx + ")");
+ }
+ SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+ SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
+
+ Slide removedSlide = null;
+ ArrayList<Record> records = new ArrayList<Record>();
+ ArrayList<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>();
+ ArrayList<Slide> sl = new ArrayList<Slide>();
+
+ ArrayList<Notes> nt = new ArrayList<Notes>();
+ for (Notes notes : getNotes())
+ nt.add(notes);
+
+ for (int i = 0, num = 0; i < _slides.length; i++) {
+ if (i != index) {
+ sl.add(_slides[i]);
+ sa.add(sas[i]);
+ _slides[i].setSlideNumber(num++);
+ records.add(sas[i].getSlidePersistAtom());
+ records.addAll(Arrays.asList(sas[i].getSlideRecords()));
+ } else {
+ removedSlide = _slides[i];
+ nt.remove(_slides[i].getNotesSheet());
+ }
+ }
+ if (sa.size() == 0) {
+ _documentRecord.removeSlideListWithText(slwt);
+ } else {
+ slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()]));
+ slwt.setChildRecord(records.toArray(new Record[records.size()]));
+ }
+ _slides = sl.toArray(new Slide[sl.size()]);
+
+ // if the removed slide had notes - remove references to them too
+
+ if (removedSlide != null) {
+ int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
+ if (notesId != 0) {
+ SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
+ records = new ArrayList<Record>();
+ ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
+ for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()) {
+ if (ns.getSlidePersistAtom().getSlideIdentifier() != notesId) {
+ na.add(ns);
+ records.add(ns.getSlidePersistAtom());
+ if (ns.getSlideRecords() != null)
+ records.addAll(Arrays.asList(ns.getSlideRecords()));
+ }
+ }
+ if (na.size() == 0) {
+ _documentRecord.removeSlideListWithText(nslwt);
+ } else {
+ nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()]));
+ nslwt.setChildRecord(records.toArray(new Record[records.size()]));
+ }
+
+ }
+ }
+ _notes = nt.toArray(new Notes[nt.size()]);
+
+ return removedSlide;
+ }
+
+ /*
+ * ===============================================================
+ * Addition Code
+ * ===============================================================
+ */
/**
* Create a blank <code>Slide</code>.
*
- * @return the created <code>Slide</code>
+ * @return the created <code>Slide</code>
*/
- public Slide createSlide() {
- SlideListWithText slist = null;
-
- // We need to add the records to the SLWT that deals
- // with Slides.
- // Add it, if it doesn't exist
- slist = _documentRecord.getSlideSlideListWithText();
- if(slist == null) {
- // Need to add a new one
- slist = new SlideListWithText();
- slist.setInstance(SlideListWithText.SLIDES);
- _documentRecord.addSlideListWithText(slist);
- }
-
- // Grab the SlidePersistAtom with the highest Slide Number.
- // (Will stay as null if no SlidePersistAtom exists yet in
- // the slide, or only master slide's ones do)
- SlidePersistAtom prev = null;
+ public Slide createSlide() {
+ SlideListWithText slist = null;
+
+ // We need to add the records to the SLWT that deals
+ // with Slides.
+ // Add it, if it doesn't exist
+ slist = _documentRecord.getSlideSlideListWithText();
+ if (slist == null) {
+ // Need to add a new one
+ slist = new SlideListWithText();
+ slist.setInstance(SlideListWithText.SLIDES);
+ _documentRecord.addSlideListWithText(slist);
+ }
+
+ // Grab the SlidePersistAtom with the highest Slide Number.
+ // (Will stay as null if no SlidePersistAtom exists yet in
+ // the slide, or only master slide's ones do)
+ SlidePersistAtom prev = null;
SlideAtomsSet[] sas = slist.getSlideAtomsSets();
- for(int j=0; j<sas.length; j++) {
- SlidePersistAtom spa = sas[j].getSlidePersistAtom();
- if(spa.getSlideIdentifier() < 0) {
- // This is for a master slide
- // Odd, since we only deal with the Slide SLWT
- } else {
+ for (int j = 0; j < sas.length; j++) {
+ SlidePersistAtom spa = sas[j].getSlidePersistAtom();
+ if (spa.getSlideIdentifier() < 0) {
+ // This is for a master slide
+ // Odd, since we only deal with the Slide SLWT
+ } else {
// Must be for a real slide
- if(prev == null) { prev = spa; }
- if(prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
- prev = spa;
- }
- }
- }
-
- // Set up a new SlidePersistAtom for this slide
- SlidePersistAtom sp = new SlidePersistAtom();
-
- // First slideId is always 256
- sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
-
- // Add this new SlidePersistAtom to the SlideListWithText
- slist.addSlidePersistAtom(sp);
-
-
- // Create a new Slide
- Slide slide = new Slide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length+1);
- slide.setSlideShow(this);
- slide.onCreate();
-
- // Add in to the list of Slides
- Slide[] s = new Slide[_slides.length+1];
- System.arraycopy(_slides, 0, s, 0, _slides.length);
- s[_slides.length] = slide;
- _slides = s;
- logger.log(POILogger.INFO, "Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
-
- // Add the core records for this new Slide to the record tree
- org.apache.poi.hslf.record.Slide slideRecord = slide.getSlideRecord();
- int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
- _records = _hslfSlideShow.getRecords();
-
-
- // Add the new Slide into the PersistPtr stuff
- int offset = 0;
- int slideOffset = 0;
- PersistPtrHolder ptr = null;
- UserEditAtom usr = null;
- for (int i = 0; i < _records.length; i++) {
- Record record = _records[i];
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- record.writeOut(out);
- } catch (IOException e){
- throw new HSLFException(e);
- }
-
- // Grab interesting records as they come past
- if(_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID){
- ptr = (PersistPtrHolder)_records[i];
- }
- if(_records[i].getRecordType() == RecordTypes.UserEditAtom.typeID) {
- usr = (UserEditAtom)_records[i];
- }
-
- if(i == slideRecordPos) {
- slideOffset = offset;
- }
- offset += out.size();
- }
-
- // persist ID is UserEditAtom.maxPersistWritten + 1
- int psrId = usr.getMaxPersistWritten() + 1;
- sp.setRefID(psrId);
- slideRecord.setSheetId(psrId);
-
- // Last view is now of the slide
- usr.setLastViewType((short)UserEditAtom.LAST_VIEW_SLIDE_VIEW);
- usr.setMaxPersistWritten(psrId); //increment the number of persit objects
+ if (prev == null) {
+ prev = spa;
+ }
+ if (prev.getSlideIdentifier() < spa.getSlideIdentifier()) {
+ prev = spa;
+ }
+ }
+ }
+
+ // Set up a new SlidePersistAtom for this slide
+ SlidePersistAtom sp = new SlidePersistAtom();
+
+ // First slideId is always 256
+ sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1));
+
+ // Add this new SlidePersistAtom to the SlideListWithText
+ slist.addSlidePersistAtom(sp);
+
+ // Create a new Slide
+ Slide slide = new Slide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length + 1);
+ slide.setSlideShow(this);
+ slide.onCreate();
+
+ // Add in to the list of Slides
+ Slide[] s = new Slide[_slides.length + 1];
+ System.arraycopy(_slides, 0, s, 0, _slides.length);
+ s[_slides.length] = slide;
+ _slides = s;
+ logger.log(POILogger.INFO, "Added slide " + _slides.length + " with ref " + sp.getRefID()
+ + " and identifier " + sp.getSlideIdentifier());
+
+ // Add the core records for this new Slide to the record tree
+ org.apache.poi.hslf.record.Slide slideRecord = slide.getSlideRecord();
+ int slideRecordPos = _hslfSlideShow.appendRootLevelRecord(slideRecord);
+ _records = _hslfSlideShow.getRecords();
+
+ // Add the new Slide into the PersistPtr stuff
+ int offset = 0;
+ int slideOffset = 0;
+ PersistPtrHolder ptr = null;
+ UserEditAtom usr = null;
+ for (int i = 0; i < _records.length; i++) {
+ Record record = _records[i];
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ record.writeOut(out);
+ } catch (IOException e) {
+ throw new HSLFException(e);
+ }
+
+ // Grab interesting records as they come past
+ if (_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID) {
+ ptr = (PersistPtrHolder) _records[i];
+ }
+ if (_records[i].getRecordType() == RecordTypes.UserEditAtom.typeID) {
+ usr = (UserEditAtom) _records[i];
+ }
+
+ if (i == slideRecordPos) {
+ slideOffset = offset;
+ }
+ offset += out.size();
+ }
+
+ // persist ID is UserEditAtom.maxPersistWritten + 1
+ int psrId = usr.getMaxPersistWritten() + 1;
+ sp.setRefID(psrId);
+ slideRecord.setSheetId(psrId);
+
+ // Last view is now of the slide
+ usr.setLastViewType((short) UserEditAtom.LAST_VIEW_SLIDE_VIEW);
+ usr.setMaxPersistWritten(psrId); // increment the number of persit
+ // objects
// Add the new slide into the last PersistPtr
- // (Also need to tell it where it is)
+ // (Also need to tell it where it is)
slideRecord.setLastOnDiskOffset(slideOffset);
ptr.addSlideLookup(sp.getRefID(), slideOffset);
logger.log(POILogger.INFO, "New slide ended up at " + slideOffset);
- slide.setMasterSheet(_masters[0]);
- // All done and added
- return slide;
+ slide.setMasterSheet(_masters[0]);
+ // All done and added
+ return slide;
+ }
+
+ /**
+ * Adds a picture to this presentation and returns the associated index.
+ *
+ * @param data
+ * picture data
+ * @param format
+ * the format of the picture. One of constans defined in the
+ * <code>Picture</code> class.
+ * @return the index to this picture (1 based).
+ */
+ public int addPicture(byte[] data, int format) throws IOException {
+ byte[] uid = PictureData.getChecksum(data);
+
+ EscherContainerRecord bstore;
+
+ EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
+ bstore = (EscherContainerRecord) Shape.getEscherChild(dggContainer,
+ EscherContainerRecord.BSTORE_CONTAINER);
+ if (bstore == null) {
+ bstore = new EscherContainerRecord();
+ bstore.setRecordId(EscherContainerRecord.BSTORE_CONTAINER);
+
+ dggContainer.addChildBefore(bstore, EscherOptRecord.RECORD_ID);
+ } else {
+ Iterator<EscherRecord> iter = bstore.getChildIterator();
+ for (int i = 0; iter.hasNext(); i++) {
+ EscherBSERecord bse = (EscherBSERecord) iter.next();
+ if (Arrays.equals(bse.getUid(), uid)) {
+ return i + 1;
+ }
+ }
+ }
+
+ PictureData pict = PictureData.create(format);
+ pict.setData(data);
+
+ int offset = _hslfSlideShow.addPicture(pict);
+
+ EscherBSERecord bse = new EscherBSERecord();
+ bse.setRecordId(EscherBSERecord.RECORD_ID);
+ bse.setOptions((short) (0x0002 | (format << 4)));
+ bse.setSize(pict.getRawData().length + 8);
+ bse.setUid(uid);
+
+ bse.setBlipTypeMacOS((byte) format);
+ bse.setBlipTypeWin32((byte) format);
+
+ if (format == Picture.EMF)
+ bse.setBlipTypeMacOS((byte) Picture.PICT);
+ else if (format == Picture.WMF)
+ bse.setBlipTypeMacOS((byte) Picture.PICT);
+ else if (format == Picture.PICT)
+ bse.setBlipTypeWin32((byte) Picture.WMF);
+
+ bse.setRef(0);
+ bse.setOffset(offset);
+ bse.setRemainingData(new byte[0]);
+
+ bstore.addChildRecord(bse);
+ int count = bstore.getChildRecords().size();
+ bstore.setOptions((short) ((count << 4) | 0xF));
+
+ return count;
}
- /**
- * Adds a picture to this presentation and returns the associated index.
- *
- * @param data picture data
- * @param format the format of the picture. One of constans defined in the <code>Picture</code> class.
- * @return the index to this picture (1 based).
- */
- public int addPicture(byte[] data, int format) throws IOException {
- byte[] uid = PictureData.getChecksum(data);
-
- EscherContainerRecord bstore;
-
- EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
- bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
- if (bstore == null){
- bstore = new EscherContainerRecord();
- bstore.setRecordId( EscherContainerRecord.BSTORE_CONTAINER);
-
- dggContainer.addChildBefore(bstore, EscherOptRecord.RECORD_ID);
- } else {
- Iterator<EscherRecord> iter = bstore.getChildIterator();
- for (int i = 0; iter.hasNext(); i++) {
- EscherBSERecord bse = (EscherBSERecord) iter.next();
- if (Arrays.equals(bse.getUid(), uid)){
- return i + 1;
- }
- }
- }
-
- PictureData pict = PictureData.create(format);
- pict.setData(data);
-
- int offset = _hslfSlideShow.addPicture(pict);
-
- EscherBSERecord bse = new EscherBSERecord();
- bse.setRecordId(EscherBSERecord.RECORD_ID);
- bse.setOptions( (short) ( 0x0002 | ( format << 4 ) ) );
- bse.setSize(pict.getRawData().length + 8);
- bse.setUid(uid);
-
- bse.setBlipTypeMacOS((byte)format);
- bse.setBlipTypeWin32((byte)format);
-
- if (format == Picture.EMF) bse.setBlipTypeMacOS((byte)Picture.PICT);
- else if (format == Picture.WMF) bse.setBlipTypeMacOS((byte)Picture.PICT);
- else if (format == Picture.PICT) bse.setBlipTypeWin32((byte)Picture.WMF);
-
- bse.setRef(0);
- bse.setOffset(offset);
- bse.setRemainingData( new byte[0] );
-
- bstore.addChildRecord(bse);
- int count = bstore.getChildRecords().size();
- bstore.setOptions((short)( (count << 4) | 0xF ));
-
- return count;
- }
-
- /**
- * Adds a picture to this presentation and returns the associated index.
- *
- * @param pict the file containing the image to add
- * @param format the format of the picture. One of constans defined in the <code>Picture</code> class.
- * @return the index to this picture (1 based).
- */
- public int addPicture(File pict, int format) throws IOException {
- int length = (int)pict.length();
- byte[] data = new byte[length];
- try {
- FileInputStream is = new FileInputStream(pict);
- is.read(data);
- is.close();
- } catch (IOException e){
- throw new HSLFException(e);
- }
- return addPicture(data, format);
- }
-
- /**
- * Add a font in this presentation
- *
- * @param font the font to add
- * @return 0-based index of the font
- */
- public int addFont(PPFont font) {
- FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
- int idx = fonts.getFontIndex(font.getFontName());
- if(idx == -1){
- idx = fonts.addFont(font.getFontName(), font.getCharSet(), font.getFontFlags(), font.getFontType(), font.getPitchAndFamily());
- }
- return idx;
- }
-
- /**
- * Get a font by index
- *
- * @param idx 0-based index of the font
- * @return of an instance of <code>PPFont</code> or <code>null</code> if not found
- */
- public PPFont getFont(int idx) {
- PPFont font = null;
- FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
- Record[] ch = fonts.getChildRecords();
- for (int i = 0; i < ch.length; i++) {
- if(ch[i] instanceof FontEntityAtom) {
- FontEntityAtom atom = (FontEntityAtom)ch[i];
- if(atom.getFontIndex() == idx){
- font = new PPFont(atom);
- break;
- }
- }
- }
- return font;
- }
-
- /**
- * get the number of fonts in the presentation
- *
- * @return number of fonts
- */
- public int getNumberOfFonts() {
- return getDocumentRecord().getEnvironment().getFontCollection().getNumberOfFonts();
- }
-
- /**
- * Return Header / Footer settings for slides
- *
- * @return Header / Footer settings for slides
- */
- public HeadersFooters getSlideHeadersFooters(){
- //detect if this ppt was saved in Office2007
- String tag = getSlidesMasters()[0].getProgrammableTag();
- boolean ppt2007 = "___PPT12".equals(tag);
-
- HeadersFootersContainer hdd = null;
- Record[] ch = _documentRecord.getChildRecords();
- for (int i = 0; i < ch.length; i++) {
- if(ch[i] instanceof HeadersFootersContainer &&
- ((HeadersFootersContainer)ch[i]).getOptions() == HeadersFootersContainer.SlideHeadersFootersContainer){
- hdd = (HeadersFootersContainer)ch[i];
- break;
- }
- }
- boolean newRecord = false;
- if(hdd == null) {
- hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
- newRecord = true;
- }
- return new HeadersFooters(hdd, this, newRecord, ppt2007);
- }
-
- /**
- * Return Header / Footer settings for notes
- *
- * @return Header / Footer settings for notes
- */
- public HeadersFooters getNotesHeadersFooters(){
- //detect if this ppt was saved in Office2007
- String tag = getSlidesMasters()[0].getProgrammableTag();
- boolean ppt2007 = "___PPT12".equals(tag);
-
- HeadersFootersContainer hdd = null;
- Record[] ch = _documentRecord.getChildRecords();
- for (int i = 0; i < ch.length; i++) {
- if(ch[i] instanceof HeadersFootersContainer &&
- ((HeadersFootersContainer)ch[i]).getOptions() == HeadersFootersContainer.NotesHeadersFootersContainer){
- hdd = (HeadersFootersContainer)ch[i];
- break;
- }
- }
- boolean newRecord = false;
- if(hdd == null) {
- hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
- newRecord = true;
- }
- if(ppt2007 && _notes.length > 0){
- return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007);
- } else {
- return new HeadersFooters(hdd, this, newRecord, ppt2007);
- }
- }
-
- /**
- * Add a movie in this presentation
- *
- * @param path the path or url to the movie
- * @return 0-based index of the movie
- */
- public int addMovie(String path, int type) {
- ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
- if(lst == null){
- lst = new ExObjList();
- _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
- }
-
- ExObjListAtom objAtom = lst.getExObjListAtom();
- //increment the object ID seed
- int objectId = (int)objAtom.getObjectIDSeed() + 1;
- objAtom.setObjectIDSeed(objectId);
- ExMCIMovie mci;
- switch (type){
- case MovieShape.MOVIE_MPEG:
- mci = new ExMCIMovie();
- break;
- case MovieShape.MOVIE_AVI:
- mci = new ExAviMovie();
- break;
- default:
- throw new IllegalArgumentException("Unsupported Movie: " + type);
- }
-
- lst.appendChildRecord(mci);
- ExVideoContainer exVideo = mci.getExVideo();
- exVideo.getExMediaAtom().setObjectId(objectId);
- exVideo.getExMediaAtom().setMask(0xE80000);
- exVideo.getPathAtom().setText(path);
- return objectId;
- }
-
- /**
- * Add a control in this presentation
- *
- * @param name name of the control, e.g. "Shockwave Flash Object"
- * @param progId OLE Programmatic Identifier, e.g. "ShockwaveFlash.ShockwaveFlash.9"
- * @return 0-based index of the control
- */
- public int addControl(String name, String progId) {
- ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
- if (lst == null) {
- lst = new ExObjList();
- _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
- }
- ExObjListAtom objAtom = lst.getExObjListAtom();
- //increment the object ID seed
- int objectId = (int) objAtom.getObjectIDSeed() + 1;
- objAtom.setObjectIDSeed(objectId);
- ExControl ctrl = new ExControl();
- ExOleObjAtom oleObj = ctrl.getExOleObjAtom();
- oleObj.setObjID(objectId);
- oleObj.setDrawAspect(ExOleObjAtom.DRAW_ASPECT_VISIBLE);
- oleObj.setType(ExOleObjAtom.TYPE_CONTROL);
- oleObj.setSubType(ExOleObjAtom.SUBTYPE_DEFAULT);
-
- ctrl.setProgId(progId);
- ctrl.setMenuName(name);
- ctrl.setClipboardName(name);
- lst.addChildAfter(ctrl, objAtom);
-
- return objectId;
- }
-
- /**
- * Add a hyperlink to this presentation
- *
- * @return 0-based index of the hyperlink
- */
- public int addHyperlink(Hyperlink link) {
- ExObjList lst = (ExObjList)_documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
- if (lst == null) {
- lst = new ExObjList();
- _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
- }
- ExObjListAtom objAtom = lst.getExObjListAtom();
- //increment the object ID seed
- int objectId = (int) objAtom.getObjectIDSeed() + 1;
- objAtom.setObjectIDSeed(objectId);
-
- ExHyperlink ctrl = new ExHyperlink();
- ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom();
- obj.setNumber(objectId);
- ctrl.setLinkURL(link.getAddress());
- ctrl.setLinkTitle(link.getTitle());
- lst.addChildAfter(ctrl, objAtom);
- link.setId(objectId);
-
- return objectId;
- }
+ /**
+ * Adds a picture to this presentation and returns the associated index.
+ *
+ * @param pict
+ * the file containing the image to add
+ * @param format
+ * the format of the picture. One of constans defined in the
+ * <code>Picture</code> class.
+ * @return the index to this picture (1 based).
+ */
+ public int addPicture(File pict, int format) throws IOException {
+ int length = (int) pict.length();
+ byte[] data = new byte[length];
+ try {
+ FileInputStream is = new FileInputStream(pict);
+ is.read(data);
+ is.close();
+ } catch (IOException e) {
+ throw new HSLFException(e);
+ }
+ return addPicture(data, format);
+ }
+
+ /**
+ * Add a font in this presentation
+ *
+ * @param font
+ * the font to add
+ * @return 0-based index of the font
+ */
+ public int addFont(PPFont font) {
+ FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
+ int idx = fonts.getFontIndex(font.getFontName());
+ if (idx == -1) {
+ idx = fonts.addFont(font.getFontName(), font.getCharSet(), font.getFontFlags(), font
+ .getFontType(), font.getPitchAndFamily());
+ }
+ return idx;
+ }
+
+ /**
+ * Get a font by index
+ *
+ * @param idx
+ * 0-based index of the font
+ * @return of an instance of <code>PPFont</code> or <code>null</code> if not
+ * found
+ */
+ public PPFont getFont(int idx) {
+ PPFont font = null;
+ FontCollection fonts = getDocumentRecord().getEnvironment().getFontCollection();
+ Record[] ch = fonts.getChildRecords();
+ for (int i = 0; i < ch.length; i++) {
+ if (ch[i] instanceof FontEntityAtom) {
+ FontEntityAtom atom = (FontEntityAtom) ch[i];
+ if (atom.getFontIndex() == idx) {
+ font = new PPFont(atom);
+ break;
+ }
+ }
+ }
+ return font;
+ }
+
+ /**
+ * get the number of fonts in the presentation
+ *
+ * @return number of fonts
+ */
+ public int getNumberOfFonts() {
+ return getDocumentRecord().getEnvironment().getFontCollection().getNumberOfFonts();
+ }
+
+ /**
+ * Return Header / Footer settings for slides
+ *
+ * @return Header / Footer settings for slides
+ */
+ public HeadersFooters getSlideHeadersFooters() {
+ // detect if this ppt was saved in Office2007
+ String tag = getSlidesMasters()[0].getProgrammableTag();
+ boolean ppt2007 = "___PPT12".equals(tag);
+
+ HeadersFootersContainer hdd = null;
+ Record[] ch = _documentRecord.getChildRecords();
+ for (int i = 0; i < ch.length; i++) {
+ if (ch[i] instanceof HeadersFootersContainer
+ && ((HeadersFootersContainer) ch[i]).getOptions() == HeadersFootersContainer.SlideHeadersFootersContainer) {
+ hdd = (HeadersFootersContainer) ch[i];
+ break;
+ }
+ }
+ boolean newRecord = false;
+ if (hdd == null) {
+ hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
+ newRecord = true;
+ }
+ return new HeadersFooters(hdd, this, newRecord, ppt2007);
+ }
+
+ /**
+ * Return Header / Footer settings for notes
+ *
+ * @return Header / Footer settings for notes
+ */
+ public HeadersFooters getNotesHeadersFooters() {
+ // detect if this ppt was saved in Office2007
+ String tag = getSlidesMasters()[0].getProgrammableTag();
+ boolean ppt2007 = "___PPT12".equals(tag);
+
+ HeadersFootersContainer hdd = null;
+ Record[] ch = _documentRecord.getChildRecords();
+ for (int i = 0; i < ch.length; i++) {
+ if (ch[i] instanceof HeadersFootersContainer
+ && ((HeadersFootersContainer) ch[i]).getOptions() == HeadersFootersContainer.NotesHeadersFootersContainer) {
+ hdd = (HeadersFootersContainer) ch[i];
+ break;
+ }
+ }
+ boolean newRecord = false;
+ if (hdd == null) {
+ hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
+ newRecord = true;
+ }
+ if (ppt2007 && _notes.length > 0) {
+ return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007);
+ } else {
+ return new HeadersFooters(hdd, this, newRecord, ppt2007);
+ }
+ }
+
+ /**
+ * Add a movie in this presentation
+ *
+ * @param path
+ * the path or url to the movie
+ * @return 0-based index of the movie
+ */
+ public int addMovie(String path, int type) {
+ ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+ if (lst == null) {
+ lst = new ExObjList();
+ _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+ }
+
+ ExObjListAtom objAtom = lst.getExObjListAtom();
+ // increment the object ID seed
+ int objectId = (int) objAtom.getObjectIDSeed() + 1;
+ objAtom.setObjectIDSeed(objectId);
+ ExMCIMovie mci;
+ switch (type) {
+ case MovieShape.MOVIE_MPEG:
+ mci = new ExMCIMovie();
+ break;
+ case MovieShape.MOVIE_AVI:
+ mci = new ExAviMovie();
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported Movie: " + type);
+ }
+
+ lst.appendChildRecord(mci);
+ ExVideoContainer exVideo = mci.getExVideo();
+ exVideo.getExMediaAtom().setObjectId(objectId);
+ exVideo.getExMediaAtom().setMask(0xE80000);
+ exVideo.getPathAtom().setText(path);
+ return objectId;
+ }
+
+ /**
+ * Add a control in this presentation
+ *
+ * @param name
+ * name of the control, e.g. "Shockwave Flash Object"
+ * @param progId
+ * OLE Programmatic Identifier, e.g.
+ * "ShockwaveFlash.ShockwaveFlash.9"
+ * @return 0-based index of the control
+ */
+ public int addControl(String name, String progId) {
+ ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+ if (lst == null) {
+ lst = new ExObjList();
+ _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+ }
+ ExObjListAtom objAtom = lst.getExObjListAtom();
+ // increment the object ID seed
+ int objectId = (int) objAtom.getObjectIDSeed() + 1;
+ objAtom.setObjectIDSeed(objectId);
+ ExControl ctrl = new ExControl();
+ ExOleObjAtom oleObj = ctrl.getExOleObjAtom();
+ oleObj.setObjID(objectId);
+ oleObj.setDrawAspect(ExOleObjAtom.DRAW_ASPECT_VISIBLE);
+ oleObj.setType(ExOleObjAtom.TYPE_CONTROL);
+ oleObj.setSubType(ExOleObjAtom.SUBTYPE_DEFAULT);
+
+ ctrl.setProgId(progId);
+ ctrl.setMenuName(name);
+ ctrl.setClipboardName(name);
+ lst.addChildAfter(ctrl, objAtom);
+
+ return objectId;
+ }
+
+ /**
+ * Add a hyperlink to this presentation
+ *
+ * @return 0-based index of the hyperlink
+ */
+ public int addHyperlink(Hyperlink link) {
+ ExObjList lst = (ExObjList) _documentRecord.findFirstOfType(RecordTypes.ExObjList.typeID);
+ if (lst == null) {
+ lst = new ExObjList();
+ _documentRecord.addChildAfter(lst, _documentRecord.getDocumentAtom());
+ }
+ ExObjListAtom objAtom = lst.getExObjListAtom();
+ // increment the object ID seed
+ int objectId = (int) objAtom.getObjectIDSeed() + 1;
+ objAtom.setObjectIDSeed(objectId);
+
+ ExHyperlink ctrl = new ExHyperlink();
+ ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom();
+ obj.setNumber(objectId);
+ ctrl.setLinkURL(link.getAddress());
+ ctrl.setLinkTitle(link.getTitle());
+ lst.addChildAfter(ctrl, objAtom);
+ link.setId(objectId);
+
+ return objectId;
+ }
}
package org.apache.poi.hwpf.model;
-import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.model.types.DOPAbstractType;
/**
*
* @author Ryan Ackley
*/
+public final class DocumentProperties extends DOPAbstractType {
-public final class DocumentProperties extends DOPAbstractType
-{
-
- public DocumentProperties(byte[] tableStream, int offset)
- {
- super.fillFields(tableStream, offset);
- }
+ public DocumentProperties(byte[] tableStream, int offset) {
+ super.fillFields(tableStream, offset);
+ }
}
package org.apache.poi.hwpf.model;
-import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.util.LittleEndian;
import java.util.ArrayList;
*
* @author Ryan Ackley
*/
-public final class PAPFormattedDiskPage extends FormattedDiskPage
-{
+public final class PAPFormattedDiskPage extends FormattedDiskPage {
private static final int BX_SIZE = 13;
private static final int FC_SIZE = 4;
package org.apache.poi.hwpf.model;
-import java.util.*;
import java.io.IOException;
import org.apache.poi.util.LittleEndian;
*
* @author Ryan Ackley
*/
-
-public final class StyleSheet implements HDFType
-{
+public final class StyleSheet implements HDFType {
public static final int NIL_STYLE = 4095;
private static final int PAP_TYPE = 1;
package org.apache.poi.hwpf.model;
-
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
import org.apache.poi.poifs.common.POIFSConstants;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
/**
- * The piece table for matching up character positions
- * to bits of text.
- * This mostly works in bytes, but the TextPieces
- * themselves work in characters. This does the icky
- * convertion.
+ * The piece table for matching up character positions to bits of text. This
+ * mostly works in bytes, but the TextPieces themselves work in characters. This
+ * does the icky convertion.
+ *
* @author Ryan Ackley
*/
-public final class TextPieceTable implements CharIndexTranslator
-{
- protected ArrayList _textPieces = new ArrayList();
- //int _multiple;
- int _cpMin;
-
- public TextPieceTable() {
- }
-
- public TextPieceTable(byte[] documentStream, byte[] tableStream, int offset,
- int size, int fcMin)
- throws UnsupportedEncodingException
- {
- // get our plex of PieceDescriptors
- PlexOfCps pieceTable = new PlexOfCps(tableStream, offset, size, PieceDescriptor.getSizeInBytes());
-
- int length = pieceTable.length();
- PieceDescriptor[] pieces = new PieceDescriptor[length];
-
- // iterate through piece descriptors raw bytes and create
- // PieceDescriptor objects
- for (int x = 0; x < length; x++)
- {
- GenericPropertyNode node = pieceTable.getProperty(x);
- pieces[x] = new PieceDescriptor(node.getBytes(), 0);
- }
-
-
- // Figure out the cp of the earliest text piece
- // Note that text pieces don't have to be stored in order!
- _cpMin = pieces[0].getFilePosition() - fcMin;
- for (int x = 0; x < pieces.length; x++) {
- int start = pieces[x].getFilePosition() - fcMin;
- if(start < _cpMin) {
- _cpMin = start;
- }
- }
-
-
- // using the PieceDescriptors, build our list of TextPieces.
- for (int x = 0; x < pieces.length; x++)
- {
- int start = pieces[x].getFilePosition();
- PropertyNode node = pieceTable.getProperty(x);
-
- // Grab the start and end, which are in characters
- int nodeStartChars = node.getStart();
- int nodeEndChars = node.getEnd();
-
- // What's the relationship between bytes and characters?
- boolean unicode = pieces[x].isUnicode();
- int multiple = 1;
- if (unicode) {
- multiple = 2;
- }
-
- // Figure out the length, in bytes and chars
- int textSizeChars = (nodeEndChars - nodeStartChars);
- int textSizeBytes = textSizeChars * multiple;
-
- // Grab the data that makes up the piece
- byte[] buf = new byte[textSizeBytes];
- System.arraycopy(documentStream, start, buf, 0, textSizeBytes);
-
- // And now build the piece
- _textPieces.add(new TextPiece(nodeStartChars, nodeEndChars, buf, pieces[x], node.getStart()));
- }
-
- // In the interest of our sanity, now sort the text pieces
- // into order, if they're not already
- TextPiece[] tp = (TextPiece[])
- _textPieces.toArray(new TextPiece[_textPieces.size()]);
- Arrays.sort(tp);
- for(int i=0; i<tp.length; i++) {
- _textPieces.set(i, tp[i]);
- }
- }
-
- public int getCpMin()
- {
- return _cpMin;
- }
-
- public List getTextPieces()
- {
- return _textPieces;
- }
-
- /**
- * Is the text at the given Character offset
- * unicode, or plain old ascii?
- * In a very evil fashion, you have to actually
- * know this to make sense of character and
- * paragraph properties :(
- * @param cp The character offset to check about
- */
- public boolean isUnicodeAtCharOffset(int cp) {
- boolean lastWas = false;
-
- Iterator it = _textPieces.iterator();
- while(it.hasNext()) {
- TextPiece tp = (TextPiece)it.next();
- // If the text piece covers the character, all good
- if(tp.getStart() <= cp && tp.getEnd() >= cp) {
- return tp.isUnicode();
- }
- // Otherwise keep track for the last one
- lastWas = tp.isUnicode();
- }
-
- // If they ask off the end, just go with the last one...
- return lastWas;
- }
-
- public boolean isUnicodeAtByteOffset(int bytePos) {
- boolean lastWas = false;
-
-
- Iterator it = _textPieces.iterator();
- while(it.hasNext()) {
- TextPiece tp = (TextPiece)it.next();
- int curByte = tp.getPieceDescriptor().getFilePosition();
- int pieceEnd = curByte + tp.bytesLength();
-
- // If the text piece covers the character, all good
- if(curByte <= bytePos && pieceEnd > bytePos) {
- return tp.isUnicode();
- }
- // Otherwise keep track for the last one
- lastWas = tp.isUnicode();
- // Move along
- curByte = pieceEnd;
- }
-
- // If they ask off the end, just go with the last one...
- return lastWas;
- }
-
- public byte[] writeTo(HWPFOutputStream docStream)
- throws IOException
- {
-
- PlexOfCps textPlex = new PlexOfCps(PieceDescriptor.getSizeInBytes());
- //int fcMin = docStream.getOffset();
-
- int size = _textPieces.size();
- for (int x = 0; x < size; x++)
- {
- TextPiece next = (TextPiece)_textPieces.get(x);
- PieceDescriptor pd = next.getPieceDescriptor();
-
- int offset = docStream.getOffset();
- int mod = (offset % POIFSConstants.BIG_BLOCK_SIZE);
- if (mod != 0)
- {
- mod = POIFSConstants.BIG_BLOCK_SIZE - mod;
- byte[] buf = new byte[mod];
- docStream.write(buf);
- }
-
-
- // set the text piece position to the current docStream offset.
- pd.setFilePosition(docStream.getOffset());
-
- // write the text to the docstream and save the piece descriptor to the
- // plex which will be written later to the tableStream.
- docStream.write(next.getRawBytes());
-
- // The TextPiece is already in characters, which
- // makes our life much easier
- int nodeStart = next.getStart();
- int nodeEnd = next.getEnd();
- textPlex.addProperty(new GenericPropertyNode(nodeStart, nodeEnd,
- pd.toByteArray()));
- }
-
- return textPlex.toByteArray();
-
- }
-
- /**
- * Adjust all the text piece after inserting
- * some text into one of them
- * @param listIndex The TextPiece that had characters inserted into
- * @param length The number of characters inserted
- */
- public int adjustForInsert(int listIndex, int length) {
- int size = _textPieces.size();
-
- TextPiece tp = (TextPiece)_textPieces.get(listIndex);
-
- // Update with the new end
- tp.setEnd(tp.getEnd() + length);
-
- // Now change all subsequent ones
- for (int x = listIndex + 1; x < size; x++)
- {
- tp = (TextPiece)_textPieces.get(x);
- tp.setStart(tp.getStart() + length);
- tp.setEnd(tp.getEnd() + length);
- }
-
- // All done
- return length;
- }
-
-
- public boolean equals(Object o)
- {
- TextPieceTable tpt = (TextPieceTable)o;
-
- int size = tpt._textPieces.size();
- if (size == _textPieces.size())
- {
- for (int x = 0; x < size; x++)
- {
- if (!tpt._textPieces.get(x).equals(_textPieces.get(x)))
- {
- return false;
- }
- }
- return true;
- }
- return false;
- }
- /* (non-Javadoc)
- * @see org.apache.poi.hwpf.model.CharIndexTranslator#getLengthInChars(int)
+public final class TextPieceTable implements CharIndexTranslator {
+ protected ArrayList _textPieces = new ArrayList();
+ // int _multiple;
+ int _cpMin;
+
+ public TextPieceTable() {
+ }
+
+ public TextPieceTable(byte[] documentStream, byte[] tableStream, int offset, int size, int fcMin) {
+ // get our plex of PieceDescriptors
+ PlexOfCps pieceTable = new PlexOfCps(tableStream, offset, size, PieceDescriptor
+ .getSizeInBytes());
+
+ int length = pieceTable.length();
+ PieceDescriptor[] pieces = new PieceDescriptor[length];
+
+ // iterate through piece descriptors raw bytes and create
+ // PieceDescriptor objects
+ for (int x = 0; x < length; x++) {
+ GenericPropertyNode node = pieceTable.getProperty(x);
+ pieces[x] = new PieceDescriptor(node.getBytes(), 0);
+ }
+
+ // Figure out the cp of the earliest text piece
+ // Note that text pieces don't have to be stored in order!
+ _cpMin = pieces[0].getFilePosition() - fcMin;
+ for (int x = 0; x < pieces.length; x++) {
+ int start = pieces[x].getFilePosition() - fcMin;
+ if (start < _cpMin) {
+ _cpMin = start;
+ }
+ }
+
+ // using the PieceDescriptors, build our list of TextPieces.
+ for (int x = 0; x < pieces.length; x++) {
+ int start = pieces[x].getFilePosition();
+ PropertyNode node = pieceTable.getProperty(x);
+
+ // Grab the start and end, which are in characters
+ int nodeStartChars = node.getStart();
+ int nodeEndChars = node.getEnd();
+
+ // What's the relationship between bytes and characters?
+ boolean unicode = pieces[x].isUnicode();
+ int multiple = 1;
+ if (unicode) {
+ multiple = 2;
+ }
+
+ // Figure out the length, in bytes and chars
+ int textSizeChars = (nodeEndChars - nodeStartChars);
+ int textSizeBytes = textSizeChars * multiple;
+
+ // Grab the data that makes up the piece
+ byte[] buf = new byte[textSizeBytes];
+ System.arraycopy(documentStream, start, buf, 0, textSizeBytes);
+
+ // And now build the piece
+ _textPieces.add(new TextPiece(nodeStartChars, nodeEndChars, buf, pieces[x], node
+ .getStart()));
+ }
+
+ // In the interest of our sanity, now sort the text pieces
+ // into order, if they're not already
+ TextPiece[] tp = (TextPiece[]) _textPieces.toArray(new TextPiece[_textPieces.size()]);
+ Arrays.sort(tp);
+ for (int i = 0; i < tp.length; i++) {
+ _textPieces.set(i, tp[i]);
+ }
+ }
+
+ public int getCpMin() {
+ return _cpMin;
+ }
+
+ public List getTextPieces() {
+ return _textPieces;
+ }
+
+ /**
+ * Is the text at the given Character offset unicode, or plain old ascii? In
+ * a very evil fashion, you have to actually know this to make sense of
+ * character and paragraph properties :(
+ *
+ * @param cp
+ * The character offset to check about
+ */
+ public boolean isUnicodeAtCharOffset(int cp) {
+ boolean lastWas = false;
+
+ Iterator it = _textPieces.iterator();
+ while (it.hasNext()) {
+ TextPiece tp = (TextPiece) it.next();
+ // If the text piece covers the character, all good
+ if (tp.getStart() <= cp && tp.getEnd() >= cp) {
+ return tp.isUnicode();
+ }
+ // Otherwise keep track for the last one
+ lastWas = tp.isUnicode();
+ }
+
+ // If they ask off the end, just go with the last one...
+ return lastWas;
+ }
+
+ public boolean isUnicodeAtByteOffset(int bytePos) {
+ boolean lastWas = false;
+
+ Iterator it = _textPieces.iterator();
+ while (it.hasNext()) {
+ TextPiece tp = (TextPiece) it.next();
+ int curByte = tp.getPieceDescriptor().getFilePosition();
+ int pieceEnd = curByte + tp.bytesLength();
+
+ // If the text piece covers the character, all good
+ if (curByte <= bytePos && pieceEnd > bytePos) {
+ return tp.isUnicode();
+ }
+ // Otherwise keep track for the last one
+ lastWas = tp.isUnicode();
+ // Move along
+ curByte = pieceEnd;
+ }
+
+ // If they ask off the end, just go with the last one...
+ return lastWas;
+ }
+
+ public byte[] writeTo(HWPFOutputStream docStream) throws IOException {
+
+ PlexOfCps textPlex = new PlexOfCps(PieceDescriptor.getSizeInBytes());
+ // int fcMin = docStream.getOffset();
+
+ int size = _textPieces.size();
+ for (int x = 0; x < size; x++) {
+ TextPiece next = (TextPiece) _textPieces.get(x);
+ PieceDescriptor pd = next.getPieceDescriptor();
+
+ int offset = docStream.getOffset();
+ int mod = (offset % POIFSConstants.BIG_BLOCK_SIZE);
+ if (mod != 0) {
+ mod = POIFSConstants.BIG_BLOCK_SIZE - mod;
+ byte[] buf = new byte[mod];
+ docStream.write(buf);
+ }
+
+ // set the text piece position to the current docStream offset.
+ pd.setFilePosition(docStream.getOffset());
+
+ // write the text to the docstream and save the piece descriptor to
+ // the
+ // plex which will be written later to the tableStream.
+ docStream.write(next.getRawBytes());
+
+ // The TextPiece is already in characters, which
+ // makes our life much easier
+ int nodeStart = next.getStart();
+ int nodeEnd = next.getEnd();
+ textPlex.addProperty(new GenericPropertyNode(nodeStart, nodeEnd, pd.toByteArray()));
+ }
+
+ return textPlex.toByteArray();
+
+ }
+
+ /**
+ * Adjust all the text piece after inserting some text into one of them
+ *
+ * @param listIndex
+ * The TextPiece that had characters inserted into
+ * @param length
+ * The number of characters inserted
*/
+ public int adjustForInsert(int listIndex, int length) {
+ int size = _textPieces.size();
+
+ TextPiece tp = (TextPiece) _textPieces.get(listIndex);
+
+ // Update with the new end
+ tp.setEnd(tp.getEnd() + length);
+
+ // Now change all subsequent ones
+ for (int x = listIndex + 1; x < size; x++) {
+ tp = (TextPiece) _textPieces.get(x);
+ tp.setStart(tp.getStart() + length);
+ tp.setEnd(tp.getEnd() + length);
+ }
+
+ // All done
+ return length;
+ }
+
+ public boolean equals(Object o) {
+ TextPieceTable tpt = (TextPieceTable) o;
+
+ int size = tpt._textPieces.size();
+ if (size == _textPieces.size()) {
+ for (int x = 0; x < size; x++) {
+ if (!tpt._textPieces.get(x).equals(_textPieces.get(x))) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
public int getCharIndex(int bytePos) {
int charCount = 0;
while (it.hasNext()) {
TextPiece tp = (TextPiece) it.next();
int pieceStart = tp.getPieceDescriptor().getFilePosition();
- if(pieceStart >= bytePos) {
+ if (pieceStart >= bytePos) {
break;
}
-
+
int bytesLength = tp.bytesLength();
int pieceEnd = pieceStart + bytesLength;
- int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength
- - (pieceEnd - bytePos);
+ int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength - (pieceEnd - bytePos);
if (tp.isUnicode()) {
charCount += toAdd / 2;
return charCount;
}
-
+
}
+import org.apache.poi.hdf.model.hdftypes.HDFType;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.DateAndTime;
+import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
/**
* Character Properties.
package org.apache.poi.hwpf.model.types;
-
+import org.apache.poi.hdf.model.hdftypes.HDFType;
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
/**
* Document Properties.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author S. Ryan Ackley
*/
-public abstract class DOPAbstractType
- implements HDFType
-{
+public abstract class DOPAbstractType implements HDFType {
protected byte field_1_formatFlags;
private static BitField fFacingPages = BitFieldFactory.getInstance(0x01);
package org.apache.poi.hwpf.model.types;
-
+import org.apache.poi.hdf.model.hdftypes.HDFType;
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
/**
* Base part of the File information Block (FibBase). Holds the core part of the FIB, from the first 32 bytes.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author Andrew C. Oliver
*/
-public abstract class FIBAbstractType
- implements HDFType
-{
+public abstract class FIBAbstractType implements HDFType {
protected int field_1_wIdent;
protected int field_2_nFib;
package org.apache.poi.hwpf.model.types;
-
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
import org.apache.poi.hwpf.usermodel.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
/**
* Paragraph Properties.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author S. Ryan Ackley
*/
-public abstract class PAPAbstractType
- implements HDFType
-{
+public abstract class PAPAbstractType implements HDFType {
protected int field_1_istd;
protected byte field_2_jc;
package org.apache.poi.hwpf.model.types;
-
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.DateAndTime;
/**
* Section Properties.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author S. Ryan Ackley
*/
-public abstract class SEPAbstractType
- implements HDFType
-{
+public abstract class SEPAbstractType implements HDFType {
protected byte field_1_bkc;
protected boolean field_2_fTitlePage;
package org.apache.poi.hwpf.model.types;
-
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
-import org.apache.poi.hwpf.usermodel.*;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
+import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
/**
* Table Properties.
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
* remove the record in src/records/definitions.
-
+ *
* @author S. Ryan Ackley
*/
-public abstract class TAPAbstractType
- implements HDFType
-{
+public abstract class TAPAbstractType implements HDFType {
protected int field_1_jc;
protected int field_2_dxaGapHalf;
package org.apache.poi.hwpf.model.types;
-
import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.HexDump;
import org.apache.poi.hdf.model.hdftypes.HDFType;
import org.apache.poi.hwpf.usermodel.*;
* @author S. Ryan Ackley
*/
-public abstract class TCAbstractType
- implements HDFType
-{
+public abstract class TCAbstractType implements HDFType {
protected short field_1_rgf;
private static BitField fFirstMerged = BitFieldFactory.getInstance(0x0001);
package org.apache.poi.hwpf.sprm;
import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
import org.apache.poi.hwpf.usermodel.CharacterProperties;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.usermodel.DateAndTime;
import org.apache.poi.hwpf.usermodel.BorderCode;
import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
-import org.apache.poi.hwpf.model.StyleSheet;
import org.apache.poi.util.LittleEndian;
public final class CharacterSprmUncompressor
public static byte[] compressParagraphProperty(ParagraphProperties newPAP,
ParagraphProperties oldPAP)
{
- ArrayList sprmList = new ArrayList();
+ List sprmList = new ArrayList();
int size = 0;
if (newPAP.getJc() != oldPAP.getJc())
import org.apache.poi.util.LittleEndian;
import java.util.HashMap;
-import java.util.Set;
import java.util.Iterator;
import java.util.Collections;
import java.util.ArrayList;
package org.apache.poi.hwpf.sprm;
-//
-//import java.util.ArrayList;
-//import java.util.Arrays;
-//
-//import org.apache.poi.hwpf.model.types.SEPAbstractType;
-//import org.apache.poi.hwpf.usermodel.SectionProperties;
-//import org.apache.poi.util.LittleEndian;
-//
-//
-//public class SectionSprmCompressor
-//{
-// private final static SectionProperties DEFAULT_SEP = new SectionProperties();
-// public SectionSprmCompressor()
-// {
-// }
-// public static byte[] compressSectionProperty(SectionProperties newSEP,
-// SectionProperties oldSEP)
-// {
-// int size = 0;
-// ArrayList sprmList = new ArrayList();
-//
-// if (newSEP.getCnsPgn() != DEFAULT_SEP.getCnsPgn())
-// {
-// size += SprmUtils.addSprm((short)0x3000, newSEP.getCnsPgn(), null, sprmList);
-// }
-// if (newSEP.getIHeadingPgn() != DEFAULT_SEP.getIHeadingPgn())
-// {
-// size += SprmUtils.addSprm((short)0x3001, newSEP.getIHeadingPgn(), null, sprmList);
-// }
-// if (!Arrays.equals(newSEP.getOlstAnm(), DEFAULT_SEP.getOlstAnm()))
-// {
-// size += SprmUtils.addSprm((short)0xD202, 0, newSEP.getOlstAnm(), sprmList);
-// }
-// if (newSEP.getFEvenlySpaced() != DEFAULT_SEP.getFEvenlySpaced())
-// {
-// size += SprmUtils.addSprm((short)0x3005, newSEP.getFEvenlySpaced() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getFUnlocked() != DEFAULT_SEP.getFUnlocked())
-// {
-// size += SprmUtils.addSprm((short)0x3006, newSEP.getFUnlocked() ? 1 :0, null, sprmList);
-// }
-// if (newSEP.getDmBinFirst() != DEFAULT_SEP.getDmBinFirst())
-// {
-// size += SprmUtils.addSprm((short)0x5007, newSEP.getDmBinFirst(), null, sprmList);
-// }
-// if (newSEP.getDmBinOther() != DEFAULT_SEP.getDmBinOther())
-// {
-// size += SprmUtils.addSprm((short)0x5008, newSEP.getDmBinOther(), null, sprmList);
-// }
-// if (newSEP.getBkc() != DEFAULT_SEP.getBkc())
-// {
-// size += SprmUtils.addSprm((short)0x3009, newSEP.getBkc(), null, sprmList);
-// }
-// if (newSEP.getFTitlePage() != DEFAULT_SEP.getFTitlePage())
-// {
-// size += SprmUtils.addSprm((short)0x300A, newSEP.getFTitlePage() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getCcolM1() != DEFAULT_SEP.getCcolM1())
-// {
-// size += SprmUtils.addSprm((short)0x500B, newSEP.getCcolM1(), null, sprmList);
-// }
-// if (newSEP.getDxaColumns() != DEFAULT_SEP.getDxaColumns())
-// {
-// size += SprmUtils.addSprm((short)0x900C, newSEP.getDxaColumns(), null, sprmList);
-// }
-// if (newSEP.getFAutoPgn() != DEFAULT_SEP.getFAutoPgn())
-// {
-// size += SprmUtils.addSprm((short)0x300D, newSEP.getFAutoPgn() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getNfcPgn() != DEFAULT_SEP.getNfcPgn())
-// {
-// size += SprmUtils.addSprm((short)0x300E, newSEP.getNfcPgn(), null, sprmList);
-// }
-// if (newSEP.getDyaPgn() != DEFAULT_SEP.getDyaPgn())
-// {
-// size += SprmUtils.addSprm((short)0xB00F, newSEP.getDyaPgn(), null, sprmList);
-// }
-// if (newSEP.getDxaPgn() != DEFAULT_SEP.getDxaPgn())
-// {
-// size += SprmUtils.addSprm((short)0xB010, newSEP.getDxaPgn(), null, sprmList);
-// }
-// if (newSEP.getFPgnRestart() != DEFAULT_SEP.getFPgnRestart())
-// {
-// size += SprmUtils.addSprm((short)0x3011, newSEP.getFPgnRestart() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getFEndNote() != DEFAULT_SEP.getFEndNote())
-// {
-// size += SprmUtils.addSprm((short)0x3012, newSEP.getFEndNote() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getLnc() != DEFAULT_SEP.getLnc())
-// {
-// size += SprmUtils.addSprm((short)0x3013, newSEP.getLnc(), null, sprmList);
-// }
-// if (newSEP.getGrpfIhdt() != DEFAULT_SEP.getGrpfIhdt())
-// {
-// size += SprmUtils.addSprm((short)0x3014, newSEP.getGrpfIhdt(), null, sprmList);
-// }
-// if (newSEP.getNLnnMod() != DEFAULT_SEP.getNLnnMod())
-// {
-// size += SprmUtils.addSprm((short)0x5015, newSEP.getNLnnMod(), null, sprmList);
-// }
-// if (newSEP.getDxaLnn() != DEFAULT_SEP.getDxaLnn())
-// {
-// size += SprmUtils.addSprm((short)0x9016, newSEP.getDxaLnn(), null, sprmList);
-// }
-// if (newSEP.getDyaHdrTop() != DEFAULT_SEP.getDyaHdrTop())
-// {
-// size += SprmUtils.addSprm((short)0xB017, newSEP.getDyaHdrTop(), null, sprmList);
-// }
-// if (newSEP.getDyaHdrBottom() != DEFAULT_SEP.getDyaHdrBottom())
-// {
-// size += SprmUtils.addSprm((short)0xB018, newSEP.getDyaHdrBottom(), null, sprmList);
-// }
-// if (newSEP.getFLBetween() != DEFAULT_SEP.getFLBetween())
-// {
-// size += SprmUtils.addSprm((short)0x3019, newSEP.getFLBetween() ? 1 : 0, null, sprmList);
-// }
-// if (newSEP.getVjc() != DEFAULT_SEP.getVjc())
-// {
-// size += SprmUtils.addSprm((short)0x301A, newSEP.getVjc(), null, sprmList);
-// }
-// if (newSEP.getLnnMin() != DEFAULT_SEP.getLnnMin())
-// {
-// size += SprmUtils.addSprm((short)0x501B, newSEP.getLnnMin(), null, sprmList);
-// }
-// if (newSEP.getPgnStart() != DEFAULT_SEP.getPgnStart())
-// {
-// size += SprmUtils.addSprm((short)0x501C, newSEP.getPgnStart(), null, sprmList);
-// }
-// if (newSEP.getDmOrientPage() != DEFAULT_SEP.getDmOrientPage())
-// {
-// size += SprmUtils.addSprm((short)0x301D, newSEP.getDmOrientPage(), null, sprmList);
-// }
-// if (newSEP.getXaPage() != DEFAULT_SEP.getXaPage())
-// {
-// size += SprmUtils.addSprm((short)0xB01F, newSEP.getXaPage(), null, sprmList);
-// }
-// if (newSEP.getYaPage() != DEFAULT_SEP.getYaPage())
-// {
-// size += SprmUtils.addSprm((short)0xB020, newSEP.getYaPage(), null, sprmList);
-// }
-// if (newSEP.getDxaLeft() != DEFAULT_SEP.getDxaLeft())
-// {
-// size += SprmUtils.addSprm((short)0xB021, newSEP.getDxaLeft(), null, sprmList);
-// }
-// if (newSEP.getDxaRight() != DEFAULT_SEP.getDxaRight())
-// {
-// size += SprmUtils.addSprm((short)0xB022, newSEP.getDxaRight(), null, sprmList);
-// }
-// if (newSEP.getDyaTop() != DEFAULT_SEP.getDyaTop())
-// {
-// size += SprmUtils.addSprm((short)0x9023, newSEP.getDyaTop(), null, sprmList);
-// }
-// if (newSEP.getDyaBottom() != DEFAULT_SEP.getDyaBottom())
-// {
-// size += SprmUtils.addSprm((short)0x9024, newSEP.getDyaBottom(), null, sprmList);
-// }
-// if (newSEP.getDzaGutter() != DEFAULT_SEP.getDzaGutter())
-// {
-// size += SprmUtils.addSprm((short)0xB025, newSEP.getDzaGutter(), null, sprmList);
-// }
-// if (newSEP.getDmPaperReq() != DEFAULT_SEP.getDmPaperReq())
-// {
-// size += SprmUtils.addSprm((short)0x5026, newSEP.getDmPaperReq(), null, sprmList);
-// }
-// if (newSEP.getFPropMark() != DEFAULT_SEP.getFPropMark() ||
-// newSEP.getIbstPropRMark() != DEFAULT_SEP.getIbstPropRMark() ||
-// newSEP.getDttmPropRMark() != DEFAULT_SEP.getDttmPropRMark())
-// {
-// byte[] buf = new byte[7];
-// buf[0] = (byte)(newSEP.getFPropMark() ? 1 : 0);
-// int offset = LittleEndian.BYTE_SIZE;
-// LittleEndian.putShort(buf, (short)newSEP.getIbstPropRMark());
-// offset += LittleEndian.SHORT_SIZE;
-// LittleEndian.putInt(buf, newSEP.getDttmPropRMark());
-// size += SprmUtils.addSprm((short)0xD227, -1, buf, sprmList);
-// }
-// if (!Arrays.equals(newSEP.getBrcTop(), DEFAULT_SEP.getBrcTop()))
-// {
-// size += SprmUtils.addSprm((short)0x702B, SprmUtils.convertBrcToInt(newSEP.getBrcTop()), null, sprmList);
-// }
-// if (!Arrays.equals(newSEP.getBrcLeft(), DEFAULT_SEP.getBrcLeft()))
-// {
-// size += SprmUtils.addSprm((short)0x702C, SprmUtils.convertBrcToInt(newSEP.getBrcLeft()), null, sprmList);
-// }
-// if (!Arrays.equals(newSEP.getBrcBottom(), DEFAULT_SEP.getBrcBottom()))
-// {
-// size += SprmUtils.addSprm((short)0x702D, SprmUtils.convertBrcToInt(newSEP.getBrcBottom()), null, sprmList);
-// }
-// if (!Arrays.equals(newSEP.getBrcRight(), DEFAULT_SEP.getBrcRight()))
-// {
-// size += SprmUtils.addSprm((short)0x702E, SprmUtils.convertBrcToInt(newSEP.getBrcRight()), null, sprmList);
-// }
-// if (newSEP.getPgbProp() != DEFAULT_SEP.getPgbProp())
-// {
-// size += SprmUtils.addSprm((short)0x522F, newSEP.getPgbProp(), null, sprmList);
-// }
-// if (newSEP.getDxtCharSpace() != DEFAULT_SEP.getDxtCharSpace())
-// {
-// size += SprmUtils.addSprm((short)0x7030, newSEP.getDxtCharSpace(), null, sprmList);
-// }
-// if (newSEP.getDyaLinePitch() != DEFAULT_SEP.getDyaLinePitch())
-// {
-// size += SprmUtils.addSprm((short)0x9031, newSEP.getDyaLinePitch(), null, sprmList);
-// }
-// if (newSEP.getClm() != DEFAULT_SEP.getClm())
-// {
-// size += SprmUtils.addSprm((short)0x5032, newSEP.getClm(), null, sprmList);
-// }
-// if (newSEP.getWTextFlow() != DEFAULT_SEP.getWTextFlow())
-// {
-// size += SprmUtils.addSprm((short)0x5033, newSEP.getWTextFlow(), null, sprmList);
-// }
-//
-// return SprmUtils.getGrpprl(sprmList, size);
-// }
-//}
-
-
import java.util.ArrayList;
import java.util.Arrays;
-import org.apache.poi.hwpf.model.types.SEPAbstractType;
import org.apache.poi.hwpf.usermodel.SectionProperties;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.usermodel.TableProperties;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
-import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
import org.apache.poi.hwpf.usermodel.BorderCode;
import java.util.ArrayList;
package org.apache.poi.hwpf.usermodel;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian;
-public final class BorderCode
- implements Cloneable
-{
+public final class BorderCode implements Cloneable {
public static final int SIZE = 4;
private short _info;
private short _info2;
package org.apache.poi.hwpf.usermodel;
-import org.apache.poi.hwpf.HWPFDocument;
-import org.apache.poi.hwpf.model.ListTables;
import org.apache.poi.hwpf.model.ListLevel;
import org.apache.poi.hwpf.model.ListData;
import org.apache.poi.hwpf.model.ListFormatOverride;
*
* @author Ryan Ackley
*/
-public final class HWPFList
-{
+public final class HWPFList {
private ListData _listData;
private ListFormatOverride _override;
private boolean _registered;
package org.apache.poi.hwpf.usermodel;
import org.apache.poi.hwpf.model.types.PAPAbstractType;
-import org.apache.poi.hwpf.model.StyleDescription;
-import org.apache.poi.hwpf.sprm.SprmBuffer;
-
-public final class ParagraphProperties
- extends PAPAbstractType
- implements Cloneable
-{
+public final class ParagraphProperties extends PAPAbstractType implements Cloneable {
public ParagraphProperties()
{
{
ParagraphProperties pp = (ParagraphProperties)super.clone();
pp.field_21_lspd = (LineSpacingDescriptor)field_21_lspd.clone();
- pp.field_24_phe = (byte[])field_24_phe.clone();
+ pp.field_24_phe = field_24_phe.clone();
pp.field_46_brcTop = (BorderCode)field_46_brcTop.clone();
pp.field_47_brcLeft = (BorderCode)field_47_brcLeft.clone();
pp.field_48_brcBottom = (BorderCode)field_48_brcBottom.clone();
pp.field_49_brcRight = (BorderCode)field_49_brcRight.clone();
pp.field_50_brcBetween = (BorderCode)field_50_brcBetween.clone();
pp.field_51_brcBar = (BorderCode)field_51_brcBar.clone();
- pp.field_60_anld = (byte[])field_60_anld.clone();
+ pp.field_60_anld = field_60_anld.clone();
return pp;
}
package org.apache.poi.hwpf.usermodel;
-import java.util.ArrayList;
-
public final class TableIterator
{
Range _range;
public Table next()
{
int numParagraphs = _range.numParagraphs();
- int numRows = 0;
int startIndex = _index;
int endIndex = _index;
import junit.framework.TestCase;
import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
-import org.apache.poi.hslf.record.*;
/**
* Tests that HSLFSlideShow does the right thing with an encrypted file
private String ss_56_e;
- public TestEncryptedFile() throws Exception {
+ public TestEncryptedFile() {
String dirname = System.getProperty("HSLF.testdata.path");
ss_ne = dirname + "/basic_test_ppt_file.ppt";
ss_e = dirname + "/Password_Protected-hello.ppt";
ss_np_e = dirname + "/Password_Protected-np-hello.ppt";
ss_56_e = dirname + "/Password_Protected-56-hello.ppt";
- }
+ }
- public void testLoadNonEncrypted() throws Exception {
- HSLFSlideShow hss = new HSLFSlideShow(ss_ne);
+ public void testLoadNonEncrypted() throws Exception {
+ HSLFSlideShow hss = new HSLFSlideShow(ss_ne);
- assertNotNull(hss);
- }
+ assertNotNull(hss);
+ }
- public void testLoadEncrypted() throws Exception {
- try {
- new HSLFSlideShow(ss_e);
- fail();
- } catch(EncryptedPowerPointFileException e) {
- // Good
- }
+ public void testLoadEncrypted() throws Exception {
+ try {
+ new HSLFSlideShow(ss_e);
+ fail();
+ } catch(EncryptedPowerPointFileException e) {
+ // Good
+ }
- try {
- new HSLFSlideShow(ss_np_e);
- fail();
- } catch(EncryptedPowerPointFileException e) {
- // Good
- }
+ try {
+ new HSLFSlideShow(ss_np_e);
+ fail();
+ } catch(EncryptedPowerPointFileException e) {
+ // Good
+ }
- try {
- new HSLFSlideShow(ss_56_e);
- fail();
- } catch(EncryptedPowerPointFileException e) {
- // Good
- }
- }
+ try {
+ new HSLFSlideShow(ss_56_e);
+ fail();
+ } catch(EncryptedPowerPointFileException e) {
+ // Good
+ }
+ }
}
package org.apache.poi.hslf.model;
+import java.awt.geom.Area;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Line2D;
+import java.awt.geom.Rectangle2D;
+
import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.HSLFSlideShow;
-
-import java.awt.*;
-import java.awt.Rectangle;
-import java.awt.geom.*;
-import java.io.ByteArrayOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
/**
* Test Freeform object.
*/
public final class TestFreeform extends TestCase {
- public void testClosedPath() throws Exception {
+ public void testClosedPath() {
GeneralPath path1 = new GeneralPath();
path1.moveTo(100, 100);
assertTrue(new Area(path1).equals(new Area(path2)));
}
- public void testLine() throws Exception {
+ public void testLine() {
GeneralPath path1 = new GeneralPath(new Line2D.Double(100, 100, 200, 100));
assertTrue(new Area(path1).equals(new Area(path2)));
}
- public void testRectangle() throws Exception {
+ public void testRectangle() {
GeneralPath path1 = new GeneralPath(new Rectangle2D.Double(100, 100, 200, 50));
package org.apache.poi.hslf.model;
-import junit.framework.*;
+import java.awt.Graphics2D;
-import java.io.FileOutputStream;
-import java.io.File;
-import java.awt.*;
+import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.blip.ImagePainter;
import org.apache.poi.hslf.blip.BitmapPainter;
-import org.apache.poi.ddf.EscherBSERecord;
+import org.apache.poi.hslf.blip.ImagePainter;
+import org.apache.poi.hslf.usermodel.PictureData;
/**
* Test Picture shape.
*/
public final class TestImagePainter extends TestCase {
- private static class CustomImagePainer implements ImagePainter{
+ private static class CustomImagePainter implements ImagePainter {
+ public CustomImagePainter() {
+ // no fields to initialise
+ }
public void paint(Graphics2D graphics, PictureData pict, Picture parent){
//do noting
}
-
}
- public void testImagePainter() throws Exception {
+ public void testImagePainter() {
ImagePainter pntr = PictureData.getImagePainter(Picture.PNG);
assertTrue(PictureData.getImagePainter(Picture.PNG) instanceof BitmapPainter);
assertTrue(PictureData.getImagePainter(Picture.JPEG) instanceof BitmapPainter);
assertTrue(PictureData.getImagePainter(Picture.DIB) instanceof BitmapPainter);
- PictureData.setImagePainter(Picture.WMF, new CustomImagePainer());
- assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainer);
+ PictureData.setImagePainter(Picture.WMF, new CustomImagePainter());
+ assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainter);
}
-
}
package org.apache.poi.hslf.model;
-import junit.framework.*;
+import java.awt.Color;
-import java.io.FileOutputStream;
-import java.awt.*;
+import junit.framework.TestCase;
import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.HSLFSlideShow;
/**
* Test Line shape.
*/
public final class TestLine extends TestCase {
- public void setUp() throws Exception {
-
- }
-
- public void testCreateLines() throws Exception {
+ public void testCreateLines() {
SlideShow ppt = new SlideShow();
Slide slide = ppt.createSlide();
line.setLineStyle(Line.LINE_DOUBLE);
line.setLineWidth(8.0);
slide.addShape(line);
-
}
-
}
package org.apache.poi.hslf.model;
-import junit.framework.TestCase;
-
-import java.io.*;
-import java.awt.*;
import java.awt.geom.Rectangle2D;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+
+import junit.framework.TestCase;
import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.HSLFSlideShow;
/**
* Test <code>MovieShape</code> object.
shape = (MovieShape)slide.getShapes()[0];
assertEquals(path, shape.getPath());
assertFalse(shape.isAutoPlay());
-
}
-
}
package org.apache.poi.hslf.model;
-import junit.framework.*;
-
-import java.io.FileOutputStream;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.HSLFSlideShow;
+import junit.framework.TestCase;
+
import org.apache.poi.ddf.EscherBSERecord;
+import org.apache.poi.hslf.usermodel.PictureData;
+import org.apache.poi.hslf.usermodel.SlideShow;
/**
* Test Picture shape.
EscherBSERecord bse3 = pict.getEscherBSERecord();
assertSame(bse2, bse3);
assertEquals(3, bse1.getRef());
-
}
/**
* Picture#getEscherBSERecord threw NullPointerException if EscherContainerRecord.BSTORE_CONTAINER
* was not found. The correct behaviour is to return null.
*/
- public void test46122() throws IOException {
+ public void test46122() {
SlideShow ppt = new SlideShow();
Slide slide = ppt.createSlide();
BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
pict.draw(graphics);
-
- assertTrue("no errors rendering Picture with null data", true);
}
-
}
import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
-import org.apache.poi.hslf.usermodel.*;
+
+import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.record.SlideAtom;
+import org.apache.poi.hslf.usermodel.SlideShow;
/**
* Tests that changing a slide's idea of what notes sheet is its works right
// SlideShow primed on the test data
private SlideShow ss;
- public TestSlideChangeNotes() throws Exception {
+ public TestSlideChangeNotes() throws Exception {
String dirname = System.getProperty("HSLF.testdata.path");
String filename = dirname + "/basic_test_ppt_file.ppt";
HSLFSlideShow hss = new HSLFSlideShow(filename);
ss = new SlideShow(hss);
- }
+ }
- public void testSetToNone() throws Exception {
+ public void testSetToNone() {
Slide slideOne = ss.getSlides()[0];
SlideAtom sa = slideOne.getSlideRecord().getSlideAtom();
slideOne.setNotes(null);
assertEquals(0, sa.getNotesID());
- }
+ }
- public void testSetToSomething() throws Exception {
+ public void testSetToSomething() {
Slide slideOne = ss.getSlides()[0];
Notes notesOne = ss.getNotes()[1];
SlideAtom sa = slideOne.getSlideRecord().getSlideAtom();
slideOne.setNotes(notesOne);
assertEquals(notesOne._getSheetNumber(), sa.getNotesID());
- }
+ }
}
package org.apache.poi.hslf.model;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
+
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
-
-import java.io.ByteArrayOutputStream;
-import java.io.ByteArrayInputStream;
-import java.awt.*;
+import org.apache.poi.hslf.record.Environment;
+import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.hslf.usermodel.RichTextRun;
+import org.apache.poi.hslf.usermodel.SlideShow;
/**
* Tests for SlideMaster
public final class TestSlideMaster extends TestCase{
String home;
- public void setUp() throws Exception {
+ public void setUp() {
home = System.getProperty("HSLF.testdata.path");
}
package org.apache.poi.hslf.model;
-import junit.framework.TestCase;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
-import java.io.*;
-import java.awt.*;
-import java.awt.geom.Rectangle2D;
+import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.hslf.usermodel.SlideShow;
/**
* Test <code>Table</code> object.
public void testIllegalCOnstruction(){
try {
- Table tbl = new Table(0, 5);
+ new Table(0, 5);
fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
} catch (IllegalArgumentException e){
}
try {
- Table tbl = new Table(5, 0);
+ new Table(5, 0);
fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
} catch (IllegalArgumentException e){
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
-import org.apache.poi.util.HexDump;
-
/**
* Tests that {@link HeadersFootersAtom} works properly
*
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
- public void testRead() throws Exception {
+ public void testRead() {
AnimationInfoAtom record = new AnimationInfoAtom(data, 0, data.length);
assertEquals(RecordTypes.AnimationInfoAtom.typeID, record.getRecordType());
assertTrue(record.getFlag(AnimationInfoAtom.Automatic));
assertTrue(Arrays.equals(data, b));
}
-
}
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import javax.imageio.stream.FileImageInputStream;
-
-import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-
package org.apache.poi.hslf.record;
-import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Date;
+import java.util.List;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.SlideShow;
*
* @author Nick Burch (nick at torchbox dot com)
*/
-public class TestExHyperlink extends TestCase {
+public final class TestExHyperlink extends TestCase {
// From a real file
private byte[] data_a = new byte[] {
0x0F, 00, 0xD7-256, 0x0F, 0xA8-256, 00, 00, 00,
-
- 00, 00, 0xD3-256, 0x0F, 04, 00, 00, 00,
+
+ 00, 00, 0xD3-256, 0x0F, 04, 00, 00, 00,
03, 00, 00, 00,
-
- 00, 00, 0xBA-256, 0x0F, 0x46, 00, 00, 00,
+
+ 00, 00, 0xBA-256, 0x0F, 0x46, 00, 00, 00,
0x68, 00, 0x74, 00, 0x74, 00, 0x70, 00,
- 0x3A, 00, 0x2F, 00, 0x2F, 00, 0x6A, 00,
+ 0x3A, 00, 0x2F, 00, 0x2F, 00, 0x6A, 00,
0x61, 00, 0x6B, 00, 0x61, 00, 0x72, 00,
0x74, 00, 0x61, 00, 0x2E, 00, 0x61, 00,
0x70, 00, 0x61, 00, 0x63, 00, 0x68, 00,
0x65, 00, 0x2E, 00, 0x6F, 00, 0x72, 00,
0x67, 00, 0x2F, 00, 0x70, 00, 0x6F, 00,
- 0x69, 00, 0x2F, 00, 0x68, 00, 0x73, 00,
- 0x73, 00, 0x66, 00, 0x2F, 00,
-
+ 0x69, 00, 0x2F, 00, 0x68, 00, 0x73, 00,
+ 0x73, 00, 0x66, 00, 0x2F, 00,
+
0x10, 00, 0xBA-256, 0x0F, 0x46, 00, 00, 00,
0x68, 00, 0x74, 00, 0x74, 00, 0x70, 00,
- 0x3A, 00, 0x2F, 00, 0x2F, 00, 0x6A, 00,
+ 0x3A, 00, 0x2F, 00, 0x2F, 00, 0x6A, 00,
0x61, 00, 0x6B, 00, 0x61, 00, 0x72, 00,
0x74, 00, 0x61, 00, 0x2E, 00, 0x61, 00,
0x70, 00, 0x61, 00, 0x63, 00, 0x68, 00,
0x65, 00, 0x2E, 00, 0x6F, 00, 0x72, 00,
0x67, 00, 0x2F, 00, 0x70, 00, 0x6F, 00,
- 0x69, 00, 0x2F, 00, 0x68, 00, 0x73, 00,
- 0x73, 00, 0x66, 00, 0x2F, 00
+ 0x69, 00, 0x2F, 00, 0x68, 00, 0x73, 00,
+ 0x73, 00, 0x66, 00, 0x2F, 00
};
-
- public void testRecordType() throws Exception {
+
+ public void testRecordType() {
ExHyperlink eh = new ExHyperlink(data_a, 0, data_a.length);
assertEquals(4055l, eh.getRecordType());
}
-
- public void testNumber() throws Exception {
+
+ public void testNumber() {
ExHyperlink eh = new ExHyperlink(data_a, 0, data_a.length);
assertEquals(3, eh.getExHyperlinkAtom().getNumber());
}
-
- public void testLinkURL() throws Exception {
+
+ public void testLinkURL() {
ExHyperlink eh = new ExHyperlink(data_a, 0, data_a.length);
assertEquals("http://jakarta.apache.org/poi/hssf/", eh.getLinkURL());
}
- public void testDetails() throws Exception {
+ public void testDetails() {
ExHyperlink eh = new ExHyperlink(data_a, 0, data_a.length);
assertEquals("http://jakarta.apache.org/poi/hssf/", eh._getDetailsA());
assertEquals("http://jakarta.apache.org/poi/hssf/", eh._getDetailsB());
assertEquals(data_a[i],b[i]);
}
}
-
+
public void testRealFile() throws Exception {
String dirname = System.getProperty("HSLF.testdata.path");
HSLFSlideShow hss = new HSLFSlideShow(dirname + File.separator + "WithLinks.ppt");
SlideShow ss = new SlideShow(hss);
-
+
// Get the document
Document doc = ss.getDocumentRecord();
// Get the ExObjList
exObjList = (ExObjList)doc._children[i];
}
}
- assertNotNull(exObjList);
-
+ if (exObjList == null) {
+ throw new AssertionFailedError("exObjList must not be null");
+ }
+
// Within that, grab out the Hyperlink atoms
- ArrayList linksA = new ArrayList();
+ List<ExHyperlink> linksA = new ArrayList<ExHyperlink>();
for(int i=0; i<exObjList._children.length; i++) {
- if(exObjList._children[i] instanceof ExHyperlink) {
- linksA.add(exObjList._children[i]);
+ Record ch = exObjList._children[i];
+ if(ch instanceof ExHyperlink) {
+ linksA.add((ExHyperlink) ch);
}
}
-
+
// Should be 4 of them
assertEquals(4, linksA.size());
ExHyperlink[] links = new ExHyperlink[linksA.size()];
linksA.toArray(links);
-
+
assertEquals(4, exObjList.getExHyperlinks().length);
-
+
// Check the other way
-
+
// Check they have what we expect in them
assertEquals(1, links[0].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/poi/", links[0].getLinkURL());
-
+
assertEquals(2, links[1].getExHyperlinkAtom().getNumber());
assertEquals("http://slashdot.org/", links[1].getLinkURL());
-
+
assertEquals(3, links[2].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/poi/hssf/", links[2].getLinkURL());
-
+
assertEquals(4, links[3].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/hslf/", links[3].getLinkURL());
-
+
}
}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-
package org.apache.poi.hslf.record;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
/**
* Tests that ExHyperlinkAtom works properly.
00, 00, 0xD3-256, 0x0F, 04, 00, 00, 00,
01, 00, 00, 00
};
- private byte[] data_b = new byte[] {
+ private byte[] data_b = new byte[] {
00, 00, 0xD3-256, 0x0F, 04, 00, 00, 00,
04, 00, 00, 00
};
-
- public void testRecordType() throws Exception {
+
+ public void testRecordType() {
ExHyperlinkAtom eha = new ExHyperlinkAtom(data_a, 0, data_a.length);
assertEquals(4051l, eha.getRecordType());
}
-
- public void testGetNumber() throws Exception {
+
+ public void testGetNumber() {
ExHyperlinkAtom eha = new ExHyperlinkAtom(data_a, 0, data_a.length);
ExHyperlinkAtom ehb = new ExHyperlinkAtom(data_b, 0, data_b.length);
-
+
assertEquals(1, eha.getNumber());
assertEquals(4, ehb.getNumber());
}
-
+
public void testWrite() throws Exception {
ExHyperlinkAtom eha = new ExHyperlinkAtom(data_a, 0, data_a.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
}
// Create A from scratch
- public void testCreate() throws Exception {
- ExHyperlinkAtom eha = new ExHyperlinkAtom();
-
- // Set value
- eha.setNumber(1);
-
+ public void testCreate() throws Exception {
+ ExHyperlinkAtom eha = new ExHyperlinkAtom();
+
+ // Set value
+ eha.setNumber(1);
+
// Check it's now the same as a
ByteArrayOutputStream baos = new ByteArrayOutputStream();
eha.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
assertEquals(data_a.length, b.length);
for(int i=0; i<data_a.length; i++) {
assertEquals(data_a[i],b[i]);
}
- }
+ }
// Try to turn a into b
public void testChange() throws Exception {
- ExHyperlinkAtom eha = new ExHyperlinkAtom(data_a, 0, data_a.length);
+ ExHyperlinkAtom eha = new ExHyperlinkAtom(data_a, 0, data_a.length);
// Change the number
eha.setNumber(4);
-
+
// Check bytes are now the same
ByteArrayOutputStream baos = new ByteArrayOutputStream();
eha.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
// Should now be the same
assertEquals(data_b.length, b.length);
for(int i=0; i<data_b.length; i++) {
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-
package org.apache.poi.hslf.record;
-import junit.framework.TestCase;
-import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
+
+import junit.framework.TestCase;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.SlideShow;
String dirname = System.getProperty("HSLF.testdata.path");
HSLFSlideShow hss = new HSLFSlideShow(dirname + File.separator + "WithLinks.ppt");
SlideShow ss = new SlideShow(hss);
-
+
// Get the document
Document doc = ss.getDocumentRecord();
// Get the ExObjList
ExObjList exObjList = doc.getExObjList();
assertNotNull(exObjList);
assertEquals(1033l, exObjList.getRecordType());
-
+
// Check the atom
assertNotNull(exObjList.getExObjListAtom());
assertEquals(4, exObjList.getExObjListAtom().getObjectIDSeed());
-
+
// Check the Hyperlinks
assertEquals(4, exObjList.getExHyperlinks().length);
-
+
// Check the contents
ExHyperlink[] links = exObjList.getExHyperlinks();
-
+
// Check they have what we expect in them
assertEquals(1, links[0].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/poi/", links[0].getLinkURL());
-
+
assertEquals(2, links[1].getExHyperlinkAtom().getNumber());
assertEquals("http://slashdot.org/", links[1].getLinkURL());
-
+
assertEquals(3, links[2].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/poi/hssf/", links[2].getLinkURL());
-
+
assertEquals(4, links[3].getExHyperlinkAtom().getNumber());
assertEquals("http://jakarta.apache.org/hslf/", links[3].getLinkURL());
-
+
}
}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-
package org.apache.poi.hslf.record;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
/**
* Tests that ExObjListAtom works properly.
00, 00, 0x0A, 0x04, 04, 00, 00, 00,
01, 00, 00, 00
};
- private byte[] data_b = new byte[] {
+ private byte[] data_b = new byte[] {
00, 00, 0x0A, 0x04, 04, 00, 00, 00,
04, 00, 00, 00
};
-
- public void testRecordType() throws Exception {
- ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
+
+ public void testRecordType() {
+ ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
assertEquals(1034l, eoa.getRecordType());
}
-
- public void testGetSeed() throws Exception {
- ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
- ExObjListAtom eob = new ExObjListAtom(data_b, 0, data_b.length);
-
+
+ public void testGetSeed() {
+ ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
+ ExObjListAtom eob = new ExObjListAtom(data_b, 0, data_b.length);
+
assertEquals(1, eoa.getObjectIDSeed());
assertEquals(4, eob.getObjectIDSeed());
- }
-
+ }
+
public void testWrite() throws Exception {
- ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
+ ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
eoa.writeOut(baos);
byte[] b = baos.toByteArray();
}
// Create A from scratch
- public void testCreate() throws Exception {
- ExObjListAtom eoa = new ExObjListAtom();
-
- // Set seed
- eoa.setObjectIDSeed(1);
-
+ public void testCreate() throws Exception {
+ ExObjListAtom eoa = new ExObjListAtom();
+
+ // Set seed
+ eoa.setObjectIDSeed(1);
+
// Check it's now the same as a
ByteArrayOutputStream baos = new ByteArrayOutputStream();
eoa.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
assertEquals(data_a.length, b.length);
for(int i=0; i<data_a.length; i++) {
assertEquals(data_a[i],b[i]);
}
- }
+ }
// Try to turn a into b
public void testChange() throws Exception {
- ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
+ ExObjListAtom eoa = new ExObjListAtom(data_a, 0, data_a.length);
// Change the number
eoa.setObjectIDSeed(4);
-
+
// Check bytes are now the same
ByteArrayOutputStream baos = new ByteArrayOutputStream();
eoa.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
// Should now be the same
assertEquals(data_b.length, b.length);
for(int i=0; i<data_b.length; i++) {
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Arrays;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.poifs.filesystem.DocumentEntry;
/**
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
-
package org.apache.poi.hslf.record;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
/**
* Tests that InteractiveInfoAtom works properly.
*/
public class TestInteractiveInfoAtom extends TestCase {
// From a real file
- private byte[] data_a = new byte[] {
+ private byte[] data_a = new byte[] {
00, 00, 0xF3-256, 0x0F, 0x10, 00, 00, 00,
00, 00, 00, 00, 01, 00, 00, 00,
04, 00, 00, 00, 8, 00, 00, 00
};
- private byte[] data_b = new byte[] {
+ private byte[] data_b = new byte[] {
00, 00, 0xF3-256, 0x0F, 0x10, 00, 00, 00,
00, 00, 00, 00, 04, 00, 00, 00,
04, 00, 00, 00, 8, 00, 00, 00
};
-
- public void testRecordType() throws Exception {
+
+ public void testRecordType() {
InteractiveInfoAtom ia = new InteractiveInfoAtom(data_a, 0, data_a.length);
assertEquals(4083l, ia.getRecordType());
}
-
- public void testGetNumber() throws Exception {
+
+ public void testGetNumber() {
InteractiveInfoAtom ia = new InteractiveInfoAtom(data_a, 0, data_a.length);
InteractiveInfoAtom ib = new InteractiveInfoAtom(data_b, 0, data_b.length);
-
+
assertEquals(1, ia.getHyperlinkID());
assertEquals(4, ib.getHyperlinkID());
- }
-
- public void testGetRest() throws Exception {
+ }
+
+ public void testGetRest() {
InteractiveInfoAtom ia = new InteractiveInfoAtom(data_a, 0, data_a.length);
InteractiveInfoAtom ib = new InteractiveInfoAtom(data_b, 0, data_b.length);
-
+
assertEquals(0, ia.getSoundRef());
assertEquals(0, ib.getSoundRef());
-
+
assertEquals(4, ia.getAction());
assertEquals(4, ib.getAction());
-
+
assertEquals(8, ia.getHyperlinkType());
assertEquals(8, ib.getHyperlinkType());
- }
-
+ }
+
public void testWrite() throws Exception {
InteractiveInfoAtom ia = new InteractiveInfoAtom(data_a, 0, data_a.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
}
// Create A from scratch
- public void testCreate() throws Exception {
- InteractiveInfoAtom ia = new InteractiveInfoAtom();
-
- // Set values
- ia.setHyperlinkID(1);
- ia.setSoundRef(0);
- ia.setAction((byte)4);
- ia.setHyperlinkType((byte)8);
-
+ public void testCreate() throws Exception {
+ InteractiveInfoAtom ia = new InteractiveInfoAtom();
+
+ // Set values
+ ia.setHyperlinkID(1);
+ ia.setSoundRef(0);
+ ia.setAction((byte)4);
+ ia.setHyperlinkType((byte)8);
+
// Check it's now the same as a
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ia.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
assertEquals(data_a.length, b.length);
for(int i=0; i<data_a.length; i++) {
assertEquals(data_a[i],b[i]);
}
- }
+ }
// Try to turn a into b
public void testChange() throws Exception {
// Change the number
ia.setHyperlinkID(4);
-
+
// Check bytes are now the same
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ia.writeOut(baos);
byte[] b = baos.toByteArray();
-
+
// Should now be the same
assertEquals(data_b.length, b.length);
for(int i=0; i<data_b.length; i++) {
package org.apache.poi.hslf.record;
-
-import junit.framework.TestCase;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
import java.util.Arrays;
-import org.apache.poi.hslf.HSLFSlideShow;
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
import org.apache.poi.hslf.usermodel.SlideShow;
/**
- * Tests Sound-related records: SoundCollection(2020), Sound(2022) and SoundData(2023)).
+ * Tests Sound-related records: SoundCollection(2020), Sound(2022) and
+ * SoundData(2023)).
*
* @author Yegor Kozlov
*/
// Get the document
Document doc = ppt.getDocumentRecord();
- SoundCollection soundCollection = null;
- Record[] doc_ch = doc.getChildRecords();
- for (int i = 0; i < doc_ch.length; i++) {
- if(doc_ch[i] instanceof SoundCollection){
- soundCollection = (SoundCollection)doc_ch[i];
- break;
- }
- }
- assertNotNull(soundCollection);
-
- Sound sound = null;
- Record[] sound_ch = soundCollection.getChildRecords();
- int k = 0;
- for (int i = 0; i < sound_ch.length; i++) {
- if(sound_ch[i] instanceof Sound){
- sound = (Sound)sound_ch[i];
- k++;
- }
- }
- assertNotNull(sound);
- assertEquals(1, k);
+ SoundCollection soundCollection = null;
+ Record[] doc_ch = doc.getChildRecords();
+ for (int i = 0; i < doc_ch.length; i++) {
+ if (doc_ch[i] instanceof SoundCollection) {
+ soundCollection = (SoundCollection) doc_ch[i];
+ break;
+ }
+ }
+ if (soundCollection == null) {
+ throw new AssertionFailedError("soundCollection must not be null");
+ }
- assertEquals("ringin.wav", sound.getSoundName());
- assertEquals(".WAV", sound.getSoundType());
- assertNotNull(sound.getSoundData());
+ Sound sound = null;
+ Record[] sound_ch = soundCollection.getChildRecords();
+ int k = 0;
+ for (int i = 0; i < sound_ch.length; i++) {
+ if (sound_ch[i] instanceof Sound) {
+ sound = (Sound) sound_ch[i];
+ k++;
+ }
+ }
+ if (sound == null) {
+ throw new AssertionFailedError("sound must not be null");
+ }
+ assertEquals(1, k);
- File f = new File(cwd, "ringin.wav");
- int length = (int)f.length();
- byte[] ref_data = new byte[length];
- is = new FileInputStream(f);
- is.read(ref_data);
- is.close();
+ assertEquals("ringin.wav", sound.getSoundName());
+ assertEquals(".WAV", sound.getSoundType());
+ assertNotNull(sound.getSoundData());
- assertTrue(Arrays.equals(ref_data, sound.getSoundData()));
+ File f = new File(cwd, "ringin.wav");
+ int length = (int) f.length();
+ byte[] ref_data = new byte[length];
+ is = new FileInputStream(f);
+ is.read(ref_data);
+ is.close();
+ assertTrue(Arrays.equals(ref_data, sound.getSoundData()));
}
}
package org.apache.poi.hslf.record;
-import org.apache.poi.hslf.HSLFSlideShow;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import junit.framework.TestCase;
+
import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
import org.apache.poi.hslf.model.textproperties.TextProp;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.util.HexDump;
-import junit.framework.TestCase;
-import java.io.ByteArrayOutputStream;
-import java.util.LinkedList;
-import java.util.Arrays;
-
/**
* Tests that StyleTextPropAtom works properly
*
assertEquals(5, stpb.getCharacterStyles().size());
}
- public void testParagraphStyleCounts() throws Exception {
+ public void testParagraphStyleCounts() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
}
- public void testCharacterStyleLengths() throws Exception {
+ public void testCharacterStyleLengths() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
}
- public void testCharacterPropOrdering() throws Exception {
+ public void testCharacterPropOrdering() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
assertEquals(24, tp_4_3.getValue());
}
- public void testParagraphProps() throws Exception {
+ public void testParagraphProps() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
assertEquals(80, tp_4_2.getValue());
}
- public void testCharacterProps() throws Exception {
+ public void testCharacterProps() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
}
}
- public void testWriteA() throws Exception {
+ public void testWriteA() {
doReadWrite(data_a, -1);
}
- public void testLoadWriteA() throws Exception {
+ public void testLoadWriteA() {
doReadWrite(data_b, data_b_text_len);
}
- public void testWriteB() throws Exception {
+ public void testWriteB() {
doReadWrite(data_b, -1);
}
- public void testLoadWriteB() throws Exception {
+ public void testLoadWriteB() {
doReadWrite(data_b, data_b_text_len);
}
- public void testLoadWriteC() throws Exception {
+ public void testLoadWriteC() {
doReadWrite(data_c, data_c_text_len);
}
- public void testLoadWriteD() throws Exception {
+ public void testLoadWriteD() {
doReadWrite(data_d, data_d_text_len);
}
- protected void doReadWrite(byte[] data, int textlen) throws Exception {
+ protected void doReadWrite(byte[] data, int textlen) {
StyleTextPropAtom stpb = new StyleTextPropAtom(data, 0,data.length);
if(textlen != -1) stpb.setParentTextSize(textlen);
ByteArrayOutputStream out = new ByteArrayOutputStream();
- stpb.writeOut(out);
+ try {
+ stpb.writeOut(out);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
byte[] bytes = out.toByteArray();
assertEquals(data.length, bytes.length);
}
}
- public void testNotEnoughDataProp() throws Exception {
+ public void testNotEnoughDataProp() {
// We don't have enough data in the record to cover
// all the properties the mask says we have
// Make sure we just do the best we can
/**
* Check the test data for Bug 40143.
*/
- public void testBug40143() throws Exception {
+ public void testBug40143() {
StyleTextPropAtom atom = new StyleTextPropAtom(data_d, 0, data_d.length);
atom.setParentTextSize(data_d_text_len);
/**
* Check the test data for Bug 42677.
*/
- public void test42677() throws Exception {
+ public void test42677() {
int length = 18;
byte[] data = {0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
* 00 00 00 01 18 00 00 01 18 01 00 00 00 01 1C 00 00 01 1C
* </StyleTextPropAtom>
*/
- public void test45815() throws Exception {
+ public void test45815() {
int length = 19;
byte[] data = {
0x00, 0x00, (byte)0xA1, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x14, 0x00,
package org.apache.poi.hslf.record;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.HexDump;
-
-import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.util.LinkedList;
import java.util.Arrays;
+import junit.framework.TestCase;
+
/**
* Tests TextRulerAtom
*
*/
public final class TestTextRulerAtom extends TestCase {
- //from a real file
+ //from a real file
private byte[] data_1 = new byte[] {
0x00, 0x00, (byte)0xA6, 0x0F, 0x18, 0x00, 0x00, 0x00,
- (byte)0xF8, 0x1F, 0x00, 0x00, 0x75, 0x00, (byte)0xE2, 0x00, 0x59,
- 0x01, (byte)0xC3, 0x01, 0x1A, 0x03, (byte)0x87, 0x03, (byte)0xF8,
- 0x03, 0x69, 0x04, (byte)0xF6, 0x05, (byte)0xF6, 0x05
+ (byte)0xF8, 0x1F, 0x00, 0x00, 0x75, 0x00, (byte)0xE2, 0x00, 0x59,
+ 0x01, (byte)0xC3, 0x01, 0x1A, 0x03, (byte)0x87, 0x03, (byte)0xF8,
+ 0x03, 0x69, 0x04, (byte)0xF6, 0x05, (byte)0xF6, 0x05
};
- private byte[] data_2 = new byte[] {
- 0x00, 0x00, (byte)0xA6, 0x0F, 0x0A, 0x00, 0x00, 0x00,
- 0x10, 0x03, 0x00, 0x00, (byte)0xF9, 0x00, 0x41, 0x01, 0x41, 0x01
- };
+ private byte[] data_2 = new byte[] {
+ 0x00, 0x00, (byte)0xA6, 0x0F, 0x0A, 0x00, 0x00, 0x00,
+ 0x10, 0x03, 0x00, 0x00, (byte)0xF9, 0x00, 0x41, 0x01, 0x41, 0x01
+ };
- public void testReadRuler() throws Exception {
+ public void testReadRuler() {
TextRulerAtom ruler = new TextRulerAtom(data_1, 0, data_1.length);
- assertEquals(ruler.getNumberOfLevels(), 0);
- assertEquals(ruler.getDefaultTabSize(), 0);
+ assertEquals(ruler.getNumberOfLevels(), 0);
+ assertEquals(ruler.getDefaultTabSize(), 0);
- int[] tabStops = ruler.getTabStops();
- assertNull(tabStops);
+ int[] tabStops = ruler.getTabStops();
+ assertNull(tabStops);
- int[] textOffsets = ruler.getTextOffsets();
- assertTrue(Arrays.equals(new int[]{226, 451, 903, 1129, 1526}, textOffsets));
+ int[] textOffsets = ruler.getTextOffsets();
+ assertTrue(Arrays.equals(new int[]{226, 451, 903, 1129, 1526}, textOffsets));
- int[] bulletOffsets = ruler.getBulletOffsets();
- assertTrue(Arrays.equals(new int[]{117, 345, 794, 1016, 1526}, bulletOffsets));
+ int[] bulletOffsets = ruler.getBulletOffsets();
+ assertTrue(Arrays.equals(new int[]{117, 345, 794, 1016, 1526}, bulletOffsets));
}
- public void testWriteRuler() throws Exception {
+ public void testWriteRuler() throws Exception {
TextRulerAtom ruler = new TextRulerAtom(data_1, 0, data_1.length);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ruler.writeOut(out);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ruler.writeOut(out);
- byte[] result = out.toByteArray();
- assertTrue(Arrays.equals(result, data_1));
+ byte[] result = out.toByteArray();
+ assertTrue(Arrays.equals(result, data_1));
}
- public void testRead2() throws Exception {
+ public void testRead2() throws Exception {
TextRulerAtom ruler = TextRulerAtom.getParagraphInstance();
- ruler.setParagraphIndent((short)249, (short)321);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ruler.writeOut(out);
-
- byte[] result = out.toByteArray();
- assertTrue(Arrays.equals(result, data_2));
+ ruler.setParagraphIndent((short)249, (short)321);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ruler.writeOut(out);
+ byte[] result = out.toByteArray();
+ assertTrue(Arrays.equals(result, data_2));
}
-
}
package org.apache.poi.hslf.record;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.HexDump;
-
-import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.util.LinkedList;
import java.util.Arrays;
+import junit.framework.TestCase;
+
/**
* Tests TextSpecInfoAtom
*
public final class TestTextSpecInfoAtom extends TestCase {
//from a real file
- private byte[] data_1 = new byte[] {
+ private byte[] data_1 = new byte[] {
0x00, 0x00, (byte)0xAA, 0x0F, 0x2C, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
+ };
- public void testRead() throws Exception {
- TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
+ public void testRead() {
+ TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
assertEquals(5, run.length);
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
/**
* Tests that TxInteractiveInfoAtom works properly.
0x19, 00, 00, 00, 0x38, 00, 00, 00
};
- private byte[] data_b = new byte[] {
- 00, 00, (byte)0xDF, 0x0F, 0x08, 00, 00, 00,
- 0x39, 00, 00, 00, 0x4E, 00, 00, 00
- };
+ private byte[] data_b = new byte[] {
+ 00, 00, (byte)0xDF, 0x0F, 0x08, 00, 00, 00,
+ 0x39, 00, 00, 00, 0x4E, 00, 00, 00
+ };
- public void testRead() throws Exception {
- TxInteractiveInfoAtom ia1 = new TxInteractiveInfoAtom(data_a, 0, data_a.length);
+ public void testRead() {
+ TxInteractiveInfoAtom ia1 = new TxInteractiveInfoAtom(data_a, 0, data_a.length);
- assertEquals(4063, ia1.getRecordType());
+ assertEquals(4063, ia1.getRecordType());
assertEquals(25, ia1.getStartIndex());
assertEquals(56, ia1.getEndIndex());
- TxInteractiveInfoAtom ia2 = new TxInteractiveInfoAtom(data_b, 0, data_b.length);
+ TxInteractiveInfoAtom ia2 = new TxInteractiveInfoAtom(data_b, 0, data_b.length);
- assertEquals(4063, ia2.getRecordType());
+ assertEquals(4063, ia2.getRecordType());
assertEquals(57, ia2.getStartIndex());
assertEquals(78, ia2.getEndIndex());
- }
+ }
public void testWrite() throws Exception {
TxInteractiveInfoAtom atom = new TxInteractiveInfoAtom(data_a, 0, data_a.length);
}
// Create A from scratch
- public void testCreate() throws Exception {
- TxInteractiveInfoAtom ia = new TxInteractiveInfoAtom();
+ public void testCreate() throws Exception {
+ TxInteractiveInfoAtom ia = new TxInteractiveInfoAtom();
- // Set values
- ia.setStartIndex(25);
- ia.setEndIndex(56);
+ // Set values
+ ia.setStartIndex(25);
+ ia.setEndIndex(56);
// Check it's now the same as a
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int i=0; i<data_a.length; i++) {
assertEquals(data_a[i],b[i]);
}
- }
+ }
// Try to turn a into b
public void testChange() throws Exception {
// Change the number
ia.setStartIndex(57);
- ia.setEndIndex(78);
+ ia.setEndIndex(78);
// Check bytes are now the same
ByteArrayOutputStream baos = new ByteArrayOutputStream();
package org.apache.poi.hslf.record;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
+
import org.apache.poi.hslf.model.textproperties.TextProp;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.StyleTextPropAtom.*;
-
-import java.util.ArrayList;
+import org.apache.poi.hslf.usermodel.SlideShow;
/**
public final class TestTxMasterStyleAtom extends TestCase {
protected SlideShow _ppt;
- public void setUp() throws Exception{
+ public void setUp() {
_ppt = new SlideShow();
-
}
public void testDefaultStyles() {
* There must be a TxMasterStyleAtom per each type of text defined in TextHeaderAtom
*/
protected TxMasterStyleAtom[] getMasterStyles(){
- ArrayList lst = new ArrayList();
+ List<TxMasterStyleAtom> lst = new ArrayList<TxMasterStyleAtom>();
- Record[] core = _ppt.getMostRecentCoreRecords();
- for (int i = 0; i < core.length; i++) {
- if(core[i].getRecordType() == RecordTypes.MainMaster.typeID){
- Record[] rec = core[i].getChildRecords();
+ Record[] coreRecs = _ppt.getMostRecentCoreRecords();
+ for (int i = 0; i < coreRecs.length; i++) {
+ Record coreRec = coreRecs[i];
+ if(coreRec.getRecordType() == RecordTypes.MainMaster.typeID){
+ Record[] recs = coreRec.getChildRecords();
int cnt = 0;
- for (int j = 0; j < rec.length; j++) {
- if (rec[j] instanceof TxMasterStyleAtom) {
- lst.add(rec[j]);
+ for (int j = 0; j < recs.length; j++) {
+ Record rec = recs[j];
+ if (rec instanceof TxMasterStyleAtom) {
+ lst.add((TxMasterStyleAtom) rec);
cnt++;
}
}
assertEquals("MainMaster must contain 7 TxMasterStyleAtoms ", 7, cnt);
- } else if(core[i].getRecordType() == RecordTypes.Document.typeID){
+ } else if(coreRec.getRecordType() == RecordTypes.Document.typeID){
TxMasterStyleAtom txstyle = null;
- Document doc = (Document)core[i];
+ Document doc = (Document)coreRec;
Record[] rec = doc.getEnvironment().getChildRecords();
for (int j = 0; j < rec.length; j++) {
if (rec[j] instanceof TxMasterStyleAtom) {
txstyle = (TxMasterStyleAtom)rec[j];
}
}
- assertNotNull("TxMasterStyleAtom not found in Document.Environment", txstyle);
+ if (txstyle == null) {
+ throw new AssertionFailedError("TxMasterStyleAtom not found in Document.Environment");
+ }
assertEquals("Document.Environment must contain TxMasterStyleAtom with type=TextHeaderAtom.OTHER_TYPE",
TextHeaderAtom.OTHER_TYPE, txstyle.getTextType());
}
}
- return (TxMasterStyleAtom[])lst.toArray(new TxMasterStyleAtom[lst.size()]);
+ return lst.toArray(new TxMasterStyleAtom[lst.size()]);
}
}
package org.apache.poi.hslf.usermodel;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
+
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
-import org.apache.poi.hslf.model.*;
+import org.apache.poi.hslf.model.Background;
+import org.apache.poi.hslf.model.Fill;
+import org.apache.poi.hslf.model.MasterSheet;
+import org.apache.poi.hslf.model.Notes;
+import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.model.Shape;
-
-import java.io.*;
-import java.util.HashSet;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.awt.*;
+import org.apache.poi.hslf.model.ShapeGroup;
+import org.apache.poi.hslf.model.Slide;
+import org.apache.poi.hslf.model.SlideMaster;
+import org.apache.poi.hslf.model.TextBox;
+import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.hslf.model.TextShape;
+import org.apache.poi.hslf.model.TitleMaster;
/**
* Testcases for bugs entered in bugzilla
SlideShow ppt = new SlideShow(hslf);
//map slide number and starting phrase of its notes
- HashMap notesMap = new HashMap();
+ Map<Integer, String> notesMap = new HashMap<Integer, String>();
notesMap.put(new Integer(4), "For decades before calculators");
notesMap.put(new Integer(5), "Several commercial applications");
notesMap.put(new Integer(6), "There are three variations of LNS that are discussed here");
if (notesMap.containsKey(slideNumber)){
assertNotNull(notes);
String text = notes.getTextRuns()[0].getRawText();
- String startingPhrase = (String)notesMap.get(slideNumber);
+ String startingPhrase = notesMap.get(slideNumber);
assertTrue("Notes for slide " + slideNumber + " must start with " +
startingPhrase , text.startsWith(startingPhrase));
}
TextRun[] runs = slide[0].getTextRuns();
assertEquals(4, runs.length);
- HashSet txt = new HashSet();
+ Set<String> txt = new HashSet<String>();
txt.add("\u201CHAPPY BIRTHDAY SCOTT\u201D");
txt.add("Have a HAPPY DAY");
txt.add("PS Nobody is allowed to hassle Scott TODAY\u2026");
Slide slide = ppt.getSlides()[0];
TextRun[] tr1 = slide.getTextRuns();
- ArrayList lst = new ArrayList();
+ List<TextRun> lst = new ArrayList<TextRun>();
Shape[] shape = slide.getShapes();
for (int i = 0; i < shape.length; i++) {
if( shape[i] instanceof TextShape){
TextRun textRun = ((TextShape)shape[i]).getTextRun();
- if(textRun != null) lst.add(textRun);
+ if(textRun != null) {
+ lst.add(textRun);
+ }
}
}
*/
public void test44770() throws Exception {
FileInputStream is = new FileInputStream(new File(cwd, "44770.ppt"));
- SlideShow ppt = new SlideShow(is);
+ try {
+ new SlideShow(is);
+ } catch (RuntimeException e) {
+ if (e.getMessage().equals("Couldn't instantiate the class for type with id 1036 on class class org.apache.poi.hslf.record.PPDrawing")) {
+ throw new AssertionFailedError("Identified bug 44770");
+ }
+ throw e;
+ }
is.close();
-
- assertTrue("No Exceptions while reading file", true);
}
/**
import junit.framework.TestCase;
import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
import org.apache.poi.hslf.record.ParentAwareRecord;
import org.apache.poi.hslf.record.Record;
import org.apache.poi.hslf.record.RecordContainer;
package org.apache.poi.hslf.usermodel;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.blip.*;
-import org.apache.poi.hslf.model.*;
-import junit.framework.TestCase;
-
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
import java.util.Arrays;
+import junit.framework.TestCase;
+
/**
* Test reading sound data from a ppt
*
protected File cwd;
- public void setUp() throws Exception {
+ public void setUp() {
cwd = new File(System.getProperty("HSLF.testdata.path"));
}
package org.apache.poi.hwpf.model;
import java.io.*;
-import java.util.*;
-import junit.framework.*;
+import java.util.Arrays;
+import java.util.List;
-import org.apache.poi.hwpf.*;
-import org.apache.poi.hwpf.model.*;
-import org.apache.poi.util.*;
+import junit.framework.TestCase;
+
+import org.apache.poi.hwpf.HWPFDocument;
/**
* Unit test for {@link SavedByTable} and {@link SavedByEntry}.
public final class TestPictures extends TestCase {
private String dirname = System.getProperty("HWPF.testdata.path");
- protected void setUp() throws Exception {
- }
-
- /**
- * two jpegs
- */
- public void testTwoImages() throws Exception {
- HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/two_images.doc"));
- List pics = doc.getPicturesTable().getAllPictures();
-
- assertNotNull(pics);
- assertEquals(pics.size(), 2);
- for(int i=0; i<pics.size(); i++) {
- Object p = pics.get(i);
- assertTrue(p instanceof Picture);
-
- Picture pic = (Picture)p;
- assertNotNull(pic.suggestFileExtension());
- assertNotNull(pic.suggestFullFileName());
- }
-
- Picture picA = (Picture)pics.get(0);
- Picture picB = (Picture)pics.get(1);
- assertEquals("jpg", picA.suggestFileExtension());
- assertEquals("jpg", picA.suggestFileExtension());
- }
-
- /**
- * pngs and jpegs
- */
- public void testDifferentImages() throws Exception {
- HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/testPictures.doc"));
- List pics = doc.getPicturesTable().getAllPictures();
-
- assertNotNull(pics);
- assertEquals(7, pics.size());
- for(int i=0; i<pics.size(); i++) {
- Object p = pics.get(i);
- assertTrue(p instanceof Picture);
-
- Picture pic = (Picture)p;
- assertNotNull(pic.suggestFileExtension());
- assertNotNull(pic.suggestFullFileName());
- }
-
- assertEquals("jpg", ((Picture)pics.get(0)).suggestFileExtension());
- assertEquals("jpg", ((Picture)pics.get(1)).suggestFileExtension());
- assertEquals("png", ((Picture)pics.get(3)).suggestFileExtension());
- assertEquals("png", ((Picture)pics.get(4)).suggestFileExtension());
- assertEquals("wmf", ((Picture)pics.get(5)).suggestFileExtension());
- assertEquals("jpg", ((Picture)pics.get(6)).suggestFileExtension());
- }
-
- /**
- * emf image, nice and simple
- */
- public void testEmfImage() throws Exception {
- HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/vector_image.doc"));
- List pics = doc.getPicturesTable().getAllPictures();
-
- assertNotNull(pics);
- assertEquals(1, pics.size());
-
- Picture pic = (Picture)pics.get(0);
- assertNotNull(pic.suggestFileExtension());
- assertNotNull(pic.suggestFullFileName());
- assertTrue(pic.getSize() > 128);
-
- // Check right contents
- byte[] emf = loadImage("vector_image.emf");
- byte[] pemf = pic.getContent();
- assertEquals(emf.length, pemf.length);
- for(int i=0; i<emf.length; i++) {
- assertEquals(emf[i], pemf[i]);
- }
- }
-
- /**
- * emf image, with a crazy offset
- */
- public void testEmfComplexImage() throws Exception {
- /*
-
- Commenting out this test case temporarily. The file emf_2003_image does not contain any
- pictures. Instead it has an office drawing object. Need to rewrite this test after
- revisiting the implementation of office drawing objects.
-
- HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/emf_2003_image.doc"));
- List pics = doc.getPicturesTable().getAllPictures();
-
- assertNotNull(pics);
- assertEquals(1, pics.size());
-
- Picture pic = (Picture)pics.get(0);
- assertNotNull(pic.suggestFileExtension());
- assertNotNull(pic.suggestFullFileName());
-
- // This one's tricky
- // TODO: Fix once we've sorted bug #41898
- assertNotNull(pic.getContent());
- assertNotNull(pic.getRawContent());
-
- // These are probably some sort of offset, need to figure them out
- assertEquals(4, pic.getSize());
- assertEquals(0x80000000l, LittleEndian.getUInt(pic.getContent()));
- assertEquals(0x80000000l, LittleEndian.getUInt(pic.getRawContent()));
- */
- }
-
- public void testPicturesWithTable() throws Exception {
- HWPFDocument doc = new HWPFDocument(new FileInputStream(
- new File(dirname, "Bug44603.doc")));
-
- List pics = doc.getPicturesTable().getAllPictures();
- assertEquals(pics.size(), 2);
- }
-
- private byte[] loadImage(String filename) throws Exception {
- ByteArrayOutputStream b = new ByteArrayOutputStream();
- FileInputStream fis = new FileInputStream(dirname + "/" + filename);
-
- byte[] buf = new byte[4096];
- int read = 0;
- while( (read = fis.read(buf)) > -1 ) {
- b.write(buf, 0, read);
- }
- return b.toByteArray();
- }
+
+ /**
+ * two jpegs
+ */
+ public void testTwoImages() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/two_images.doc"));
+ List pics = doc.getPicturesTable().getAllPictures();
+
+ assertNotNull(pics);
+ assertEquals(pics.size(), 2);
+ for(int i=0; i<pics.size(); i++) {
+ Object p = pics.get(i);
+ assertTrue(p instanceof Picture);
+
+ Picture pic = (Picture)p;
+ assertNotNull(pic.suggestFileExtension());
+ assertNotNull(pic.suggestFullFileName());
+ }
+
+ Picture picA = (Picture)pics.get(0);
+ Picture picB = (Picture)pics.get(1);
+ assertEquals("jpg", picA.suggestFileExtension());
+ assertEquals("jpg", picA.suggestFileExtension());
+ }
+
+ /**
+ * pngs and jpegs
+ */
+ public void testDifferentImages() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/testPictures.doc"));
+ List pics = doc.getPicturesTable().getAllPictures();
+
+ assertNotNull(pics);
+ assertEquals(7, pics.size());
+ for(int i=0; i<pics.size(); i++) {
+ Object p = pics.get(i);
+ assertTrue(p instanceof Picture);
+
+ Picture pic = (Picture)p;
+ assertNotNull(pic.suggestFileExtension());
+ assertNotNull(pic.suggestFullFileName());
+ }
+
+ assertEquals("jpg", ((Picture)pics.get(0)).suggestFileExtension());
+ assertEquals("jpg", ((Picture)pics.get(1)).suggestFileExtension());
+ assertEquals("png", ((Picture)pics.get(3)).suggestFileExtension());
+ assertEquals("png", ((Picture)pics.get(4)).suggestFileExtension());
+ assertEquals("wmf", ((Picture)pics.get(5)).suggestFileExtension());
+ assertEquals("jpg", ((Picture)pics.get(6)).suggestFileExtension());
+ }
+
+ /**
+ * emf image, nice and simple
+ */
+ public void testEmfImage() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/vector_image.doc"));
+ List pics = doc.getPicturesTable().getAllPictures();
+
+ assertNotNull(pics);
+ assertEquals(1, pics.size());
+
+ Picture pic = (Picture)pics.get(0);
+ assertNotNull(pic.suggestFileExtension());
+ assertNotNull(pic.suggestFullFileName());
+ assertTrue(pic.getSize() > 128);
+
+ // Check right contents
+ byte[] emf = loadImage("vector_image.emf");
+ byte[] pemf = pic.getContent();
+ assertEquals(emf.length, pemf.length);
+ for(int i=0; i<emf.length; i++) {
+ assertEquals(emf[i], pemf[i]);
+ }
+ }
+
+ /**
+ * emf image, with a crazy offset
+ */
+ public void disabled_testEmfComplexImage() throws Exception {
+
+ // Commenting out this test case temporarily. The file emf_2003_image does not contain any
+ // pictures. Instead it has an office drawing object. Need to rewrite this test after
+ // revisiting the implementation of office drawing objects.
+
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/emf_2003_image.doc"));
+ List pics = doc.getPicturesTable().getAllPictures();
+
+ assertNotNull(pics);
+ assertEquals(1, pics.size());
+
+ Picture pic = (Picture)pics.get(0);
+ assertNotNull(pic.suggestFileExtension());
+ assertNotNull(pic.suggestFullFileName());
+
+ // This one's tricky
+ // TODO: Fix once we've sorted bug #41898
+ assertNotNull(pic.getContent());
+ assertNotNull(pic.getRawContent());
+
+ // These are probably some sort of offset, need to figure them out
+ assertEquals(4, pic.getSize());
+ assertEquals(0x80000000l, LittleEndian.getUInt(pic.getContent()));
+ assertEquals(0x80000000l, LittleEndian.getUInt(pic.getRawContent()));
+ }
+
+ public void testPicturesWithTable() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(
+ new File(dirname, "Bug44603.doc")));
+
+ List pics = doc.getPicturesTable().getAllPictures();
+ assertEquals(pics.size(), 2);
+ }
+
+ private byte[] loadImage(String filename) throws Exception {
+ ByteArrayOutputStream b = new ByteArrayOutputStream();
+ FileInputStream fis = new FileInputStream(dirname + "/" + filename);
+
+ byte[] buf = new byte[4096];
+ int read = 0;
+ while( (read = fis.read(buf)) > -1 ) {
+ b.write(buf, 0, read);
+ }
+ return b.toByteArray();
+ }
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.File;
import java.io.FileInputStream;
import java.util.List;
public final class TestShapes extends TestCase {
private String dirname = System.getProperty("HWPF.testdata.path");
- /**
- * two shapes, second is a group
- */
- public void testShapes() throws Exception {
- HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/WithArtShapes.doc"));
+ /**
+ * two shapes, second is a group
+ */
+ public void testShapes() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/WithArtShapes.doc"));
List shapes = doc.getShapesTable().getAllShapes();
List vshapes = doc.getShapesTable().getVisibleShapes();
assertEquals(4817, s2.getWidth());
assertEquals(2164, s2.getHeight());
assertEquals(true, s2.isWithinDocument());
-
- }
+ }
}
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
+
package org.apache.poi.ddf;
import junit.framework.TestCase;
import org.apache.poi.util.HexRead;
import org.apache.poi.util.HexDump;
-import java.io.IOException;
import java.util.Arrays;
-public class TestEscherOptRecord extends TestCase
-{
+public final class TestEscherOptRecord extends TestCase {
public void testFillFields() {
checkFillFieldsSimple();
}
/**
- * Test serialisation of a particually complex example
+ * Test serialisation of a particually complex example
* This test is currently broken!
*/
public void testComplexSerialise() {
byte[] data = {
- 0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00,
+ 0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00,
// Simple data follows
0x42, 0x01, 0x49, 0x00, 0x00, 0x00, // SP @ 8
0x43, 0x01, 0x85-256, 0x00, 0x00, 0x00, // SP @ 14
0x44, 0x01, 0x04, 0x00, 0x00, 0x00, // SP @ 20
0x45, 0xC1-256, 0x88-256, 0x00, 0x00, 0x00, // SP @ 26
0x46, 0xC1-256, 0x90-256, 0x00, 0x00, 0x00, // SP @ 32
- 0x7F, 0x01, 0x01, 0x00, 0x01, 0x00,
- 0x80-256, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x81-256, 0x01, 0x02, 0x00, 0x00, 0x08,
- 0xBF-256, 0x01, 0x10, 0x00, 0x10, 0x00,
- 0xC0-256, 0x01, 0x01, 0x00, 0x00, 0x08, // SP 10
+ 0x7F, 0x01, 0x01, 0x00, 0x01, 0x00,
+ 0x80-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x81-256, 0x01, 0x02, 0x00, 0x00, 0x08,
+ 0xBF-256, 0x01, 0x10, 0x00, 0x10, 0x00,
+ 0xC0-256, 0x01, 0x01, 0x00, 0x00, 0x08, // SP 10
0xC1-256, 0x01, 0x00, 0x00, 0x01, 0x00,
- 0xC4-256, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0xCB-256, 0x01, 0x38, 0x63, 0x00, 0x00,
- 0xCD-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xC4-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xCB-256, 0x01, 0x38, 0x63, 0x00, 0x00,
+ 0xCD-256, 0x01, 0x00, 0x00, 0x00, 0x00,
0xCE-256, 0x01, 0x00, 0x00, 0x00, 0x00, // SP 15
- 0xD0-256, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0xD1-256, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0xD7-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xD0-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xD1-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xD7-256, 0x01, 0x00, 0x00, 0x00, 0x00,
0xFF-256, 0x01, 0x18, 0x00, 0x18, 0x00,
- 0x01, 0x02, 0x02, 0x00, 0x00, 0x08,
+ 0x01, 0x02, 0x02, 0x00, 0x00, 0x08,
0x3F, 0x02, 0x00, 0x00, 0x02, 0x00, // SP 21
-
+
// Complex data follows
-
+
// Complex data for Array #325
// Array header
- 0x22, 0x00, 0x22, 0x00, 0xF0-256, 0xFF-256,
+ 0x22, 0x00, 0x22, 0x00, 0xF0-256, 0xFF-256,
// Array data
- 0x18, 0x00, 0x28, 0x00, 0x04, 0x00, 0x34,
+ 0x18, 0x00, 0x28, 0x00, 0x04, 0x00, 0x34,
0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00,
- 0x1C, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x10,
+ 0x1C, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x10,
0x00, 0x00, 0x00, 0x1C, 0x00,
- 0x04, 0x00, 0x28, 0x00, 0x10, 0x00, 0x34, 0x00, 0x18, 0x00, 0x3C,
+ 0x04, 0x00, 0x28, 0x00, 0x10, 0x00, 0x34, 0x00, 0x18, 0x00, 0x3C,
0x00, 0x24, 0x00, 0x44, 0x00,
- 0x30, 0x00, 0x48, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x48, 0x00, 0x3C,
+ 0x30, 0x00, 0x48, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x48, 0x00, 0x3C,
0x00, 0x54, 0x00, 0x38, 0x00,
- 0x60, 0x00, 0x2C, 0x00, 0x70, 0x00, 0x20, 0x00, 0x78, 0x00,
+ 0x60, 0x00, 0x2C, 0x00, 0x70, 0x00, 0x20, 0x00, 0x78, 0x00,
0x14, 0x00, 0x80-256, 0x00, 0x08, 0x00,
- 0x84-256, 0x00, 0x04, 0x00, 0x78, 0x00, 0x04, 0x00, 0x6C, 0x00,
+ 0x84-256, 0x00, 0x04, 0x00, 0x78, 0x00, 0x04, 0x00, 0x6C, 0x00,
0x04, 0x00, 0x60, 0x00, 0x04, 0x00,
- 0x54, 0x00, 0x08, 0x00, 0x48, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x0C,
+ 0x54, 0x00, 0x08, 0x00, 0x48, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x0C,
0x00, 0x30, 0x00, 0x08, 0x00,
- 0x3C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x08, 0x00, 0x54, 0x00, 0x00,
+ 0x3C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x08, 0x00, 0x54, 0x00, 0x00,
0x00, 0x48, 0x00, 0x00, 0x00,
0x3C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x04, 0x00, 0x24, 0x00,
// Complex data for Array #326
// Array header
- 0x45, 0x00, 0x48, 0x00, 0x02, 0x00,
+ 0x45, 0x00, 0x48, 0x00, 0x02, 0x00,
// Array data
- 0x00, 0x40, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x00, 0x40, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
- 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x00, 0x80-256
};
-
+
// Create the record
EscherOptRecord r = new EscherOptRecord();
int filled = r.fillFields( data, new DefaultEscherRecordFactory() );
-
+
// Check it's the right length
assertEquals(data.length, filled);
assertEquals(data.length, r.getRecordSize());
-
+
// Serialise it
byte[] dest = new byte[data.length];
int written = r.serialize(0, dest);
-
+
// Check it serialised it back to the same data
assertEquals(data.length, written);
for(int i=0; i<data.length; i++) {
package org.apache.poi.hssf.record;
-import junit.framework.TestCase;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherSpRecord;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.util.HexRead;
-import org.apache.poi.util.LittleEndianOutput;
-import org.apache.poi.util.LittleEndianOutputStream;
-import org.apache.poi.hssf.HSSFTestDataSamples;
-
-import java.io.*;
-import java.util.List;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
public final class TestDrawingRecord extends TestCase {
}
-}
\ No newline at end of file
+}
package org.apache.poi.hssf.record;
-import java.io.ByteArrayInputStream;
-
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.util.HexRead;
"00 " + // unicode compressed
"41 42 " + // 'AB'
"3C 00 " + // ContinueRecord.sid
- "10 00 " + // size 16
+ "10 00 " + // size 16
"00 00 18 00 00 00 00 00 " +
- "02 00 00 00 00 00 00 00 "
+ "02 00 00 00 00 00 00 00 "
);
-
+
public void testLoad() {
RecordInputStream in = TestcaseRecordInputStream.create(data);
package org.apache.poi.hssf.record.aggregates;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.Collection;
import java.util.HashMap;
/**
* Tests for {@link SharedValueManager}
- *
+ *
* @author Josh Micich
*/
public final class TestSharedValueManager extends TestCase {
* The second sheet has two column shared formula ranges - one contained within the other.
* These shared formula ranges were created by fill-dragging a single cell formula across the
* desired region. The larger shared formula ranges were placed first.<br/>
- *
+ *
* There are probably many ways to produce similar effects, but it should be noted that Excel
* is quite temperamental in this regard. Slight variations in technique can cause the shared
* formulas to spill out into plain formula records (which would make these tests pointless).
- *
+ *
*/
private static final String SAMPLE_FILE_NAME = "overlapSharedFormula.xls";
/**
- * Some of these bugs are intermittent, and the test author couldn't think of a way to write
+ * Some of these bugs are intermittent, and the test author couldn't think of a way to write
* test code to hit them bug deterministically. The reason for the unpredictability is that
* the bugs depended on the {@link SharedFormulaRecord}s being searched in a particular order.
- * At the time of writing of the test, the order was being determined by the call to {@link
- * Collection#toArray(Object[])} on {@link HashMap#values()} where the items in the map were
+ * At the time of writing of the test, the order was being determined by the call to {@link
+ * Collection#toArray(Object[])} on {@link HashMap#values()} where the items in the map were
* using default {@link Object#hashCode()}<br/>
*/
private static final int MAX_ATTEMPTS=5;
* This bug happened when there were two or more shared formula ranges that overlapped. POI
* would sometimes associate formulas in the overlapping region with the wrong shared formula
*/
- public void testPartiallyOverlappingRanges() throws IOException {
+ public void testPartiallyOverlappingRanges() {
Record[] records;
int attempt=1;
do {
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook(SAMPLE_FILE_NAME);
-
- HSSFSheet sheet = wb.getSheetAt(0);
- RecordInspector.getRecords(sheet, 0);
- assertEquals("1+1", sheet.getRow(2).getCell(0).getCellFormula());
- if ("1+1".equals(sheet.getRow(3).getCell(0).getCellFormula())) {
- throw new AssertionFailedError("Identified bug - wrong shared formula record chosen"
- + " (attempt " + attempt + ")");
- }
- assertEquals("2+2", sheet.getRow(3).getCell(0).getCellFormula());
- records = RecordInspector.getRecords(sheet, 0);
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook(SAMPLE_FILE_NAME);
+
+ HSSFSheet sheet = wb.getSheetAt(0);
+ RecordInspector.getRecords(sheet, 0);
+ assertEquals("1+1", sheet.getRow(2).getCell(0).getCellFormula());
+ if ("1+1".equals(sheet.getRow(3).getCell(0).getCellFormula())) {
+ throw new AssertionFailedError("Identified bug - wrong shared formula record chosen"
+ + " (attempt " + attempt + ")");
+ }
+ assertEquals("2+2", sheet.getRow(3).getCell(0).getCellFormula());
+ records = RecordInspector.getRecords(sheet, 0);
} while (attempt++ < MAX_ATTEMPTS);
-
+
int count=0;
for (int i = 0; i < records.length; i++) {
if (records[i] instanceof SharedFormulaRecord) {
}
assertEquals(2, count);
}
-
+
/**
* This bug occurs for similar reasons to the bug in {@link #testPartiallyOverlappingRanges()}
* but the symptoms are much uglier - serialization fails with {@link NullPointerException}.<br/>
*/
- public void testCompletelyOverlappedRanges() throws IOException {
+ public void testCompletelyOverlappedRanges() {
Record[] records;
int attempt=1;
do {
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook(SAMPLE_FILE_NAME);
-
- HSSFSheet sheet = wb.getSheetAt(1);
- try {
- records = RecordInspector.getRecords(sheet, 0);
- } catch (NullPointerException e) {
- throw new AssertionFailedError("Identified bug " +
- "- cannot reserialize completely overlapped shared formula"
- + " (attempt " + attempt + ")");
- }
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook(SAMPLE_FILE_NAME);
+
+ HSSFSheet sheet = wb.getSheetAt(1);
+ try {
+ records = RecordInspector.getRecords(sheet, 0);
+ } catch (NullPointerException e) {
+ throw new AssertionFailedError("Identified bug " +
+ "- cannot reserialize completely overlapped shared formula"
+ + " (attempt " + attempt + ")");
+ }
} while (attempt++ < MAX_ATTEMPTS);
-
+
int count=0;
for (int i = 0; i < records.length; i++) {
if (records[i] instanceof SharedFormulaRecord) {
package org.apache.poi.hssf.record.formula;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* Convenient abstract class to reduce the amount of boilerplate code needed
import java.util.Arrays;
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.record.TestcaseRecordInputStream;
-import org.apache.poi.hssf.record.UnicodeString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.util.LittleEndianByteArrayOutputStream;
import org.apache.poi.util.LittleEndianInput;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
/**
* Tests for <tt>ArrayPtg</tt>
- *
+ *
* @author Josh Micich
*/
public final class TestArrayPtg extends TestCase {
private static final byte[] ENCODED_PTG_DATA = {
0x40,
- 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,
};
private static final byte[] ENCODED_CONSTANT_DATA = {
2, // 3 columns
};
/**
- * Lots of problems with ArrayPtg's encoding of
+ * Lots of problems with ArrayPtg's encoding of
*/
public void testReadWriteTokenValueBytes() {
-
+
ArrayPtg ptg = new ArrayPtg(TestcaseRecordInputStream.createLittleEndian(ENCODED_PTG_DATA));
-
+
ptg.readTokenValues(TestcaseRecordInputStream.createLittleEndian(ENCODED_CONSTANT_DATA));
assertEquals(3, ptg.getColumnCount());
assertEquals(2, ptg.getRowCount());
Object[][] values = ptg.getTokenArrayValues();
assertEquals(2, values.length);
-
-
+
+
assertEquals(Boolean.TRUE, values[0][0]);
assertEquals("ABCD", values[0][1]);
assertEquals(new Double(0), values[1][0]);
assertEquals(Boolean.FALSE, values[1][1]);
assertEquals("FG", values[1][2]);
-
+
byte[] outBuf = new byte[ENCODED_CONSTANT_DATA.length];
ptg.writeTokenValueBytes(new LittleEndianByteArrayOutputStream(outBuf, 0));
-
+
if(outBuf[0] == 4) {
throw new AssertionFailedError("Identified bug 42564b");
}
ptg.readTokenValues(TestcaseRecordInputStream.createLittleEndian(ENCODED_CONSTANT_DATA));
assertEquals(3, ptg.getColumnCount());
assertEquals(2, ptg.getRowCount());
-
+
assertEquals(0, ptg.getValueIndex(0, 0));
assertEquals(1, ptg.getValueIndex(1, 0));
assertEquals(2, ptg.getValueIndex(2, 0));
assertEquals(4, ptg.getValueIndex(1, 1));
assertEquals(5, ptg.getValueIndex(2, 1));
}
-
+
/**
* Test for a bug which was temporarily introduced by the fix for bug 42564.
* A spreadsheet was added to make the ordering clearer.
public void testElementOrderingInSpreadsheet() {
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex42564-elementOrder.xls");
- // The formula has an array with 3 rows and 5 columns
+ // The formula has an array with 3 rows and 5 columns
String formula = wb.getSheetAt(0).getRow(0).getCell(0).getCellFormula();
// TODO - These number literals should not have '.0'. Excel has different number rendering rules
public void testToFormulaString() {
ArrayPtg ptg = new ArrayPtg(TestcaseRecordInputStream.createLittleEndian(ENCODED_PTG_DATA));
-
+
ptg.readTokenValues(TestcaseRecordInputStream.createLittleEndian(ENCODED_CONSTANT_DATA));
-
+
String actualFormula;
try {
actualFormula = ptg.toFormulaString();
}
assertEquals("{TRUE,\"ABCD\",\"E\";0.0,FALSE,\"FG\"}", actualFormula);
}
-
+
/**
* worth checking since AttrPtg.sid=0x20 and Ptg.CLASS_* = (0x00, 0x20, and 0x40)
*/
System.arraycopy(ENCODED_PTG_DATA, 0, fullData, 0, ENCODED_PTG_DATA.length);
System.arraycopy(ENCODED_CONSTANT_DATA, 0, fullData, ENCODED_PTG_DATA.length, ENCODED_CONSTANT_DATA.length);
- // Force encoded operand class for tArray
+ // Force encoded operand class for tArray
fullData[0] = (byte) (ArrayPtg.sid + operandClass);
-
+
LittleEndianInput in = TestcaseRecordInputStream.createLittleEndian(fullData);
-
+
Ptg[] ptgs = Ptg.readTokens(ENCODED_PTG_DATA.length, in);
assertEquals(1, ptgs.length);
ArrayPtg aPtg = (ArrayPtg) ptgs[0];
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
-import org.apache.poi.ss.usermodel.ErrorConstants;
/**
* Tests HSSFFormulaEvaluator for its handling of cell formula circular references.
- *
+ *
* @author Josh Micich
*/
public final class TestCircularReferences extends TestCase {
assertTrue(cellValue.getCellType() == HSSFCell.CELL_TYPE_ERROR);
assertEquals(ErrorEval.CIRCULAR_REF_ERROR.getErrorCode(), cellValue.getErrorValue());
}
-
-
+
+
/**
- * ASF Bugzilla Bug 44413
- * "INDEX() formula cannot contain its own location in the data array range"
+ * ASF Bugzilla Bug 44413
+ * "INDEX() formula cannot contain its own location in the data array range"
*/
public void testIndexFormula() {
-
+
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");
-
+
int colB = 1;
sheet.createRow(0).createCell(colB).setCellValue(1);
sheet.createRow(1).createCell(colB).setCellValue(2);
// This formula should evaluate to the contents of B2,
testCell.setCellFormula("INDEX(A1:B4,2,2)");
// However the range A1:B4 also includes the current cell A4. If the other parameters
- // were 4 and 1, this would represent a circular reference. Prior to v3.2 POI would
+ // were 4 and 1, this would represent a circular reference. Prior to v3.2 POI would
// 'fully' evaluate ref arguments before invoking operators, which raised the possibility of
// cycles / StackOverflowErrors.
-
+
CellValue cellValue = evaluateWithCycles(wb, testCell);
-
+
assertTrue(cellValue.getCellType() == HSSFCell.CELL_TYPE_NUMERIC);
assertEquals(2, cellValue.getNumberValue(), 0);
}
* Cell A1 has formula "=A1"
*/
public void testSimpleCircularReference() {
-
+
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");
-
+
HSSFRow row = sheet.createRow(0);
HSSFCell testCell = row.createCell(0);
testCell.setCellFormula("A1");
CellValue cellValue = evaluateWithCycles(wb, testCell);
-
+
confirmCycleErrorCode(cellValue);
}
* A1=B1, B1=C1, C1=D1, D1=A1
*/
public void testMultiLevelCircularReference() {
-
+
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");
-
+
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellFormula("B1");
row.createCell(1).setCellFormula("C1");
testCell.setCellFormula("A1");
CellValue cellValue = evaluateWithCycles(wb, testCell);
-
+
confirmCycleErrorCode(cellValue);
}
-
+
public void testIntermediateCircularReferenceResults_bug46898() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");
-
+
HSSFRow row = sheet.createRow(0);
-
+
HSSFCell cellA1 = row.createCell(0);
HSSFCell cellB1 = row.createCell(1);
HSSFCell cellC1 = row.createCell(2);
HSSFCell cellD1 = row.createCell(3);
HSSFCell cellE1 = row.createCell(4);
-
+
cellA1.setCellFormula("IF(FALSE, 1+B1, 42)");
cellB1.setCellFormula("1+C1");
cellC1.setCellFormula("1+D1");
cellD1.setCellFormula("1+E1");
cellE1.setCellFormula("1+A1");
-
+
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
CellValue cv;
-
- // Happy day flow - evaluate A1 first
+
+ // Happy day flow - evaluate A1 first
cv = fe.evaluate(cellA1);
assertEquals(Cell.CELL_TYPE_NUMERIC, cv.getCellType());
assertEquals(42.0, cv.getNumberValue(), 0.0);
cv = fe.evaluate(cellB1); // no circ-ref-error because A1 result is cached
assertEquals(Cell.CELL_TYPE_NUMERIC, cv.getCellType());
assertEquals(46.0, cv.getNumberValue(), 0.0);
-
+
// Show the bug - evaluate another cell from the loop first
fe.clearAllCachedResultValues();
cv = fe.evaluate(cellB1);
cv = fe.evaluate(cellE1);
assertEquals(Cell.CELL_TYPE_NUMERIC, cv.getCellType());
assertEquals(43.0, cv.getNumberValue(), 0.0);
-
-
+
+
}
}
import junit.framework.AssertionFailedError;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
-import org.apache.poi.hssf.record.formula.eval.ValueEval;
import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
import org.apache.poi.hssf.record.formula.eval.OperationEval;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.usermodel;
import junit.framework.TestCase;
import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.ss.util.Region;
/**
- * Test the ability to clone a sheet.
+ * Test the ability to clone a sheet.
* If adding new records that belong to a sheet (as opposed to a book)
- * add that record to the sheet in the testCloneSheetBasic method.
+ * add that record to the sheet in the testCloneSheetBasic method.
* @author avik
*/
public final class TestCloneSheet extends TestCase {
HSSFSheet s = b.createSheet("Test");
s.addMergedRegion(new CellRangeAddress(0, 1, 0, 1));
HSSFSheet clonedSheet = b.cloneSheet(0);
-
+
assertEquals("One merged area", 1, clonedSheet.getNumMergedRegions());
}
- /**
- * Ensures that pagebreak cloning works properly
- *
- */
- public void testPageBreakClones() {
- HSSFWorkbook b = new HSSFWorkbook();
- HSSFSheet s = b.createSheet("Test");
- s.setRowBreak(3);
- s.setColumnBreak((short)6);
-
- HSSFSheet clone = b.cloneSheet(0);
- assertTrue("Row 3 not broken", clone.isRowBroken(3));
- assertTrue("Column 6 not broken", clone.isColumnBroken((short)6));
-
- s.removeRowBreak(3);
-
- assertTrue("Row 3 still should be broken", clone.isRowBroken(3));
- }
+ /**
+ * Ensures that pagebreak cloning works properly
+ */
+ public void testPageBreakClones() {
+ HSSFWorkbook b = new HSSFWorkbook();
+ HSSFSheet s = b.createSheet("Test");
+ s.setRowBreak(3);
+ s.setColumnBreak((short) 6);
+
+ HSSFSheet clone = b.cloneSheet(0);
+ assertTrue("Row 3 not broken", clone.isRowBroken(3));
+ assertTrue("Column 6 not broken", clone.isColumnBroken((short) 6));
+
+ s.removeRowBreak(3);
+
+ assertTrue("Row 3 still should be broken", clone.isRowBroken(3));
+ }
}
import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.ss.util.Region;
/**
- *
+ *
* @author Dmitriy Kumshayev
*/
public final class TestHSSFConditionalFormatting extends TestCase {
String formula = "7";
HSSFSheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
+
HSSFConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(formula);
HSSFFontFormatting fontFmt = rule1.createFontFormatting();
fontFmt.setFontStyle(true, false);
HSSFPatternFormatting patternFmt = rule1.createPatternFormatting();
patternFmt.setFillBackgroundColor(HSSFColor.YELLOW.index);
-
+
HSSFConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.BETWEEN, "1", "2");
HSSFConditionalFormattingRule [] cfRules =
{
assertEquals(2, cf.getNumberOfRules());
rule1 = cf.getRule(0);
- assertEquals("7",rule1.getFormula1());
+ assertEquals("7",rule1.getFormula1());
assertNull(rule1.getFormula2());
-
+
HSSFFontFormatting r1fp = rule1.getFontFormatting();
assertNotNull(r1fp);
-
+
assertTrue(r1fp.isItalic());
assertFalse(r1fp.isBold());
HSSFPatternFormatting r1pf = rule1.getPatternFormatting();
assertNotNull(r1pf);
- assertEquals(HSSFColor.YELLOW.index,r1pf.getFillBackgroundColor());
+ assertEquals(HSSFColor.YELLOW.index,r1pf.getFillBackgroundColor());
rule2 = cf.getRule(1);
- assertEquals("2",rule2.getFormula2());
- assertEquals("1",rule2.getFormula1());
+ assertEquals("2",rule2.getFormula2());
+ assertEquals("1",rule2.getFormula1());
}
-
+
public void testClone() {
HSSFWorkbook wb = new HSSFWorkbook();
String formula = "7";
HSSFSheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
+
HSSFConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(formula);
HSSFFontFormatting fontFmt = rule1.createFontFormatting();
fontFmt.setFontStyle(true, false);
HSSFPatternFormatting patternFmt = rule1.createPatternFormatting();
patternFmt.setFillBackgroundColor(HSSFColor.YELLOW.index);
-
+
HSSFConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.BETWEEN, "1", "2");
HSSFConditionalFormattingRule [] cfRules =
{
};
sheetCF.addConditionalFormatting(regions, cfRules);
-
+
try {
wb.cloneSheet(0);
} catch (RuntimeException e) {
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
* Ensure that date values *with* a fractional portion get the right time of day
*/
public void testConvertDateTime() {
- // Excel day 30000 is date 18-Feb-1982
+ // Excel day 30000 is date 18-Feb-1982
// 0.7 corresponds to time 16:48:00
Date actual = HSSFDateUtil.getJavaDate(30000.7);
Date expected = createDate(1982, 1, 18, 16, 48, 0);
package org.apache.poi.hssf.usermodel;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import junit.framework.AssertionFailedError;
import org.apache.poi.hssf.HSSFITestDataProvider;
-import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.model.Sheet;
-import org.apache.poi.hssf.model.HSSFFormulaParser;
-import org.apache.poi.hssf.record.DBCellRecord;
-import org.apache.poi.hssf.record.FormulaRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.StringRecord;
-import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.ss.util.AreaReference;
-import org.apache.poi.ss.util.CellReference;
-import org.apache.poi.ss.formula.FormulaType;
+import org.apache.poi.ss.usermodel.BaseTestFont;
+import org.apache.poi.ss.usermodel.Font;
/**
* Tests various functionality having to do with {@link org.apache.poi.ss.usermodel.Name}.
public void testDefaultFont() {
baseTestDefaultFont(HSSFFont.FONT_ARIAL, (short)200, Font.COLOR_NORMAL);
}
-}
\ No newline at end of file
+}
==================================================================== */
package org.apache.poi.hssf.usermodel;
-import org.apache.poi.hssf.model.Workbook;
-
import junit.framework.TestCase;
-public class TestHSSFOptimiser extends TestCase {
- public void testDoesNoHarmIfNothingToDo() throws Exception {
+public final class TestHSSFOptimiser extends TestCase {
+ public void testDoesNoHarmIfNothingToDo() {
HSSFWorkbook wb = new HSSFWorkbook();
-
+
HSSFFont f = wb.createFont();
f.setFontName("Testing");
HSSFCellStyle s = wb.createCellStyle();
s.setFont(f);
-
+
assertEquals(5, wb.getNumberOfFonts());
assertEquals(22, wb.getNumCellStyles());
-
+
// Optimise fonts
HSSFOptimiser.optimiseFonts(wb);
-
+
assertEquals(5, wb.getNumberOfFonts());
assertEquals(22, wb.getNumCellStyles());
-
+
assertEquals(f, s.getFont(wb));
-
+
// Optimise styles
HSSFOptimiser.optimiseCellStyles(wb);
-
+
assertEquals(5, wb.getNumberOfFonts());
assertEquals(22, wb.getNumCellStyles());
-
+
assertEquals(f, s.getFont(wb));
}
-
- public void testOptimiseFonts() throws Exception {
+
+ public void testOptimiseFonts() {
HSSFWorkbook wb = new HSSFWorkbook();
-
+
// Add 6 fonts, some duplicates
HSSFFont f1 = wb.createFont();
- f1.setFontHeight((short)11);
+ f1.setFontHeight((short) 11);
f1.setFontName("Testing");
-
+
HSSFFont f2 = wb.createFont();
- f2.setFontHeight((short)22);
+ f2.setFontHeight((short) 22);
f2.setFontName("Also Testing");
-
+
HSSFFont f3 = wb.createFont();
- f3.setFontHeight((short)33);
+ f3.setFontHeight((short) 33);
f3.setFontName("Unique");
-
+
HSSFFont f4 = wb.createFont();
- f4.setFontHeight((short)11);
+ f4.setFontHeight((short) 11);
f4.setFontName("Testing");
-
+
HSSFFont f5 = wb.createFont();
- f5.setFontHeight((short)22);
+ f5.setFontHeight((short) 22);
f5.setFontName("Also Testing");
-
+
HSSFFont f6 = wb.createFont();
- f6.setFontHeight((short)66);
+ f6.setFontHeight((short) 66);
f6.setFontName("Also Unique");
-
-
-
+
// Use all three of the four in cell styles
assertEquals(21, wb.getNumCellStyles());
-
+
HSSFCellStyle cs1 = wb.createCellStyle();
cs1.setFont(f1);
assertEquals(5, cs1.getFontIndex());
-
+
HSSFCellStyle cs2 = wb.createCellStyle();
cs2.setFont(f4);
assertEquals(8, cs2.getFontIndex());
-
+
HSSFCellStyle cs3 = wb.createCellStyle();
cs3.setFont(f5);
assertEquals(9, cs3.getFontIndex());
-
+
HSSFCellStyle cs4 = wb.createCellStyle();
cs4.setFont(f6);
assertEquals(10, cs4.getFontIndex());
-
+
assertEquals(25, wb.getNumCellStyles());
-
-
+
// And three in rich text
HSSFSheet s = wb.createSheet();
HSSFRow r = s.createRow(0);
-
+
HSSFRichTextString rtr1 = new HSSFRichTextString("Test");
rtr1.applyFont(0, 2, f1);
rtr1.applyFont(3, 4, f2);
r.createCell(0).setCellValue(rtr1);
-
+
HSSFRichTextString rtr2 = new HSSFRichTextString("AlsoTest");
rtr2.applyFont(0, 2, f3);
rtr2.applyFont(3, 5, f5);
rtr2.applyFont(6, 8, f6);
r.createCell(1).setCellValue(rtr2);
-
-
+
// Check what we have now
assertEquals(10, wb.getNumberOfFonts());
assertEquals(25, wb.getNumCellStyles());
-
+
// Optimise
HSSFOptimiser.optimiseFonts(wb);
-
+
// Check font count
assertEquals(8, wb.getNumberOfFonts());
assertEquals(25, wb.getNumCellStyles());
-
+
// Check font use in cell styles
assertEquals(5, cs1.getFontIndex());
assertEquals(5, cs2.getFontIndex()); // duplicate of 1
assertEquals(6, cs3.getFontIndex()); // duplicate of 2
assertEquals(8, cs4.getFontIndex()); // two have gone
-
-
+
// And in rich text
-
- // RTR 1 had f1 and f2, unchanged
+
+ // RTR 1 had f1 and f2, unchanged
assertEquals(5, r.getCell(0).getRichStringCellValue().getFontAtIndex(0));
assertEquals(5, r.getCell(0).getRichStringCellValue().getFontAtIndex(1));
assertEquals(6, r.getCell(0).getRichStringCellValue().getFontAtIndex(3));
assertEquals(6, r.getCell(0).getRichStringCellValue().getFontAtIndex(4));
-
+
// RTR 2 had f3 (unchanged), f5 (=f2) and f6 (moved down)
assertEquals(7, r.getCell(1).getRichStringCellValue().getFontAtIndex(0));
assertEquals(7, r.getCell(1).getRichStringCellValue().getFontAtIndex(1));
assertEquals(8, r.getCell(1).getRichStringCellValue().getFontAtIndex(6));
assertEquals(8, r.getCell(1).getRichStringCellValue().getFontAtIndex(7));
}
-
- public void testOptimiseStyles() throws Exception {
+
+ public void testOptimiseStyles() {
HSSFWorkbook wb = new HSSFWorkbook();
// Two fonts
assertEquals(4, wb.getNumberOfFonts());
-
+
HSSFFont f1 = wb.createFont();
- f1.setFontHeight((short)11);
+ f1.setFontHeight((short) 11);
f1.setFontName("Testing");
-
+
HSSFFont f2 = wb.createFont();
- f2.setFontHeight((short)22);
+ f2.setFontHeight((short) 22);
f2.setFontName("Also Testing");
assertEquals(6, wb.getNumberOfFonts());
-
-
+
// Several styles
assertEquals(21, wb.getNumCellStyles());
-
+
HSSFCellStyle cs1 = wb.createCellStyle();
cs1.setFont(f1);
-
+
HSSFCellStyle cs2 = wb.createCellStyle();
cs2.setFont(f2);
-
+
HSSFCellStyle cs3 = wb.createCellStyle();
cs3.setFont(f1);
-
+
HSSFCellStyle cs4 = wb.createCellStyle();
cs4.setFont(f1);
- cs4.setAlignment((short)22);
-
+ cs4.setAlignment((short) 22);
+
HSSFCellStyle cs5 = wb.createCellStyle();
cs5.setFont(f2);
- cs5.setAlignment((short)111);
-
+ cs5.setAlignment((short) 111);
+
HSSFCellStyle cs6 = wb.createCellStyle();
cs6.setFont(f2);
-
+
assertEquals(27, wb.getNumCellStyles());
-
-
+
// Use them
HSSFSheet s = wb.createSheet();
HSSFRow r = s.createRow(0);
-
+
r.createCell(0).setCellStyle(cs1);
r.createCell(1).setCellStyle(cs2);
r.createCell(2).setCellStyle(cs3);
r.createCell(5).setCellStyle(cs6);
r.createCell(6).setCellStyle(cs1);
r.createCell(7).setCellStyle(cs2);
-
+
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
assertEquals(26, r.getCell(5).getCellValueRecord().getXFIndex());
assertEquals(21, r.getCell(6).getCellValueRecord().getXFIndex());
-
-
+
// Optimise
HSSFOptimiser.optimiseCellStyles(wb);
-
-
+
// Check
assertEquals(6, wb.getNumberOfFonts());
assertEquals(25, wb.getNumCellStyles());
-
+
// cs1 -> 21
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
// cs2 -> 22
-/*
-* 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
-*
-* 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.
-*/
-package org.apache.poi.hssf.usermodel;
+/* ====================================================================
+ 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
+
+ http://www.apache.org/licenses/LICENSE-2.0
-import junit.framework.TestCase;
+ 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.
+==================================================================== */
+
+package org.apache.poi.hssf.usermodel;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.HSSFITestDataProvider;
package org.apache.poi.hssf.usermodel;
import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
-import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.RowRecord;
assertEquals(-1, row.getLastCellNum());
assertEquals(-1, row.getFirstCellNum());
HSSFCell cellB2 = row.createCell(1);
- HSSFCell cellB3 = row.createCell(2);
- HSSFCell cellB4 = row.createCell(3);
+ row.createCell(2); // C2
+ row.createCell(3); // D2
assertEquals(1, row.getFirstCellNum());
assertEquals(4, row.getLastCellNum());
import java.util.List;
import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.HSSFITestDataProvider;
fail("WindowOneRecord in Workbook is probably not initialized");
}
}
-
+
/**
* Tests for {@link HSSFWorkbook#isHidden()} etc
*/
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.InputStream;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.ss.util.Region;
import org.apache.poi.util.TempFile;
/**
s.addMergedRegion(new CellRangeAddress(30, 40, 5, 15));
sanityChecker.checkHSSFWorkbook(wb);
wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
-
+
s = wb.getSheetAt(0);
CellRangeAddress r1 = s.getMergedRegion(0);
CellRangeAddress r2 = s.getMergedRegion(1);
}
}
}
-
+
/**
* This tests is for bug [ #506658 ] Repeating output.
*
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
+import java.util.List;
import junit.framework.ComparisonFailure;
import junit.framework.TestCase;
throw new RuntimeException(e);
}
}
-
+
/**
* Test sorting of properties in <code>DirectoryProperty</code>
*/
DirectoryNode vba = (DirectoryNode)vba_project.getEntry(VBA);
DirectoryProperty p = (DirectoryProperty)vba.getProperty();
- ArrayList lst = new ArrayList();
- for (Iterator it = p.getChildren(); it.hasNext();){
- Property ch = (Property)it.next();
+ List<Property> lst = new ArrayList<Property>();
+ for (Iterator<Property> it = p.getChildren(); it.hasNext();){
+ Property ch = it.next();
lst.add(ch);
}
- return (Property [])lst.toArray(new Property[ 0 ]);
+ return lst.toArray(new Property[ 0 ]);
}
/**
* Old version of case-sensitive PropertyComparator to demonstrate the problem
*/
- private static final Comparator OldCaseSensitivePropertyComparator = new Comparator() {
+ private static final Comparator<Property> OldCaseSensitivePropertyComparator = new Comparator<Property>() {
- public int compare(Object o1, Object o2) {
- String name1 = (( Property ) o1).getName();
- String name2 = (( Property ) o2).getName();
+ public int compare(Property o1, Property o2) {
+ String name1 = o1.getName();
+ String name2 = o2.getName();
int result = name1.length() - name2.length();
if (result == 0) {
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.poifs.storage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.poi.poifs.common.POIFSConstants;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianConsts;
-import java.io.*;
-
-import java.util.*;
-
/**
* Class LocalRawDataBlockList
*
* @author Marc Johnson(mjohnson at apache dot org)
*/
-
-public class LocalRawDataBlockList
- extends RawDataBlockList
-{
- private List _list;
+public final class LocalRawDataBlockList extends RawDataBlockList {
+ private List<RawDataBlock> _list;
private RawDataBlock[] _array;
- /**
- * Constructor LocalRawDataBlockList
- *
- * @exception IOException
- */
-
public LocalRawDataBlockList()
throws IOException
{
super(new ByteArrayInputStream(new byte[ 0 ]), POIFSConstants.BIG_BLOCK_SIZE);
- _list = new ArrayList();
+ _list = new ArrayList<RawDataBlock>();
_array = null;
}
* @param start index of first BAT block
* @param end index of last BAT block
* @param chain index of next XBAT block
- *
- * @exception IOException
*/
-
public void createNewXBATBlock(final int start, final int end,
final int chain)
throws IOException
* create a BAT block and add it to the list
*
* @param start_index initial index for the block list
- *
- * @exception IOException
*/
-
public void createNewBATBlock(final int start_index)
throws IOException
{
* fill the list with dummy blocks
*
* @param count of blocks
- *
- * @exception IOException
*/
-
public void fill(final int count)
throws IOException
{
*
* @param block new block to add
*/
-
public void add(RawDataBlock block)
{
_list.add(block);
* @param index of block to be removed
*
* @return desired block
- *
- * @exception IOException
*/
-
public ListManagedBlock remove(final int index)
throws IOException
{
* @param index the index of the specified block; if the index is
* out of range, that's ok
*/
-
public void zap(final int index)
{
ensureArrayExists();
{
if (_array == null)
{
- _array = ( RawDataBlock [] ) _list.toArray(new RawDataBlock[ 0 ]);
+ _array = _list.toArray(new RawDataBlock[ 0 ]);
}
}
}
* @author Marc Johnson
*/
public final class TestBlockListImpl extends TestCase {
+ private static final class BlockListTestImpl extends BlockListImpl {
+ public BlockListTestImpl() {
+ // no extra initialisation
+ }
+ }
+ private static BlockListImpl create() {
+ return new BlockListTestImpl();
+ }
public void testZap() throws IOException {
- BlockListImpl list = new BlockListImpl();
+ BlockListImpl list = create();
// verify that you can zap anything
for (int j = -2; j < 10; j++)
}
}
+
public void testRemove() throws IOException {
- BlockListImpl list = new BlockListImpl();
+ BlockListImpl list = create();
RawDataBlock[] blocks = new RawDataBlock[ 5 ];
byte[] data = new byte[ 512 * 5 ];
}
public void testSetBAT() throws IOException {
- BlockListImpl list = new BlockListImpl();
+ BlockListImpl list = create();
list.setBAT(null);
list.setBAT(new BlockAllocationTableReader());
// document, one that includes a reserved (BAT) block, one
// that includes a reserved (XBAT) block, and one that
// points off into space somewhere
- BlockListImpl list = new BlockListImpl();
+ BlockListImpl list = create();
List raw_blocks = new ArrayList();
byte[] data = new byte[ 512 ];
int offset = 0;