]> source.dussan.org Git - poi.git/commitdiff
Applied patches from Piers and my latest changes
authorSaid Ryan Ackley <sackley@apache.org>
Tue, 23 Mar 2004 05:51:55 +0000 (05:51 +0000)
committerSaid Ryan Ackley <sackley@apache.org>
Tue, 23 Mar 2004 05:51:55 +0000 (05:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353539 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
src/scratchpad/src/org/apache/poi/hwpf/model/Ffn.java
src/scratchpad/src/org/apache/poi/hwpf/model/FontTable.java
src/scratchpad/src/org/apache/poi/hwpf/model/PAPFormattedDiskPage.java
src/scratchpad/src/org/apache/poi/hwpf/model/PropertyNode.java
src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java
src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java
src/scratchpad/src/org/apache/poi/hwpf/sprm/CharacterSprmUncompressor.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterProperties.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/DocumentPosition.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/HWPFList.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java

index 28d4d9ad80e62d115b28f17b1410f055e09c2e2b..56024d9fd923a073c332e6bec3ffd07bb666fde3 100644 (file)
@@ -1,57 +1,20 @@
-/*
- *  ====================================================================
- *  The Apache Software License, Version 1.1
- *
- *  Copyright (c) 2003 The Apache Software Foundation.  All rights
- *  reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *
- *  1. Redistributions of source code must retain the above copyright
- *  notice, this list of conditions and the following disclaimer.
- *
- *  2. Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in
- *  the documentation and/or other materials provided with the
- *  distribution.
- *
- *  3. The end-user documentation included with the redistribution,
- *  if any, must include the following acknowledgment:
- *  "This product includes software developed by the
- *  Apache Software Foundation (http://www.apache.org/)."
- *  Alternately, this acknowledgment may appear in the software itself,
- *  if and wherever such third-party acknowledgments normally appear.
- *
- *  4. The names "Apache" and "Apache Software Foundation" and
- *  "Apache POI" must not be used to endorse or promote products
- *  derived from this software without prior written permission. For
- *  written permission, please contact apache@apache.org.
- *
- *  5. Products derived from this software may not be called "Apache",
- *  "Apache POI", nor may "Apache" appear in their name, without
- *  prior written permission of the Apache Software Foundation.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- *  SUCH DAMAGE.
- *  ====================================================================
- *
- *  This software consists of voluntary contributions made by many
- *  individuals on behalf of the Apache Software Foundation.  For more
- *  information on the Apache Software Foundation, please see
- *  <http://www.apache.org/>.
- */
+/* ====================================================================
+   Copyright 2002-2004   Apache Software Foundation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+
 package org.apache.poi.hwpf;
 
 import java.io.InputStream;
@@ -61,6 +24,8 @@ import java.io.OutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.FileOutputStream;
 
+import java.util.Iterator;
+
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.common.POIFSConstants;
@@ -122,6 +87,7 @@ public class HWPFDocument
   /** Holds fonts for this document.*/
   private FontTable _ft;
 
+  /** Hold list tables */
   private ListTables _lt;
 
 
@@ -226,6 +192,24 @@ public class HWPFDocument
     return new Range(0, p.getEnd(), this);
   }
 
+  /**
+   * Returns the character length of a document.
+   * @return
+   */
+  public int characterLength()
+  {
+    java.util.List textPieces = _tpt.getTextPieces();
+    Iterator textIt = textPieces.iterator();
+
+    int length = 0;
+    while(textIt.hasNext())
+    {
+      TextPiece tp = (TextPiece)textIt.next();
+      length += tp.characterLength();
+    }
+    return length;
+  }
+
   public ListTables getListTables()
   {
     return _lt;
@@ -406,6 +390,12 @@ public class HWPFDocument
     return _ft;
   }
 
