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
This commit is contained in:
parent
a4f9eb9543
commit
ee4ba764b7
@ -37,6 +37,7 @@
|
||||
|
||||
<!-- Don't forget to update status.xml too! -->
|
||||
<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="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>
|
||||
|
@ -34,6 +34,7 @@
|
||||
<!-- Don't forget to update changes.xml too! -->
|
||||
<changes>
|
||||
<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="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>
|
||||
|
@ -294,6 +294,16 @@ public class FileInformationBlock extends FIBAbstractType
|
||||
_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()
|
||||
{
|
||||
_fieldHandler.clearFields();
|
||||
|
@ -90,12 +90,20 @@ public class TextPiece extends PropertyNode implements Comparable
|
||||
|
||||
public void adjustForDelete(int start, int length)
|
||||
{
|
||||
|
||||
if (usesUnicode()) {
|
||||
|
||||
start /= 2;
|
||||
length /= 2;
|
||||
}
|
||||
|
||||
int myStart = getStart();
|
||||
int myEnd = getEnd();
|
||||
int end = start + length;
|
||||
|
||||
/* do we have to delete from this text piece? */
|
||||
if (start <= myEnd && end >= myStart) {
|
||||
|
||||
/* find where the deleted area overlaps with this text piece */
|
||||
int overlapStart = Math.max(myStart, start);
|
||||
int overlapEnd = Math.min(myEnd, end);
|
||||
|
@ -226,6 +226,25 @@ public class Range
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
@ -306,13 +325,19 @@ public class Range
|
||||
// Since this is the first item in our list, it is safe to assume that
|
||||
// _start >= tp.getStart()
|
||||
int insertIndex = _start - tp.getStart();
|
||||
if (tp.usesUnicode())
|
||||
insertIndex /= 2;
|
||||
sb.insert(insertIndex, text);
|
||||
|
||||
int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length());
|
||||
_doc.getCharacterTable().adjustForInsert(_charStart, adjustedLength);
|
||||
_doc.getParagraphTable().adjustForInsert(_parStart, adjustedLength);
|
||||
_doc.getSectionTable().adjustForInsert(_sectionStart, adjustedLength);
|
||||
adjustForInsert(text.length());
|
||||
|
||||
// update the FIB.CCPText field
|
||||
adjustFIB(text.length());
|
||||
|
||||
return getCharacterRun(0);
|
||||
}
|
||||
|
||||
@ -489,6 +514,7 @@ public class Range
|
||||
|
||||
public void delete()
|
||||
{
|
||||
|
||||
initAll();
|
||||
|
||||
int numSections = _sections.size();
|
||||
@ -519,6 +545,12 @@ public class Range
|
||||
TextPiece piece = (TextPiece)_text.get(x);
|
||||
piece.adjustForDelete(_start, _end - _start);
|
||||
}
|
||||
|
||||
// update the FIB.CCPText field
|
||||
if (usesUnicode())
|
||||
adjustFIB(-((_end - _start) / 2));
|
||||
else
|
||||
adjustFIB(-(_end - _start));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -827,6 +859,19 @@ public class Range
|
||||
_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.
|
||||
* @param length the length to adjust for
|
||||
@ -834,6 +879,7 @@ public class Range
|
||||
private void adjustForInsert(int length)
|
||||
{
|
||||
_end += length;
|
||||
|
||||
reset();
|
||||
Range parent = (Range)_parent.get();
|
||||
if (parent != null)
|
||||
@ -842,4 +888,14 @@ public class Range
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int getStartOffset() {
|
||||
|
||||
return _start;
|
||||
}
|
||||
|
||||
public int getEndOffset() {
|
||||
|
||||
return _end;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user