import org.apache.poi.hwpf.model.NotesTables;
import org.apache.poi.hwpf.model.PAPBinTable;
import org.apache.poi.hwpf.model.PicturesTable;
-import org.apache.poi.hwpf.model.PieceDescriptor;
import org.apache.poi.hwpf.model.RevisionMarkAuthorTable;
import org.apache.poi.hwpf.model.SavedByTable;
import org.apache.poi.hwpf.model.SectionTable;
import org.apache.poi.hwpf.model.ShapesTable;
+import org.apache.poi.hwpf.model.SinglentonTextPiece;
import org.apache.poi.hwpf.model.StyleSheet;
import org.apache.poi.hwpf.model.SubdocumentType;
import org.apache.poi.hwpf.model.TextPiece;
* structure*/
protected ComplexFileTable _cft;
- protected final StringBuilder _text;
+ /** Contains text buffer linked directly to single-piece document text piece */
+ protected StringBuilder _text;
/** Holds the save history for this document. */
protected SavedByTable _sbt;
{
_cft = new ComplexFileTable();
_tpt = _cft.getTextPieceTable();
- _tpt.add( new TextPiece( 0, _text.length(), _text.toString()
- .getBytes( "UTF-16LE" ), new PieceDescriptor( new byte[8],
- 0 ) ) );
+ final TextPiece textPiece = new SinglentonTextPiece( _text );
+ _tpt.add( textPiece );
+ _text = textPiece.getStringBuilder();
}
// Read FSPA and Escher information
--- /dev/null
+package org.apache.poi.hwpf.model;
+
+import java.io.IOException;
+
+import org.apache.poi.util.Internal;
+
+@Internal
+public class SinglentonTextPiece extends TextPiece
+{
+
+ public SinglentonTextPiece( StringBuilder buffer ) throws IOException
+ {
+ super( 0, buffer.length(), buffer.toString().getBytes( "UTF-16LE" ),
+ new PieceDescriptor( new byte[8], 0 ) );
+ }
+
+ @Override
+ public int bytesLength()
+ {
+ return getStringBuilder().length() * 2;
+ }
+
+ @Override
+ public int characterLength()
+ {
+ return getStringBuilder().length();
+ }
+
+ @Override
+ public int getCP()
+ {
+ return 0;
+ }
+
+ @Override
+ public int getEnd()
+ {
+ return characterLength();
+ }
+
+ @Override
+ public int getStart()
+ {
+ return 0;
+ }
+
+ public String toString()
+ {
+ return "SinglentonTextPiece (" + characterLength() + " chars)";
+ }
+}
* @author Ryan Ackley
*/
@Internal
-public final class TextPiece extends PropertyNode<TextPiece>
+public class TextPiece extends PropertyNode<TextPiece>
{
private boolean _usesUnicode;
* @param start Local start position, in characters
* @param end Local end position, in characters
*/
+ @Deprecated
public String substring(int start, int end)
{
StringBuilder buf = (StringBuilder)_buf;
* @param start The start position for the delete, in characters
* @param length The number of characters to delete
*/
+ @Deprecated
public void adjustForDelete(int start, int length) {
int numChars = length;
/**
* Returns the length, in characters
*/
+ @Deprecated
public int characterLength()
{
return (getEnd() - getStart());
==================================================================== */
package org.apache.poi.hwpf.usermodel;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
HWPFTestDataSamples.openSampleFileFromArchive( "Bug51524.zip" );
}
+ /**
+ * Bug 51604 - replace text fails for doc ( poi 3.8 beta release from
+ * download site )
+ */
+ public void test51604()
+ {
+ HWPFDocument document = HWPFTestDataSamples
+ .openSampleFile( "Bug51604.doc" );
+
+ Range range = document.getRange();
+ int numParagraph = range.numParagraphs();
+ int counter = 0;
+ for ( int i = 0; i < numParagraph; i++ )
+ {
+ Paragraph paragraph = range.getParagraph( i );
+ int numCharRuns = paragraph.numCharacterRuns();
+ for ( int j = 0; j < numCharRuns; j++ )
+ {
+ CharacterRun charRun = paragraph.getCharacterRun( j );
+ String text = charRun.text();
+ charRun.replaceText( text, "+" + ( ++counter ) );
+ }
+ }
+
+ document = HWPFTestDataSamples.writeOutAndReadBack( document );
+ String text = document.getDocumentText();
+ assertEquals( "+1+2+3+4+5+6+7+8+9+10+11+12", text );
+ }
+
}