+  public void delete(int start, int length)
+  {
+    Range r = new Range(start, start + length, this);
+    r.delete();
+  }
+
   /**
    * Takes two arguments, 1) name of the Word file to read in 2) location to
    * write it out at.
index e4ca163c1072f605b0957bee8137c9575c5f067b..65feccf309f4167a5c692c138b626d9157cf89b1 100644 (file)
@@ -108,7 +108,7 @@ public class Ffn
     offset += _fontSig.length;
 
     offsetTmp = offset - offsetTmp;
-    _xszFfnLength = this.getSize() - offsetTmp;
+    _xszFfnLength = (this.getSize() - offsetTmp)/2;
     _xszFfn = new char[_xszFfnLength];
 
     for(int i = 0; i < _xszFfnLength; i++)
@@ -206,13 +206,13 @@ public class Ffn
 
     for(int i = 0; i < _xszFfn.length; i++)
     {
-      buf[offset] = (byte)_xszFfn[i];
-        offset += LittleEndian.BYTE_SIZE;
+      LittleEndian.putShort(buf, offset, (short)_xszFfn[i]);
+      offset += LittleEndian.SHORT_SIZE;
     }
 
-      return buf;
+    return buf;
 
-    }
+  }
 
     public boolean equals(Object o)
     {
index 6f0507f8afd9d1fd020980e31ec7ac24bac4140c..23919ea200360d0836b53548f68270b2ebd48879 100644 (file)
@@ -159,7 +159,7 @@ public class FontTable
 
          for(int i = 0; i < _fontNames.length; i++)
          {
-               tableStream.write(_fontNames[i].toByteArray());
+                 tableStream.write(_fontNames[i].toByteArray());
          }
 
   }
index 42cd566b2adda4d8617b9384d2afd012fcde9940..b76821d9179d3e67d8eb23198f45b6fb44372a25 100644 (file)
@@ -272,15 +272,15 @@ public class PAPFormattedDiskPage extends FormattedDiskPage
             int maxHugeGrpprlSize = LittleEndian.getUShort(_dataStream,
                 hugeGrpprlOffset);
 
-            if (maxHugeGrpprlSize < grpprl.length)
+            if (maxHugeGrpprlSize < grpprl.length-2) // grpprl.length-2 because we don't store the istd
               throw new UnsupportedOperationException(
                   "This Paragraph's dataStream storage is too small.");
           }
 
           // store grpprl at hugeGrpprlOffset
           System.arraycopy(grpprl, 2, _dataStream, hugeGrpprlOffset + 2,
-                           grpprl.length);
-          LittleEndian.putUShort(_dataStream, hugeGrpprlOffset, grpprl.length);
+                           grpprl.length - 2); // grpprl.length-2 because we don't store the istd
+          LittleEndian.putUShort(_dataStream, hugeGrpprlOffset, grpprl.length - 2);
 
           // grpprl = grpprl containing only a sprmPHugePapx2
           int istd = LittleEndian.getUShort(grpprl, 0);
index ad5a3953cb3bb6b3ec46dd504ace0d05955a1f42..7bca00d1a9784f8a8d123e922f8309700b00f7b7 100644 (file)
@@ -110,6 +110,29 @@ public abstract class PropertyNode implements Comparable
     _cpEnd = end;
   }
 
+  /**
+   * Adjust for a deletion that can span multiple PropertyNodes.
+   * @param start
+   * @param length
+   */
+  public void adjustForDelete(int start, int length)
+  {
+    int end = start + length;
+
+    if (_cpEnd > start)
+    {
+      if (_cpStart < end)
+      {
+        _cpEnd = end >= _cpEnd ? start : _cpEnd - length;
+        _cpStart = Math.min(start, _cpStart);
+      }
+      else
+      {
+        _cpEnd -= length;
+        _cpStart -= length;
+      }
+    }
+  }
 
   protected boolean limitsAreEqual(Object o)
   {
index fff36ce622bee007eb2ed38d205cd521f3c9e7a4..e1a856a4444cf33b22ec1de7a936406be0343415 100644 (file)
@@ -1,56 +1,19 @@
 /* ====================================================================
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2003 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Apache" and "Apache Software Foundation" and
- *    "Apache POI" must not be used to endorse or promote products
- *    derived from this software without prior written permission. For
- *    written permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    "Apache POI", nor may "Apache" appear in their name, without
- *    prior written permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
+   Copyright 2002-2004   Apache Software Foundation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
 
 package org.apache.poi.hwpf.model;
 
@@ -65,7 +28,7 @@ import java.io.UnsupportedEncodingException;
 public class TextPiece extends PropertyNode implements Comparable
 {
   private boolean _usesUnicode;
-  private int _length;
+
   private PieceDescriptor _pd;
 
   /**
@@ -77,10 +40,11 @@ public class TextPiece extends PropertyNode implements Comparable
   public TextPiece(int start, int end, byte[] text, PieceDescriptor pd)
     throws UnsupportedEncodingException
   {
-      super(start, end, new StringBuffer(new String(text, pd.isUnicode() ? "UTF-16LE" : "Cp1252")));
-      _usesUnicode = pd.isUnicode();
-      _length = end - start;
-      _pd = pd;
+     /** start - end is length on file. This is double the expected when its
+     * unicode.*/
+    super(start, end, new StringBuffer(new String(text, pd.isUnicode() ? "UTF-16LE" : "Cp1252")));
+    _usesUnicode = pd.isUnicode();
+    _pd = pd;
   }
   /**
    * @return If this text piece uses unicode
@@ -123,6 +87,16 @@ public class TextPiece extends PropertyNode implements Comparable
      return ((StringBuffer)_buf).substring(start/denominator, end/denominator);
    }
 
+   public void adjustForDelete(int start, int length)
+   {
+
+   }
+
+   public int characterLength()
+   {
+     return (getEnd() - getStart()) / (_usesUnicode ? 2 : 1);
+   }
+
    public boolean equals(Object o)
    {
      if (limitsAreEqual(o))
index 1718d3a0ba95298920fee8fa6dbba32b584406d6..2d13d4c54f7386890ecea7780e24b62f167b6bf1 100644 (file)
@@ -204,6 +204,8 @@ public class TextPieceTable
     int size = _textPieces.size();
 
     TextPiece tp = (TextPiece)_textPieces.get(listIndex);
+
+    //The text piece stores the length on file.
     length = length * (tp.usesUnicode() ? 2 : 1);
     tp.setEnd(tp.getEnd() + length);
     for (int x = listIndex + 1; x < size; x++)
index 2c69bde7434e2b16cb9d73e446277f20344fac98..c4f1c81bf4f5e8f0d0d2389a0b3b71dd077ee6fb 100644 (file)
@@ -626,7 +626,7 @@ public class CharacterSprmUncompressor
     {
       return true;
     }
-    else if ((x & 0x80) == 0x80)
+    else if ((x & 0x81) == 0x80)
     {
       return oldVal;
     }
index 47add56d59ff12a65ffc4ebad18f5bc27212e2d6..78a8b973452aa99f43beff755cb433183d8df272 100644 (file)
@@ -420,6 +420,8 @@ public class CharacterProperties
     cp.field_41_xstDispFldRMark = (byte[])field_41_xstDispFldRMark.clone();
     cp.field_42_shd = (ShadingDescriptor)field_42_shd.clone();
 
+    cp._ico24 = _ico24;
+
     return cp;
   }
 
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/DocumentPosition.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/DocumentPosition.java
new file mode 100644 (file)
index 0000000..a9bc94b
--- /dev/null
@@ -0,0 +1,32 @@
+/* ====================================================================
+   Copyright 2002-2004   Apache Software Foundation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+/**
+ * @author Ryan Ackley
+ */
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.HWPFDocument;
+
+public class DocumentPosition
+  extends Range
+{
+  public DocumentPosition(HWPFDocument doc, int pos)
+  {
+    super(pos, pos, doc);
+  }
+
+}
\ No newline at end of file
index 66dc3bd3002e27c374c65f5d3a9bdd0c706789cf..001b60afd55d2d0546e8195d67cfb3a3a9cb4f2a 100644 (file)
@@ -32,9 +32,13 @@ import org.apache.poi.hwpf.sprm.ParagraphSprmCompressor;
  * org.apache.poi.hwpf.HWPFDocument#registerList(HWPFList) registerList} in
  * {@link org.apache.poi.hwpf.HWPFDocument HWPFDocument}.
  *
