Browse Source

Patch from bug #45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@658349 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_2_FINAL
Nick Burch 16 years ago
parent
commit
2df6546a1b

+ 1
- 0
src/documentation/content/xdocs/changes.xml View File



<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.1-final" date="2008-06-??"> <release version="3.1-final" date="2008-06-??">
<action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</action>
<action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action> <action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action>
<action dev="POI-DEVELOPERS" type="add">Support for specifying a policy to HSSF on missing / blank cells when fetching</action> <action dev="POI-DEVELOPERS" type="add">Support for specifying a policy to HSSF on missing / blank cells when fetching</action>
<action dev="POI-DEVELOPERS" type="add">44937 - Partial support for extracting Escher images from HWPF files</action> <action dev="POI-DEVELOPERS" type="add">44937 - Partial support for extracting Escher images from HWPF files</action>

+ 1
- 0
src/documentation/content/xdocs/status.xml View File

<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.1-final" date="2008-06-??"> <release version="3.1-final" date="2008-06-??">
<action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</action>
<action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action> <action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action>
<action dev="POI-DEVELOPERS" type="add">Support for specifying a policy to HSSF on missing / blank cells when fetching</action> <action dev="POI-DEVELOPERS" type="add">Support for specifying a policy to HSSF on missing / blank cells when fetching</action>
<action dev="POI-DEVELOPERS" type="add">44937 - Partial support for extracting Escher images from HWPF files</action> <action dev="POI-DEVELOPERS" type="add">44937 - Partial support for extracting Escher images from HWPF files</action>

+ 10
- 0
src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java View File

_longHandler.setLong(FIBLongHandler.CBMAC, cbMac); _longHandler.setLong(FIBLongHandler.CBMAC, cbMac);
} }


public int getCcpText()
{
return _longHandler.getLong(FIBLongHandler.CCPTEXT);
}

public void setCcpText(int ccpText)
{
_longHandler.setLong(FIBLongHandler.CCPTEXT, ccpText);
}

public void clearOffsetsSizes() public void clearOffsetsSizes()
{ {
_fieldHandler.clearFields(); _fieldHandler.clearFields();

+ 8
- 0
src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java View File



public void adjustForDelete(int start, int length) public void adjustForDelete(int start, int length)
{ {

if (usesUnicode()) {

start /= 2;
length /= 2;
}

int myStart = getStart(); int myStart = getStart();
int myEnd = getEnd(); int myEnd = getEnd();
int end = start + length; int end = start + length;


/* do we have to delete from this text piece? */ /* do we have to delete from this text piece? */
if (start <= myEnd && end >= myStart) { if (start <= myEnd && end >= myStart) {

/* find where the deleted area overlaps with this text piece */ /* find where the deleted area overlaps with this text piece */
int overlapStart = Math.max(myStart, start); int overlapStart = Math.max(myStart, start);
int overlapEnd = Math.min(myEnd, end); int overlapEnd = Math.min(myEnd, end);

+ 56
- 0
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java View File

} }
} }


/**
* Does any <code>TextPiece</code> in this Range use unicode?
*
* @return true if it does and false if it doesn't
*/
public boolean usesUnicode() {

initText();

for (int i = _textStart; i < _textEnd; i++)
{
TextPiece piece = (TextPiece)_text.get(i);
if (piece.usesUnicode())
return true;
}

return false;
}

/** /**
* Gets the text that this Range contains. * Gets the text that this Range contains.
* *
// Since this is the first item in our list, it is safe to assume that // Since this is the first item in our list, it is safe to assume that
// _start >= tp.getStart() // _start >= tp.getStart()
int insertIndex = _start - tp.getStart(); int insertIndex = _start - tp.getStart();
if (tp.usesUnicode())
insertIndex /= 2;
sb.insert(insertIndex, text); sb.insert(insertIndex, text);

int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length()); int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length());
_doc.getCharacterTable().adjustForInsert(_charStart, adjustedLength); _doc.getCharacterTable().adjustForInsert(_charStart, adjustedLength);
_doc.getParagraphTable().adjustForInsert(_parStart, adjustedLength); _doc.getParagraphTable().adjustForInsert(_parStart, adjustedLength);
_doc.getSectionTable().adjustForInsert(_sectionStart, adjustedLength); _doc.getSectionTable().adjustForInsert(_sectionStart, adjustedLength);
adjustForInsert(text.length()); adjustForInsert(text.length());


// update the FIB.CCPText field
adjustFIB(text.length());

return getCharacterRun(0); return getCharacterRun(0);
} }




public void delete() public void delete()
{ {

initAll(); initAll();


int numSections = _sections.size(); int numSections = _sections.size();
TextPiece piece = (TextPiece)_text.get(x); TextPiece piece = (TextPiece)_text.get(x);
piece.adjustForDelete(_start, _end - _start); piece.adjustForDelete(_start, _end - _start);
} }

// update the FIB.CCPText field
if (usesUnicode())
adjustFIB(-((_end - _start) / 2));
else
adjustFIB(-(_end - _start));
} }


/** /**
_sectionRangeFound = false; _sectionRangeFound = false;
} }


/**
* Adjust the value of <code>FIB.CCPText</code> after an insert or a delete...
*
* @param adjustment The (signed) value that should be added to <code>FIB.CCPText</code>
*/
protected void adjustFIB(int adjustment) {

// update the FIB.CCPText field (this should happen once per adjustment, so we don't want it in
// adjustForInsert() or it would get updated multiple times if the range has a parent)
// without this, OpenOffice.org (v. 2.2.x) does not see all the text in the document
_doc.getFileInformationBlock().setCcpText(_doc.getFileInformationBlock().getCcpText() + adjustment);
}

/** /**
* adjust this range after an insert happens. * adjust this range after an insert happens.
* @param length the length to adjust for * @param length the length to adjust for
private void adjustForInsert(int length) private void adjustForInsert(int length)
{ {
_end += length; _end += length;

reset(); reset();
Range parent = (Range)_parent.get(); Range parent = (Range)_parent.get();
if (parent != null) if (parent != null)
} }
} }



public int getStartOffset() {

return _start;
}

public int getEndOffset() {

return _end;
}
} }

Loading…
Cancel
Save