Fixed several test drivers or the implementation

renamed font functions in HSLFTextRun

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1682356 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2015-05-28 23:32:26 +00:00
parent 063e74acf6
commit d1f9035400
32 changed files with 1300 additions and 1063 deletions

View File

@ -153,7 +153,7 @@ public final class ApacheconEU08 {
cell.setText(txt1[i][j]); cell.setText(txt1[i][j]);
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
rt.setFontSize(10); rt.setFontSize(10);
rt.setFontName("Arial"); rt.setFontFamily("Arial");
rt.setBold(true); rt.setBold(true);
if(i == 0){ if(i == 0){
rt.setFontSize(32); rt.setFontSize(32);
@ -232,7 +232,7 @@ public final class ApacheconEU08 {
HSLFTextBox box3 = new HSLFTextBox(); HSLFTextBox box3 = new HSLFTextBox();
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
rt3.setFontName("Courier New"); rt3.setFontFamily("Courier New");
rt3.setFontSize(8); rt3.setFontSize(8);
box3.setText( box3.setText(
"SlideShow ppt = new SlideShow();\u000b" + "SlideShow ppt = new SlideShow();\u000b" +
@ -341,7 +341,7 @@ public final class ApacheconEU08 {
HSLFTextBox box3 = new HSLFTextBox(); HSLFTextBox box3 = new HSLFTextBox();
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
rt3.setFontName("Courier New"); rt3.setFontFamily("Courier New");
rt3.setFontSize(8); rt3.setFontSize(8);
box3.setText( box3.setText(
"//bar chart data. The first value is the bar color, the second is the width\u000b" + "//bar chart data. The first value is the bar color, the second is the width\u000b" +

View File

@ -54,7 +54,7 @@ public final class TableDemo {
for (int j = 0; j < txt1[i].length; j++) { for (int j = 0; j < txt1[i].length; j++) {
TableCell cell = table1.getCell(i, j); TableCell cell = table1.getCell(i, j);
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
rt.setFontName("Arial"); rt.setFontFamily("Arial");
rt.setFontSize(10); rt.setFontSize(10);
if(i == 0){ if(i == 0){
cell.getFill().setForegroundColor(new Color(227, 227, 227)); cell.getFill().setForegroundColor(new Color(227, 227, 227));
@ -94,7 +94,7 @@ public final class TableDemo {
TableCell cell = table2.getCell(i, j); TableCell cell = table2.getCell(i, j);
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
rt.setFontSize(10); rt.setFontSize(10);
rt.setFontName("Arial"); rt.setFontFamily("Arial");
if(i == 0){ if(i == 0){
cell.getFill().setForegroundColor(new Color(0, 51, 102)); cell.getFill().setForegroundColor(new Color(0, 51, 102));
rt.setFontColor(Color.white); rt.setFontColor(Color.white);

View File

@ -170,49 +170,41 @@ public class HexDump {
* @return output string * @return output string
*/ */
public static String dump(final byte [] data, final long offset, public static String dump(final byte [] data, final long offset, final int index) {
final int index) { if ((index < 0) || (index > data.length))
StringBuffer buffer;
if ((index < 0) || (index >= data.length))
{ {
throw new ArrayIndexOutOfBoundsException( throw new ArrayIndexOutOfBoundsException(
"illegal index: " + index + " into array of length " "illegal index: " + index + " into array of length "
+ data.length); + data.length);
} }
long display_offset = offset + index; long display_offset = offset + index;
buffer = new StringBuffer(74); StringBuilder buffer = new StringBuilder(74);
for (int j = index; j < data.length; j += 16) for (int j = index; j <= data.length; j += 16) {
{
int chars_read = data.length - j; int chars_read = data.length - j;
if (chars_read > 16) if (chars_read > 16) {
{
chars_read = 16; chars_read = 16;
} }
buffer.append(dump(display_offset)).append(' '); buffer.append(dump(display_offset)).append(' ');
for (int k = 0; k < 16; k++) for (int k = 0; k < 16; k++) {
{ String hexDmp = (k < chars_read) ? dump(data[ k + j ]) : " ";
if (k < chars_read) buffer.append(hexDmp);
{
buffer.append(dump(data[ k + j ]));
}
else
{
buffer.append(" ");
}
buffer.append(' '); buffer.append(' ');
} }
for (int k = 0; k < chars_read; k++) for (int k = 0; k < chars_read; k++) {
{ byte dataB = data[ k + j ];
if ((data[ k + j ] >= ' ') && (data[ k + j ] < 127)) char charB = (char)(dataB & 0xFF);
{ switch (charB) {
buffer.append(( char ) data[ k + j ]); case 127: case 128: case 129: case 141: case 142: case 143: case 144: case 157: case 158:
} charB = '.';
else break;
{ default:
buffer.append('.'); if (charB < ' ') charB = '.';
break;
} }
buffer.append(charB);
} }
buffer.append(EOL); buffer.append(EOL);
display_offset += chars_read; display_offset += chars_read;

View File

@ -257,7 +257,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0); HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0);
rt.setFontSize(_font.getSize()); rt.setFontSize(_font.getSize());
rt.setFontName(_font.getFamily()); rt.setFontFamily(_font.getFamily());
if (getColor() != null) rt.setFontColor(getColor()); if (getColor() != null) rt.setFontColor(getColor());
if (_font.isBold()) rt.setBold(true); if (_font.isBold()) rt.setBold(true);

View File

@ -247,14 +247,14 @@ public final class PPDrawing extends RecordAtom {
*/ */
public void writeOut(OutputStream out) throws IOException { public void writeOut(OutputStream out) throws IOException {
// Ensure the escher layer reflects the text changes // Ensure the escher layer reflects the text changes
for(int i=0; i<textboxWrappers.length; i++) { for (EscherTextboxWrapper w : textboxWrappers) {
textboxWrappers[i].writeOut(null); w.writeOut(null);
} }
// Find the new size of the escher children; // Find the new size of the escher children;
int newSize = 0; int newSize = 0;
for(int i=0; i<childRecords.length; i++) { for(EscherRecord er : childRecords) {
newSize += childRecords[i].getRecordSize(); newSize += er.getRecordSize();
} }
// Update the size (header bytes 5-8) // Update the size (header bytes 5-8)

View File

@ -17,11 +17,12 @@
package org.apache.poi.hslf.record; package org.apache.poi.hslf.record;
import org.apache.poi.util.LittleEndian; import java.io.*;
import java.io.OutputStream;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianByteArrayInputStream;
/** /**
* The special info runs contained in this text. * The special info runs contained in this text.
@ -42,6 +43,15 @@ public final class TextSpecInfoAtom extends RecordAtom {
*/ */
private byte[] _data; private byte[] _data;
/**
* Constructs an empty atom, with a default run of size 1
*/
public TextSpecInfoAtom() {
_header = new byte[8];
LittleEndian.putUInt(_header, 4, _type);
reset(1);
}
/** /**
* Constructs the link related atom record from its * Constructs the link related atom record from its
* source data. * source data.
@ -50,7 +60,7 @@ public final class TextSpecInfoAtom extends RecordAtom {
* @param start the start offset into the byte array. * @param start the start offset into the byte array.
* @param len the length of the slice in the byte array. * @param len the length of the slice in the byte array.
*/ */
protected TextSpecInfoAtom(byte[] source, int start, int len) { public TextSpecInfoAtom(byte[] source, int start, int len) {
// Get the header. // Get the header.
_header = new byte[8]; _header = new byte[8];
System.arraycopy(source,start,_header,0,8); System.arraycopy(source,start,_header,0,8);
@ -92,13 +102,44 @@ public final class TextSpecInfoAtom extends RecordAtom {
* @param size the site of parent text * @param size the site of parent text
*/ */
public void reset(int size){ public void reset(int size){
_data = new byte[10]; TextSpecInfoRun sir = new TextSpecInfoRun(size);
// 01 00 00 00 ByteArrayOutputStream bos = new ByteArrayOutputStream();
LittleEndian.putInt(_data, 0, size); try {
// 01 00 00 00 sir.writeOut(bos);
LittleEndian.putInt(_data, 4, 1); //mask } catch (IOException e) {
// 00 00 throw new RuntimeException(e);
LittleEndian.putShort(_data, 8, (short)0); //langId }
_data = bos.toByteArray();
// Update the size (header bytes 5-8)
LittleEndian.putInt(_header, 4, _data.length);
}
/**
* Adapts the size by enlarging the last {@link TextSpecInfoRun}
* or chopping the runs to the given length
*
* @param size
*/
public void setParentSize(int size) {
assert(size > 0);
int covered = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
TextSpecInfoRun runs[] = getTextSpecInfoRuns();
assert(runs.length > 0);
for (int i=0; i<runs.length && covered < size; i++) {
TextSpecInfoRun run = runs[i];
if (covered + run.getLength() > size || i == runs.length-1) {
run.setLength(size-covered);
}
covered += run.getLength();
try {
run.writeOut(bos);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
_data = bos.toByteArray();
// Update the size (header bytes 5-8) // Update the size (header bytes 5-8)
LittleEndian.putInt(_header, 4, _data.length); LittleEndian.putInt(_header, 4, _data.length);
@ -111,92 +152,17 @@ public final class TextSpecInfoAtom extends RecordAtom {
*/ */
public int getCharactersCovered(){ public int getCharactersCovered(){
int covered = 0; int covered = 0;
TextSpecInfoRun[] runs = getTextSpecInfoRuns(); for (TextSpecInfoRun r : getTextSpecInfoRuns()) covered += r.length;
for (int i = 0; i < runs.length; i++) covered += runs[i].len;
return covered; return covered;
} }
public TextSpecInfoRun[] getTextSpecInfoRuns(){ public TextSpecInfoRun[] getTextSpecInfoRuns(){
ArrayList<TextSpecInfoRun> lst = new ArrayList<TextSpecInfoRun>(); LittleEndianByteArrayInputStream bis = new LittleEndianByteArrayInputStream(_data);
int pos = 0; List<TextSpecInfoRun> lst = new ArrayList<TextSpecInfoRun>();
int[] bits = {1, 0, 2}; while (bis.available() > 0) {
while(pos < _data.length) { lst.add(new TextSpecInfoRun(bis));
TextSpecInfoRun run = new TextSpecInfoRun();
run.len = LittleEndian.getInt(_data, pos); pos += 4;
run.mask = LittleEndian.getInt(_data, pos); pos += 4;
for (int i = 0; i < bits.length; i++) {
if((run.mask & 1 << bits[i]) != 0){
switch (bits[i]){
case 0:
run.spellInfo = LittleEndian.getShort(_data, pos); pos += 2;
break;
case 1:
run.langId = LittleEndian.getShort(_data, pos); pos += 2;
break;
case 2:
run.altLangId = LittleEndian.getShort(_data, pos); pos += 2;
break;
}
}
}
lst.add(run);
} }
return lst.toArray(new TextSpecInfoRun[lst.size()]); return lst.toArray(new TextSpecInfoRun[lst.size()]);
} }
public static class TextSpecInfoRun {
//Length of special info run.
protected int len;
//Special info mask of this run;
protected int mask;
// info fields as indicated by the mask.
// -1 means the bit is not set
protected short spellInfo = -1;
protected short langId = -1;
protected short altLangId = -1;
/**
* Spelling status of this text. See Spell Info table below.
*
* <p>Spell Info Types:</p>
* <li>0 Unchecked
* <li>1 Previously incorrect, needs rechecking
* <li>2 Correct
* <li>3 Incorrect
*
* @return Spelling status of this text
*/
public short getSpellInfo(){
return spellInfo;
}
/**
* Windows LANGID for this text.
*
* @return Windows LANGID for this text.
*/
public short getLangId(){
return spellInfo;
}
/**
* Alternate Windows LANGID of this text;
* must be a valid non-East Asian LANGID if the text has an East Asian language,
* otherwise may be an East Asian LANGID or language neutral (zero).
*
* @return Alternate Windows LANGID of this text
*/
public short getAltLangId(){
return altLangId;
}
/**
* @return Length of special info run.
*/
public int length(){
return len;
}
}
} }

View File

@ -0,0 +1,346 @@
/* ====================================================================
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.hslf.record;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.util.*;
public class TextSpecInfoRun {
/**
* A enum that specifies the spelling status of a run of text.
*/
public enum SpellInfoEnum {
/** the text is spelled incorrectly. */
error(new BitField(1)),
/** the text needs rechecking. */
clean(new BitField(2)),
/** the text has a grammar error. */
grammar(new BitField(4)),
/** the text is spelled correct */
correct(new BitField(0));
final BitField bitField;
SpellInfoEnum(BitField bitField) {
this.bitField = bitField;
}
}
/** A bit that specifies whether the spellInfo field exists. */
private static final BitField spellFld = new BitField(0X00000001);
/** A bit that specifies whether the lid field exists. */
private static final BitField langFld = new BitField(0X00000002);
/** A bit that specifies whether the altLid field exists. */
private static final BitField altLangFld = new BitField(0X00000004);
// unused1, unused2 - Undefined and MUST be ignored.
/** A bit that specifies whether the pp10runid, reserved3, and grammarError fields exist. */
private static final BitField pp10extFld = new BitField(0X00000020);
/** A bit that specifies whether the bidi field exists. */
private static final BitField bidiFld = new BitField(0X00000040);
// unused3 - Undefined and MUST be ignored.
// reserved1 - MUST be zero and MUST be ignored.
/** A bit that specifies whether the smartTags field exists. */
private static final BitField smartTagFld = new BitField(0X00000200);
// reserved2 - MUST be zero and MUST be ignored.
/**
* An optional unsigned integer that specifies an identifier for a character
* run that contains StyleTextProp11 data. It MUST exist if and only if pp10ext is TRUE.
**/
private static final BitField pp10runidFld = new BitField(0X0000000F);
// reserved3 - An optional unsigned integer that MUST be zero, and MUST be ignored. It
// MUST exist if and only if fPp10ext is TRUE.
/**
* An optional bit that specifies a grammar error. It MUST exist if and
* only if fPp10ext is TRUE.
**/
private static final BitField grammarErrorFld = new BitField(0X80000000);
//Length of special info run.
protected int length;
//Special info mask of this run;
protected int mask;
// info fields as indicated by the mask.
// -1 means the bit is not set
/**
* An optional SpellingFlags structure that specifies the spelling status of this
* text. It MUST exist if and only if spell is TRUE.
* The spellInfo.grammar sub-field MUST be zero.
* <br>
* error (1 bit): A bit that specifies whether the text is spelled incorrectly.<br>
* clean (1 bit): A bit that specifies whether the text needs rechecking.<br>
* grammar (1 bit): A bit that specifies whether the text has a grammar error.<br>
* reserved (13 bits): MUST be zero and MUST be ignored.
*/
protected short spellInfo = -1;
/**
* An optional TxLCID that specifies the language identifier of this text.
* It MUST exist if and only if lang is TRUE.
* <br>
* 0x0000 = No language.<br>
* 0x0013 = Any Dutch language is preferred over non-Dutch languages when proofing the text.<br>
* 0x0400 = No proofing is performed on the text.<br>
* &gt; 0x0400 = A valid LCID as specified by [MS-LCID].
*/
protected short langId = -1;
/**
* An optional TxLCID that specifies the alternate language identifier of this text.
* It MUST exist if and only if altLang is TRUE.
*/
protected short altLangId = -1;
/**
* An optional signed integer that specifies whether the text contains bidirectional
* characters. It MUST exist if and only if fBidi is TRUE.
* 0x0000 = Contains no bidirectional characters,
* 0x0001 = Contains bidirectional characters.
*/
protected short bidi = -1;
protected int pp10extMask = -1;
protected byte[] smartTagsBytes = null;
/**
* Inits a TextSpecInfoRun with default values
*
* @param len the length of the one and only run
*/
public TextSpecInfoRun(int len) {
setLength(len);
setLangId((short)0);
}
public TextSpecInfoRun(LittleEndianByteArrayInputStream source) {
length = source.readInt();
mask = source.readInt();
if (spellFld.isSet(mask)) {
spellInfo = source.readShort();
}
if (langFld.isSet(mask)) {
langId = source.readShort();
}
if (altLangFld.isSet(mask)) {
altLangId = source.readShort();
}
if (bidiFld.isSet(mask)) {
bidi = source.readShort();
}
if (pp10extFld.isSet(mask)) {
pp10extMask = source.readInt();
}
if (smartTagFld.isSet(mask)) {
// An unsigned integer specifies the count of items in rgSmartTagIndex.
int count = source.readInt();
smartTagsBytes = new byte[4+count*4];
LittleEndian.putInt(smartTagsBytes, 0, count);
// An array of SmartTagIndex that specifies the indices.
// The count of items in the array is specified by count.
source.readFully(smartTagsBytes, 4, count*4);
}
}
/**
* Write the contents of the record back, so it can be written
* to disk
*
* @param out the output stream to write to.
* @throws java.io.IOException if an error occurs.
*/
public void writeOut(OutputStream out) throws IOException {
final byte buf[] = new byte[4];
LittleEndian.putInt(buf, 0, length);
out.write(buf);
LittleEndian.putInt(buf, 0, mask);
out.write(buf);
Object flds[] = {
spellFld, spellInfo, "spell info",
langFld, langId, "lang id",
altLangFld, altLangId, "alt lang id",
bidiFld, bidi, "bidi",
pp10extFld, pp10extMask, "pp10 extension field",
smartTagFld, smartTagsBytes, "smart tags"
};
for (int i=0; i<flds.length; i+=3) {
BitField fld = (BitField)flds[i+0];
Object valO = flds[i+1];
if (!fld.isSet(mask)) continue;
boolean valid;
if (valO instanceof byte[]) {
byte bufB[] = (byte[])valO;
valid = bufB.length > 0;
out.write(bufB);
} else if (valO instanceof Integer) {
int valI = ((Integer)valO);
valid = (valI != -1);
LittleEndian.putInt(buf, 0, valI);
out.write(buf);
} else if (valO instanceof Short) {
short valS = ((Short)valO);
valid = (valS != -1);
LittleEndian.putShort(buf, 0, valS);
out.write(buf, 0, 2);
} else {
valid = false;
}
if (!valid) {
throw new IOException(flds[i+2]+" is activated, but its value is invalid");
}
}
}
/**
* @return Spelling status of this text. null if not defined.
*/
public SpellInfoEnum getSpellInfo(){
if (spellInfo == -1) return null;
for (SpellInfoEnum si : new SpellInfoEnum[]{SpellInfoEnum.clean,SpellInfoEnum.error,SpellInfoEnum.grammar}) {
if (si.bitField.isSet(spellInfo)) return si;
}
return SpellInfoEnum.correct;
}
/**
* @param spellInfo Spelling status of this text. null if not defined.
*/
public void setSpellInfo(SpellInfoEnum spellInfo) {
this.spellInfo = (spellInfo == null)
? -1
: (short)spellInfo.bitField.set(0);
mask = spellFld.setBoolean(mask, spellInfo != null);
}
/**
* Windows LANGID for this text.
*
* @return Windows LANGID for this text, -1 if it's not set
*/
public short getLangId(){
return langId;
}
/**
* @param langId Windows LANGID for this text, -1 to unset
*/
public void setLangId(short langId) {
this.langId = langId;
mask = langFld.setBoolean(mask, langId != -1);
}
/**
* Alternate Windows LANGID of this text;
* must be a valid non-East Asian LANGID if the text has an East Asian language,
* otherwise may be an East Asian LANGID or language neutral (zero).
*
* @return Alternate Windows LANGID of this text, -1 if it's not set
*/
public short getAltLangId(){
return altLangId;
}
public void setAltLangId(short altLangId) {
this.altLangId = altLangId;
mask = altLangFld.setBoolean(mask, altLangId != -1);
}
/**
* @return Length of special info run.
*/
public int getLength() {
return length;
}
/**
* @param length Length of special info run.
*/
public void setLength(int length) {
this.length = length;
}
/**
* @return the bidirectional characters flag. false = not bidi, true = is bidi, null = not set
*/
public Boolean getBidi() {
return (bidi == -1 ? null : bidi != 0);
}
/**
* @param bidi the bidirectional characters flag. false = not bidi, true = is bidi, null = not set
*/
public void setBidi(Boolean bidi) {
this.bidi = (bidi == null) ? -1 : (short)(bidi ? 1 : 0);
mask = bidiFld.setBoolean(mask, bidi != null);
}
/**
* @return the unparsed smart tags
*/
public byte[] getSmartTagsBytes() {
return smartTagsBytes;
}
/**
* @param smartTagsBytes the unparsed smart tags, null to unset
*/
public void setSmartTagsBytes(byte[] smartTagsBytes) {
this.smartTagsBytes = smartTagsBytes;
mask = smartTagFld.setBoolean(mask, smartTagsBytes != null);
}
/**
* @return an identifier for a character run that contains StyleTextProp11 data.
*/
public int getPP10RunId() {
return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? -1 : pp10runidFld.getValue(pp10extMask);
}
/**
* @param pp10RunId an identifier for a character run that contains StyleTextProp11 data, -1 to unset
*/
public void setPP10RunId(int pp10RunId) {
if (pp10RunId == -1) {
pp10extMask = (getGrammarError() == null) ? -1 : pp10runidFld.clear(pp10extMask);
} else {
pp10extMask = pp10runidFld.setValue(pp10extMask, pp10RunId);
}
// if both parameters are invalid, remove the extension mask
mask = pp10extFld.setBoolean(mask, pp10extMask != -1);
}
public Boolean getGrammarError() {
return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? null : grammarErrorFld.isSet(pp10extMask);
}
public void getGrammarError(Boolean grammarError) {
if (grammarError == null) {
pp10extMask = (getPP10RunId() == -1) ? -1 : grammarErrorFld.clear(pp10extMask);
} else {
pp10extMask = grammarErrorFld.set(pp10extMask);
}
// if both parameters are invalid, remove the extension mask
mask = pp10extFld.setBoolean(mask, pp10extMask != -1);
}
}

View File

@ -127,7 +127,36 @@ public abstract class HSLFSheet implements Sheet<HSLFShape,HSLFSlideShow> {
*/ */
@Override @Override
public List<HSLFShape> getShapes() { public List<HSLFShape> getShapes() {
return getShapeList(); PPDrawing ppdrawing = getPPDrawing();
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
EscherContainerRecord spgr = null;
for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
EscherRecord rec = it.next();
if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
spgr = (EscherContainerRecord) rec;
break;
}
}
if (spgr == null) {
throw new IllegalStateException("spgr not found");
}
List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
Iterator<EscherRecord> it = spgr.getChildIterator();
if (it.hasNext()) {
// skip first item
it.next();
}
for (; it.hasNext();) {
EscherContainerRecord sp = (EscherContainerRecord) it.next();
HSLFShape sh = HSLFShapeFactory.createShape(sp, null);
sh.setSheet(this);
shapeList.add(sh);
}
return shapeList;
} }
/** /**
@ -347,48 +376,10 @@ public abstract class HSLFSheet implements Sheet<HSLFShape,HSLFSlideShow> {
} }
public Iterator<HSLFShape> iterator() { public Iterator<HSLFShape> iterator() {
return getShapeList().iterator(); return getShapes().iterator();
} }
/**
* Returns all shapes contained in this Sheet
*
* @return all shapes contained in this Sheet (Slide or Notes)
*/
protected List<HSLFShape> getShapeList() {
PPDrawing ppdrawing = getPPDrawing();
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
EscherContainerRecord spgr = null;
for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
EscherRecord rec = it.next();
if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
spgr = (EscherContainerRecord) rec;
break;
}
}
if (spgr == null) {
throw new IllegalStateException("spgr not found");
}
List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
Iterator<EscherRecord> it = spgr.getChildIterator();
if (it.hasNext()) {
// skip first item
it.next();
}
for (; it.hasNext();) {
EscherContainerRecord sp = (EscherContainerRecord) it.next();
HSLFShape sh = HSLFShapeFactory.createShape(sp, null);
sh.setSheet(this);
shapeList.add(sh);
}
return shapeList;
}
/** /**
* @return whether shapes on the master sheet should be shown. By default master graphics is turned off. * @return whether shapes on the master sheet should be shown. By default master graphics is turned off.
* Sheets that support the notion of master (slide, slideLayout) should override it and * Sheets that support the notion of master (slide, slideLayout) should override it and

View File

@ -571,10 +571,6 @@ public final class HSLFSlideShow implements SlideShow {
+ _slides.size() + ")"); + _slides.size() + ")");
} }
_slides.get(newSlideNumber).setSlideNumber(oldSlideNumber);
_slides.get(oldSlideNumber).setSlideNumber(newSlideNumber);
Collections.swap(_slides, oldSlideNumber-1, newSlideNumber-1);
// The order of slides is defined by the order of slide atom sets in the // The order of slides is defined by the order of slide atom sets in the
// SlideListWithText container. // SlideListWithText container.
SlideListWithText slwt = _documentRecord.getSlideSlideListWithText(); SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
@ -584,11 +580,16 @@ public final class HSLFSlideShow implements SlideShow {
sas[oldSlideNumber - 1] = sas[newSlideNumber - 1]; sas[oldSlideNumber - 1] = sas[newSlideNumber - 1];
sas[newSlideNumber - 1] = tmp; sas[newSlideNumber - 1] = tmp;
Collections.swap(_slides, oldSlideNumber - 1, newSlideNumber - 1);
_slides.get(newSlideNumber - 1).setSlideNumber(newSlideNumber);
_slides.get(oldSlideNumber - 1).setSlideNumber(oldSlideNumber);
ArrayList<Record> lst = new ArrayList<Record>(); ArrayList<Record> lst = new ArrayList<Record>();
for (SlideAtomsSet s : sas) { for (SlideAtomsSet s : sas) {
lst.add(s.getSlidePersistAtom()); lst.add(s.getSlidePersistAtom());
lst.addAll(Arrays.asList(s.getSlideRecords())); lst.addAll(Arrays.asList(s.getSlideRecords()));
} }
Record[] r = lst.toArray(new Record[lst.size()]); Record[] r = lst.toArray(new Record[lst.size()]);
slwt.setChildRecord(r); slwt.setChildRecord(r);
} }
@ -628,7 +629,7 @@ public final class HSLFSlideShow implements SlideShow {
records.add(s.getSlidePersistAtom()); records.add(s.getSlidePersistAtom());
records.addAll(Arrays.asList(s.getSlideRecords())); records.addAll(Arrays.asList(s.getSlideRecords()));
} }
if (sa.size() == 0) { if (sa.isEmpty()) {
_documentRecord.removeSlideListWithText(slwt); _documentRecord.removeSlideListWithText(slwt);
} else { } else {
slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()])); slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()]));

View File

@ -241,8 +241,8 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
hardAttribute = maskProp != null && maskProp.getValue() == 0; hardAttribute = maskProp != null && maskProp.getValue() == 0;
} }
if (prop == null && !hardAttribute){ if (prop == null && !hardAttribute){
HSLFSheet sheet = _parentShape.getSheet(); HSLFSheet sheet = getSheet();
int txtype = _parentShape.getRunType(); int txtype = getRunType();
HSLFMasterSheet master = sheet.getMasterSheet(); HSLFMasterSheet master = sheet.getMasterSheet();
if (master != null) if (master != null)
prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false);
@ -600,7 +600,7 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
if (prop == null) { if (prop == null) {
if (_sheet != null) { if (_sheet != null) {
int txtype = getParentShape().getRunType(); int txtype = getRunType();
HSLFMasterSheet master = _sheet.getMasterSheet(); HSLFMasterSheet master = _sheet.getMasterSheet();
if (master != null) { if (master != null) {
prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false); prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false);
@ -789,10 +789,11 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
* If TextSpecInfoAtom is present, we must update the text size in it, * If TextSpecInfoAtom is present, we must update the text size in it,
* otherwise the ppt will be corrupted * otherwise the ppt will be corrupted
*/ */
TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_txtbox.findFirstOfType(RecordTypes.TextSpecInfoAtom.typeID); for (Record r : paragraphs.get(0)._records) {
int len = rawText.length() + 1; if (r instanceof TextSpecInfoAtom) {
if(specAtom != null && len != specAtom.getCharactersCovered()) { ((TextSpecInfoAtom)r).setParentSize(rawText.length()+1);
specAtom.reset(len); break;
}
} }
} }
@ -870,6 +871,12 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
return appendText(paragraphs, text, false); return appendText(paragraphs, text, false);
} }
public static String getText(List<HSLFTextParagraph> paragraphs) {
assert(!paragraphs.isEmpty());
String rawText = getRawText(paragraphs);
return toExternalString(rawText, paragraphs.get(0).getRunType());
}
public static String getRawText(List<HSLFTextParagraph> paragraphs) { public static String getRawText(List<HSLFTextParagraph> paragraphs) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (HSLFTextParagraph p : paragraphs) { for (HSLFTextParagraph p : paragraphs) {
@ -1151,7 +1158,7 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
wrapper.appendChildRecord(tha); wrapper.appendChildRecord(tha);
TextBytesAtom tba = new TextBytesAtom(); TextBytesAtom tba = new TextBytesAtom();
tba.setText("\r".getBytes()); tba.setText("".getBytes());
wrapper.appendChildRecord(tba); wrapper.appendChildRecord(tba);
StyleTextPropAtom sta = new StyleTextPropAtom(1); StyleTextPropAtom sta = new StyleTextPropAtom(1);
@ -1162,16 +1169,10 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {
HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta); HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null, sta);
htp.setParagraphStyle(paraStyle); htp.setParagraphStyle(paraStyle);
htp._records = new Record[0]; htp._records = new Record[0];
// htp.setBullet(false);
// htp.setLineSpacing(100);
// htp.setLeftMargin(0);
// htp.setIndent(0);
// set wrap flags
HSLFTextRun htr = new HSLFTextRun(htp); HSLFTextRun htr = new HSLFTextRun(htp);
htr.setCharacterStyle(charStyle); htr.setCharacterStyle(charStyle);
htr.setText("\r"); htr.setText("");
// htr.setFontColor(Color.black);
htp.addTextRun(htr); htp.addTextRun(htr);
return Arrays.asList(htp); return Arrays.asList(htp);

View File

@ -39,7 +39,7 @@ public final class HSLFTextRun implements TextRun {
/** The TextRun we belong to */ /** The TextRun we belong to */
private HSLFTextParagraph parentParagraph; private HSLFTextParagraph parentParagraph;
private String _runText = ""; private String _runText = "";
private String _fontname; private String _fontFamily;
/** /**
* Our paragraph and character style. * Our paragraph and character style.
@ -68,9 +68,9 @@ public final class HSLFTextRun implements TextRun {
* Supply the SlideShow we belong to * Supply the SlideShow we belong to
*/ */
public void updateSheet() { public void updateSheet() {
if (_fontname != null) { if (_fontFamily != null) {
setFontName(_fontname); setFontFamily(_fontFamily);
_fontname = null; _fontFamily = null;
} }
} }
@ -149,7 +149,7 @@ public final class HSLFTextRun implements TextRun {
if (prop == null){ if (prop == null){
HSLFSheet sheet = parentParagraph.getSheet(); HSLFSheet sheet = parentParagraph.getSheet();
int txtype = parentParagraph.getParentShape().getRunType(); int txtype = parentParagraph.getRunType();
HSLFMasterSheet master = sheet.getMasterSheet(); HSLFMasterSheet master = sheet.getMasterSheet();
if (master != null) if (master != null)
prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true); prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true);
@ -306,16 +306,16 @@ public final class HSLFTextRun implements TextRun {
/** /**
* Sets the font name to use * Sets the font name to use
*/ */
public void setFontName(String fontName) { public void setFontFamily(String fontFamily) {
HSLFSheet sheet = parentParagraph.getSheet(); HSLFSheet sheet = parentParagraph.getSheet();
HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow();
if (sheet == null || slideShow == null) { if (sheet == null || slideShow == null) {
//we can't set font since slideshow is not assigned yet //we can't set font since slideshow is not assigned yet
_fontname = fontName; _fontFamily = fontFamily;
return; return;
} }
// Get the index for this font (adding if needed) // Get the index for this font (adding if needed)
int fontIdx = slideShow.getFontCollection().addFont(fontName); int fontIdx = slideShow.getFontCollection().addFont(fontFamily);
setCharTextPropVal("font.index", fontIdx); setCharTextPropVal("font.index", fontIdx);
} }
@ -327,7 +327,7 @@ public final class HSLFTextRun implements TextRun {
HSLFSheet sheet = parentParagraph.getSheet(); HSLFSheet sheet = parentParagraph.getSheet();
HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow(); HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow();
if (sheet == null || slideShow == null) { if (sheet == null || slideShow == null) {
return _fontname; return _fontFamily;
} }
int fontIdx = getCharTextPropVal("font.index"); int fontIdx = getCharTextPropVal("font.index");
if(fontIdx == -1) { return null; } if(fontIdx == -1) { return null; }

View File

@ -17,7 +17,6 @@
package org.apache.poi.hslf.model; package org.apache.poi.hslf.model;
import org.apache.poi.hslf.usermodel.TestTextRun;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.Suite; import org.junit.runners.Suite;
@ -36,7 +35,6 @@ import org.junit.runners.Suite;
TestOleEmbedding.class, TestOleEmbedding.class,
TestPPFont.class, TestPPFont.class,
TestPPGraphics2D.class, TestPPGraphics2D.class,
TestPicture.class,
TestSetBoldItalic.class, TestSetBoldItalic.class,
TestShapes.class, TestShapes.class,
TestSheet.class, TestSheet.class,
@ -44,9 +42,7 @@ import org.junit.runners.Suite;
TestSlideMaster.class, TestSlideMaster.class,
TestSlides.class, TestSlides.class,
TestTable.class, TestTable.class,
TestTextRun.class, TestTextRunReWrite.class
TestTextRunReWrite.class,
TestTextShape.class
}) })
public class AllHSLFModelTests { public class AllHSLFModelTests {
} }

View File

@ -40,7 +40,7 @@ public final class TestPPGraphics2D {
private HSLFSlideShow ppt; private HSLFSlideShow ppt;
@Before @Before
protected void setUp() throws Exception { public void setUp() throws Exception {
ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt")); ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt"));
} }

View File

@ -21,7 +21,6 @@ import static org.junit.Assert.*;
import java.awt.*; import java.awt.*;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.awt.geom.Rectangle2D.Double;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -29,11 +28,8 @@ import java.util.List;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.ddf.*; import org.apache.poi.ddf.*;
import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.sl.usermodel.*; import org.apache.poi.sl.usermodel.ShapeType;
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle;
import org.apache.poi.sl.usermodel.TextParagraph.FontAlign;
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -138,6 +134,7 @@ public final class TestShapes {
} }
} }
@SuppressWarnings("unused")
@Test @Test
public void testParagraphs() throws Exception { public void testParagraphs() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlideShow ppt = new HSLFSlideShow();
@ -196,7 +193,7 @@ public final class TestShapes {
HSLFTextBox txtbox = new HSLFTextBox(); HSLFTextBox txtbox = new HSLFTextBox();
rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
txtbox.setText(val); txtbox.setText(val);
rt.setFontName("Arial"); rt.setFontFamily("Arial");
rt.setFontSize(42); rt.setFontSize(42);
rt.setBold(true); rt.setBold(true);
rt.setItalic(true); rt.setItalic(true);

View File

@ -82,10 +82,13 @@ public final class TestSheet {
assertTrue(sheet._getSheetNumber() != 0); assertTrue(sheet._getSheetNumber() != 0);
assertTrue(sheet._getSheetRefId() != 0); assertTrue(sheet._getSheetRefId() != 0);
List<HSLFTextParagraph> txt = sheet.getTextParagraphs(); List<List<HSLFTextParagraph>> txt = sheet.getTextParagraphs();
assertTrue("no text runs", txt != null && !txt.isEmpty()); // assertTrue("no text runs", txt != null && !txt.isEmpty());
for (HSLFTextParagraph t : txt) { // backgrounds.ppt has no texts
assertNotNull(t.getSheet()); for (List<HSLFTextParagraph> t : txt) {
for (HSLFTextParagraph tp : t) {
assertNotNull(tp.getSheet());
}
} }
List<HSLFShape> shape = sheet.getShapes(); List<HSLFShape> shape = sheet.getShapes();

View File

@ -113,10 +113,9 @@ public final class TestSlideMaster {
HSLFMasterSheet masterSheet = slide.getMasterSheet(); HSLFMasterSheet masterSheet = slide.getMasterSheet();
assertTrue(masterSheet instanceof HSLFTitleMaster); assertTrue(masterSheet instanceof HSLFTitleMaster);
List<HSLFTextParagraph> txt = slide.getTextParagraphs(); for (List<HSLFTextParagraph> txt : slide.getTextParagraphs()) {
for (int i = 0; i < txt.size(); i++) { HSLFTextRun rt = txt.get(0).getTextRuns().get(0);
HSLFTextRun rt = txt.get(i).getTextRuns().get(0); switch(txt.get(0).getRunType()){
switch(txt.get(i).getRunType()){
case TextHeaderAtom.CENTER_TITLE_TYPE: case TextHeaderAtom.CENTER_TITLE_TYPE:
assertEquals("Arial", rt.getFontFamily()); assertEquals("Arial", rt.getFontFamily());
assertEquals(32, rt.getFontSize(), 0); assertEquals(32, rt.getFontSize(), 0);
@ -141,20 +140,22 @@ public final class TestSlideMaster {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
List<HSLFSlide> slide = ppt.getSlides(); List<HSLFSlide> slide = ppt.getSlides();
assertEquals(3, slide.size()); assertEquals(3, slide.size());
for (HSLFTextParagraph trun : slide.get(0).getTextParagraphs()) { for (List<HSLFTextParagraph> tparas : slide.get(0).getTextParagraphs()) {
if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ HSLFTextParagraph tpara = tparas.get(0);
HSLFTextRun rt = trun.getTextRuns().get(0); if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
HSLFTextRun rt = tpara.getTextRuns().get(0);
assertEquals(40, rt.getFontSize(), 0); assertEquals(40, rt.getFontSize(), 0);
assertEquals(true, rt.isUnderlined()); assertEquals(true, rt.isUnderlined());
assertEquals("Arial", rt.getFontFamily()); assertEquals("Arial", rt.getFontFamily());
} else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
HSLFTextRun rt = trun.getTextRuns().get(0); HSLFTextRun rt = tpara.getTextRuns().get(0);
assertEquals(0, trun.getIndentLevel()); assertEquals(0, tpara.getIndentLevel());
assertEquals(32, rt.getFontSize(), 0); assertEquals(32, rt.getFontSize(), 0);
assertEquals("Arial", rt.getFontFamily()); assertEquals("Arial", rt.getFontFamily());
rt = trun.getTextRuns().get(1); tpara = tparas.get(1);
assertEquals(1, trun.getIndentLevel()); rt = tpara.getTextRuns().get(0);
assertEquals(1, tpara.getIndentLevel());
assertEquals(28, rt.getFontSize(), 0); assertEquals(28, rt.getFontSize(), 0);
assertEquals("Arial", rt.getFontFamily()); assertEquals("Arial", rt.getFontFamily());
@ -162,16 +163,17 @@ public final class TestSlideMaster {
} }
; ;
for (HSLFTextParagraph trun : slide.get(1).getTextParagraphs()) { for (List<HSLFTextParagraph> tparas : slide.get(1).getTextParagraphs()) {
if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ HSLFTextParagraph tpara = tparas.get(0);
HSLFTextRun rt = trun.getTextRuns().get(0); if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
HSLFTextRun rt = tpara.getTextRuns().get(0);
assertEquals(48, rt.getFontSize(), 0); assertEquals(48, rt.getFontSize(), 0);
assertEquals(true, rt.isItalic()); assertEquals(true, rt.isItalic());
assertEquals("Georgia", rt.getFontFamily()); assertEquals("Georgia", rt.getFontFamily());
} else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
HSLFTextRun rt; HSLFTextRun rt;
rt = trun.getTextRuns().get(0); rt = tpara.getTextRuns().get(0);
assertEquals(0, trun.getIndentLevel()); assertEquals(0, tpara.getIndentLevel());
assertEquals(32, rt.getFontSize(), 0); assertEquals(32, rt.getFontSize(), 0);
assertEquals("Courier New", rt.getFontFamily()); assertEquals("Courier New", rt.getFontFamily());
} }
@ -222,16 +224,17 @@ public final class TestSlideMaster {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
HSLFSlide slide = ppt.getSlides().get(0); HSLFSlide slide = ppt.getSlides().get(0);
for (HSLFTextParagraph trun : slide.getTextParagraphs()) { for (List<HSLFTextParagraph> tparas : slide.getTextParagraphs()) {
if (trun.getRunType() == TextHeaderAtom.TITLE_TYPE){ HSLFTextParagraph tpara = tparas.get(0);
HSLFTextRun rt = trun.getTextRuns().get(0); if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
HSLFTextRun rt = tpara.getTextRuns().get(0);
assertEquals(40, rt.getFontSize(), 0); assertEquals(40, rt.getFontSize(), 0);
assertEquals(true, rt.isUnderlined()); assertEquals(true, rt.isUnderlined());
assertEquals("Arial", rt.getFontFamily()); assertEquals("Arial", rt.getFontFamily());
} else if (trun.getRunType() == TextHeaderAtom.BODY_TYPE){ } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
int indents[] = { 32, 28, 24 }; int indents[] = { 32, 28, 24 };
for (HSLFTextRun rt : trun.getTextRuns()) { for (HSLFTextRun rt : tpara.getTextRuns()) {
int indent = trun.getIndentLevel(); int indent = tpara.getIndentLevel();
assertEquals(indents[indent], rt.getFontSize(), 0); assertEquals(indents[indent], rt.getFontSize(), 0);
} }
} }

View File

@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.util.List;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.usermodel.*; import org.apache.poi.hslf.usermodel.*;
@ -58,34 +59,37 @@ public final class TestTextRunReWrite {
@Test @Test
public void testWritesOutTheSameNonRich() throws Exception { public void testWritesOutTheSameNonRich() throws Exception {
// Grab the first text run on the first sheet
HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
HSLFTextParagraph tr2 = ss.getSlides().get(0).getTextParagraphs().get(1);
// Ensure the text lengths are as we'd expect to start with // Ensure the text lengths are as we'd expect to start with
assertEquals(1, ss.getSlides().length); assertEquals(1, ss.getSlides().size());
assertEquals(2, ss.getSlides().get(0).getTextParagraphs().length); assertEquals(2, ss.getSlides().get(0).getTextParagraphs().size());
assertEquals(30, tr1.getRawText().length());
assertEquals(179, tr2.getRawText().length());
assertEquals(1, tr1.getTextRuns().length); // Grab the first text run on the first sheet
assertEquals(30, tr1.getTextRuns().get(0).getLength()); List<HSLFTextParagraph> tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); List<HSLFTextParagraph> tr2 = ss.getSlides().get(0).getTextParagraphs().get(1);
assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered());
assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered());
assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(179, HSLFTextParagraph.getRawText(tr2).length());
assertEquals(1, tr1.size());
assertEquals(30, HSLFTextParagraph.getText(tr1).length());
assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered());
assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
// Set the text to be as it is now // Set the text to be as it is now
tr1.setText( tr1.getRawText() ); HSLFTextParagraph.setText(tr1, HSLFTextParagraph.getRawText(tr1));
tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
// Check the text lengths are still right // Check the text lengths are still right
assertEquals(30, tr1.getRawText().length()); assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(179, tr2.getRawText().length()); assertEquals(179, HSLFTextParagraph.getRawText(tr2).length());
assertEquals(1, tr1.getTextRuns().length); assertEquals(1, tr1.size());
assertEquals(30, tr1.getTextRuns().get(0).getLength()); assertEquals(30, HSLFTextParagraph.getText(tr1).length());
assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(31, tr1.getTextRuns().get(0)._getRawCharacterStyle().getCharactersCovered()); assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered());
assertEquals(31, tr1.getTextRuns().get(0)._getRawParagraphStyle().getCharactersCovered()); assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
// Write the slideshow out to a byte array // Write the slideshow out to a byte array
@ -117,33 +121,32 @@ public final class TestTextRunReWrite {
@Test @Test
public void testWritesOutTheSameRich() throws Exception { public void testWritesOutTheSameRich() throws Exception {
// Grab the first text run on the first sheet // Grab the first text run on the first sheet
HSLFTextParagraph tr1 = ss.getSlides().get(0).getTextParagraphs().get(0); List<HSLFTextParagraph> tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
// Get the first rich text run // Get the first rich text run
HSLFTextRun rtr1 = tr1.getTextRuns().get(0); HSLFTextRun rtr1 = tr1.get(0).getTextRuns().get(0);
// Check that the text sizes are as expected // Check that the text sizes are as expected
assertEquals(1, tr1.getTextRuns().length); assertEquals(1, tr1.get(0).getTextRuns().size());
assertEquals(30, tr1.getRawText().length()); assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(30, tr1.getTextRuns().get(0).getRawText().length());
assertEquals(30, rtr1.getLength()); assertEquals(30, rtr1.getLength());
assertEquals(30, rtr1.getRawText().length()); assertEquals(30, rtr1.getRawText().length());
assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered());
assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
// Set the text to be as it is now // Set the text to be as it is now
rtr1.setText( rtr1.getRawText() ); rtr1.setText( rtr1.getRawText() );
rtr1 = tr1.getTextRuns().get(0); rtr1 = tr1.get(0).getTextRuns().get(0);
// Check that the text sizes are still as expected // Check that the text sizes are still as expected
assertEquals(1, tr1.getTextRuns().length); assertEquals(1, tr1.get(0).getTextRuns().size());
assertEquals(30, tr1.getRawText().length()); assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
assertEquals(30, tr1.getTextRuns().get(0).getRawText().length()); assertEquals(30, tr1.get(0).getTextRuns().get(0).getRawText().length());
assertEquals(30, rtr1.getLength()); assertEquals(30, rtr1.getLength());
assertEquals(30, rtr1.getRawText().length()); assertEquals(30, rtr1.getRawText().length());
assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered()); assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered());
assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered()); assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
// Write the slideshow out to a byte array // Write the slideshow out to a byte array

View File

@ -1,52 +0,0 @@
/* ====================================================================
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.hslf.model;
import org.apache.poi.hslf.record.StyleTextPropAtom;
import org.apache.poi.hslf.record.TextCharsAtom;
import org.apache.poi.hslf.record.TextHeaderAtom;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.hssf.usermodel.DummyGraphics2d;
import org.junit.Test;
public class TextPainterTest {
@Test
public void testTextPainter() {
HSLFTextShape shape = new Polygon();
TextPainter painter = new TextPainter(shape);
painter.getAttributedString(new HSLFTextParagraph(null, new TextCharsAtom(), null));
painter.paint(new DummyGraphics2d());
painter.getTextElements((float)1.0, null);
}
@Test
public void testTextPainterWithText() {
HSLFTextShape shape = new Polygon();
TextPainter painter = new TextPainter(shape);
TextCharsAtom tca = new TextCharsAtom();
tca.setText("some text to read");
HSLFTextParagraph txrun = new HSLFTextParagraph(new TextHeaderAtom(), tca, new StyleTextPropAtom(10));
HSLFSlide sheet = new HSLFSlide(1, 1, 1);
sheet.setSlideShow(new HSLFSlideShow());
txrun.setSheet(sheet);
painter.getAttributedString(txrun, new DummyGraphics2d());
painter.paint(new DummyGraphics2d());
painter.getTextElements((float)1.0, null);
}
}

View File

@ -42,14 +42,14 @@ public final class TestTextSpecInfoAtom extends TestCase {
public void testRead() { public void testRead() {
TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length); TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
assertEquals(5, run.length); assertEquals(5, run.length);
assertEquals(10, run[0].length()); assertEquals(10, run[0].getLength());
assertEquals(1, run[1].length()); assertEquals(1, run[1].getLength());
assertEquals(70, run[2].length()); assertEquals(70, run[2].getLength());
assertEquals(9, run[3].length()); assertEquals(9, run[3].getLength());
assertEquals(32, run[4].length()); assertEquals(32, run[4].getLength());
} }
@ -66,10 +66,10 @@ public final class TestTextSpecInfoAtom extends TestCase {
TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length); TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
spec.reset(32); //length of the parent text spec.reset(32); //length of the parent text
TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns(); TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
assertEquals(1, run.length); assertEquals(1, run.length);
assertEquals(32, run[0].length()); assertEquals(32, run[0].getLength());
//serialize and read again //serialize and read again
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -77,9 +77,9 @@ public final class TestTextSpecInfoAtom extends TestCase {
byte[] result = out.toByteArray(); byte[] result = out.toByteArray();
TextSpecInfoAtom spec2 = new TextSpecInfoAtom(result, 0, result.length); TextSpecInfoAtom spec2 = new TextSpecInfoAtom(result, 0, result.length);
TextSpecInfoAtom.TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns(); TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns();
assertEquals(1, run2.length); assertEquals(1, run2.length);
assertEquals(32, run2[0].length()); assertEquals(32, run2[0].getLength());
} }
} }

View File

@ -84,13 +84,13 @@ public final class TestTxMasterStyleAtom extends TestCase {
TextProp prop; TextProp prop;
//paragraph styles //paragraph styles
props = txmaster.getParagraphStyles()[0]; props = txmaster.getParagraphStyles().get(0);
prop = props.findByName("alignment"); prop = props.findByName("alignment");
assertEquals(1, prop.getValue()); //title has center alignment assertEquals(1, prop.getValue()); //title has center alignment
//character styles //character styles
props = txmaster.getCharacterStyles()[0]; props = txmaster.getCharacterStyles().get(0);
prop = props.findByName("font.color"); prop = props.findByName("font.color");
assertEquals(0x3000000, prop.getValue()); assertEquals(0x3000000, prop.getValue());
@ -110,27 +110,27 @@ public final class TestTxMasterStyleAtom extends TestCase {
TextPropCollection props; TextPropCollection props;
TextProp prop; TextProp prop;
TextPropCollection[] prstyles = txmaster.getParagraphStyles(); List<TextPropCollection> prstyles = txmaster.getParagraphStyles();
TextPropCollection[] chstyles = txmaster.getCharacterStyles(); List<TextPropCollection> chstyles = txmaster.getCharacterStyles();
assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " + assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " +
"must contain styles for 5 indentation levels", 5, prstyles.length); "must contain styles for 5 indentation levels", 5, prstyles.size());
assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " + assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " +
"must contain styles for 5 indentation levels", 5, chstyles.length); "must contain styles for 5 indentation levels", 5, chstyles.size());
//paragraph styles //paragraph styles
props = prstyles[0]; props = prstyles.get(0);
prop = props.findByName("alignment"); prop = props.findByName("alignment");
assertEquals(0, prop.getValue()); assertEquals(0, prop.getValue());
for (int i = 0; i < prstyles.length; i++) { for (int i = 0; i < prstyles.size(); i++) {
assertNotNull("text.offset is null for indentation level " + i, prstyles[i].findByName("text.offset")); assertNotNull("text.offset is null for indentation level " + i, prstyles.get(i).findByName("text.offset"));
assertNotNull("bullet.offset is null for indentation level " + i, prstyles[i].findByName("bullet.offset")); assertNotNull("bullet.offset is null for indentation level " + i, prstyles.get(i).findByName("bullet.offset"));
} }
//character styles //character styles
props = chstyles[0]; props = chstyles.get(0);
prop = props.findByName("font.color"); prop = props.findByName("font.color");
assertEquals(0x1000000, prop.getValue()); assertEquals(0x1000000, prop.getValue());
@ -150,13 +150,13 @@ public final class TestTxMasterStyleAtom extends TestCase {
TextProp prop; TextProp prop;
//paragraph styles //paragraph styles
props = txmaster.getParagraphStyles()[0]; props = txmaster.getParagraphStyles().get(0);
prop = props.findByName("alignment"); prop = props.findByName("alignment");
assertEquals(0, prop.getValue()); assertEquals(0, prop.getValue());
//character styles //character styles
props = txmaster.getCharacterStyles()[0]; props = txmaster.getCharacterStyles().get(0);
prop = props.findByName("font.color"); prop = props.findByName("font.color");
assertEquals(0x1000000, prop.getValue()); assertEquals(0x1000000, prop.getValue());
@ -176,13 +176,13 @@ public final class TestTxMasterStyleAtom extends TestCase {
TextProp prop; TextProp prop;
//paragraph styles //paragraph styles
props = txmaster.getParagraphStyles()[0]; props = txmaster.getParagraphStyles().get(0);
prop = props.findByName("alignment"); prop = props.findByName("alignment");
assertEquals(0, prop.getValue()); //title has center alignment assertEquals(0, prop.getValue()); //title has center alignment
//character styles //character styles
props = txmaster.getCharacterStyles()[0]; props = txmaster.getCharacterStyles().get(0);
prop = props.findByName("font.color"); prop = props.findByName("font.color");
assertEquals(0x1000000, prop.getValue()); assertEquals(0x1000000, prop.getValue());

View File

@ -37,7 +37,10 @@ import org.junit.runners.Suite;
TestSheetText.class, TestSheetText.class,
TestSlideOrdering.class, TestSlideOrdering.class,
TestSoundData.class, TestSoundData.class,
TestFontRendering.class TestFontRendering.class,
TestPicture.class,
TestTextRun.class,
TestTextShape.class
}) })
public class AllHSLFUserModelTests { public class AllHSLFUserModelTests {
} }

View File

@ -19,17 +19,15 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPFException9;
import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.EscherTextboxWrapper; import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.StyleTextProp9Atom; import org.junit.Test;
import org.apache.poi.hslf.record.StyleTextPropAtom;
import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
import org.apache.poi.POIDataSamples;
/** /**
@ -37,22 +35,21 @@ import org.apache.poi.POIDataSamples;
* *
* @author Alex Nikiforov [mailto:anikif@gmail.com] * @author Alex Nikiforov [mailto:anikif@gmail.com]
*/ */
public final class TestNumberedList extends TestCase { public final class TestNumberedList {
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
protected void setUp() throws Exception { @Test
} public void testNumberedList() throws Exception {
public void testNumberedList() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers.ppt"));
assertTrue("No Exceptions while reading file", true); assertTrue("No Exceptions while reading file", true);
final HSLFSlide[] slides = ppt.getSlides(); final List<HSLFSlide> slides = ppt.getSlides();
assertEquals(2, slides.length); assertEquals(2, slides.size());
checkSlide0(slides[0]); checkSlide0(slides.get(0));
checkSlide1(slides[1]); checkSlide1(slides.get(1));
} }
private void checkSlide0(final HSLFSlide s) {
private void checkSlide0(final HSLFSlide s) {
final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
assertNotNull(numberedListArray); assertNotNull(numberedListArray);
assertEquals(1, numberedListArray.length);//Just one text box here assertEquals(1, numberedListArray.length);//Just one text box here
@ -68,27 +65,33 @@ public final class TestNumberedList extends TestCase {
assertNull(autoNumbers[1].getAutoNumberScheme()); assertNull(autoNumbers[1].getAutoNumberScheme());
assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaLcParenRight == autoNumbers[2].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaLcParenRight == autoNumbers[2].getAutoNumberScheme());
HSLFTextParagraph[] textRuns = s.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
assertEquals(2, textRuns.length); assertEquals(2, textParass.size());
HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; List<HSLFTextParagraph> textParas = textParass.get(0);
assertEquals("titTe", textRun.getRawText()); assertEquals("titTe", HSLFTextParagraph.getRawText(textParas));
assertEquals(1, textRuns[0].getTextRuns().length); assertEquals(1, textParas.size());
assertFalse(textRun.isBullet()); assertFalse(textParas.get(0).isBullet());
assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText()); String expected =
"This is a text placeholder that \r" +
"follows the design pattern\r" +
"Just a test\rWithout any paragraph\r" +
"Second paragraph first line c) ;\r" +
"Second paragraph second line d) . \r";
assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
assertEquals(textRuns.length, styleAtoms.length); assertEquals(textParass.size(), styleAtoms.length);
final EscherTextboxWrapper wrapper = styleAtoms[1]; final EscherTextboxWrapper wrapper = styleAtoms[1];
final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles(); final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); assertEquals(60, textProps.get(0).getCharactersCovered());
assertEquals(60, props[0].getCharactersCovered()); assertEquals(34, textProps.get(1).getCharactersCovered());
assertEquals(34, props[1].getCharactersCovered()); assertEquals(68, textProps.get(2).getCharactersCovered());
assertEquals(68, props[2].getCharactersCovered());
} }
private void checkSlide1(final HSLFSlide s) {
private void checkSlide1(final HSLFSlide s) {
final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
assertNotNull(numberedListArray); assertNotNull(numberedListArray);
assertEquals(1, numberedListArray.length);//Just one text box here assertEquals(1, numberedListArray.length);//Just one text box here
@ -104,25 +107,30 @@ public final class TestNumberedList extends TestCase {
assertNull(autoNumbers[1].getAutoNumberScheme()); assertNull(autoNumbers[1].getAutoNumberScheme());
assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaUcPeriod == autoNumbers[2].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaUcPeriod == autoNumbers[2].getAutoNumberScheme());
final HSLFTextParagraph[] textRuns = s.getTextParagraphs(); final List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
assertEquals(2, textRuns.length); assertEquals(2, textParass.size());
HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; List<HSLFTextParagraph> textParas = textParass.get(0);
assertEquals("Second Slide Title", textRun.getRawText()); assertEquals("Second Slide Title", HSLFTextParagraph.getRawText(textParas));
assertEquals(1, textRuns[0].getTextRuns().length); assertEquals(1, textParas.size());
assertFalse(textRun.isBullet()); assertFalse(textParas.get(0).isBullet());
assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText()); String expected =
"This is a text placeholder that \r" +
"follows the design pattern\r" +
"Just a test\rWithout any paragraph\r" +
"Second paragraph first line c) ;\r" +
"Second paragraph second line d) . \r";
assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
assertEquals(textRuns.length, styleAtoms.length); assertEquals(textParass.size(), styleAtoms.length);
final EscherTextboxWrapper wrapper = styleAtoms[1]; final EscherTextboxWrapper wrapper = styleAtoms[1];
final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles(); final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); assertEquals(33, textProps.get(0).getCharactersCovered());
assertEquals(33, props[0].getCharactersCovered()); assertEquals(61, textProps.get(1).getCharactersCovered());
assertEquals(61, props[1].getCharactersCovered()); assertEquals(68, textProps.get(2).getCharactersCovered());
assertEquals(68, props[2].getCharactersCovered());
} }
} }

View File

@ -19,17 +19,15 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPFException9;
import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.EscherTextboxWrapper; import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.StyleTextProp9Atom; import org.junit.Test;
import org.apache.poi.hslf.record.StyleTextPropAtom;
import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
import org.apache.poi.POIDataSamples;
/** /**
@ -40,20 +38,18 @@ import org.apache.poi.POIDataSamples;
* *
* @author Alex Nikiforov [mailto:anikif@gmail.com] * @author Alex Nikiforov [mailto:anikif@gmail.com]
*/ */
public final class TestNumberedList2 extends TestCase { public final class TestNumberedList2 {
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
protected void setUp() throws Exception { @Test
}
public void testNumberedList() throws Exception { public void testNumberedList() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers2.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers2.ppt"));
assertTrue("No Exceptions while reading file", true); assertTrue("No Exceptions while reading file", true);
final HSLFSlide[] slides = ppt.getSlides(); final List<HSLFSlide> slides = ppt.getSlides();
assertEquals(2, slides.length); assertEquals(2, slides.size());
checkSlide0(slides[0]); checkSlide0(slides.get(0));
checkSlide1(slides[1]); checkSlide1(slides.get(1));
} }
private void checkSlide0(final HSLFSlide s) { private void checkSlide0(final HSLFSlide s) {
final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo(); final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
@ -73,18 +69,22 @@ public final class TestNumberedList2 extends TestCase {
assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme());
HSLFTextParagraph[] textRuns = s.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
assertEquals(2, textRuns.length); assertEquals(2, textParass.size());
HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; List<HSLFTextParagraph> textParas = textParass.get(0);
assertEquals("List Item One\rList Item Two\rList Item Three", textRun.getRawText()); assertEquals("List Item One\rList Item Two\rList Item Three", HSLFTextParagraph.getRawText(textParas));
assertEquals(1, textRuns[0].getTextRuns().length); assertEquals(3, textParas.size());
assertTrue(textRun.isBullet()); assertTrue(textParas.get(0).isBullet());
assertEquals("A numbered list may start at any number \rThis would be used as a continuation list on another page\rThis list should start with #6", textRuns[1].getRawText()); String expected =
"A numbered list may start at any number \r" +
"This would be used as a continuation list on another page\r" +
"This list should start with #6";
assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
assertEquals(textRuns.length, styleAtoms.length); assertEquals(textParass.size(), styleAtoms.length);
checkSingleRunWrapper(44, styleAtoms[0]); checkSingleRunWrapper(44, styleAtoms[0]);
checkSingleRunWrapper(130, styleAtoms[1]); checkSingleRunWrapper(130, styleAtoms[1]);
} }
@ -99,19 +99,21 @@ public final class TestNumberedList2 extends TestCase {
assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getAutoNumberStartNumber());//Default value = 1 will be used assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getAutoNumberStartNumber());//Default value = 1 will be used
assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme());
HSLFTextParagraph[] textRuns = s.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
assertEquals(3, textRuns.length); assertEquals(3, textParass.size());
HSLFTextRun textRun = textRuns[0].getTextRuns()[0]; List<HSLFTextParagraph> textParas = textParass.get(0);
assertEquals("Bulleted list\rMore bullets", textRun.getRawText()); assertEquals("Bulleted list\rMore bullets", HSLFTextParagraph.getRawText(textParas));
assertEquals(1, textRuns[0].getTextRuns().length); assertEquals(2, textParas.size());
assertTrue(textRun.isBullet()); assertTrue(textParas.get(0).isBullet());
assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText()); String expected = "Numbered list between two bulleted lists\rSecond numbered list item";
assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText()); assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
expected = "Second bulleted list \u2013 should appear after numbered list\rMore bullets";
assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(2)));
final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
assertEquals(textRuns.length, styleAtoms.length); assertEquals(textParass.size(), styleAtoms.length);
checkSingleRunWrapper(27, styleAtoms[0]); checkSingleRunWrapper(27, styleAtoms[0]);
checkSingleRunWrapper(67, styleAtoms[1]); checkSingleRunWrapper(67, styleAtoms[1]);
checkSingleRunWrapper(70, styleAtoms[2]); checkSingleRunWrapper(70, styleAtoms[2]);
@ -120,7 +122,6 @@ public final class TestNumberedList2 extends TestCase {
final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles(); final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
assertEquals(1, textProps.size()); assertEquals(1, textProps.size());
final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); assertEquals(exceptedLength, textProps.get(0).getCharactersCovered());
assertEquals(exceptedLength, props[0].getCharactersCovered());
} }
} }

View File

@ -19,17 +19,15 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.model.textproperties.TextPFException9; import org.apache.poi.hslf.model.textproperties.TextPFException9;
import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.EscherTextboxWrapper; import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.record.StyleTextProp9Atom; import org.junit.Test;
import org.apache.poi.hslf.record.StyleTextPropAtom;
import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
import org.apache.poi.POIDataSamples;
/** /**
@ -40,19 +38,17 @@ import org.apache.poi.POIDataSamples;
* *
* @author Alex Nikiforov [mailto:anikif@gmail.com] * @author Alex Nikiforov [mailto:anikif@gmail.com]
*/ */
public final class TestNumberedList3 extends TestCase { public final class TestNumberedList3 {
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
protected void setUp() throws Exception { @Test
} public void testNumberedList() throws Exception {
public void testNumberedList() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers3.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers3.ppt"));
assertTrue("No Exceptions while reading file", true); assertTrue("No Exceptions while reading file", true);
final HSLFSlide[] slides = ppt.getSlides(); final List<HSLFSlide> slides = ppt.getSlides();
assertEquals(1, slides.length); assertEquals(1, slides.size());
final HSLFSlide slide = slides[0]; final HSLFSlide slide = slides.get(0);
checkSlide(slide); checkSlide(slide);
} }
private void checkSlide(final HSLFSlide s) { private void checkSlide(final HSLFSlide s) {
@ -66,35 +62,32 @@ public final class TestNumberedList3 extends TestCase {
assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used
assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
final HSLFTextParagraph[] textRuns = s.getTextParagraphs(); final List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
assertEquals(3, textRuns.length); assertEquals(3, textParass.size());
assertEquals("Bulleted list\rMore bullets\rNo bullets here", textRuns[0].getRawText()); assertEquals("Bulleted list\rMore bullets\rNo bullets here", HSLFTextParagraph.getRawText(textParass.get(0)));
assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText()); assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", HSLFTextParagraph.getRawText(textParass.get(1)));
assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText()); assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", HSLFTextParagraph.getRawText(textParass.get(2)));
assertEquals(2, textRuns[0].getTextRuns().length); assertEquals(3, textParass.get(0).size());
assertEquals(1, textRuns[1].getTextRuns().length); assertEquals(2, textParass.get(1).size());
assertEquals(1, textRuns[2].getTextRuns().length); assertEquals(2, textParass.get(2).size());
assertNull(textRuns[0].getStyleTextProp9Atom()); assertNull(textParass.get(0).get(0).getStyleTextProp9Atom());
assertNotNull(textRuns[1].getStyleTextProp9Atom()); assertNotNull(textParass.get(1).get(0).getStyleTextProp9Atom());
assertNull(textRuns[2].getStyleTextProp9Atom()); assertNull(textParass.get(2).get(0).getStyleTextProp9Atom());
final TextPFException9[] autoNumbers = textRuns[1].getStyleTextProp9Atom().getAutoNumberTypes(); final TextPFException9[] autoNumbers = textParass.get(1).get(0).getStyleTextProp9Atom().getAutoNumberTypes();
assertEquals(1, autoNumbers.length); assertEquals(1, autoNumbers.length);
assertEquals(Short.valueOf((short)1), autoNumbers[0].getfBulletHasAutoNumber()); assertEquals(Short.valueOf((short)1), autoNumbers[0].getfBulletHasAutoNumber());
assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used
assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme()); assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
final List<TextPropCollection> textProps = textRuns[1].getStyleTextPropAtom().getCharacterStyles(); final List<TextPropCollection> textProps = textParass.get(1).get(0).getStyleTextPropAtom().getCharacterStyles();
assertEquals(1, textProps.size()); assertEquals(1, textProps.size());
final TextPropCollection textProp = textProps.get(0); final TextPropCollection textProp = textProps.get(0);
assertEquals(67, textProp.getCharactersCovered()); assertEquals(67, textProp.getCharactersCovered());
assertTrue(textParass.get(0).get(0).isBullet());
HSLFTextRun textRun = textRuns[0].getTextRuns()[0];
assertTrue(textRun.isBullet());
final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers(); final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
assertEquals(textRuns.length, styleAtoms.length); assertEquals(textParass.size(), styleAtoms.length);
checkSingleRunWrapper(43, styleAtoms[0]); checkSingleRunWrapper(43, styleAtoms[0]);
checkSingleRunWrapper(67, styleAtoms[1]); checkSingleRunWrapper(67, styleAtoms[1]);
} }
@ -102,7 +95,6 @@ public final class TestNumberedList3 extends TestCase {
final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom(); final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles(); final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
assertEquals(1, textProps.size()); assertEquals(1, textProps.size());
final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]); assertEquals(exceptedLength, textProps.get(0).getCharactersCovered());
assertEquals(exceptedLength, props[0].getCharactersCovered());
} }
} }

View File

@ -15,7 +15,7 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hslf.model; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;

View File

@ -18,21 +18,21 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import junit.framework.TestCase;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.model.*;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.junit.Before;
import org.junit.Test;
/** /**
* Tests that SlideShow can re-order slides properly * Tests that SlideShow can re-order slides properly
* *
* @author Nick Burch (nick at torchbox dot com) * @author Nick Burch (nick at torchbox dot com)
*/ */
public final class TestReOrderingSlides extends TestCase { public final class TestReOrderingSlides {
// A SlideShow with one slide // A SlideShow with one slide
private HSLFSlideShowImpl hss_one; private HSLFSlideShowImpl hss_one;
private HSLFSlideShow ss_one; private HSLFSlideShow ss_one;
@ -48,6 +48,7 @@ public final class TestReOrderingSlides extends TestCase {
/** /**
* Create/open the slideshows * Create/open the slideshows
*/ */
@Before
public void setUp() throws Exception { public void setUp() throws Exception {
POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
@ -64,10 +65,11 @@ public final class TestReOrderingSlides extends TestCase {
/** /**
* Test that we can "re-order" a slideshow with only 1 slide on it * Test that we can "re-order" a slideshow with only 1 slide on it
*/ */
@Test
public void testReOrder1() throws Exception { public void testReOrder1() throws Exception {
// Has one slide // Has one slide
assertEquals(1, ss_one.getSlides().length); assertEquals(1, ss_one.getSlides().size());
HSLFSlide s1 = ss_one.getSlides()[0]; HSLFSlide s1 = ss_one.getSlides().get(0);
// Check slide 1 is as expected // Check slide 1 is as expected
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
@ -86,10 +88,10 @@ public final class TestReOrderingSlides extends TestCase {
HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
// Check it still has 1 slide // Check it still has 1 slide
assertEquals(1, ss_read.getSlides().length); assertEquals(1, ss_read.getSlides().size());
// And check it's as expected // And check it's as expected
s1 = ss_read.getSlides()[0]; s1 = ss_read.getSlides().get(0);
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
assertEquals(3, s1._getSheetRefId()); assertEquals(3, s1._getSheetRefId());
assertEquals(1, s1.getSlideNumber()); assertEquals(1, s1.getSlideNumber());
@ -99,11 +101,12 @@ public final class TestReOrderingSlides extends TestCase {
* Test doing a dummy re-order on a slideshow with * Test doing a dummy re-order on a slideshow with
* two slides in it * two slides in it
*/ */
@Test
public void testReOrder2() throws Exception { public void testReOrder2() throws Exception {
// Has two slides // Has two slides
assertEquals(2, ss_two.getSlides().length); assertEquals(2, ss_two.getSlides().size());
HSLFSlide s1 = ss_two.getSlides()[0]; HSLFSlide s1 = ss_two.getSlides().get(0);
HSLFSlide s2 = ss_two.getSlides()[1]; HSLFSlide s2 = ss_two.getSlides().get(1);
// Check slide 1 is as expected // Check slide 1 is as expected
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
@ -126,11 +129,11 @@ public final class TestReOrderingSlides extends TestCase {
HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
// Check it still has 2 slides // Check it still has 2 slides
assertEquals(2, ss_read.getSlides().length); assertEquals(2, ss_read.getSlides().size());
// And check it's as expected // And check it's as expected
s1 = ss_read.getSlides()[0]; s1 = ss_read.getSlides().get(0);
s2 = ss_read.getSlides()[1]; s2 = ss_read.getSlides().get(1);
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
assertEquals(4, s1._getSheetRefId()); assertEquals(4, s1._getSheetRefId());
assertEquals(1, s1.getSlideNumber()); assertEquals(1, s1.getSlideNumber());
@ -142,11 +145,12 @@ public final class TestReOrderingSlides extends TestCase {
/** /**
* Test re-ordering slides in a slideshow with 2 slides on it * Test re-ordering slides in a slideshow with 2 slides on it
*/ */
@Test
public void testReOrder2swap() throws Exception { public void testReOrder2swap() throws Exception {
// Has two slides // Has two slides
assertEquals(2, ss_two.getSlides().length); assertEquals(2, ss_two.getSlides().size());
HSLFSlide s1 = ss_two.getSlides()[0]; HSLFSlide s1 = ss_two.getSlides().get(0);
HSLFSlide s2 = ss_two.getSlides()[1]; HSLFSlide s2 = ss_two.getSlides().get(1);
// Check slide 1 is as expected // Check slide 1 is as expected
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
@ -169,11 +173,11 @@ public final class TestReOrderingSlides extends TestCase {
HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
// Check it still has 2 slides // Check it still has 2 slides
assertEquals(2, ss_read.getSlides().length); assertEquals(2, ss_read.getSlides().size());
// And check it's as expected // And check it's as expected
s1 = ss_read.getSlides()[0]; s1 = ss_read.getSlides().get(0);
s2 = ss_read.getSlides()[1]; s2 = ss_read.getSlides().get(1);
assertEquals(257, s1._getSheetNumber()); assertEquals(257, s1._getSheetNumber());
assertEquals(6, s1._getSheetRefId()); assertEquals(6, s1._getSheetRefId());
assertEquals(1, s1.getSlideNumber()); assertEquals(1, s1.getSlideNumber());
@ -186,12 +190,13 @@ public final class TestReOrderingSlides extends TestCase {
* Test doing a dummy re-order on a slideshow with * Test doing a dummy re-order on a slideshow with
* three slides in it * three slides in it
*/ */
@Test
public void testReOrder3() throws Exception { public void testReOrder3() throws Exception {
// Has three slides // Has three slides
assertEquals(3, ss_three.getSlides().length); assertEquals(3, ss_three.getSlides().size());
HSLFSlide s1 = ss_three.getSlides()[0]; HSLFSlide s1 = ss_three.getSlides().get(0);
HSLFSlide s2 = ss_three.getSlides()[1]; HSLFSlide s2 = ss_three.getSlides().get(1);
HSLFSlide s3 = ss_three.getSlides()[2]; HSLFSlide s3 = ss_three.getSlides().get(2);
// Check slide 1 is as expected // Check slide 1 is as expected
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
@ -218,12 +223,12 @@ public final class TestReOrderingSlides extends TestCase {
HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
// Check it still has 3 slides // Check it still has 3 slides
assertEquals(3, ss_read.getSlides().length); assertEquals(3, ss_read.getSlides().size());
// And check it's as expected // And check it's as expected
s1 = ss_read.getSlides()[0]; s1 = ss_read.getSlides().get(0);
s2 = ss_read.getSlides()[1]; s2 = ss_read.getSlides().get(1);
s3 = ss_read.getSlides()[2]; s3 = ss_read.getSlides().get(2);
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
assertEquals(3, s1._getSheetRefId()); assertEquals(3, s1._getSheetRefId());
@ -239,12 +244,13 @@ public final class TestReOrderingSlides extends TestCase {
/** /**
* Test re-ordering slides in a slideshow with 3 slides on it * Test re-ordering slides in a slideshow with 3 slides on it
*/ */
@Test
public void testReOrder3swap() throws Exception { public void testReOrder3swap() throws Exception {
// Has three slides // Has three slides
assertEquals(3, ss_three.getSlides().length); assertEquals(3, ss_three.getSlides().size());
HSLFSlide s1 = ss_three.getSlides()[0]; HSLFSlide s1 = ss_three.getSlides().get(0);
HSLFSlide s2 = ss_three.getSlides()[1]; HSLFSlide s2 = ss_three.getSlides().get(1);
HSLFSlide s3 = ss_three.getSlides()[2]; HSLFSlide s3 = ss_three.getSlides().get(2);
// Check slide 1 is as expected // Check slide 1 is as expected
assertEquals(256, s1._getSheetNumber()); assertEquals(256, s1._getSheetNumber());
@ -263,6 +269,18 @@ public final class TestReOrderingSlides extends TestCase {
// (1 -> 2, 2 -> 3) // (1 -> 2, 2 -> 3)
ss_three.reorderSlide(3, 1); ss_three.reorderSlide(3, 1);
// refresh the slides
s1 = ss_three.getSlides().get(0);
s2 = ss_three.getSlides().get(1);
s3 = ss_three.getSlides().get(2);
assertEquals(1, s1.getSlideNumber());
assertEquals(2, s2.getSlideNumber());
assertEquals(3, s3.getSlideNumber());
assertEquals("Slide 3", ((HSLFTextShape)s1.getShapes().get(0)).getText());
assertEquals("Slide 1", ((HSLFTextShape)s3.getShapes().get(0)).getText());
// Write out, and read back in // Write out, and read back in
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
hss_three.write(baos); hss_three.write(baos);
@ -272,16 +290,16 @@ public final class TestReOrderingSlides extends TestCase {
HSLFSlideShow ss_read = new HSLFSlideShow(hss_read); HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
// Check it still has 3 slides // Check it still has 3 slides
assertEquals(3, ss_read.getSlides().length); assertEquals(3, ss_read.getSlides().size());
// And check it's as expected // And check it's as expected
HSLFSlide _s1 = ss_read.getSlides()[0]; HSLFSlide _s1 = ss_read.getSlides().get(0);
HSLFSlide _s2 = ss_read.getSlides()[1]; HSLFSlide _s2 = ss_read.getSlides().get(1);
HSLFSlide _s3 = ss_read.getSlides()[2]; HSLFSlide _s3 = ss_read.getSlides().get(2);
// 1 --> 3 // 1 --> 3
assertEquals(s1._getSheetNumber(), _s3._getSheetNumber()); assertEquals(s1._getSheetNumber(), _s1._getSheetNumber());
assertEquals(s1._getSheetRefId(), _s3._getSheetRefId()); assertEquals(s1._getSheetRefId(), _s1._getSheetRefId());
assertEquals(1, s1.getSlideNumber()); assertEquals(1, s1.getSlideNumber());
// 2nd slide is not updated // 2nd slide is not updated
@ -290,8 +308,8 @@ public final class TestReOrderingSlides extends TestCase {
assertEquals(2, s2.getSlideNumber()); assertEquals(2, s2.getSlideNumber());
// 3 --> 1 // 3 --> 1
assertEquals(s3._getSheetNumber(), _s1._getSheetNumber()); assertEquals(s3._getSheetNumber(), _s3._getSheetNumber());
assertEquals(s3._getSheetRefId(), _s1._getSheetRefId()); assertEquals(s3._getSheetRefId(), _s3._getSheetRefId());
assertEquals(3, s3.getSlideNumber()); assertEquals(3, s3.getSlideNumber());
} }
} }

View File

@ -17,14 +17,12 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.assertEquals;
import junit.framework.TestCase;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.record.ParentAwareRecord;
import org.apache.poi.hslf.record.Record;
import org.apache.poi.hslf.record.RecordContainer;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.record.*;
import org.junit.Before;
import org.junit.Test;
/** /**
* Tests that the record setup done by SlideShow * Tests that the record setup done by SlideShow
@ -33,17 +31,20 @@ import org.apache.poi.POIDataSamples;
* *
* @author Nick Burch (nick at torchbox dot com) * @author Nick Burch (nick at torchbox dot com)
*/ */
public final class TestRecordSetup extends TestCase { public final class TestRecordSetup {
// SlideShow primed on the test data // SlideShow primed on the test data
private HSLFSlideShow ss; @SuppressWarnings("unused")
private HSLFSlideShow ss;
private HSLFSlideShowImpl hss; private HSLFSlideShowImpl hss;
public TestRecordSetup() throws Exception { @Before
public void init() throws Exception {
POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
ss = new HSLFSlideShow(hss); ss = new HSLFSlideShow(hss);
} }
@Test
public void testHandleParentAwareRecords() { public void testHandleParentAwareRecords() {
Record[] records = hss.getRecords(); Record[] records = hss.getRecords();
for(int i=0; i<records.length; i++) { for(int i=0; i<records.length; i++) {

View File

@ -17,86 +17,93 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import java.io.ByteArrayInputStream; import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream; import static org.apache.poi.POITestCase.assertContains;
import java.io.FileInputStream;
import java.io.*;
import java.util.List;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.POITestCase; import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.model.*; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.hslf.record.Record; import org.apache.poi.util.IOUtils;
import org.apache.poi.hslf.record.SlideListWithText; import org.junit.Before;
import org.junit.Test;
/** /**
* Test that the friendly getters and setters on RichTextRun * Test that the friendly getters and setters on RichTextRun
* behave as expected. * behave as expected.
* (model.TestTextRun tests the other functionality) * (model.TestTextRun tests the other functionality)
*/ */
public final class TestRichTextRun extends POITestCase { public final class TestRichTextRun {
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
// SlideShow primed on the test data // SlideShow primed on the test data
private HSLFSlideShow ss; private HSLFSlideShow ss;
private HSLFSlideShow ssRichA; private HSLFSlideShow ssRichA;
private HSLFSlideShow ssRichB; private HSLFSlideShow ssRichB;
private HSLFSlideShow ssRichC; private HSLFSlideShow ssRichC;
private HSLFSlideShow ssChinese; private HSLFSlideShow ssChinese;
private HSLFSlideShowImpl hss; private HSLFSlideShowImpl hss;
private HSLFSlideShowImpl hssRichA; private HSLFSlideShowImpl hssRichA;
private HSLFSlideShowImpl hssRichB; private HSLFSlideShowImpl hssRichB;
private HSLFSlideShowImpl hssRichC; private HSLFSlideShowImpl hssRichC;
private HSLFSlideShowImpl hssChinese; private HSLFSlideShowImpl hssChinese;
private static String filenameC; private static String filenameC;
protected void setUp() throws Exception { @Before
// Basic (non rich) test file public void setUp() throws Exception {
hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt")); // Basic (non rich) test file
ss = new HSLFSlideShow(hss); hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
ss = new HSLFSlideShow(hss);
// Rich test file A // Rich test file A
hssRichA = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page.ppt")); hssRichA = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
ssRichA = new HSLFSlideShow(hssRichA); ssRichA = new HSLFSlideShow(hssRichA);
// Rich test file B // Rich test file B
hssRichB = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt")); hssRichB = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt"));
ssRichB = new HSLFSlideShow(hssRichB); ssRichB = new HSLFSlideShow(hssRichB);
// Rich test file C - has paragraph styles that run out before // Rich test file C - has paragraph styles that run out before
// the character ones do // the character ones do
filenameC = "ParagraphStylesShorterThanCharStyles.ppt"; filenameC = "ParagraphStylesShorterThanCharStyles.ppt";
hssRichC = new HSLFSlideShowImpl(_slTests.openResourceAsStream(filenameC)); hssRichC = new HSLFSlideShowImpl(_slTests.openResourceAsStream(filenameC));
ssRichC = new HSLFSlideShow(hssRichC); ssRichC = new HSLFSlideShow(hssRichC);
// Rich test file with Chinese + English text in it // Rich test file with Chinese + English text in it
hssChinese = new HSLFSlideShowImpl(_slTests.openResourceAsStream("54880_chinese.ppt")); hssChinese = new HSLFSlideShowImpl(_slTests.openResourceAsStream("54880_chinese.ppt"));
ssChinese = new HSLFSlideShow(hssChinese); ssChinese = new HSLFSlideShow(hssChinese);
} }
/** /**
* Test the stuff about getting/setting bold * Test the stuff about getting/setting bold
* on a non rich text run * on a non rich text run
*/ */
@Test
public void testBoldNonRich() { public void testBoldNonRich() {
HSLFSlide slideOne = ss.getSlides()[0]; HSLFSlide slideOne = ss.getSlides().get(0);
HSLFTextParagraph[] textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextRun rtr = textRuns[0].getTextRuns()[0]; List<HSLFTextParagraph> textParas = textParass.get(0);
HSLFTextRun rtr = textParas.get(0).getTextRuns().get(0);
assertNull(rtr._getRawCharacterStyle()); assertNotNull(rtr.getCharacterStyle());
assertNull(rtr._getRawParagraphStyle()); assertNotNull(textParas.get(0).getParagraphStyle());
assertFalse(rtr.isBold()); assertFalse(rtr.isBold());
// Now set it to not bold // Now set it to not bold
rtr.setBold(false); rtr.setBold(false);
//setting bold=false doesn't change the internal state // in Pre 3.12: setting bold=false doesn't change the internal state
assertNull(rtr._getRawCharacterStyle()); // now: also allow explicitly disable styles and there aren't any non rich text runs anymore
assertNull(rtr._getRawParagraphStyle()); assertNotNull(rtr.getCharacterStyle());
assertNotNull(textParas.get(0).getParagraphStyle());
assertFalse(rtr.isBold()); assertFalse(rtr.isBold());
// And now make it bold // And now make it bold
rtr.setBold(true); rtr.setBold(true);
assertNotNull(rtr._getRawCharacterStyle()); assertNotNull(rtr.getCharacterStyle());
assertNotNull(rtr._getRawParagraphStyle()); assertNotNull(textParas.get(0).getParagraphStyle());
assertTrue(rtr.isBold()); assertTrue(rtr.isBold());
} }
@ -104,115 +111,116 @@ public final class TestRichTextRun extends POITestCase {
* Test the stuff about getting/setting bold * Test the stuff about getting/setting bold
* on a rich text run * on a rich text run
*/ */
@Test
public void testBoldRich() { public void testBoldRich() {
HSLFSlide slideOneR = ssRichA.getSlides()[0]; HSLFSlide slideOneR = ssRichA.getSlides().get(0);
HSLFTextParagraph[] textRunsR = slideOneR.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOneR.getTextParagraphs();
HSLFTextRun[] rtrs = textRunsR[1].getTextRuns(); List<HSLFTextParagraph> textParas = textParass.get(1);
assertEquals(3, rtrs.length); assertEquals(3, textParas.size());
assertTrue(rtrs[0].isBold()); assertTrue(textParas.get(0).getTextRuns().get(0).isBold());
assertFalse(rtrs[1].isBold()); assertFalse(textParas.get(1).getTextRuns().get(0).isBold());
assertFalse(rtrs[2].isBold()); assertFalse(textParas.get(2).getTextRuns().get(0).isBold());
rtrs[0].setBold(true); textParas.get(0).getTextRuns().get(0).setBold(true);
rtrs[1].setBold(true); textParas.get(1).getTextRuns().get(0).setBold(true);
assertTrue(rtrs[0].isBold()); assertTrue(textParas.get(0).getTextRuns().get(0).isBold());
assertTrue(rtrs[1].isBold()); assertTrue(textParas.get(1).getTextRuns().get(0).isBold());
rtrs[0].setBold(false); textParas.get(0).getTextRuns().get(0).setBold(false);
rtrs[1].setBold(false); textParas.get(1).getTextRuns().get(0).setBold(false);
assertFalse(rtrs[0].isBold()); assertFalse(textParas.get(0).getTextRuns().get(0).isBold());
assertFalse(rtrs[1].isBold()); assertFalse(textParas.get(1).getTextRuns().get(0).isBold());
} }
/** /**
* Tests getting and setting the font size on rich and non * Tests getting and setting the font size on rich and non
* rich text runs * rich text runs
*/ */
@Test
public void testFontSize() { public void testFontSize() {
HSLFSlide slideOne = ss.getSlides()[0]; HSLFSlide slideOne = ss.getSlides().get(0);
HSLFTextParagraph[] textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextRun rtr = textRuns[0].getTextRuns()[0]; HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
HSLFSlide slideOneR = ssRichB.getSlides()[0]; HSLFSlide slideOneR = ssRichB.getSlides().get(0);
HSLFTextParagraph[] textRunsR = slideOneR.getTextParagraphs(); List<List<HSLFTextParagraph>> textParassR = slideOneR.getTextParagraphs();
HSLFTextRun rtrRa = textRunsR[0].getTextRuns()[0]; HSLFTextRun rtrRa = textParassR.get(0).get(0).getTextRuns().get(0);
HSLFTextRun rtrRb = textRunsR[1].getTextRuns()[0]; HSLFTextRun rtrRb = textParassR.get(1).get(0).getTextRuns().get(0);
HSLFTextRun rtrRc = textRunsR[1].getTextRuns()[3]; HSLFTextRun rtrRc = textParassR.get(1).get(3).getTextRuns().get(0);
String defaultFont = "Arial"; String defaultFont = "Arial";
// Start off with rich one // Start off with rich one
// First run has defaults // First run has defaults
assertEquals(44, rtrRa.getFontSize()); assertEquals(44, rtrRa.getFontSize(), 0);
assertEquals(defaultFont, rtrRa.getFontName()); assertEquals(defaultFont, rtrRa.getFontFamily());
// Second is size 20, default font // Second is size 20, default font
assertEquals(20, rtrRb.getFontSize()); assertEquals(20, rtrRb.getFontSize(), 0);
assertEquals(defaultFont, rtrRb.getFontName()); assertEquals(defaultFont, rtrRb.getFontFamily());
// Third is size 24, alt font // Third is size 24, alt font
assertEquals(24, rtrRc.getFontSize()); assertEquals(24, rtrRc.getFontSize(), 0);
assertEquals("Times New Roman", rtrRc.getFontName()); assertEquals("Times New Roman", rtrRc.getFontFamily());
// Change 2nd to different size and font // Change 2nd to different size and font
assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR
rtrRb.setFontSize(18); rtrRb.setFontSize(18);
rtrRb.setFontName("Courier"); rtrRb.setFontFamily("Courier");
assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier
assertEquals(18, rtrRb.getFontSize()); assertEquals(18, rtrRb.getFontSize(), 0);
assertEquals("Courier", rtrRb.getFontName()); assertEquals("Courier", rtrRb.getFontFamily());
// Now do non rich one // Now do non rich one
assertEquals(44, rtr.getFontSize()); assertEquals(44, rtr.getFontSize(), 0);
assertEquals(defaultFont, rtr.getFontName()); assertEquals(defaultFont, rtr.getFontFamily());
assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
assertNull(rtr._getRawCharacterStyle()); assertNotNull(rtr.getCharacterStyle());
assertNull(rtr._getRawParagraphStyle()); assertNotNull(rtr.getTextParagraph().getParagraphStyle());
// Change Font size // Change Font size
rtr.setFontSize(99); rtr.setFontSize(99);
assertEquals(99, rtr.getFontSize()); assertEquals(99, rtr.getFontSize(), 0);
assertEquals(defaultFont, rtr.getFontName()); assertEquals(defaultFont, rtr.getFontFamily());
assertNotNull(rtr._getRawCharacterStyle()); assertNotNull(rtr.getCharacterStyle());
assertNotNull(rtr._getRawParagraphStyle()); assertNotNull(rtr.getTextParagraph().getParagraphStyle());
assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
// Change Font size and name // Change Font size and name
rtr.setFontSize(25); rtr.setFontSize(25);
rtr.setFontName("Times New Roman"); rtr.setFontFamily("Times New Roman");
assertEquals(25, rtr.getFontSize()); assertEquals(25, rtr.getFontSize(), 0);
assertEquals("Times New Roman", rtr.getFontName()); assertEquals("Times New Roman", rtr.getFontFamily());
assertNotNull(rtr._getRawCharacterStyle()); assertNotNull(rtr.getCharacterStyle());
assertNotNull(rtr._getRawParagraphStyle()); assertNotNull(rtr.getTextParagraph().getParagraphStyle());
assertEquals(2, ss.getFontCollection().getChildRecords().length); assertEquals(2, ss.getFontCollection().getChildRecords().length);
} }
@Test
public void testChangeWriteRead() throws Exception { public void testChangeWriteRead() throws Exception {
HSLFSlideShowImpl[] h = new HSLFSlideShowImpl[] { hss, hssRichA, hssRichB }; for(HSLFSlideShow h : new HSLFSlideShow[] { ss, ssRichA, ssRichB }) {
HSLFSlide[] s = new HSLFSlide[] { ss.getSlides()[0], ssRichA.getSlides()[0], ssRichB.getSlides()[0] };
for(int i=0; i<h.length; i++) {
// Change // Change
HSLFSlide slideOne = s[i]; HSLFSlide slideOne = h.getSlides().get(0);
HSLFTextParagraph[] textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextRun rtr = textRuns[0].getTextRuns()[0]; HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
rtr.setBold(true); rtr.setBold(true);
rtr.setFontSize(18); rtr.setFontSize(18);
rtr.setFontName("Courier"); rtr.setFontFamily("Courier");
HSLFTextParagraph.storeText(textParass.get(0));
// Check it took those // Check it took those
assertEquals(true, rtr.isBold()); assertTrue(rtr.isBold());
assertEquals(18, rtr.getFontSize()); assertEquals(18., rtr.getFontSize(), 0);
assertEquals("Courier", rtr.getFontName()); assertEquals("Courier", rtr.getFontFamily());
// Write out and back in // Write out and back in
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
h[i].write(baos); h.write(baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
HSLFSlideShowImpl readHSLF = new HSLFSlideShowImpl(bais); HSLFSlideShowImpl readHSLF = new HSLFSlideShowImpl(bais);
@ -221,23 +229,23 @@ public final class TestRichTextRun extends POITestCase {
// Tweak existing one again, to ensure really worked // Tweak existing one again, to ensure really worked
rtr.setBold(false); rtr.setBold(false);
rtr.setFontSize(17); rtr.setFontSize(17);
rtr.setFontName("CourierZZ"); rtr.setFontFamily("CourierZZ");
// Check it took those changes // Check it took those changes
assertEquals(false, rtr.isBold()); assertFalse(rtr.isBold());
assertEquals(17, rtr.getFontSize()); assertEquals(17., rtr.getFontSize(), 0);
assertEquals("CourierZZ", rtr.getFontName()); assertEquals("CourierZZ", rtr.getFontFamily());
// Now, look at the one we changed, wrote out, and read back in // Now, look at the one we changed, wrote out, and read back in
// Ensure it does contain our original modifications // Ensure it does contain our original modifications
HSLFSlide slideOneRR = readS.getSlides()[0]; HSLFSlide slideOneRR = readS.getSlides().get(0);
HSLFTextParagraph[] textRunsRR = slideOneRR.getTextParagraphs(); List<List<HSLFTextParagraph>> textParassRR = slideOneRR.getTextParagraphs();
HSLFTextRun rtrRRa = textRunsRR[0].getTextRuns()[0]; HSLFTextRun rtrRRa = textParassRR.get(0).get(0).getTextRuns().get(0);
assertEquals(true, rtrRRa.isBold()); assertTrue(rtrRRa.isBold());
assertEquals(18, rtrRRa.getFontSize()); assertEquals(18., rtrRRa.getFontSize(), 0);
assertEquals("Courier", rtrRRa.getFontName()); assertEquals("Courier", rtrRRa.getFontFamily());
} }
} }
@ -245,16 +253,17 @@ public final class TestRichTextRun extends POITestCase {
* Test that we can do the right things when the paragraph styles * Test that we can do the right things when the paragraph styles
* run out before the character styles do * run out before the character styles do
*/ */
@Test
public void testParagraphStylesShorterTheCharStyles() { public void testParagraphStylesShorterTheCharStyles() {
// Check we have the right number of sheets // Check we have the right number of sheets
HSLFSlide[] slides = ssRichC.getSlides(); List<HSLFSlide> slides = ssRichC.getSlides();
assertEquals(14, slides.length); assertEquals(14, slides.size());
// Check the number of text runs on interesting sheets // Check the number of text runs on interesting sheets
HSLFSlide slideThreeC = ssRichC.getSlides()[2]; HSLFSlide slideThreeC = ssRichC.getSlides().get(2);
HSLFSlide slideSevenC = ssRichC.getSlides()[6]; HSLFSlide slideSevenC = ssRichC.getSlides().get(6);
assertEquals(3, slideThreeC.getTextParagraphs().length); assertEquals(4, slideThreeC.getTextParagraphs().size());
assertEquals(5, slideSevenC.getTextParagraphs().length); assertEquals(5, slideSevenC.getTextParagraphs().size());
// On slide three, we should have: // On slide three, we should have:
// TR: // TR:
@ -266,32 +275,20 @@ public final class TestRichTextRun extends POITestCase {
// Illustrative Example // Illustrative Example
// . // .
HSLFTextParagraph[] s3tr = slideThreeC.getTextParagraphs(); List<List<HSLFTextParagraph>> s3tr = slideThreeC.getTextParagraphs();
HSLFTextRun[] s3rtr0 = s3tr[0].getTextRuns(); List<HSLFTextRun> s3rtr0 = s3tr.get(0).get(0).getTextRuns();
HSLFTextRun[] s3rtr1 = s3tr[1].getTextRuns(); List<HSLFTextRun> s3rtr1 = s3tr.get(2).get(0).getTextRuns();
HSLFTextRun[] s3rtr2 = s3tr[2].getTextRuns(); List<HSLFTextRun> s3rtr2 = s3tr.get(3).get(0).getTextRuns();
assertEquals(2, s3rtr0.length); assertEquals(2, s3rtr0.size());
assertEquals(1, s3rtr1.length); assertEquals(1, s3rtr1.size());
assertEquals(2, s3rtr2.length); assertEquals(2, s3rtr2.size());
assertEquals("You are an important supplier of various items that I need", s3rtr0[0].getRawText()); assertEquals("You are an important supplier of various items that I need", s3rtr0.get(0).getRawText());
assertEquals("", s3rtr0[1].getRawText()); assertEquals("", s3rtr0.get(1).getRawText());
assertEquals("Source: Internal focus groups", s3rtr1[0].getRawText()); assertEquals("Source: Internal focus groups", s3rtr1.get(0).getRawText());
assertEquals("Illustrative Example", s3rtr2[0].getRawText()); assertEquals("Illustrative Example", s3rtr2.get(0).getRawText());
assertEquals("", s3rtr2[1].getRawText()); assertEquals("", s3rtr2.get(1).getRawText());
assertTrue(s3rtr0[0]._isParagraphStyleShared());
assertTrue(s3rtr0[1]._isParagraphStyleShared());
assertFalse(s3rtr1[0]._isParagraphStyleShared());
assertTrue(s3rtr2[0]._isParagraphStyleShared());
assertTrue(s3rtr2[1]._isParagraphStyleShared());
assertFalse(s3rtr0[0]._isCharacterStyleShared());
assertFalse(s3rtr0[1]._isCharacterStyleShared());
assertFalse(s3rtr1[0]._isCharacterStyleShared());
assertFalse(s3rtr2[0]._isCharacterStyleShared());
assertFalse(s3rtr2[1]._isCharacterStyleShared());
// On slide seven, we have: // On slide seven, we have:
// TR: // TR:
@ -300,26 +297,14 @@ public final class TestRichTextRun extends POITestCase {
// <ps>(text a)</ps><ps>(text a)(text b)</ps> // <ps>(text a)</ps><ps>(text a)(text b)</ps>
// TR: // TR:
// (text) // (text)
HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); List<List<HSLFTextParagraph>> s7tr = slideSevenC.getTextParagraphs();
HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); List<HSLFTextParagraph> s7rtr0 = s7tr.get(0);
HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); List<HSLFTextParagraph> s7rtr1 = s7tr.get(1);
HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); List<HSLFTextParagraph> s7rtr2 = s7tr.get(2);
assertEquals(1, s7rtr0.length); assertEquals(1, s7rtr0.size());
assertEquals(3, s7rtr1.length); assertEquals(8, s7rtr1.size());
assertEquals(1, s7rtr2.length); assertEquals(1, s7rtr2.size());
assertFalse(s7rtr0[0]._isParagraphStyleShared());
assertFalse(s7rtr1[0]._isParagraphStyleShared());
assertTrue(s7rtr1[1]._isParagraphStyleShared());
assertTrue(s7rtr1[2]._isParagraphStyleShared());
assertFalse(s7rtr2[0]._isParagraphStyleShared());
assertFalse(s7rtr0[0]._isCharacterStyleShared());
assertTrue(s7rtr1[0]._isCharacterStyleShared());
assertTrue(s7rtr1[1]._isCharacterStyleShared());
assertFalse(s7rtr1[2]._isCharacterStyleShared());
assertFalse(s7rtr2[0]._isCharacterStyleShared());
} }
/** /**
@ -327,39 +312,44 @@ public final class TestRichTextRun extends POITestCase {
* run out before the character styles do, when we tweak something * run out before the character styles do, when we tweak something
* and write back out. * and write back out.
*/ */
public void testParagraphStylesShorterTheCharStylesWrite() throws Exception { @Test
@SuppressWarnings("unused")
public void testParagraphStylesShorterTheCharStylesWrite() throws Exception {
assertMatchesSLTWC(ssRichC); assertMatchesSLTWC(ssRichC);
assertMatchesFileC(ssRichC); assertMatchesFileC(ssRichC);
HSLFSlide slideSevenC = ssRichC.getSlides()[6]; HSLFSlide slideSevenC = ssRichC.getSlides().get(6);
HSLFTextParagraph[] s7tr = slideSevenC.getTextParagraphs(); List<List<HSLFTextParagraph>> s7tr = slideSevenC.getTextParagraphs();
HSLFTextRun[] s7rtr0 = s7tr[0].getTextRuns(); List<HSLFTextRun> s7rtr0 = s7tr.get(0).get(0).getTextRuns();
HSLFTextRun[] s7rtr1 = s7tr[1].getTextRuns(); List<HSLFTextRun> s7rtr1 = s7tr.get(1).get(0).getTextRuns();
HSLFTextRun[] s7rtr2 = s7tr[2].getTextRuns(); List<HSLFTextRun> s7rtr2 = s7tr.get(2).get(0).getTextRuns();
String oldText; String oldText;
// Reset the text on the last run // Reset the text on the last run
// Need to ensure it's a run that really has styles! // Need to ensure it's a run that really has styles!
oldText = s7rtr2[0].getRawText(); oldText = s7rtr2.get(0).getRawText();
s7rtr2[0].setText( oldText ); s7rtr2.get(0).setText( oldText );
assertEquals(oldText, s7rtr2[0].getRawText()); HSLFTextParagraph.storeText(s7tr.get(2));
assertEquals(oldText, s7tr[2].getRawText()); assertEquals(oldText, s7rtr2.get(0).getRawText());
assertEquals(oldText.length() + 1, s7rtr2[0]._getRawCharacterStyle().getCharactersCovered()); assertEquals(oldText, HSLFTextParagraph.getRawText(s7tr.get(2)));
assertEquals(oldText.length() + 1, s7rtr2[0]._getRawParagraphStyle().getCharactersCovered()); assertEquals(oldText.length() + 1, s7rtr2.get(0).getCharacterStyle().getCharactersCovered());
assertEquals(oldText.length() + 1, s7rtr2.get(0).getTextParagraph().getParagraphStyle().getCharactersCovered());
assertMatchesSLTWC(ssRichC); assertMatchesSLTWC(ssRichC);
assertMatchesFileC(ssRichC); assertMatchesFileC(ssRichC);
// Reset the text on a shared paragraph // Reset the text on a shared paragraph
oldText = s7rtr1[2].getRawText(); oldText = s7rtr1.get(0).getRawText();
s7rtr1[2].setText( oldText ); s7rtr1.get(0).setText( oldText );
assertEquals(oldText, s7rtr1[2].getRawText()); HSLFTextParagraph.storeText(s7tr.get(1));
assertEquals(oldText.length() + 1, s7rtr1[2]._getRawCharacterStyle().getCharactersCovered()); assertEquals(oldText, s7rtr1.get(0).getRawText());
assertEquals(oldText.length(), s7rtr1.get(0).getCharacterStyle().getCharactersCovered());
assertMatchesSLTWC(ssRichC); assertMatchesSLTWC(ssRichC);
assertMatchesFileC(ssRichC); assertMatchesFileC(ssRichC);
// Reset the text on a shared paragraph+character // Reset the text on a shared paragraph+character
s7rtr1[1].setText( s7rtr1[1].getRawText() ); s7rtr1.get(0).setText( s7rtr1.get(0).getRawText() );
HSLFTextParagraph.storeText(s7tr.get(1));
assertMatchesSLTWC(ssRichC); assertMatchesSLTWC(ssRichC);
assertMatchesFileC(ssRichC); assertMatchesFileC(ssRichC);
} }
@ -391,17 +381,11 @@ public final class TestRichTextRun extends POITestCase {
byte[] r_rb = writeRecord(ref_r); byte[] r_rb = writeRecord(ref_r);
byte[] s_rb = writeRecord(s_r); byte[] s_rb = writeRecord(s_r);
assertEquals(r_rb.length, s_rb.length); assertArrayEquals(r_rb, s_rb);
for(int j=0; j<r_rb.length; j++) {
assertEquals(r_rb[j],s_rb[j]);
}
} }
// Check the bytes are the same // Check the bytes are the same
assertEquals(raw_slwt.length, s_slwt.length); assertArrayEquals(raw_slwt, s_slwt);
for(int i=0; i<raw_slwt.length; i++) {
assertEquals(raw_slwt[i], s_slwt[i]);
}
} }
/** /**
@ -409,35 +393,35 @@ public final class TestRichTextRun extends POITestCase {
* of slideshow c * of slideshow c
*/ */
private static void assertMatchesFileC(HSLFSlideShow s) throws Exception { private static void assertMatchesFileC(HSLFSlideShow s) throws Exception {
if (true) { // TODO - test is disabled, pending fix of bug #39800
// System.err.println("Skipping test, as would be marked as failed due to bug #39800"); //
return;
}
if(false) {
// Grab the bytes of the file // Grab the bytes of the file
FileInputStream fin = new FileInputStream(filenameC); NPOIFSFileSystem fs = new NPOIFSFileSystem(_slTests.getFile(filenameC));
ByteArrayOutputStream fb = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[4096]; InputStream is = fs.createDocumentInputStream("PowerPoint Document");
int read = 0; IOUtils.copy(is, baos);
while(read != -1) { is.close();
read = fin.read(b); fs.close();
if(read > 0) { byte[] raw_file = baos.toByteArray();
fb.write(b, 0, read);
}
}
byte[] raw_file = fb.toByteArray();
// Now write out the slideshow // Now write out the slideshow
ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.reset();
s.write(baos); s.write(baos);
fs = new NPOIFSFileSystem(new ByteArrayInputStream(baos.toByteArray()));
baos.reset();
is = fs.createDocumentInputStream("PowerPoint Document");
IOUtils.copy(is, baos);
is.close();
fs.close();
byte[] raw_ss = baos.toByteArray(); byte[] raw_ss = baos.toByteArray();
FileOutputStream fos = new FileOutputStream("PowerPoint Document.new.stream");
fos.write(raw_ss);
fos.close();
// different paragraph mask, because of sanitizing
raw_ss[169030] = 0x0a;
// Ensure they're the same // Ensure they're the same
assertEquals(raw_file.length, raw_ss.length); assertArrayEquals(raw_file, raw_ss);
for(int i=0; i<raw_file.length; i++) {
assertEquals(raw_file[i], raw_ss[i]);
}
}
} }
private byte[] writeRecord(Record r) throws Exception { private byte[] writeRecord(Record r) throws Exception {
@ -446,15 +430,13 @@ if(false) {
return baos.toByteArray(); return baos.toByteArray();
} }
@Test
public void testIndentationLevel() throws Exception { public void testIndentationLevel() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt"));
HSLFSlide[] sl = ppt.getSlides(); for (HSLFSlide sl : ppt.getSlides()) {
for (int i = 0; i < sl.length; i++) { for (List<HSLFTextParagraph> txt : sl.getTextParagraphs()) {
HSLFTextParagraph[] txt = sl[i].getTextParagraphs(); for (HSLFTextParagraph p : txt) {
for (int j = 0; j < txt.length; j++) { int indent = p.getIndentLevel();
HSLFTextRun[] rt = txt[j].getTextRuns();
for (int k = 0; k < rt.length; k++) {
int indent = rt[k].getIndentLevel();
assertTrue(indent >= 0 && indent <= 4 ); assertTrue(indent >= 0 && indent <= 4 );
} }
@ -462,78 +444,84 @@ if(false) {
} }
} }
@Test
public void testReadParagraphStyles() throws Exception { public void testReadParagraphStyles() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt"));
assertTrue("No Exceptions while reading file", true); assertTrue("No Exceptions while reading file", true);
HSLFTextRun rt; HSLFTextParagraph rt;
HSLFTextParagraph[] txt; List<List<HSLFTextParagraph>> txt;
HSLFSlide[] slide = ppt.getSlides(); List<HSLFSlide> slide = ppt.getSlides();
assertEquals(2, slide.length); assertEquals(2, slide.size());
txt = slide[0].getTextParagraphs(); txt = slide.get(0).getTextParagraphs();
assertEquals(2, txt.length); assertEquals(2, txt.size());
assertEquals("Title text", txt[0].getRawText()); assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0)));
assertEquals(1, txt[0].getTextRuns().length); assertEquals(1, txt.get(0).size());
rt = txt[0].getTextRuns()[0]; rt = txt.get(0).get(0);
assertFalse(rt.isBullet()); assertFalse(rt.isBullet());
assertEquals( String expected =
"This is a text placeholder that \r" + "This is a text placeholder that \r" +
"follows the design pattern\r" + "follows the design pattern\r" +
"Defined in the slide master\r" + "Defined in the slide master\r" +
"and has bullets by default", txt[1].getRawText()); "and has bullets by default";
assertEquals(1, txt[1].getTextRuns().length); assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1)));
rt = txt[1].getTextRuns()[0]; assertEquals(4, txt.get(1).size());
rt = txt.get(1).get(0);
assertEquals('\u2022', rt.getBulletChar()); assertEquals('\u2022', rt.getBulletChar());
assertTrue(rt.isBullet()); assertTrue(rt.isBullet());
txt = slide[1].getTextParagraphs(); txt = slide.get(1).getTextParagraphs();
assertEquals(2, txt.length); assertEquals(2, txt.size());
assertEquals( expected =
"I\u2019m a text box\r" + "I\u2019m a text box\r" +
"With bullets\r" + "With bullets\r" +
"That follow the design pattern\r" + "That follow the design pattern\r" +
"From the slide master", txt[0].getRawText()); "From the slide master";
assertEquals(1, txt[0].getTextRuns().length); assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(0)));
rt = txt[0].getTextRuns()[0]; assertEquals(4, txt.get(0).size());
rt = txt.get(0).get(0);
assertTrue(rt.isBullet()); assertTrue(rt.isBullet());
assertEquals('\u2022', rt.getBulletChar()); assertEquals('\u2022', rt.getBulletChar());
assertEquals( expected =
"I\u2019m a text box with user-defined\r" + "I\u2019m a text box with user-defined\r" +
"bullet character", txt[1].getRawText()); "bullet character";
assertEquals(1, txt[1].getTextRuns().length); assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1)));
rt = txt[1].getTextRuns()[0]; assertEquals(2, txt.get(1).size());
rt = txt.get(1).get(0);
assertTrue(rt.isBullet()); assertTrue(rt.isBullet());
assertEquals('\u263A', rt.getBulletChar()); assertEquals('\u263A', rt.getBulletChar());
} }
@Test
public void testSetParagraphStyles() throws Exception { public void testSetParagraphStyles() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlideShow ppt = new HSLFSlideShow();
HSLFSlide slide = ppt.createSlide(); HSLFSlide slide = ppt.createSlide();
HSLFTextBox shape = new HSLFTextBox(); HSLFTextBox shape = new HSLFTextBox();
HSLFTextRun rt = shape.getTextParagraphs().getTextRuns()[0];
shape.setText( shape.setText(
"Hello, World!\r" + "Hello, World!\r" +
"This should be\r" + "This should be\r" +
"Multiline text"); "Multiline text");
rt.setFontSize(42); HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
HSLFTextRun tr = rt.getTextRuns().get(0);
tr.setFontSize(42);
rt.setBullet(true); rt.setBullet(true);
rt.setTextOffset(50); rt.setLeftMargin(50);
rt.setBulletOffset(0); rt.setIndent(0);
rt.setBulletChar('\u263A'); rt.setBulletChar('\u263A');
slide.addShape(shape); slide.addShape(shape);
assertEquals(42, rt.getFontSize()); assertEquals(42.0, tr.getFontSize(), 0);
assertEquals(true, rt.isBullet()); assertEquals(true, rt.isBullet());
assertEquals(50, rt.getTextOffset()); assertEquals(50.0, rt.getLeftMargin(), 0);
assertEquals(0, rt.getBulletOffset()); assertEquals(0, rt.getIndent(), 0);
assertEquals('\u263A', rt.getBulletChar()); assertEquals('\u263A', rt.getBulletChar());
shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300));
@ -545,57 +533,67 @@ if(false) {
out.close(); out.close();
ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
slide = ppt.getSlides()[0]; slide = ppt.getSlides().get(0);
shape = (HSLFTextBox)slide.getShapes()[0]; shape = (HSLFTextBox)slide.getShapes().get(0);
rt = shape.getTextParagraphs().getTextRuns()[0]; rt = shape.getTextParagraphs().get(0);
assertEquals(42, rt.getFontSize()); tr = rt.getTextRuns().get(0);
assertEquals(42.0, tr.getFontSize(), 0);
assertEquals(true, rt.isBullet()); assertEquals(true, rt.isBullet());
assertEquals(50, rt.getTextOffset()); assertEquals(50.0, rt.getLeftMargin(), 0);
assertEquals(0, rt.getBulletOffset()); assertEquals(0, rt.getIndent(), 0);
assertEquals('\u263A', rt.getBulletChar()); assertEquals('\u263A', rt.getBulletChar());
} }
@Test
public void testAddText() throws Exception { public void testAddText() throws Exception {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt"));
assertTrue("No Exceptions while reading file", true); assertTrue("No Exceptions while reading file", true);
HSLFTextRun rt; HSLFTextParagraph rt;
HSLFTextParagraph[] txt; HSLFTextRun tr;
HSLFSlide[] slides = ppt.getSlides(); List<List<HSLFTextParagraph>> txt;
List<HSLFSlide> slides = ppt.getSlides();
assertEquals(2, slides.length); assertEquals(2, slides.size());
txt = slides[0].getTextParagraphs(); txt = slides.get(0).getTextParagraphs();
assertEquals(2, txt.length); assertEquals(2, txt.size());
assertEquals("Title text", txt[0].getRawText()); assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0)));
assertEquals(1, txt[0].getTextRuns().length); assertEquals(1, txt.get(0).size());
rt = txt[0].getTextRuns()[0]; rt = txt.get(0).get(0);
assertFalse(rt.isBullet()); assertFalse(rt.isBullet());
// Add some new text // Add some new text
txt[0].appendText("Foo! I'm new!"); HSLFTextParagraph.appendText(txt.get(0), "Foo! I'm new!", true);
assertEquals(2, txt[0].getTextRuns().length); assertEquals(2, txt.get(0).size());
rt = txt[0].getTextRuns()[0]; rt = txt.get(0).get(0);
assertFalse(rt.isBold()); tr = rt.getTextRuns().get(0);
assertEquals("Title text", rt.getRawText()); assertFalse(tr.isBold());
rt = txt[0].getTextRuns()[1]; assertEquals("Title text\r", tr.getRawText());
assertFalse(rt.isBold()); rt = txt.get(0).get(1);
assertEquals("Foo! I'm new!", rt.getRawText()); tr = rt.getTextRuns().get(0);
rt.setBold(true); assertFalse(tr.isBold());
assertEquals("Foo! I'm new!", tr.getRawText());
tr.setBold(true);
HSLFTextParagraph.storeText(txt.get(0));
// And some more // And some more, attributes will be copied from previous run
txt[0].appendText("Me too!"); HSLFTextParagraph.appendText(txt.get(0), "Me too!", true);
assertEquals(3, txt[0].getTextRuns().length); HSLFTextParagraph.storeText(txt.get(0));
rt = txt[0].getTextRuns()[0]; assertEquals(3, txt.get(0).size());
assertFalse(rt.isBold()); rt = txt.get(0).get(0);
assertEquals("Title text", rt.getRawText()); tr = rt.getTextRuns().get(0);
rt = txt[0].getTextRuns()[1]; assertFalse(tr.isBold());
assertTrue(rt.isBold()); assertEquals("Title text\r", tr.getRawText());
assertEquals("Foo! I'm new!", rt.getRawText()); rt = txt.get(0).get(1);
rt = txt[0].getTextRuns()[2]; tr = rt.getTextRuns().get(0);
assertFalse(rt.isBold()); assertTrue(tr.isBold());
assertEquals("Me too!", rt.getRawText()); assertEquals("Foo! I'm new!\r", tr.getRawText());
rt = txt.get(0).get(2);
tr = rt.getTextRuns().get(0);
assertTrue(tr.isBold());
assertEquals("Me too!", tr.getRawText());
// Save and re-open // Save and re-open
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -605,55 +603,59 @@ if(false) {
ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
slides = ppt.getSlides(); slides = ppt.getSlides();
assertEquals(2, slides.length); assertEquals(2, slides.size());
txt = slides[0].getTextParagraphs(); txt = slides.get(0).getTextParagraphs();
assertEquals(2, txt.length); assertEquals(2, txt.size());
assertEquals(3, txt[0].getTextRuns().length); assertEquals(3, txt.get(0).size());
rt = txt[0].getTextRuns()[0]; rt = txt.get(0).get(0);
assertFalse(rt.isBold()); tr = rt.getTextRuns().get(0);
assertEquals("Title text", rt.getRawText()); assertFalse(tr.isBold());
rt = txt[0].getTextRuns()[1]; assertEquals("Title text\r", tr.getRawText());
assertTrue(rt.isBold()); rt = txt.get(0).get(1);
assertEquals("Foo! I'm new!", rt.getRawText()); tr = rt.getTextRuns().get(0);
rt = txt[0].getTextRuns()[2]; assertTrue(tr.isBold());
assertFalse(rt.isBold()); assertEquals("Foo! I'm new!\r", tr.getRawText());
assertEquals("Me too!", rt.getRawText()); rt = txt.get(0).get(2);
tr = rt.getTextRuns().get(0);
assertTrue(tr.isBold());
assertEquals("Me too!", tr.getRawText());
// FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt"); // FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt");
// ppt.write(fout); // ppt.write(fout);
} }
@Test
public void testChineseParagraphs() throws Exception { public void testChineseParagraphs() throws Exception {
HSLFTextRun[] rts; List<HSLFTextRun> rts;
HSLFTextRun rt; HSLFTextRun rt;
HSLFTextParagraph[] txt; List<List<HSLFTextParagraph>> txt;
HSLFSlide[] slides = ssChinese.getSlides(); List<HSLFSlide> slides = ssChinese.getSlides();
// One slide // One slide
assertEquals(1, slides.length); assertEquals(1, slides.size());
// One block of text within that // One block of text within that
txt = slides[0].getTextParagraphs(); txt = slides.get(0).getTextParagraphs();
assertEquals(1, txt.length); assertEquals(1, txt.size());
// One rich block of text in that - text is all the same style // One rich block of text in that - text is all the same style
// TODO Is this completely correct? // TODO Is this completely correct?
rts = txt[0].getTextRuns(); rts = txt.get(0).get(0).getTextRuns();
assertEquals(1, rts.length); assertEquals(1, rts.size());
rt = rts[0]; rt = rts.get(0);
// Check we can get the english text out of that // Check we can get the english text out of that
String text = rt.getRawText(); String text = rt.getRawText();
assertContains(text, "Single byte"); assertContains(text, "Single byte");
// And the chinese // And the chinese
assertContains(text, "\uff8a\uff9d\uff76\uff78"); assertContains(txt.get(0).get(3).getTextRuns().get(0).getRawText(), "\uff8a\uff9d\uff76\uff78");
// It isn't bold or italic // It isn't bold or italic
assertFalse(rt.isBold()); assertFalse(rt.isBold());
assertFalse(rt.isItalic()); assertFalse(rt.isItalic());
// Font is Calibri // Font is Calibri
assertEquals("Calibri", rt.getFontName()); assertEquals("Calibri", rt.getFontFamily());
} }
} }

View File

@ -17,45 +17,50 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.assertEquals;
import junit.framework.TestCase; import java.util.List;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.model.*;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.junit.Before;
import org.junit.Test;
/** /**
* Tests that SlideShow returns Sheets which have the right text in them * Tests that SlideShow returns Sheets which have the right text in them
* *
* @author Nick Burch (nick at torchbox dot com) * @author Nick Burch (nick at torchbox dot com)
*/ */
public final class TestSheetText extends TestCase { public final class TestSheetText {
// SlideShow primed on the test data // SlideShow primed on the test data
private HSLFSlideShow ss; private HSLFSlideShow ss;
public TestSheetText() throws Exception { @Before
public void init() throws Exception {
POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
ss = new HSLFSlideShow(hss); ss = new HSLFSlideShow(hss);
} }
@Test
public void testSheetOne() { public void testSheetOne() {
HSLFSheet slideOne = ss.getSlides()[0]; HSLFSheet slideOne = ss.getSlides().get(0);
String[] expectText = new String[] {"This is a test title","This is a test subtitle\nThis is on page 1"}; String[] expectText = new String[] {"This is a test title","This is a test subtitle\rThis is on page 1"};
assertEquals(expectText.length, slideOne.getTextParagraphs().length); assertEquals(expectText.length, slideOne.getTextParagraphs().size());
for(int i=0; i<expectText.length; i++) { int i = 0;
assertEquals(expectText[i], slideOne.getTextParagraphs()[i].getRawText()); for(List<HSLFTextParagraph> textParas : slideOne.getTextParagraphs()) {
assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas));
} }
} }
public void testSheetTwo() { public void testSheetTwo() {
HSLFSheet slideTwo = ss.getSlides()[1]; HSLFSheet slideTwo = ss.getSlides().get(1);
String[] expectText = new String[] {"This is the title on page 2","This is page two\nIt has several blocks of text\nNone of them have formatting"}; String[] expectText = new String[] {"This is the title on page 2","This is page two\rIt has several blocks of text\rNone of them have formatting"};
assertEquals(expectText.length, slideTwo.getTextParagraphs().length); assertEquals(expectText.length, slideTwo.getTextParagraphs().size());
for(int i=0; i<expectText.length; i++) { int i = 0;
assertEquals(expectText[i], slideTwo.getTextParagraphs()[i].getRawText()); for(List<HSLFTextParagraph> textParas : slideTwo.getTextParagraphs()) {
} assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas));
}
} }
/** /**
@ -69,11 +74,11 @@ public final class TestSheetText extends TestCase {
HSLFSlideShow sss = new HSLFSlideShow(hss); HSLFSlideShow sss = new HSLFSlideShow(hss);
// Should come out with 10 slides, no notes // Should come out with 10 slides, no notes
assertEquals(10, sss.getSlides().length); assertEquals(10, sss.getSlides().size());
assertEquals(0, sss.getNotes().length); assertEquals(0, sss.getNotes().size());
// Check text on first slide // Check text on first slide
HSLFSlide s = sss.getSlides()[0]; HSLFSlide s = sss.getSlides().get(0);
String exp = String exp =
"Realizing the Development Dividend:\n" + "Realizing the Development Dividend:\n" +
"Community Capacity Building and CDM.\n" + "Community Capacity Building and CDM.\n" +
@ -83,7 +88,7 @@ public final class TestSheetText extends TestCase {
"COP 11 \u2013 MOP 1\n" + // special long hyphen "COP 11 \u2013 MOP 1\n" + // special long hyphen
"December 5, 2005\n"; "December 5, 2005\n";
assertEquals(1, s.getTextParagraphs().length); assertEquals(1, s.getTextParagraphs().size());
assertEquals(exp, s.getTextParagraphs()[0].getRawText()); assertEquals(exp, HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0)));
} }
} }

View File

@ -17,18 +17,20 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import junit.framework.TestCase; import static org.junit.Assert.assertEquals;
import java.util.List;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.model.*;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.junit.Before;
import org.junit.Test;
/** /**
* Tests that SlideShow returns Sheets in the right order * Tests that SlideShow returns Sheets in the right order
* *
* @author Nick Burch (nick at torchbox dot com) * @author Nick Burch (nick at torchbox dot com)
*/ */
public final class TestSlideOrdering extends TestCase { public final class TestSlideOrdering {
private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
// Simple slideshow, record order matches slide order // Simple slideshow, record order matches slide order
@ -36,7 +38,8 @@ public final class TestSlideOrdering extends TestCase {
// Complex slideshow, record order doesn't match slide order // Complex slideshow, record order doesn't match slide order
private HSLFSlideShow ssB; private HSLFSlideShow ssB;
public TestSlideOrdering() throws Exception { @Before
public void init() throws Exception {
HSLFSlideShowImpl hssA = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); HSLFSlideShowImpl hssA = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
ssA = new HSLFSlideShow(hssA); ssA = new HSLFSlideShow(hssA);
@ -47,33 +50,29 @@ public final class TestSlideOrdering extends TestCase {
/** /**
* Test the simple case - record order matches slide order * Test the simple case - record order matches slide order
*/ */
@Test
public void testSimpleCase() { public void testSimpleCase() {
assertEquals(2, ssA.getSlides().length); assertEquals(2, ssA.getSlides().size());
HSLFSlide s1 = ssA.getSlides()[0]; HSLFSlide s1 = ssA.getSlides().get(0);
HSLFSlide s2 = ssA.getSlides()[1]; HSLFSlide s2 = ssA.getSlides().get(1);
String[] firstTRs = new String[] { "This is a test title", "This is the title on page 2" }; String[] firstTRs = new String[] { "This is a test title", "This is the title on page 2" };
assertEquals(firstTRs[0], s1.getTextParagraphs()[0].getRawText()); assertEquals(firstTRs[0], HSLFTextParagraph.getRawText(s1.getTextParagraphs().get(0)));
assertEquals(firstTRs[1], s2.getTextParagraphs()[0].getRawText()); assertEquals(firstTRs[1], HSLFTextParagraph.getRawText(s2.getTextParagraphs().get(0)));
} }
/** /**
* Test the complex case - record order differs from slide order * Test the complex case - record order differs from slide order
*/ */
@Test
public void testComplexCase() { public void testComplexCase() {
assertEquals(3, ssB.getSlides().length); assertEquals(3, ssB.getSlides().size());
int i=1;
HSLFSlide s1 = ssB.getSlides()[0]; for (HSLFSlide s : ssB.getSlides()) {
HSLFSlide s2 = ssB.getSlides()[1]; assertEquals("Slide "+(i++), HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0)));
HSLFSlide s3 = ssB.getSlides()[2]; }
String[] firstTRs = new String[] { "Slide 1", "Slide 2", "Slide 3" };
assertEquals(firstTRs[0], s1.getTextParagraphs()[0].getRawText());
assertEquals(firstTRs[1], s2.getTextParagraphs()[0].getRawText());
assertEquals(firstTRs[2], s3.getTextParagraphs()[0].getRawText());
} }
/** /**
@ -88,15 +87,16 @@ public final class TestSlideOrdering extends TestCase {
POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream(filename)); HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream(filename));
HSLFSlide[] slide = ppt.getSlides(); List<HSLFSlide> slide = ppt.getSlides();
assertEquals(titles.length, slide.length); assertEquals(titles.length, slide.size());
for (int i = 0; i < slide.length; i++) { for (int i = 0; i < slide.size(); i++) {
String title = slide[i].getTitle(); String title = slide.get(i).getTitle();
assertEquals("Wrong slide title in " + filename, titles[i], title); assertEquals("Wrong slide title in " + filename, titles[i], title);
} }
} }
@Test
public void testTitles() throws Exception { public void testTitles() throws Exception {
assertSlideOrdering("basic_test_ppt_file.ppt", new String[] { assertSlideOrdering("basic_test_ppt_file.ppt", new String[] {
"This is a test title", "This is the title on page 2" }); "This is a test title", "This is the title on page 2" });

View File

@ -19,15 +19,11 @@ package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.awt.Color; import java.io.IOException;
import java.io.*;
import java.util.List; import java.util.List;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.model.Table;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.usermodel.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -59,28 +55,28 @@ public final class TestTextRun {
@Test @Test
public void testGetText() { public void testGetText() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> textParas = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParas = slideOne.getTextParagraphs();
assertEquals(2, textParas.size()); assertEquals(2, textParas.size());
// Get text works with \n // Get text works with \n
assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); assertEquals("This is a test title", HSLFTextParagraph.getText(textParas.get(0)));
assertEquals("This is a test subtitle\nThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); assertEquals("This is a test subtitle\nThis is on page 1", HSLFTextParagraph.getText(textParas.get(1)));
// Raw text has \r instead // Raw text has \r instead
assertEquals("This is a test title", textParas.get(0).getTextRuns().get(0).getRawText()); assertEquals("This is a test title", HSLFTextParagraph.getRawText(textParas.get(0)));
assertEquals("This is a test subtitle\rThis is on page 1", textParas.get(1).getTextRuns().get(0).getRawText()); assertEquals("This is a test subtitle\rThis is on page 1", HSLFTextParagraph.getRawText(textParas.get(1)));
// Now check on a rich text run // Now check on a rich text run
HSLFSlide slideOneR = ssRich.getSlides().get(0); HSLFSlide slideOneR = ssRich.getSlides().get(0);
List<HSLFTextParagraph> textRunsR = slideOneR.getTextParagraphs(); textParas = slideOneR.getTextParagraphs();
assertEquals(2, textRunsR.size()); assertEquals(2, textParas.size());
assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getText(textParas.get(0)));
assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", HSLFTextParagraph.getText(textParas.get(1)));
assertEquals("This is a title, it\u2019s in black", textRunsR.get(0).getTextRuns().get(0).getRawText()); assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getRawText(textParas.get(0)));
assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", textRunsR.get(1).getTextRuns().get(0).getRawText()); assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", HSLFTextParagraph.getRawText(textParas.get(1)));
} }
/** /**
@ -89,8 +85,8 @@ public final class TestTextRun {
@Test @Test
public void testSetText() { public void testSetText() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs();
HSLFTextParagraph run = textRuns.get(0); HSLFTextParagraph run = textRuns.get(0).get(0);
HSLFTextRun tr = run.getTextRuns().get(0); HSLFTextRun tr = run.getTextRuns().get(0);
// Check current text // Check current text
@ -110,10 +106,11 @@ public final class TestTextRun {
* Test to ensure that changing non rich text between bytes and * Test to ensure that changing non rich text between bytes and
* chars works correctly * chars works correctly
*/ */
@Test @SuppressWarnings("unused")
@Test
public void testAdvancedSetText() { public void testAdvancedSetText() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> paras = slideOne.getTextParagraphs(); List<HSLFTextParagraph> paras = slideOne.getTextParagraphs().get(0);
HSLFTextParagraph para = paras.get(0); HSLFTextParagraph para = paras.get(0);
TextHeaderAtom tha = null; TextHeaderAtom tha = null;
@ -192,21 +189,21 @@ public final class TestTextRun {
@Test @Test
public void testGetRichTextNonRich() { public void testGetRichTextNonRich() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
assertEquals(2, textRuns.size()); assertEquals(2, textParass.size());
HSLFTextParagraph trA = textRuns.get(0); List<HSLFTextParagraph> trA = textParass.get(0);
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textParass.get(1);
assertEquals(1, trA.getTextRuns().size()); assertEquals(1, trA.size());
assertEquals(1, trB.getTextRuns().size()); assertEquals(1, trB.size());
HSLFTextRun rtrA = trA.getTextRuns().get(0); HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0);
HSLFTextRun rtrB = trB.getTextRuns().get(0); HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText());
assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(1, 1)), rtrB.getRawText()); assertEquals(HSLFTextParagraph.getRawText(trB), rtrB.getRawText());
// assertNull(rtrA._getRawCharacterStyle()); // assertNull(rtrA._getRawCharacterStyle());
// assertNull(rtrA._getRawParagraphStyle()); // assertNull(rtrA._getRawParagraphStyle());
@ -220,45 +217,36 @@ public final class TestTextRun {
@Test @Test
public void testGetRichText() { public void testGetRichText() {
HSLFSlide slideOne = ssRich.getSlides().get(0); HSLFSlide slideOne = ssRich.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
assertEquals(2, textRuns.size()); assertEquals(2, textParass.size());
HSLFTextParagraph trA = textRuns.get(0); List<HSLFTextParagraph> trA = textParass.get(0);
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textParass.get(1);
assertEquals(1, trA.getTextRuns().size()); assertEquals(1, trA.size());
assertEquals(3, trB.getTextRuns().size()); assertEquals(3, trB.size());
HSLFTextRun rtrA = trA.getTextRuns().get(0); HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0);
HSLFTextRun rtrB = trB.getTextRuns().get(0); HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
HSLFTextRun rtrC = trB.getTextRuns().get(1); HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
HSLFTextRun rtrD = trB.getTextRuns().get(2); HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
assertEquals(HSLFTextParagraph.getRawText(textRuns.subList(0, 0)), rtrA.getRawText()); assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText());
String trBstr = HSLFTextParagraph.getRawText(textRuns.subList(1, 1)); String trBstr = HSLFTextParagraph.getRawText(trB);
assertEquals(trBstr.substring(0, 30), rtrB.getRawText()); assertEquals(trBstr.substring(0, 30), rtrB.getRawText());
assertEquals(trBstr.substring(30,58), rtrC.getRawText()); assertEquals(trBstr.substring(30,58), rtrC.getRawText());
assertEquals(trBstr.substring(58,82), rtrD.getRawText()); assertEquals(trBstr.substring(58,82), rtrD.getRawText());
// assertNull(rtrA._getRawCharacterStyle());
// assertNull(rtrA._getRawParagraphStyle());
// assertNotNull(rtrB._getRawCharacterStyle());
// assertNotNull(rtrB._getRawParagraphStyle());
// assertNotNull(rtrC._getRawCharacterStyle());
// assertNotNull(rtrC._getRawParagraphStyle());
// assertNotNull(rtrD._getRawCharacterStyle());
// assertNotNull(rtrD._getRawParagraphStyle());
// Same paragraph styles // Same paragraph styles
// assertEquals(rtrB._getRawParagraphStyle(), rtrC._getRawParagraphStyle()); assertEquals(trB.get(0).getParagraphStyle(), trB.get(1).getParagraphStyle());
// assertEquals(rtrB._getRawParagraphStyle(), rtrD._getRawParagraphStyle()); assertEquals(trB.get(0).getParagraphStyle(), trB.get(2).getParagraphStyle());
// Different char styles // Different char styles
// assertFalse( rtrB._getRawCharacterStyle().equals( rtrC._getRawCharacterStyle() )); assertNotEquals(rtrB.getCharacterStyle(), rtrC.getCharacterStyle());
// assertFalse( rtrB._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); assertNotEquals(rtrB.getCharacterStyle(), rtrD.getCharacterStyle());
// assertFalse( rtrC._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() )); assertNotEquals(rtrC.getCharacterStyle(), rtrD.getCharacterStyle());
} }
/** /**
@ -268,22 +256,18 @@ public final class TestTextRun {
@Test @Test
public void testSetTextWhereNotRich() { public void testSetTextWhereNotRich() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textParass.get(0);
// assertEquals(1, trB.getTextRuns().length); assertEquals(1, trB.size());
HSLFTextRun rtrB = trB.getTextRuns().get(0); HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
// assertEquals(trB.getRawText(), rtrB.getRawText()); assertEquals(HSLFTextParagraph.getText(trB), rtrB.getRawText());
// assertNull(rtrB._getRawCharacterStyle());
// assertNull(rtrB._getRawParagraphStyle());
// Change text via normal // Change text via normal
// trB.setText("Test Foo Test"); HSLFTextParagraph.setText(trB, "Test Foo Test");
rtrB = trB.getTextRuns().get(0); rtrB = trB.get(0).getTextRuns().get(0);
// assertEquals("Test Foo Test", trB.getRawText()); assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB));
// assertEquals("Test Foo Test", rtrB.getRawText()); assertEquals("Test Foo Test", rtrB.getRawText());
// assertNull(rtrB._getRawCharacterStyle());
// assertNull(rtrB._getRawParagraphStyle());
} }
/** /**
@ -293,13 +277,13 @@ public final class TestTextRun {
@Test @Test
public void testSetTextWhereRich() { public void testSetTextWhereRich() {
HSLFSlide slideOne = ssRich.getSlides().get(0); HSLFSlide slideOne = ssRich.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textParass.get(1);
assertEquals(3, trB.getTextRuns().size()); assertEquals(3, trB.size());
HSLFTextRun rtrB = trB.getTextRuns().get(0); HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
HSLFTextRun rtrC = trB.getTextRuns().get(1); HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
HSLFTextRun rtrD = trB.getTextRuns().get(2); HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
// TextPropCollection tpBP = rtrB._getRawParagraphStyle(); // TextPropCollection tpBP = rtrB._getRawParagraphStyle();
// TextPropCollection tpBC = rtrB._getRawCharacterStyle(); // TextPropCollection tpBC = rtrB._getRawCharacterStyle();
// TextPropCollection tpCP = rtrC._getRawParagraphStyle(); // TextPropCollection tpCP = rtrC._getRawParagraphStyle();
@ -342,8 +326,8 @@ public final class TestTextRun {
@Test @Test
public void testChangeTextInRichTextRunNonRich() { public void testChangeTextInRichTextRunNonRich() {
HSLFSlide slideOne = ss.getSlides().get(0); HSLFSlide slideOne = ss.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs();
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textRuns.get(1);
// assertEquals(1, trB.getTextRuns().length); // assertEquals(1, trB.getTextRuns().length);
// //
// HSLFTextRun rtrB = trB.getTextRuns().get(0); // HSLFTextRun rtrB = trB.getTextRuns().get(0);
@ -368,15 +352,15 @@ public final class TestTextRun {
@Test @Test
public void testChangeTextInRichTextRun() { public void testChangeTextInRichTextRun() {
HSLFSlide slideOne = ssRich.getSlides().get(0); HSLFSlide slideOne = ssRich.getSlides().get(0);
List<HSLFTextParagraph> textRuns = slideOne.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
HSLFTextParagraph trB = textRuns.get(1); List<HSLFTextParagraph> trB = textParass.get(1);
assertEquals(3, trB.getTextRuns().size()); assertEquals(3, trB.size());
// We start with 3 text runs, each with their own set of styles, // We start with 3 text runs, each with their own set of styles,
// but all sharing the same paragraph styles // but all sharing the same paragraph styles
HSLFTextRun rtrB = trB.getTextRuns().get(0); HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
HSLFTextRun rtrC = trB.getTextRuns().get(1); HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
HSLFTextRun rtrD = trB.getTextRuns().get(2); HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
// TextPropCollection tpBP = rtrB._getRawParagraphStyle(); // TextPropCollection tpBP = rtrB._getRawParagraphStyle();
// TextPropCollection tpBC = rtrB._getRawCharacterStyle(); // TextPropCollection tpBC = rtrB._getRawCharacterStyle();
// TextPropCollection tpCP = rtrC._getRawParagraphStyle(); // TextPropCollection tpCP = rtrC._getRawParagraphStyle();
@ -400,8 +384,8 @@ public final class TestTextRun {
// assertFalse(tpCC.equals(tpDC)); // assertFalse(tpCC.equals(tpDC));
// Check text in the rich runs // Check text in the rich runs
assertEquals("This is the subtitle, in bold\n", rtrB.getRawText()); assertEquals("This is the subtitle, in bold\r", rtrB.getRawText());
assertEquals("This bit is blue and italic\n", rtrC.getRawText()); assertEquals("This bit is blue and italic\r", rtrC.getRawText());
assertEquals("This bit is red (normal)", rtrD.getRawText()); assertEquals("This bit is red (normal)", rtrD.getRawText());
String newBText = "New Subtitle, will still be bold\n"; String newBText = "New Subtitle, will still be bold\n";
@ -452,23 +436,24 @@ public final class TestTextRun {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt"));
HSLFSlide sl = ppt.getSlides().get(0); HSLFSlide sl = ppt.getSlides().get(0);
List<HSLFTextParagraph> txt = sl.getTextParagraphs(); List<List<HSLFTextParagraph>> textParass = sl.getTextParagraphs();
assertEquals(2, txt.size()); assertEquals(2, textParass.size());
rt = txt.get(0).getTextRuns(); List<HSLFTextParagraph> textParas = textParass.get(0);
rt = textParass.get(0).get(0).getTextRuns();
assertEquals(1, rt.size()); assertEquals(1, rt.size());
assertEquals(0, txt.get(0).getIndentLevel()); assertEquals(0, textParass.get(0).get(0).getIndentLevel());
assertEquals("sdfsdfsdf", rt.get(0).getRawText()); assertEquals("sdfsdfsdf", rt.get(0).getRawText());
rt = txt.get(1).getTextRuns(); textParas = textParass.get(1);
assertEquals(2, rt.size()); String texts[] = {"Sdfsdfsdf\r","Dfgdfg\r","Dfgdfgdfg\r","Sdfsdfs\r","Sdfsdf\r"};
assertEquals(0, txt.get(0).getIndentLevel()); int indents[] = {0,0,0,1,1};
assertEquals("Sdfsdfsdf\n" + int i=0;
"Dfgdfg\n" + for (HSLFTextParagraph p : textParas) {
"Dfgdfgdfg\n", rt.get(0).getRawText()); assertEquals(texts[i], p.getTextRuns().get(0).getRawText());
assertEquals(1, txt.get(1).getIndentLevel()); assertEquals(indents[i], p.getIndentLevel());
assertEquals("Sdfsdfs\n" + i++;
"Sdfsdf\n", rt.get(1).getRawText()); }
} }
/** /**
@ -479,7 +464,7 @@ public final class TestTextRun {
HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlideShow ppt = new HSLFSlideShow();
HSLFSlide slide = ppt.createSlide(); HSLFSlide slide = ppt.createSlide();
assertNull(slide.getTextParagraphs()); assertEquals(0, slide.getTextParagraphs().size());
HSLFTextBox shape1 = new HSLFTextBox(); HSLFTextBox shape1 = new HSLFTextBox();
// HSLFTextParagraph run1 = shape1.getTextParagraphs(); // HSLFTextParagraph run1 = shape1.getTextParagraphs();
@ -565,17 +550,14 @@ public final class TestTextRun {
public void test52244() throws IOException { public void test52244() throws IOException {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt"));
HSLFSlide slide = ppt.getSlides().get(0); HSLFSlide slide = ppt.getSlides().get(0);
List<HSLFTextParagraph> runs = slide.getTextParagraphs();
assertEquals("Arial", runs.get(0).getTextRuns().get(0).getFontFamily()); int sizes[] = { 36, 24, 12, 32, 12, 12 };
assertEquals(36, runs.get(0).getTextRuns().get(0).getFontSize(), 0);
assertEquals("Arial", runs.get(1).getTextRuns().get(0).getFontFamily());
assertEquals(24, runs.get(1).getTextRuns().get(0).getFontSize(), 0);
assertEquals("Arial", runs.get(2).getTextRuns().get(0).getFontFamily());
assertEquals(32, runs.get(2).getTextRuns().get(0).getFontSize(), 0);
int i=0;
for (List<HSLFTextParagraph> textParas : slide.getTextParagraphs()) {
assertEquals("Arial", textParas.get(0).getTextRuns().get(0).getFontFamily());
assertEquals(sizes[i++], (int)textParas.get(0).getTextRuns().get(0).getFontSize());
}
} }
} }

View File

@ -15,26 +15,15 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hslf.model; package org.apache.poi.hslf.usermodel;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream; import java.io.*;
import java.io.ByteArrayOutputStream; import java.util.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.record.TextHeaderAtom;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.ShapeType;
import org.junit.Test; import org.junit.Test;
@ -49,28 +38,21 @@ public final class TestTextShape {
@Test @Test
public void createAutoShape(){ public void createAutoShape(){
HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID); HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID);
assertNull(shape.getTextParagraphs());
assertNull(shape.getText());
assertNull(shape.getEscherTextboxWrapper()); assertNull(shape.getEscherTextboxWrapper());
HSLFTextParagraph run = shape.createTextRun();
assertNotNull(run);
assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getTextParagraphs());
assertNotNull(shape.getEscherTextboxWrapper()); assertNotNull(shape.getEscherTextboxWrapper());
assertEquals("", shape.getText()); assertEquals("", shape.getText());
assertSame(run, shape.createTextRun()); assertEquals(-1, shape.getTextParagraphs().get(0).getIndex());
assertEquals(-1, run.getIndex());
} }
@Test @Test
public void createTextBox(){ public void createTextBox(){
HSLFTextShape shape = new HSLFTextBox(); HSLFTextShape shape = new HSLFTextBox();
HSLFTextParagraph run = shape.getTextParagraphs(); List<HSLFTextParagraph> paras = shape.getTextParagraphs();
assertNotNull(run); assertNotNull(paras);
assertNotNull(shape.getText()); assertNotNull(shape.getText());
assertNotNull(shape.getEscherTextboxWrapper()); assertNotNull(shape.getEscherTextboxWrapper());
assertSame(run, shape.createTextRun());
assertNotNull(shape.getTextParagraphs()); assertNotNull(shape.getTextParagraphs());
assertNotNull(shape.getEscherTextboxWrapper()); assertNotNull(shape.getEscherTextboxWrapper());
assertEquals("", shape.getText()); assertEquals("", shape.getText());
@ -88,46 +70,45 @@ public final class TestTextShape {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text_shapes.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text_shapes.ppt"));
List<String> lst1 = new ArrayList<String>(); List<String> lst1 = new ArrayList<String>();
HSLFSlide slide = ppt.getSlides()[0]; HSLFSlide slide = ppt.getSlides().get(0);
HSLFShape[] shape = slide.getShapes(); for (HSLFShape shape : slide.getShapes()) {
for (int i = 0; i < shape.length; i++) { assertTrue("Expected TextShape but found " + shape.getClass().getName(), shape instanceof HSLFTextShape);
assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof HSLFTextShape); HSLFTextShape tx = (HSLFTextShape)shape;
HSLFTextShape tx = (HSLFTextShape)shape[i]; List<HSLFTextParagraph> paras = tx.getTextParagraphs();
HSLFTextParagraph run = tx.getTextParagraphs(); assertNotNull(paras);
assertNotNull(run); int runType = paras.get(0).getRunType();
int runType = run.getRunType();
ShapeType type = shape[i].getShapeType(); ShapeType type = shape.getShapeType();
String rawText = HSLFTextParagraph.getRawText(paras);
switch (type){ switch (type){
case TEXT_BOX: case TEXT_BOX:
assertEquals("Text in a TextBox", run.getRawText()); assertEquals("Text in a TextBox", rawText);
break; break;
case RECT: case RECT:
if(runType == TextHeaderAtom.OTHER_TYPE) if(runType == TextHeaderAtom.OTHER_TYPE)
assertEquals("Rectangle", run.getRawText()); assertEquals("Rectangle", rawText);
else if(runType == TextHeaderAtom.TITLE_TYPE) else if(runType == TextHeaderAtom.TITLE_TYPE)
assertEquals("Title Placeholder", run.getRawText()); assertEquals("Title Placeholder", rawText);
break; break;
case OCTAGON: case OCTAGON:
assertEquals("Octagon", run.getRawText()); assertEquals("Octagon", rawText);
break; break;
case ELLIPSE: case ELLIPSE:
assertEquals("Ellipse", run.getRawText()); assertEquals("Ellipse", rawText);
break; break;
case ROUND_RECT: case ROUND_RECT:
assertEquals("RoundRectangle", run.getRawText()); assertEquals("RoundRectangle", rawText);
break; break;
default: default:
fail("Unexpected shape: " + shape[i].getShapeName()); fail("Unexpected shape: " + shape.getShapeName());
} }
lst1.add(run.getRawText()); lst1.add(rawText);
} }
List<String> lst2 = new ArrayList<String>(); List<String> lst2 = new ArrayList<String>();
HSLFTextParagraph[] run = slide.getTextParagraphs(); for (List<HSLFTextParagraph> paras : slide.getTextParagraphs()) {
for (int i = 0; i < run.length; i++) { lst2.add(HSLFTextParagraph.getRawText(paras));
lst2.add(run[i].getRawText());
} }
assertTrue(lst1.containsAll(lst2)); assertTrue(lst1.containsAll(lst2));
@ -139,15 +120,13 @@ public final class TestTextShape {
HSLFSlide slide = ppt.createSlide(); HSLFSlide slide = ppt.createSlide();
HSLFTextShape shape1 = new HSLFTextBox(); HSLFTextShape shape1 = new HSLFTextBox();
HSLFTextParagraph run1 = shape1.createTextRun(); shape1.setText("Hello, World!");
run1.setText("Hello, World!");
slide.addShape(shape1); slide.addShape(shape1);
shape1.moveTo(100, 100); shape1.moveTo(100, 100);
HSLFTextShape shape2 = new HSLFAutoShape(ShapeType.RIGHT_ARROW); HSLFTextShape shape2 = new HSLFAutoShape(ShapeType.RIGHT_ARROW);
HSLFTextParagraph run2 = shape2.createTextRun(); shape2.setText("Testing TextShape");
run2.setText("Testing TextShape");
slide.addShape(shape2); slide.addShape(shape2);
shape2.moveTo(300, 300); shape2.moveTo(300, 300);
@ -156,31 +135,30 @@ public final class TestTextShape {
out.close(); out.close();
ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
slide = ppt.getSlides()[0]; slide = ppt.getSlides().get(0);
HSLFShape[] shape = slide.getShapes(); List<HSLFShape> shape = slide.getShapes();
assertTrue(shape[0] instanceof HSLFTextShape); assertTrue(shape.get(0) instanceof HSLFTextShape);
shape1 = (HSLFTextShape)shape[0]; shape1 = (HSLFTextShape)shape.get(0);
assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType()); assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType());
assertEquals("Hello, World!", shape1.getTextParagraphs().getRawText()); assertEquals("Hello, World!", shape1.getText());
assertTrue(shape[1] instanceof HSLFTextShape); assertTrue(shape.get(1) instanceof HSLFTextShape);
shape1 = (HSLFTextShape)shape[1]; shape1 = (HSLFTextShape)shape.get(1);
assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType()); assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType());
assertEquals("Testing TextShape", shape1.getTextParagraphs().getRawText()); assertEquals("Testing TextShape", shape1.getText());
} }
@Test @Test
public void margins() throws IOException { public void margins() throws IOException {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text-margins.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text-margins.ppt"));
HSLFSlide slide = ppt.getSlides()[0]; HSLFSlide slide = ppt.getSlides().get(0);
Map<String,HSLFTextShape> map = new HashMap<String,HSLFTextShape>(); Map<String,HSLFTextShape> map = new HashMap<String,HSLFTextShape>();
HSLFShape[] shape = slide.getShapes(); for (HSLFShape shape : slide.getShapes()) {
for (int i = 0; i < shape.length; i++) { if(shape instanceof HSLFTextShape){
if(shape[i] instanceof HSLFTextShape){ HSLFTextShape tx = (HSLFTextShape)shape;
HSLFTextShape tx = (HSLFTextShape)shape[i];
map.put(tx.getText(), tx); map.put(tx.getText(), tx);
} }
} }
@ -216,20 +194,20 @@ public final class TestTextShape {
public void bug52599() throws IOException { public void bug52599() throws IOException {
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52599.ppt")); HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52599.ppt"));
HSLFSlide slide = ppt.getSlides()[0]; HSLFSlide slide = ppt.getSlides().get(0);
HSLFShape[] sh = slide.getShapes(); List<HSLFShape> sh = slide.getShapes();
assertEquals(3, sh.length); assertEquals(3, sh.size());
HSLFTextShape sh0 = (HSLFTextShape)sh[0]; HSLFTextShape sh0 = (HSLFTextShape)sh.get(0);
assertEquals(null, sh0.getText()); assertNotNull(sh0.getTextParagraphs());
assertEquals(null, sh0.getTextParagraphs()); assertEquals("", sh0.getText());
HSLFTextShape sh1 = (HSLFTextShape)sh[1]; HSLFTextShape sh1 = (HSLFTextShape)sh.get(1);
assertEquals(null, sh1.getText()); assertNotNull(sh1.getTextParagraphs());
assertEquals(null, sh1.getTextParagraphs()); assertEquals("", sh1.getText());
HSLFTextShape sh2 = (HSLFTextShape)sh[2]; HSLFTextShape sh2 = (HSLFTextShape)sh.get(2);
assertEquals("this box should be shown just once", sh2.getText()); assertEquals("this box should be shown just once", sh2.getText());
assertEquals(-1, sh2.getTextParagraphs().getIndex()); assertEquals(-1, sh2.getTextParagraphs().get(0).getIndex());
} }
} }