- * In Word, lists are not ranged entities. Lists only act as properties for
- * list entries. Once you register a list, you can add list entries to a
- * document that use the list.
+ * In Word, lists are not ranged entities, meaning you can't actually add one
+ * to the document. Lists only act as properties for list entries. Once you
+ * register a list, you can add list entries to a document that are a part of
+ * the list.
+ *
+ * The only benefit of this that I see, is that you can add a list entry
+ * anywhere in the document and continue numbering from the previous list.
  *
  * @author Ryan Ackley
  */
@@ -45,6 +49,12 @@ public class HWPFList
   private boolean _registered;
   private StyleSheet _styleSheet;
 
+  /**
+   *
+   * @param numbered true if the list should be numbered; false if it should be
+   *        bulleted.
+   * @param styleSheet The document's stylesheet.
+   */
   public HWPFList(boolean numbered, StyleSheet styleSheet)
   {
     _listData = new ListData((int)(Math.random() * (double)System.currentTimeMillis()), numbered);
@@ -52,6 +62,12 @@ public class HWPFList
     _styleSheet = styleSheet;
   }
 
+  /**
+   * Sets the character properties of the list numbers.
+   *
+   * @param level the level number that the properties should apply to.
+   * @param chp The character properties.
+   */
   public void setLevelNumberProperties(int level, CharacterProperties chp)
   {
     ListLevel listLevel = _listData.getLevel(level);
@@ -62,6 +78,12 @@ public class HWPFList
     listLevel.setNumberProperties(grpprl);
   }
 
+  /**
+   * Sets the paragraph properties for a particular level of the list.
+   *
+   * @param level The level number.
+   * @param pap The paragraph properties
+   */
   public void setLevelParagraphProperties(int level, ParagraphProperties pap)
   {
     ListLevel listLevel = _listData.getLevel(level);
index cf929a9b6a20722194e097e22f04132e47520e1e..f3e9f130aee383e4456ae7d2e2ff103f3b6e8ada 100644 (file)
@@ -184,7 +184,7 @@ public class Paragraph
   public void setJustification(byte jc)
   {
     _props.setJc(jc);
-    _papx.addSprm(SPRM_JC, jc);
+    _papx.updateSprm(SPRM_JC, jc);
   }
 
   public boolean keepOnPage()
@@ -196,7 +196,7 @@ public class Paragraph
   {
     byte keep = (byte)(fKeep ? 1 : 0);
     _props.setFKeep(keep);
-    _papx.addSprm(SPRM_FKEEP, keep);
+    _papx.updateSprm(SPRM_FKEEP, keep);
   }
 
   public boolean keepWithNext()
@@ -208,7 +208,7 @@ public class Paragraph
   {
     byte keepFollow = (byte)(fKeepFollow ? 1 : 0);
     _props.setFKeepFollow(keepFollow);
-    _papx.addSprm(SPRM_FKEEPFOLLOW, keepFollow);
+    _papx.updateSprm(SPRM_FKEEPFOLLOW, keepFollow);
   }
 
   public boolean pageBreakBefore()
@@ -220,7 +220,7 @@ public class Paragraph
   {
     byte pageBreak = (byte)(fPageBreak ? 1 : 0);
     _props.setFPageBreakBefore(pageBreak);
-    _papx.addSprm(SPRM_FPAGEBREAKBEFORE, pageBreak);
+    _papx.updateSprm(SPRM_FPAGEBREAKBEFORE, pageBreak);
   }
 
   public boolean isLineNotNumbered()
@@ -232,7 +232,7 @@ public class Paragraph
   {
     byte noLnn = (byte)(fNoLnn ? 1 : 0);
     _props.setFNoLnn(noLnn);
-    _papx.addSprm(SPRM_FNOLINENUMB, noLnn);
+    _papx.updateSprm(SPRM_FNOLINENUMB, noLnn);
   }
 
   public boolean isSideBySide()
@@ -244,7 +244,7 @@ public class Paragraph
   {
     byte sideBySide = (byte)(fSideBySide ? 1 : 0);
     _props.setFSideBySide(sideBySide);
-    _papx.addSprm(SPRM_FSIDEBYSIDE, sideBySide);
+    _papx.updateSprm(SPRM_FSIDEBYSIDE, sideBySide);
   }
 
   public boolean isAutoHyphenated()
@@ -256,7 +256,7 @@ public class Paragraph
   {
     byte auto = (byte)(!autoHyph ? 1 : 0);
     _props.setFNoAutoHyph(auto);
-    _papx.addSprm(SPRM_FNOAUTOHYPH, auto);
+    _papx.updateSprm(SPRM_FNOAUTOHYPH, auto);
   }
 
   public boolean isWidowControlled()
@@ -268,7 +268,7 @@ public class Paragraph
   {
     byte widow = (byte)(widowControl ? 1 : 0);
     _props.setFWidowControl(widow);
-    _papx.addSprm(SPRM_FWIDOWCONTROL, widow);
+    _papx.updateSprm(SPRM_FWIDOWCONTROL, widow);
   }
 
   public int getIndentFromRight()
@@ -279,7 +279,7 @@ public class Paragraph
   public void setIndentFromRight(int dxaRight)
   {
     _props.setDxaRight(dxaRight);
-    _papx.addSprm(SPRM_DXARIGHT, (short)dxaRight);
+    _papx.updateSprm(SPRM_DXARIGHT, (short)dxaRight);
   }
 
   public int getIndentFromLeft()
@@ -290,7 +290,7 @@ public class Paragraph
   public void setIndentFromLeft(int dxaLeft)
   {
     _props.setDxaLeft(dxaLeft);
-    _papx.addSprm(SPRM_DXALEFT, (short)dxaLeft);
+    _papx.updateSprm(SPRM_DXALEFT, (short)dxaLeft);
   }
 
   public int getFirstLineIndent()
@@ -301,7 +301,7 @@ public class Paragraph
   public void setFirstLineIndent(int first)
   {
     _props.setDxaLeft1(first);
-    _papx.addSprm(SPRM_DXALEFT1, (short)first);
+    _papx.updateSprm(SPRM_DXALEFT1, (short)first);
   }
 
   public LineSpacingDescriptor getLineSpacing()
@@ -312,7 +312,7 @@ public class Paragraph
   public void setLineSpacing(LineSpacingDescriptor lspd)
   {
     _props.setLspd(lspd);
-    _papx.addSprm(SPRM_DYALINE, lspd.toInt());
+    _papx.updateSprm(SPRM_DYALINE, lspd.toInt());
   }
 
   public int getSpacingBefore()
@@ -323,7 +323,7 @@ public class Paragraph
   public void setSpacingBefore(int before)
   {
     _props.setDyaBefore(before);
-    _papx.addSprm(SPRM_DYABEFORE, (short)before);
+    _papx.updateSprm(SPRM_DYABEFORE, (short)before);
   }
 
   public int getSpacingAfter()
@@ -334,7 +334,7 @@ public class Paragraph
   public void setSpacingAfter(int after)
   {
     _props.setDyaAfter(after);
-    _papx.addSprm(SPRM_DYAAFTER, (short)after);
+    _papx.updateSprm(SPRM_DYAAFTER, (short)after);
   }
 
   public boolean isKinsoku()
@@ -346,7 +346,7 @@ public class Paragraph
   {
     byte kin = (byte)(kinsoku ? 1 : 0);
     _props.setFKinsoku(kin);
-    _papx.addSprm(SPRM_FKINSOKU, kin);
+    _papx.updateSprm(SPRM_FKINSOKU, kin);
   }
 
   public boolean isWordWrapped()
@@ -358,7 +358,7 @@ public class Paragraph
   {
     byte wordWrap = (byte)(wrap ? 1 : 0);
     _props.setFWordWrap(wordWrap);
-    _papx.addSprm(SPRM_FWORDWRAP, wordWrap);
+    _papx.updateSprm(SPRM_FWORDWRAP, wordWrap);
   }
 
   public int getFontAlignment()
@@ -369,7 +369,7 @@ public class Paragraph
   public void setFontAlignment(int align)
   {
     _props.setWAlignFont(align);
-    _papx.addSprm(SPRM_WALIGNFONT, (short)align);
+    _papx.updateSprm(SPRM_WALIGNFONT, (short)align);
   }
 
   public boolean isVertical()
@@ -380,7 +380,7 @@ public class Paragraph
   public void setVertical(boolean vertical)
   {
     _props.setFVertical(vertical);
-    _papx.addSprm(SPRM_FRAMETEXTFLOW, getFrameTextFlow());
+    _papx.updateSprm(SPRM_FRAMETEXTFLOW, getFrameTextFlow());
   }
 
   public boolean isBackward()
@@ -391,7 +391,7 @@ public class Paragraph
   public void setBackward(boolean bward)
   {
     _props.setFBackward(bward);
-    _papx.addSprm(SPRM_FRAMETEXTFLOW, getFrameTextFlow());
+    _papx.updateSprm(SPRM_FRAMETEXTFLOW, getFrameTextFlow());
   }
 
   public BorderCode getTopBorder()
@@ -402,7 +402,7 @@ public class Paragraph
   public void setTopBorder(BorderCode top)
   {
     _props.setBrcTop(top);
-    _papx.addSprm(SPRM_BRCTOP, top.toInt());
+    _papx.updateSprm(SPRM_BRCTOP, top.toInt());
   }
 
   public BorderCode getLeftBorder()
@@ -413,7 +413,7 @@ public class Paragraph
   public void setLeftBorder(BorderCode left)
   {
     _props.setBrcLeft(left);
-    _papx.addSprm(SPRM_BRCLEFT, left.toInt());
+    _papx.updateSprm(SPRM_BRCLEFT, left.toInt());
   }
 
   public BorderCode getBottomBorder()
@@ -424,7 +424,7 @@ public class Paragraph
   public void setBottomBorder(BorderCode bottom)
   {
     _props.setBrcBottom(bottom);
-    _papx.addSprm(SPRM_BRCBOTTOM, bottom.toInt());
+    _papx.updateSprm(SPRM_BRCBOTTOM, bottom.toInt());
   }
 
   public BorderCode getRightBorder()
@@ -435,7 +435,7 @@ public class Paragraph
   public void setRightBorder(BorderCode right)
   {
     _props.setBrcRight(right);
-    _papx.addSprm(SPRM_BRCRIGHT, right.toInt());
+    _papx.updateSprm(SPRM_BRCRIGHT, right.toInt());
   }
 
   public BorderCode getBarBorder()
@@ -446,7 +446,7 @@ public class Paragraph
   public void setBarBorder(BorderCode bar)
   {
     _props.setBrcBar(bar);
-    _papx.addSprm(SPRM_BRCBAR, bar.toInt());
+    _papx.updateSprm(SPRM_BRCBAR, bar.toInt());
   }
 
   public ShadingDescriptor getShading()
@@ -457,7 +457,7 @@ public class Paragraph
   public void setShading(ShadingDescriptor shd)
   {
     _props.setShd(shd);
-    _papx.addSprm(SPRM_SHD, shd.toShort());
+    _papx.updateSprm(SPRM_SHD, shd.toShort());
   }
 
   public DropCapSpecifier getDropCap()
@@ -468,7 +468,7 @@ public class Paragraph
   public void setDropCap(DropCapSpecifier dcs)
   {
     _props.setDcs(dcs);
-    _papx.addSprm(SPRM_DCS, dcs.toShort());
+    _papx.updateSprm(SPRM_DCS, dcs.toShort());
   }
 
   void setTableRowEnd(TableProperties props)
@@ -481,7 +481,7 @@ public class Paragraph
   private void setTableRowEnd(byte val)
   {
     _props.setFTtp(val);
-    _papx.addSprm(SPRM_FTTP, val);
+    _papx.updateSprm(SPRM_FTTP, val);
   }
 
   public Object clone()
index f633fc424a334bbf87caac8c95d14a7a6e3e488a..ed991e1c651b93063f39e7311ca20f349b5d836c 100644 (file)
@@ -63,6 +63,10 @@ import java.lang.ref.WeakReference;
  * It is possible to insert text and/or properties at the beginning or end of a
  * range.
  *
+ * Ranges are only valid if there hasn't been an insert in a prior Range since
+ * the Range's creation. Once an element (text, paragraph, etc.) has been
+ * inserted into a Range, subsequent Ranges become unstable.
+ *
  * @author Ryan Ackley
  */
 public class Range
@@ -161,6 +165,7 @@ public class Range
     _parent = new WeakReference(null);
   }
 
+
   /**
    * Used to create Ranges that are children of other Ranges.
    *
@@ -480,6 +485,33 @@ public class Range
     return getParagraph(numParagraphs() - 1);
   }
 
+  public void delete()
+  {
+    initAll();
+
+    int numSections = _sections.size();
+    int numRuns = _characters.size();
+    int numParagraphs = _paragraphs.size();
+
+    for (int x = _charStart; x < numRuns; x++)
+    {
+      CHPX chpx = (CHPX)_characters.get(x);
+      chpx.adjustForDelete(_start, _end - _start);
+    }
+
+    for (int x = _parStart; x < numParagraphs; x++)
+    {
+      PAPX papx = (PAPX)_paragraphs.get(x);
+      papx.adjustForDelete(_start, _end - _start);
+    }
+
+    for (int x = _sectionStart; x < numSections; x++)
+    {
+      SEPX sepx = (SEPX)_sections.get(x);
+      sepx.adjustForDelete(_start, _end - _start);
+    }
+  }
+
   /**
    * Inserts a simple table into the beginning of this range. The number of
    * columns is determined by the TableProperties passed into this function.
@@ -546,7 +578,7 @@ public class Range
     initCharacterRuns();
     CHPX chpx = (CHPX)_characters.get(index + _charStart);
 
-    int[] point = findRange(_paragraphs, _parStart, chpx.getStart(),
+    int[] point = findRange(_paragraphs, _parStart, Math.max(chpx.getStart(), _start),
                               chpx.getEnd());
     PAPX papx = (PAPX)_paragraphs.get(point[0]);
     short istd = papx.getIstd();