git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@658349 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_2_FINAL
<!-- 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> |
<!-- 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> |
_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(); |
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); |
} | } | ||||
} | } | ||||
/** | |||||
* 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; | |||||
} | |||||
} | } |