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.NotesTables;
|
||||||
import org.apache.poi.hwpf.model.PAPBinTable;
|
import org.apache.poi.hwpf.model.PAPBinTable;
|
||||||
import org.apache.poi.hwpf.model.PicturesTable;
|
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.RevisionMarkAuthorTable;
|
||||||
import org.apache.poi.hwpf.model.SavedByTable;
|
import org.apache.poi.hwpf.model.SavedByTable;
|
||||||
import org.apache.poi.hwpf.model.SectionTable;
|
import org.apache.poi.hwpf.model.SectionTable;
|
||||||
import org.apache.poi.hwpf.model.ShapesTable;
|
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.StyleSheet;
|
||||||
import org.apache.poi.hwpf.model.SubdocumentType;
|
import org.apache.poi.hwpf.model.SubdocumentType;
|
||||||
import org.apache.poi.hwpf.model.TextPiece;
|
import org.apache.poi.hwpf.model.TextPiece;
|
||||||
|
@ -94,7 +94,8 @@ public final class HWPFDocument extends HWPFDocumentCore
|
||||||
* structure*/
|
* structure*/
|
||||||
protected ComplexFileTable _cft;
|
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. */
|
/** Holds the save history for this document. */
|
||||||
protected SavedByTable _sbt;
|
protected SavedByTable _sbt;
|
||||||
|
@ -284,9 +285,9 @@ public final class HWPFDocument extends HWPFDocumentCore
|
||||||
{
|
{
|
||||||
_cft = new ComplexFileTable();
|
_cft = new ComplexFileTable();
|
||||||
_tpt = _cft.getTextPieceTable();
|
_tpt = _cft.getTextPieceTable();
|
||||||
_tpt.add( new TextPiece( 0, _text.length(), _text.toString()
|
final TextPiece textPiece = new SinglentonTextPiece( _text );
|
||||||
.getBytes( "UTF-16LE" ), new PieceDescriptor( new byte[8],
|
_tpt.add( textPiece );
|
||||||
0 ) ) );
|
_text = textPiece.getStringBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read FSPA and Escher information
|
// 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
|
* @author Ryan Ackley
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public final class TextPiece extends PropertyNode<TextPiece>
|
public class TextPiece extends PropertyNode<TextPiece>
|
||||||
{
|
{
|
||||||
private boolean _usesUnicode;
|
private boolean _usesUnicode;
|
||||||
|
|
||||||
|
@ -134,6 +134,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
|
||||||
* @param start Local start position, in characters
|
* @param start Local start position, in characters
|
||||||
* @param end Local end position, in characters
|
* @param end Local end position, in characters
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public String substring(int start, int end)
|
public String substring(int start, int end)
|
||||||
{
|
{
|
||||||
StringBuilder buf = (StringBuilder)_buf;
|
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 start The start position for the delete, in characters
|
||||||
* @param length The number of characters to delete
|
* @param length The number of characters to delete
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void adjustForDelete(int start, int length) {
|
public void adjustForDelete(int start, int length) {
|
||||||
int numChars = length;
|
int numChars = length;
|
||||||
|
|
||||||
|
@ -187,6 +189,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
|
||||||
/**
|
/**
|
||||||
* Returns the length, in characters
|
* Returns the length, in characters
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public int characterLength()
|
public int characterLength()
|
||||||
{
|
{
|
||||||
return (getEnd() - getStart());
|
return (getEnd() - getStart());
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.hwpf.usermodel;
|
package org.apache.poi.hwpf.usermodel;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -473,4 +475,33 @@ public class TestBugs extends TestCase
|
||||||
HWPFTestDataSamples.openSampleFileFromArchive( "Bug51524.zip" );
|
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