]> source.dussan.org Git - poi.git/commitdiff
Patch from bug #45001 - Partial fix for HWPF Range.insertBefore() and Range.delete...
authorNick Burch <nick@apache.org>
Tue, 20 May 2008 16:57:20 +0000 (16:57 +0000)
committerNick Burch <nick@apache.org>
Tue, 20 May 2008 16:57:20 +0000 (16:57 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@658349 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java
src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java

index ebb063f2743eed31cd025396bf95d564873bd780..824713479c4f180d0ccdb8ad2e0fe246cca37987 100644 (file)
@@ -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>
index 2167a42574e620f50499904f7ce847812d4cf501..12bdd0dd9fbabe36b19736fcd151647e1ad20076 100644 (file)
@@ -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>
index 48e6d78b3a9852b7a654ccc8432daa6f8d44eb00..887e13d829792a68dde64249b1cb1315625393f1 100644 (file)
@@ -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();
index 67c634d9f687b76f52d534e10e7920d7a97d0bd9..bc33954dff63e548328e28a20f1ac4915e5f55ca 100644 (file)
@@ -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);
index f2d9a615f812d8ce3c31e61c670aef0d75cec083..85592a92a21b8b6e868a502ce234b89cd1c21009 100644 (file)
@@ -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;
+       }
 }