mirror of https://github.com/apache/poi.git
backlink used doc's stringbuilder and singlenton TextPiece from TextPieceTable
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1155210 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d31694057d
commit
aade7062e1
|
@ -39,11 +39,11 @@ import org.apache.poi.hwpf.model.NoteType;
|
|||
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;
|
||||
|
@ -94,7 +94,8 @@ public final class HWPFDocument extends HWPFDocumentCore
|
|||
* 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;
|
||||
|
@ -284,9 +285,9 @@ public final class HWPFDocument extends HWPFDocumentCore
|
|||
{
|
||||
_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
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
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)";
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ import org.apache.poi.util.Internal;
|
|||
* @author Ryan Ackley
|
||||
*/
|
||||
@Internal
|
||||
public final class TextPiece extends PropertyNode<TextPiece>
|
||||
public class TextPiece extends PropertyNode<TextPiece>
|
||||
{
|
||||
private boolean _usesUnicode;
|
||||
|
||||
|
@ -134,6 +134,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
|
|||
* @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;
|
||||
|
@ -157,6 +158,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
|
|||
* @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;
|
||||
|
||||
|
@ -187,6 +189,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
|
|||
/**
|
||||
* Returns the length, in characters
|
||||
*/
|
||||
@Deprecated
|
||||
public int characterLength()
|
||||
{
|
||||
return (getEnd() - getStart());
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
==================================================================== */
|
||||
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;
|
||||
|
@ -473,4 +475,33 @@ public class TestBugs extends TestCase
|
|||
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 );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue