]> source.dussan.org Git - poi.git/commitdiff
initial check in
authorSaid Ryan Ackley <sackley@apache.org>
Mon, 10 Nov 2003 11:55:11 +0000 (11:55 +0000)
committerSaid Ryan Ackley <sackley@apache.org>
Mon, 10 Nov 2003 11:55:11 +0000 (11:55 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353442 13f79535-47bb-0310-9956-ffa450edef68

26 files changed:
src/scratchpad/src/org/apache/poi/hwpf/Range.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverride.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverrideLevel.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListLevel.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListTables.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/UPX.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/CharacterSprmUncompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmCompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmUncompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmBuffer.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmIterator.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmUncompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmCompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/BorderCode.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRange.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/DateAndTime.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/LineSpacingDescriptor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphRange.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionProperties.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionRange.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/ShadingDescriptor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableCellDescriptor.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableProperties.java [new file with mode: 0644]

diff --git a/src/scratchpad/src/org/apache/poi/hwpf/Range.java b/src/scratchpad/src/org/apache/poi/hwpf/Range.java
new file mode 100644 (file)
index 0000000..1854893
--- /dev/null
@@ -0,0 +1,291 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf;
+
+
+import org.apache.poi.util.LittleEndian;
+
+import org.apache.poi.hwpf.usermodel.SectionRange;
+import org.apache.poi.hwpf.usermodel.CharacterRange;
+import org.apache.poi.hwpf.usermodel.ParagraphRange;
+import org.apache.poi.hwpf.usermodel.CharacterProperties;
+import org.apache.poi.hwpf.usermodel.ParagraphProperties;
+import org.apache.poi.hwpf.usermodel.SectionProperties;
+
+import org.apache.poi.hwpf.model.hdftypes.PropertyNode;
+import org.apache.poi.hwpf.model.hdftypes.StyleSheet;
+import org.apache.poi.hwpf.model.hdftypes.StyleDescription;
+import org.apache.poi.hwpf.model.hdftypes.CHPBinTable;
+import org.apache.poi.hwpf.model.hdftypes.CHPX;
+import org.apache.poi.hwpf.model.hdftypes.PAPX;
+import org.apache.poi.hwpf.model.hdftypes.SEPX;
+import org.apache.poi.hwpf.model.hdftypes.PAPBinTable;
+import org.apache.poi.hwpf.model.hdftypes.SectionTable;
+import org.apache.poi.hwpf.model.hdftypes.TextPieceTable;
+import org.apache.poi.hwpf.model.hdftypes.TextPiece;
+
+import org.apache.poi.hwpf.sprm.CharacterSprmUncompressor;
+import org.apache.poi.hwpf.sprm.SectionSprmUncompressor;
+import org.apache.poi.hwpf.sprm.ParagraphSprmUncompressor;
+
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.UnsupportedEncodingException;
+import java.lang.ref.SoftReference;
+
+public class Range
+{
+  private int _start;
+  private int _end;
+  private HWPFDocument _doc;
+  private List _parentSections;
+  private List _parentParagraphs;
+  private List _parentCharacters;
+  private List _parentText;
+  private List _sections;
+  private List _paragraphs;
+  private List _characters;
+  private List _text;
+
+
+  protected Range(int start, int end, HWPFDocument doc)
+  {
+    _start = start;
+    _end = end;
+    _doc = doc;
+    _parentSections = _doc.getSectionTable().getSections();
+    _parentParagraphs = _doc.getParagraphTable().getParagraphs();
+    _parentCharacters = _doc.getCharacterTable().getTextRuns();
+    _parentText = _doc.getTextTable().getTextPieces();
+  }
+
+  protected Range(int start, int end, Range parent)
+  {
+    _start = start;
+    _end = end;
+    _doc = parent._doc;
+    _parentSections = parent._parentSections;
+    _parentParagraphs = parent._parentParagraphs;
+    _parentCharacters = parent._parentCharacters;
+    _parentText = parent._parentText;
+  }
+
+  public String text()
+    throws UnsupportedEncodingException
+  {
+    if (_text == null)
+    {
+      _text = initRangedList(_parentText, _start, _end);
+    }
+
+    StringBuffer sb = new StringBuffer();
+    int size = _text.size();
+    for (int x = 0; x < size; x++)
+    {
+      TextPiece tp = (TextPiece)_text.get(x);
+      String encoding = "Cp1252";
+      if (tp.usesUnicode())
+      {
+        encoding = "UTF-16LE";
+      }
+      String str = new String (tp.getBuf(), Math.max(_start, tp.getStart()), Math.min(_end, tp.getEnd()), encoding);
+      sb.append(str);
+    }
+    return sb.toString();
+  }
+
+  public int numSections()
+  {
+    if (_sections == null)
+    {
+      _sections = initRangedList(_parentSections, _start, _end);
+    }
+    return _sections.size();
+  }
+
+  public int numParagraphs()
+  {
+    if (_paragraphs == null)
+    {
+      _paragraphs = initRangedList(_parentParagraphs, _start, _end);
+    }
+    return _paragraphs.size();
+  }
+
+  public int numCharacterRuns()
+  {
+    if (_characters == null)
+    {
+      _characters = initRangedList(_parentCharacters, _start, _end);
+    }
+    return _characters.size();
+  }
+
+  public CharacterProperties getCharacterRun(int index)
+  {
+    CHPX chpx = (CHPX)_characters.get(index);
+    CharacterProperties chp = (CharacterProperties)chpx.getCacheContents();
+    if (chp == null)
+    {
+      List paragraphList = initRangedList(_paragraphs, chpx.getStart(),
+                                          chpx.getEnd());
+      PAPX papx = (PAPX)paragraphList.get(0);
+      short istd = LittleEndian.getShort(papx.getBuf());
+
+      StyleSheet sd = _doc.getStyleSheet();
+      CharacterProperties baseStyle = sd.getCharacterStyle(istd);
+      chp = CharacterSprmUncompressor.uncompressCHP(baseStyle, chpx.getBuf(), 0);
+      chpx.fillCache(chp);
+    }
+    return chp;
+  }
+
+  public SectionProperties getSection(int index)
+  {
+    SEPX sepx = (SEPX)_sections.get(index);
+    SectionProperties sep = (SectionProperties)sepx.getCacheContents();
+    if (sep == null)
+    {
+      sep = SectionSprmUncompressor.uncompressSEP(new SectionProperties(), sepx.getBuf(), 0);
+      sepx.fillCache(sep);
+    }
+    return sep;
+  }
+
+  public ParagraphProperties getParagraph(int index)
+  {
+    PAPX papx = (PAPX)_sections.get(index);
+    ParagraphProperties pap = (ParagraphProperties)papx.getCacheContents();
+    if (pap == null)
+    {
+      short istd = LittleEndian.getShort(papx.getBuf());
+      StyleSheet sd = _doc.getStyleSheet();
+      ParagraphProperties baseStyle = sd.getParagraphStyle(istd);
+      pap = ParagraphSprmUncompressor.uncompressPAP(baseStyle, papx.getBuf(), 2);
+      papx.fillCache(pap);
+    }
+    return pap;
+  }
+
+  public SectionRange getSectionRange(int index)
+  {
+    if (_sections == null)
+    {
+      _sections = initRangedList(_doc.getSectionTable().getSections(), _start, _end);
+    }
+    PropertyNode node = (PropertyNode)_sections.get(index);
+    return new SectionRange(Math.max(_start, node.getStart()),
+                            Math.min(_end, node.getEnd()), this);
+  }
+
+  public ParagraphRange getParagraphRange(int index)
+  {
+    if (_paragraphs == null)
+    {
+      _paragraphs = initRangedList(_doc.getParagraphTable().getParagraphs(), _start, _end);
+    }
+    PropertyNode node = (PropertyNode)_paragraphs.get(index);
+    return new ParagraphRange(Math.max(_start, node.getStart()),
+                            Math.min(_end, node.getEnd()),this);
+
+  }
+
+  public CharacterRange getCharacterRange(int index)
+  {
+    if (_characters == null)
+    {
+      _characters = initRangedList(_doc.getCharacterTable().getTextRuns(), _start, _end);
+    }
+    PropertyNode node = (PropertyNode)_characters.get(index);
+    return new CharacterRange(Math.max(_start, node.getStart()),
+                            Math.min(_end, node.getEnd()), this);
+
+  }
+
+  public SectionRange sections()
+  {
+    return new SectionRange(_start, _end, _doc);
+  }
+  public ParagraphRange paragraphs()
+  {
+    return new ParagraphRange(_start, _end, _doc);
+  }
+
+  public CharacterRange characterRuns()
+  {
+    return new CharacterRange(_start, _end, _doc);
+  }
+
+  private List initRangedList(List rpl, int start, int end)
+  {
+    int x = 0;
+    PropertyNode node = (PropertyNode)rpl.get(x);
+    while(node.getStart() < start)
+    {
+      x++;
+      node = (PropertyNode)rpl.get(x);
+    }
+
+    int y = x;
+    node = (PropertyNode)rpl.get(y);
+    while(node.getEnd() > end)
+    {
+      y++;
+      node = (PropertyNode)rpl.get(y);
+    }
+    return rpl.subList(x, y + 1);
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverride.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverride.java
new file mode 100644 (file)
index 0000000..9066f71
--- /dev/null
@@ -0,0 +1,116 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.model.hdftypes;
+
+import org.apache.poi.util.LittleEndian;
+
+public class ListFormatOverride
+{
+  int _lsid;
+  int _reserved1;
+  int _reserved2;
+  byte _clfolvl;
+  byte[] _reserved3 = new byte[3];
+  ListFormatOverrideLevel[] _levelOverrides;
+
+  public ListFormatOverride(byte[] buf, int offset)
+  {
+    _lsid = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _reserved1 = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _reserved2 = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _clfolvl = buf[offset++];
+    System.arraycopy(buf, offset, _reserved3, 0, _reserved3.length);
+    _levelOverrides = new ListFormatOverrideLevel[_clfolvl];
+  }
+
+  public int numOverrides()
+  {
+    return _clfolvl;
+  }
+
+  public int getLsid()
+  {
+    return _lsid;
+  }
+
+  public ListFormatOverrideLevel[] getLevelOverrides()
+  {
+    return _levelOverrides;
+  }
+
+  public void setOverride(int index, ListFormatOverrideLevel lfolvl)
+  {
+    _levelOverrides[index] = lfolvl;
+  }
+
+  public byte[] toByteArray()
+  {
+    byte[] buf = new byte[16];
+    int offset = 0;
+    LittleEndian.putInt(buf, offset, _lsid);
+    offset += LittleEndian.INT_SIZE;
+    LittleEndian.putInt(buf, offset, _reserved1);
+    offset += LittleEndian.INT_SIZE;
+    LittleEndian.putInt(buf, offset, _reserved2);
+    offset += LittleEndian.INT_SIZE;
+    buf[offset++] = _clfolvl;
+    System.arraycopy(_reserved3, 0, buf, offset, 3);
+
+    return buf;
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverrideLevel.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverrideLevel.java
new file mode 100644 (file)
index 0000000..da1e056
--- /dev/null
@@ -0,0 +1,106 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.model.hdftypes;
+
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.BitField;
+
+public class ListFormatOverrideLevel
+{
+  private static final int BASE_SIZE = 8;
+
+  int _iStartAt;
+  byte _info;
+   private static BitField _ilvl = new BitField(0xf);
+   private static BitField _fStartAt = new BitField(0x10);
+   private static BitField _fFormatting = new BitField(0x20);
+  byte[] _reserved = new byte[3];
+  ListLevel _lvl;
+
+  public ListFormatOverrideLevel(byte[] buf, int offset)
+  {
+    _iStartAt = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _info = buf[offset++];
+    System.arraycopy(buf, offset, _reserved, 0, _reserved.length);
+    offset += _reserved.length;
+
+    if (_fFormatting.getValue(_info) > 0)
+    {
+      _lvl = new ListLevel(buf, offset);
+    }
+  }
+
+  public int getSizeInBytes()
+  {
+    return (_lvl == null ? BASE_SIZE : BASE_SIZE + _lvl.getSizeInBytes());
+  }
+
+  public byte[] toByteArray()
+  {
+    byte[] buf = new byte[getSizeInBytes()];
+
+    int offset = 0;
+    LittleEndian.putInt(buf, _iStartAt);
+    offset += LittleEndian.INT_SIZE;
+    buf[offset++] = _info;
+    System.arraycopy(_reserved, 0, buf, offset, 3);
+
+    byte[] levelBuf = _lvl.toByteArray();
+    System.arraycopy(levelBuf, 0, buf, offset, levelBuf.length);
+
+    return buf;
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListLevel.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListLevel.java
new file mode 100644 (file)
index 0000000..9b2f822
--- /dev/null
@@ -0,0 +1,159 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.model.hdftypes;
+
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.LittleEndian;
+
+public class ListLevel
+{
+  private int _iStartAt;
+  private byte _nfc;
+  private byte _info;
+    private static BitField _jc;
+    private static BitField _fLegal;
+    private static BitField _fNoRestart;
+    private static BitField _fPrev;
+    private static BitField _fPrevSpace;
+    private static BitField _fWord6;
+  private byte[] _rgbxchNums;
+  private byte _ixchFollow;
+  private int _dxaSpace;
+  private int _dxaIndent;
+  private int _cbGrpprlChpx;
+  private int _cbGrpprlPapx;
+  private byte _reserved;
+  private byte[] _grpprlPapx;
+  private byte[] _grpprlChpx;
+  private char[] _numberText;
+
+  public ListLevel(byte[] buf, int offset)
+  {
+    _iStartAt = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _nfc = buf[offset++];
+    _info = buf[offset++];
+
+    _rgbxchNums = new byte[9];
+    for (int x = 0; x < 9; x++)
+    {
+      _rgbxchNums[x] = buf[offset++];
+    }
+    _ixchFollow = buf[offset++];
+    _dxaSpace = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _dxaIndent = LittleEndian.getInt(buf, offset);
+    offset += LittleEndian.INT_SIZE;
+    _cbGrpprlChpx = LittleEndian.getUnsignedByte(buf, offset++);
+    _cbGrpprlPapx = LittleEndian.getUnsignedByte(buf, offset++);
+    _reserved = buf[offset++];
+
+    _grpprlPapx = new byte[_cbGrpprlPapx];
+    _grpprlChpx = new byte[_cbGrpprlChpx];
+    System.arraycopy(buf, offset, _grpprlPapx, 0, _cbGrpprlPapx);
+    offset += _cbGrpprlPapx;
+    System.arraycopy(buf, offset, _grpprlChpx, 0, _cbGrpprlChpx);
+    offset += _cbGrpprlChpx;
+
+    int numberTextLength = LittleEndian.getShort(buf, offset);
+    _numberText = new char[numberTextLength];
+    offset += LittleEndian.SHORT_SIZE;
+    for (int x = 0; x < numberTextLength; x++)
+    {
+      _numberText[x] = (char)LittleEndian.getShort(buf, offset);
+      offset += LittleEndian.SHORT_SIZE;
+    }
+
+  }
+  public byte[] toByteArray()
+  {
+    byte[] buf = new byte[getSizeInBytes()];
+    int offset = 0;
+    LittleEndian.putInt(buf, offset, _iStartAt);
+    offset += LittleEndian.INT_SIZE;
+    buf[offset++] = _nfc;
+    buf[offset++] = _info;
+    System.arraycopy(_rgbxchNums, 0, buf, offset, _rgbxchNums.length);
+    offset += _rgbxchNums.length;
+    buf[offset++] = _ixchFollow;
+    LittleEndian.putInt(buf, offset, _dxaSpace);
+    offset += LittleEndian.INT_SIZE;
+    LittleEndian.putInt(buf, offset, _dxaIndent);
+    offset += LittleEndian.INT_SIZE;
+    LittleEndian.putInt(buf, offset, _cbGrpprlChpx);
+    offset += LittleEndian.INT_SIZE;
+    LittleEndian.putInt(buf, offset, _cbGrpprlPapx);
+    offset += LittleEndian.INT_SIZE;
+
+    System.arraycopy(_grpprlPapx, 0, buf, offset, _cbGrpprlPapx);
+    offset += _cbGrpprlPapx;
+    System.arraycopy(_grpprlChpx, 0, buf, offset, _cbGrpprlChpx);
+    offset += _cbGrpprlChpx;
+
+    LittleEndian.putShort(buf, offset, (short)_numberText.length);
+    offset += LittleEndian.SHORT_SIZE;
+    for (int x = 0; x < _numberText.length; x++)
+    {
+      LittleEndian.putShort(buf, offset, (short)_numberText[x]);
+      offset += LittleEndian.SHORT_SIZE;
+    }
+    return buf;
+  }
+  public int getSizeInBytes()
+  {
+    return 28 + _cbGrpprlChpx + _cbGrpprlPapx + _numberText.length + 2;
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListTables.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListTables.java
new file mode 100644 (file)
index 0000000..90529cb
--- /dev/null
@@ -0,0 +1,164 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.model.hdftypes;
+
+import org.apache.poi.util.LittleEndian;
+
+import org.apache.poi.hwpf.model.io.*;
+
+import java.util.HashMap;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class ListTables
+{
+  private static final int LIST_DATA_SIZE = 28;
+  private static final int LIST_FORMAT_OVERRIDE_SIZE = 16;
+
+  HashMap listMap = new HashMap();
+  HashMap overrideMap = new HashMap();
+
+  public ListTables(byte[] tableStream, int lstOffset, int lfoOffset)
+  {
+    // get the list data
+    int length = LittleEndian.getShort(tableStream, lstOffset);
+    lstOffset += LittleEndian.SHORT_SIZE;
+    int levelOffset = lstOffset + (length * LIST_DATA_SIZE);
+
+    for (int x = 0; x < length; x++)
+    {
+      ListData lst = new ListData(tableStream, lstOffset);
+      listMap.put(new Integer(lst.getLsid()), lst);
+      lstOffset += LIST_DATA_SIZE;
+
+      int num = lst.numLevels();
+      for (int y = 0; y < num; y++)
+      {
+        ListLevel lvl = new ListLevel(tableStream, levelOffset);
+        lst.setLevel(y, lvl);
+        levelOffset += lvl.getSizeInBytes();
+      }
+    }
+
+    // now get the list format overrides. The size is an int unlike the LST size
+    length = LittleEndian.getInt(tableStream, lfoOffset);
+    lfoOffset += LittleEndian.INT_SIZE;
+    int lfolvlOffset = LIST_FORMAT_OVERRIDE_SIZE * length + 4;
+    for (int x = 0; x < length; x++)
+    {
+      ListFormatOverride lfo = new ListFormatOverride(tableStream, lfoOffset);
+      lfoOffset += LIST_FORMAT_OVERRIDE_SIZE;
+      int num = lfo.numOverrides();
+      for (int y = 0; y < num; y++)
+      {
+        ListFormatOverrideLevel lfolvl = new ListFormatOverrideLevel(tableStream, lfolvlOffset);
+        lfo.setOverride(y, lfolvl);
+        lfolvlOffset += lfolvl.getSizeInBytes();
+      }
+      overrideMap.put(new Integer(lfo.getLsid()), lfo);
+    }
+  }
+
+  public void writeListDataTo(HWPFOutputStream tableStream)
+    throws IOException
+  {
+
+    Integer[] intList = (Integer[])listMap.keySet().toArray(new Integer[0]);
+
+    // use this stream as a buffer for the levels since their size varies.
+    ByteArrayOutputStream levelBuf = new ByteArrayOutputStream();
+
+    // use a byte array for the lists because we know their size.
+    byte[] listBuf = new byte[intList.length * LIST_DATA_SIZE];
+
+
+    for (int x = 0; x < intList.length; x++)
+    {
+      ListData lst = (ListData)listMap.get(intList[x]);
+      tableStream.write(lst.toByteArray());
+      ListLevel[] lvls = lst.getLevels();
+      for (int y = 0; y < lvls.length; y++)
+      {
+        levelBuf.write(lvls[y].toByteArray());
+      }
+    }
+    tableStream.write(levelBuf.toByteArray());
+  }
+  public void writeListOverridesTo(HWPFOutputStream tableStream)
+    throws IOException
+  {
+    Integer[] intList = (Integer[])overrideMap.keySet().toArray(new Integer[0]);
+
+    // use this stream as a buffer for the levels since their size varies.
+    ByteArrayOutputStream levelBuf = new ByteArrayOutputStream();
+
+    // use a byte array for the lists because we know their size.
+    byte[] overrideBuf = new byte[intList.length * LIST_FORMAT_OVERRIDE_SIZE];
+
+
+    for (int x = 0; x < intList.length; x++)
+    {
+      ListFormatOverride lfo = (ListFormatOverride)overrideMap.get(intList[x]);
+      tableStream.write(lfo.toByteArray());
+      ListFormatOverrideLevel[] lfolvls = lfo.getLevelOverrides();
+      for (int y = 0; y < lfolvls.length; y++)
+      {
+        levelBuf.write(lfolvls[y].toByteArray());
+      }
+    }
+    tableStream.write(levelBuf.toByteArray());
+
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/UPX.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/UPX.java
new file mode 100644 (file)
index 0000000..57f5f02
--- /dev/null
@@ -0,0 +1,82 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.model.hdftypes;
+
+import java.util.Arrays;
+
+public class UPX
+{
+  private byte[] _upx;
+
+  public UPX(byte[] upx)
+  {
+    _upx = upx;
+  }
+
+  public byte[] getUPX()
+  {
+    return _upx;
+  }
+  public int size()
+  {
+    return _upx.length;
+  }
+
+  public boolean equals(Object o)
+  {
+    UPX upx = (UPX)o;
+    return Arrays.equals(_upx, upx._upx);
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/CharacterSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/CharacterSprmUncompressor.java
new file mode 100644 (file)
index 0000000..05c3a72
--- /dev/null
@@ -0,0 +1,640 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.hwpf.usermodel.CharacterProperties;
+import org.apache.poi.hwpf.usermodel.DateAndTime;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
+import org.apache.poi.hwpf.model.hdftypes.StyleSheet;
+import org.apache.poi.util.LittleEndian;
+
+public class CharacterSprmUncompressor
+{
+  public CharacterSprmUncompressor()
+  {
+  }
+
+  public static CharacterProperties uncompressCHP(CharacterProperties parent,
+                                                  byte[] grpprl,
+                                                  int offset)
+  {
+    CharacterProperties newProperties = null;
+    try
+    {
+      newProperties = (CharacterProperties) parent.clone();
+    }
+    catch (CloneNotSupportedException cnse)
+    {
+      throw new RuntimeException("There is no way this exception should happen!!");
+    }
+    SprmIterator sprmIt = new SprmIterator(grpprl, offset);
+
+    while (sprmIt.hasNext())
+    {
+      SprmOperation sprm = (SprmOperation)sprmIt.next();
+      unCompressCHPOperation(parent, newProperties, sprm);
+    }
+
+    return newProperties;
+  }
+
+  /**
+   * Used in decompression of a chpx. This performs an operation defined by
+   * a single sprm.
+   *
+   * @param oldCHP The base CharacterProperties.
+   * @param newCHP The current CharacterProperties.
+   * @param operand The operand defined by the sprm (See Word file format spec)
+   * @param param The parameter defined by the sprm (See Word file format spec)
+   * @param varParam The variable length parameter defined by the sprm. (See
+   *        Word file format spec)
+   * @param grpprl The entire chpx that this operation is a part of.
+   * @param offset The offset in the grpprl of the next sprm
+   * @param styleSheet The StyleSheet for this document.
+   */
+  static void unCompressCHPOperation (CharacterProperties oldCHP,
+                                      CharacterProperties newCHP,
+                                      SprmOperation sprm)
+  {
+
+    switch (sprm.getOperation())
+    {
+      case 0:
+        newCHP.setFRMarkDel (getFlag (sprm.getOperand()));
+        break;
+      case 0x1:
+        newCHP.setFRMark (getFlag (sprm.getOperand()));
+        break;
+      case 0x2:
+        newCHP.setFFldVanish (getFlag (sprm.getOperand()));
+        break;
+      case 0x3:
+        newCHP.setFcPic (sprm.getOperand());
+        newCHP.setFSpec (true);
+        break;
+      case 0x4:
+        newCHP.setIbstRMark ((short) sprm.getOperand());
+        break;
+      case 0x5:
+        newCHP.setDttmRMark (new DateAndTime(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x6:
+        newCHP.setFData (getFlag (sprm.getOperand()));
+        break;
+      case 0x7:
+        //don't care about this
+        break;
+      case 0x8:
+        //short chsDiff = (short)((param & 0xff0000) >>> 16);
+        int operand =sprm.getOperand();
+        short chsDiff = (short) (operand & 0x0000ff);
+        newCHP.setFChsDiff (getFlag (chsDiff));
+        newCHP.setChse ((short) (operand & 0xffff00));
+        break;
+      case 0x9:
+        newCHP.setFSpec (true);
+        newCHP.setFtcSym ((short) LittleEndian.getShort (sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        newCHP.setXchSym ((short) LittleEndian.getShort (sprm.getGrpprl(), sprm.getGrpprlOffset() + 2));
+        break;
+      case 0xa:
+        newCHP.setFOle2 (getFlag (sprm.getOperand()));
+        break;
+      case 0xb:
+
+        // Obsolete
+        break;
+      case 0xc:
+        newCHP.setIcoHighlight ((byte) sprm.getOperand());
+        newCHP.setFHighlight (getFlag (sprm.getOperand()));
+        break;
+      case 0xd:
+
+        //     undocumented
+        break;
+      case 0xe:
+        newCHP.setFcObj (sprm.getOperand());
+        break;
+      case 0xf:
+
+        // undocumented
+        break;
+      case 0x10:
+
+        // undocumented
+        break;
+
+        // undocumented till 0x30
+
+      case 0x11:
+        break;
+      case 0x12:
+        break;
+      case 0x13:
+        break;
+      case 0x14:
+        break;
+      case 0x15:
+        break;
+      case 0x16:
+        break;
+      case 0x17:
+        break;
+      case 0x18:
+        break;
+      case 0x19:
+        break;
+      case 0x1a:
+        break;
+      case 0x1b:
+        break;
+      case 0x1c:
+        break;
+      case 0x1d:
+        break;
+      case 0x1e:
+        break;
+      case 0x1f:
+        break;
+      case 0x20:
+        break;
+      case 0x21:
+        break;
+      case 0x22:
+        break;
+      case 0x23:
+        break;
+      case 0x24:
+        break;
+      case 0x25:
+        break;
+      case 0x26:
+        break;
+      case 0x27:
+        break;
+      case 0x28:
+        break;
+      case 0x29:
+        break;
+      case 0x2a:
+        break;
+      case 0x2b:
+        break;
+      case 0x2c:
+        break;
+      case 0x2d:
+        break;
+      case 0x2e:
+        break;
+      case 0x2f:
+        break;
+      case 0x30:
+        newCHP.setIstd (sprm.getOperand());
+        break;
+      case 0x31:
+
+        //permutation vector for fast saves, who cares!
+        break;
+      case 0x32:
+        newCHP.setFBold (false);
+        newCHP.setFItalic (false);
+        newCHP.setFOutline (false);
+        newCHP.setFStrike (false);
+        newCHP.setFShadow (false);
+        newCHP.setFSmallCaps (false);
+        newCHP.setFCaps (false);
+        newCHP.setFVanish (false);
+        newCHP.setKul ((byte) 0);
+        newCHP.setIco ((byte) 0);
+        break;
+      case 0x33:
+        try
+        {
+          // preserve the fSpec setting from the original CHP
+          boolean fSpec = newCHP.isFSpec ();
+          newCHP = (CharacterProperties) oldCHP.clone ();
+          newCHP.setFSpec (fSpec);
+
+        }
+        catch (CloneNotSupportedException e)
+        {
+          //do nothing
+        }
+        return;
+      case 0x34:
+
+        // undocumented
+        break;
+      case 0x35:
+        newCHP.setFBold (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFBold ()));
+        break;
+      case 0x36:
+        newCHP.setFItalic (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFItalic ()));
+        break;
+      case 0x37:
+        newCHP.setFStrike (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFStrike ()));
+        break;
+      case 0x38:
+        newCHP.setFOutline (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFOutline ()));
+        break;
+      case 0x39:
+        newCHP.setFShadow (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFShadow ()));
+        break;
+      case 0x3a:
+        newCHP.setFSmallCaps (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFSmallCaps ()));
+        break;
+      case 0x3b:
+        newCHP.setFCaps (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFCaps ()));
+        break;
+      case 0x3c:
+        newCHP.setFVanish (getCHPFlag ((byte) sprm.getOperand(), oldCHP.isFVanish ()));
+        break;
+      case 0x3d:
+        newCHP.setFtcAscii ((short) sprm.getOperand());
+        break;
+      case 0x3e:
+        newCHP.setKul ((byte) sprm.getOperand());
+        break;
+      case 0x3f:
+        operand = sprm.getOperand();
+        int hps = operand & 0xff;
+        if (hps != 0)
+        {
+          newCHP.setHps (hps);
+        }
+
+        //byte cInc = (byte)(((byte)(param & 0xfe00) >>> 4) >> 1);
+        byte cInc = (byte) ((operand & 0xff00) >>> 8);
+        cInc = (byte) (cInc >>> 1);
+        if (cInc != 0)
+        {
+          newCHP.setHps (Math.max (newCHP.getHps () + (cInc * 2), 2));
+        }
+
+        //byte hpsPos = (byte)((param & 0xff0000) >>> 8);
+        byte hpsPos = (byte) ((operand & 0xff0000) >>> 16);
+        if (hpsPos != 0x80)
+        {
+          newCHP.setHpsPos (hpsPos);
+        }
+        boolean fAdjust = (operand & 0x0100) > 0;
+        if (fAdjust && hpsPos != 128 && hpsPos != 0 && oldCHP.getHpsPos () == 0)
+        {
+          newCHP.setHps (Math.max (newCHP.getHps () + ( -2), 2));
+        }
+        if (fAdjust && hpsPos == 0 && oldCHP.getHpsPos () != 0)
+        {
+          newCHP.setHps (Math.max (newCHP.getHps () + 2, 2));
+        }
+        break;
+      case 0x40:
+        newCHP.setDxaSpace (sprm.getOperand());
+        break;
+      case 0x41:
+        newCHP.setLidDefault ((short) sprm.getOperand());
+        break;
+      case 0x42:
+        newCHP.setIco ((byte) sprm.getOperand());
+        break;
+      case 0x43:
+        newCHP.setHps (sprm.getOperand());
+        break;
+      case 0x44:
+        byte hpsLvl = (byte) sprm.getOperand();
+        newCHP.setHps (Math.max (newCHP.getHps () + (hpsLvl * 2), 2));
+        break;
+      case 0x45:
+        newCHP.setHpsPos ((short) sprm.getOperand());
+        break;
+      case 0x46:
+        if (sprm.getOperand() != 0)
+        {
+          if (oldCHP.getHpsPos () == 0)
+          {
+            newCHP.setHps (Math.max (newCHP.getHps () + ( -2), 2));
+          }
+        }
+        else
+        {
+          if (oldCHP.getHpsPos () != 0)
+          {
+            newCHP.setHps (Math.max (newCHP.getHps () + 2, 2));
+          }
+        }
+        break;
+      case 0x47:
+        /*CharacterProperties genCHP = new CharacterProperties ();
+        genCHP.setFtcAscii (4);
+        genCHP = (CharacterProperties) unCompressProperty (varParam, genCHP,
+          styleSheet);
+        CharacterProperties styleCHP = styleSheet.getStyleDescription (oldCHP.
+          getBaseIstd ()).getCHP ();
+        if (genCHP.isFBold () == newCHP.isFBold ())
+        {
+          newCHP.setFBold (styleCHP.isFBold ());
+        }
+        if (genCHP.isFItalic () == newCHP.isFItalic ())
+        {
+          newCHP.setFItalic (styleCHP.isFItalic ());
+        }
+        if (genCHP.isFSmallCaps () == newCHP.isFSmallCaps ())
+        {
+          newCHP.setFSmallCaps (styleCHP.isFSmallCaps ());
+        }
+        if (genCHP.isFVanish () == newCHP.isFVanish ())
+        {
+          newCHP.setFVanish (styleCHP.isFVanish ());
+        }
+        if (genCHP.isFStrike () == newCHP.isFStrike ())
+        {
+          newCHP.setFStrike (styleCHP.isFStrike ());
+        }
+        if (genCHP.isFCaps () == newCHP.isFCaps ())
+        {
+          newCHP.setFCaps (styleCHP.isFCaps ());
+        }
+        if (genCHP.getFtcAscii () == newCHP.getFtcAscii ())
+        {
+          newCHP.setFtcAscii (styleCHP.getFtcAscii ());
+        }
+        if (genCHP.getFtcFE () == newCHP.getFtcFE ())
+        {
+          newCHP.setFtcFE (styleCHP.getFtcFE ());
+        }
+        if (genCHP.getFtcOther () == newCHP.getFtcOther ())
+        {
+          newCHP.setFtcOther (styleCHP.getFtcOther ());
+        }
+        if (genCHP.getHps () == newCHP.getHps ())
+        {
+          newCHP.setHps (styleCHP.getHps ());
+        }
+        if (genCHP.getHpsPos () == newCHP.getHpsPos ())
+        {
+          newCHP.setHpsPos (styleCHP.getHpsPos ());
+        }
+        if (genCHP.getKul () == newCHP.getKul ())
+        {
+          newCHP.setKul (styleCHP.getKul ());
+        }
+        if (genCHP.getDxaSpace () == newCHP.getDxaSpace ())
+        {
+          newCHP.setDxaSpace (styleCHP.getDxaSpace ());
+        }
+        if (genCHP.getIco () == newCHP.getIco ())
+        {
+          newCHP.setIco (styleCHP.getIco ());
+        }
+        if (genCHP.getLidDefault () == newCHP.getLidDefault ())
+        {
+          newCHP.setLidDefault (styleCHP.getLidDefault ());
+        }
+        if (genCHP.getLidFE () == newCHP.getLidFE ())
+        {
+          newCHP.setLidFE (styleCHP.getLidFE ());
+        }*/
+        break;
+      case 0x48:
+        newCHP.setIss ((byte) sprm.getOperand());
+        break;
+      case 0x49:
+        newCHP.setHps (LittleEndian.getShort (sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x4a:
+        int increment = LittleEndian.getShort (sprm.getGrpprl(), sprm.getGrpprlOffset());
+        newCHP.setHps (Math.max (newCHP.getHps () + increment, 8));
+        break;
+      case 0x4b:
+        newCHP.setHpsKern (sprm.getOperand());
+        break;
+      case 0x4c:
+//        unCompressCHPOperation (oldCHP, newCHP, 0x47, param, varParam,
+//                                styleSheet, opSize);
+        break;
+      case 0x4d:
+        float percentage = (float) sprm.getOperand() / 100.0f;
+        int add = (int) ((float) percentage * (float) newCHP.getHps ());
+        newCHP.setHps (newCHP.getHps () + add);
+        break;
+      case 0x4e:
+        newCHP.setYsr ((byte) sprm.getOperand());
+        break;
+      case 0x4f:
+        newCHP.setFtcAscii ((short) sprm.getOperand());
+        break;
+      case 0x50:
+        newCHP.setFtcFE ((short) sprm.getOperand());
+        break;
+      case 0x51:
+        newCHP.setFtcOther ((short) sprm.getOperand());
+        break;
+      case 0x52:
+
+        // undocumented
+        break;
+      case 0x53:
+        newCHP.setFDStrike (getFlag (sprm.getOperand()));
+        break;
+      case 0x54:
+        newCHP.setFImprint (getFlag (sprm.getOperand()));
+        break;
+      case 0x55:
+        newCHP.setFSpec (getFlag (sprm.getOperand()));
+        break;
+      case 0x56:
+        newCHP.setFObj (getFlag (sprm.getOperand()));
+        break;
+      case 0x57:
+        byte[] buf = sprm.getGrpprl();
+        int offset = sprm.getGrpprlOffset();
+        newCHP.setFPropMark (buf[offset]);
+        newCHP.setIbstPropRMark ((short) LittleEndian.getShort (buf, offset + 1));
+        newCHP.setDttmPropRMark (new DateAndTime(buf, offset +3));
+        break;
+      case 0x58:
+        newCHP.setFEmboss (getFlag (sprm.getOperand()));
+        break;
+      case 0x59:
+        newCHP.setSfxtText ((byte) sprm.getOperand());
+        break;
+
+        // undocumented till 0x61
+      case 0x5a:
+        break;
+      case 0x5b:
+        break;
+      case 0x5c:
+        break;
+      case 0x5d:
+        break;
+      case 0x5e:
+        break;
+      case 0x5f:
+        break;
+      case 0x60:
+        break;
+      case 0x61:
+        break;
+      case 0x62:
+        byte[] xstDispFldRMark = new byte[32];
+        buf = sprm.getGrpprl();
+        offset = sprm.getGrpprlOffset();
+        newCHP.setFDispFldRMark (buf[offset]);
+        newCHP.setIbstDispFldRMark ((short) LittleEndian.getShort (buf, offset + 1));
+        newCHP.setDttmDispFldRMark (new DateAndTime(buf, offset + 3));
+        System.arraycopy (buf, offset + 7, xstDispFldRMark, 0, 32);
+        newCHP.setXstDispFldRMark (xstDispFldRMark);
+        break;
+      case 0x63:
+        newCHP.setIbstRMarkDel ((short) sprm.getOperand());
+        break;
+      case 0x64:
+        newCHP.setDttmRMarkDel (new DateAndTime(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x65:
+        newCHP.setBrc (new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x66:
+        newCHP.setShd (new ShadingDescriptor(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x67:
+
+        // Obsolete
+        break;
+      case 0x68:
+        break;
+
+        // undocumented till 0x6c
+
+      case 0x69:
+        break;
+      case 0x6a:
+        break;
+      case 0x6b:
+        break;
+      case 0x6c:
+        break;
+      case 0x6d:
+        newCHP.setLidDefault ((short) sprm.getOperand());
+        break;
+      case 0x6e:
+        newCHP.setLidFE ((short) sprm.getOperand());
+        break;
+      case 0x6f:
+        newCHP.setIdctHint ((byte) sprm.getOperand());
+        break;
+    }
+  }
+
+  /**
+   * Converts an int into a boolean. If the int is non-zero, it returns true.
+   * Otherwise it returns false.
+   *
+   * @param x The int to convert.
+   *
+   * @return A boolean whose value depends on x.
+   */
+  public static boolean getFlag (int x)
+  {
+    if (x != 0)
+    {
+      return true;
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  private static boolean getCHPFlag (byte x, boolean oldVal)
+  {
+    /*
+         switch(x)
+         {
+     case 0:
+       return false;
+     case 1:
+       return true;
+     case (byte)0x80:
+       return oldVal;
+     case (byte)0x81:
+       return !oldVal;
+     default:
+       return false;
+         }
+     */
+    if (x == 0)
+    {
+      return false;
+    }
+    else if (x == 1)
+    {
+      return true;
+    }
+    else if ((x & 0x80) == 0x80)
+    {
+      return oldVal;
+    }
+    else if ((x & 0x81) == 0x81)
+    {
+      return!oldVal;
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java
new file mode 100644 (file)
index 0000000..a2a8e2d
--- /dev/null
@@ -0,0 +1,515 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.hwpf.usermodel.ParagraphProperties;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+import org.apache.poi.hwpf.usermodel.DateAndTime;
+import org.apache.poi.hwpf.usermodel.LineSpacingDescriptor;
+import org.apache.poi.util.LittleEndian;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Collections;
+import java.util.ArrayList;
+
+public class ParagraphSprmUncompressor
+  extends SprmUncompressor
+{
+  public ParagraphSprmUncompressor()
+  {
+  }
+
+  public static ParagraphProperties uncompressPAP(ParagraphProperties parent,
+                                                  byte[] grpprl,
+                                                  int offset)
+  {
+    ParagraphProperties newProperties = null;
+    try
+    {
+      newProperties = (ParagraphProperties) parent.clone();
+    }
+    catch (CloneNotSupportedException cnse)
+    {
+      throw new RuntimeException("There is no way this exception should happen!!");
+    }
+    SprmIterator sprmIt = new SprmIterator(grpprl, offset);
+
+    while (sprmIt.hasNext())
+    {
+      SprmOperation sprm = (SprmOperation)sprmIt.next();
+      unCompressPAPOperation(newProperties, sprm);
+    }
+
+    return newProperties;
+  }
+
+  /**
+   * Performs an operation on a ParagraphProperties object. Used to uncompress
+   * from a papx.
+   *
+   * @param newPAP The ParagraphProperties object to perform the operation on.
+   * @param operand The operand that defines the operation.
+   * @param param The operation's parameter.
+   * @param varParam The operation's variable length parameter.
+   * @param grpprl The original papx.
+   * @param offset The current offset in the papx.
+   * @param spra A part of the sprm that defined this operation.
+   */
+  static void unCompressPAPOperation (ParagraphProperties newPAP, SprmOperation sprm)
+  {
+    switch (sprm.getOperation())
+    {
+      case 0:
+        newPAP.setIstd (sprm.getOperand());
+        break;
+      case 0x1:
+
+        // Used only for piece table grpprl's not for PAPX
+//        int istdFirst = LittleEndian.getShort (varParam, 2);
+//        int istdLast = LittleEndian.getShort (varParam, 4);
+//        if ((newPAP.getIstd () > istdFirst) || (newPAP.getIstd () <= istdLast))
+//        {
+//          permuteIstd (newPAP, varParam, opSize);
+//        }
+        break;
+      case 0x2:
+        if (newPAP.getIstd () <= 9 || newPAP.getIstd () >= 1)
+        {
+          byte paramTmp = (byte) sprm.getOperand();
+          newPAP.setIstd (newPAP.getIstd () + paramTmp);
+          newPAP.setLvl ((byte) (newPAP.getLvl () + paramTmp));
+
+          if (((paramTmp >> 7) & 0x01) == 1)
+          {
+            newPAP.setIstd (Math.max (newPAP.getIstd (), 1));
+          }
+          else
+          {
+            newPAP.setIstd (Math.min (newPAP.getIstd (), 9));
+          }
+
+        }
+        break;
+      case 0x3:
+        newPAP.setJc ((byte) sprm.getOperand());
+        break;
+      case 0x4:
+        newPAP.setFSideBySide ((byte) sprm.getOperand());
+        break;
+      case 0x5:
+        newPAP.setFKeep ((byte) sprm.getOperand());
+        break;
+      case 0x6:
+        newPAP.setFKeepFollow ((byte) sprm.getOperand());
+        break;
+      case 0x7:
+        newPAP.setFPageBreakBefore ((byte) sprm.getOperand());
+        break;
+      case 0x8:
+        newPAP.setBrcl ((byte) sprm.getOperand());
+        break;
+      case 0x9:
+        newPAP.setBrcp ((byte) sprm.getOperand());
+        break;
+      case 0xa:
+        newPAP.setIlvl ((byte) sprm.getOperand());
+        break;
+      case 0xb:
+        newPAP.setIlfo (sprm.getOperand());
+        break;
+      case 0xc:
+        newPAP.setFNoLnn ((byte) sprm.getOperand());
+        break;
+      case 0xd:
+        /**handle tabs . variable parameter. seperate processing needed*/
+        handleTabs(newPAP, sprm);
+        break;
+      case 0xe:
+        newPAP.setDxaRight (sprm.getOperand());
+        break;
+      case 0xf:
+        newPAP.setDxaLeft (sprm.getOperand());
+        break;
+      case 0x10:
+
+        // sprmPNest is only stored in grpprls linked to a piece table.
+        newPAP.setDxaLeft (newPAP.getDxaLeft () + sprm.getOperand());
+        newPAP.setDxaLeft (Math.max (0, newPAP.getDxaLeft ()));
+        break;
+      case 0x11:
+        newPAP.setDxaLeft1 (sprm.getOperand());
+        break;
+      case 0x12:
+        newPAP.setLspd(new LineSpacingDescriptor(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x13:
+        newPAP.setDyaBefore (sprm.getOperand());
+        break;
+      case 0x14:
+        newPAP.setDyaAfter (sprm.getOperand());
+        break;
+      case 0x15:
+        // fast saved only
+        //applySprmPChgTabs (newPAP, varParam, opSize);
+        break;
+      case 0x16:
+        newPAP.setFInTable ((byte) sprm.getOperand());
+        break;
+      case 0x17:
+        newPAP.setFTtp ((byte) sprm.getOperand());
+        break;
+      case 0x18:
+        newPAP.setDxaAbs (sprm.getOperand());
+        break;
+      case 0x19:
+        newPAP.setDyaAbs (sprm.getOperand());
+        break;
+      case 0x1a:
+        newPAP.setDxaWidth (sprm.getOperand());
+        break;
+      case 0x1b:
+        byte param = (byte)sprm.getOperand();
+        /** @todo handle paragraph postioning*/
+        byte pcVert = (byte) ((param & 0x0c) >> 2);
+        byte pcHorz = (byte) (param & 0x03);
+        if (pcVert != 3)
+        {
+          newPAP.setPcVert (pcVert);
+        }
+        if (pcHorz != 3)
+        {
+          newPAP.setPcHorz (pcHorz);
+        }
+        break;
+
+        // BrcXXX1 is older Version. Brc is used
+      case 0x1c:
+
+        //newPAP.setBrcTop1((short)param);
+        break;
+      case 0x1d:
+
+        //newPAP.setBrcLeft1((short)param);
+        break;
+      case 0x1e:
+
+        //newPAP.setBrcBottom1((short)param);
+        break;
+      case 0x1f:
+
+        //newPAP.setBrcRight1((short)param);
+        break;
+      case 0x20:
+
+        //newPAP.setBrcBetween1((short)param);
+        break;
+      case 0x21:
+
+        //newPAP.setBrcBar1((byte)param);
+        break;
+      case 0x22:
+        newPAP.setDxaFromText (sprm.getOperand());
+        break;
+      case 0x23:
+        newPAP.setWr((byte)sprm.getOperand());
+        break;
+      case 0x24:
+        newPAP.setBrcTop(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x25:
+        newPAP.setBrcLeft(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x26:
+        newPAP.setBrcBottom (new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x27:
+        newPAP.setBrcRight (new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x28:
+        newPAP.setBrcBetween (new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x29:
+        newPAP.setBrcBar (new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x2a:
+        newPAP.setFNoAutoHyph ((byte) sprm.getOperand());
+        break;
+      case 0x2b:
+        newPAP.setDyaHeight (sprm.getOperand());
+        break;
+      case 0x2c:
+        newPAP.setDcs ((short) sprm.getOperand());
+        break;
+      case 0x2d:
+        newPAP.setShd ((short) sprm.getOperand());
+        break;
+      case 0x2e:
+        newPAP.setDyaFromText (sprm.getOperand());
+        break;
+      case 0x2f:
+        newPAP.setDxaFromText (sprm.getOperand());
+        break;
+      case 0x30:
+        newPAP.setFLocked ((byte) sprm.getOperand());
+        break;
+      case 0x31:
+        newPAP.setFWidowControl ((byte) sprm.getOperand());
+        break;
+      case 0x32:
+
+        //undocumented
+        break;
+      case 0x33:
+        newPAP.setFKinsoku ((byte) sprm.getOperand());
+        break;
+      case 0x34:
+        newPAP.setFWordWrap ((byte) sprm.getOperand());
+        break;
+      case 0x35:
+        newPAP.setFOverflowPunct ((byte) sprm.getOperand());
+        break;
+      case 0x36:
+        newPAP.setFTopLinePunct ((byte) sprm.getOperand());
+        break;
+      case 0x37:
+        newPAP.setFAutoSpaceDE ((byte) sprm.getOperand());
+        break;
+      case 0x38:
+        newPAP.setFAutoSpaceDN ((byte) sprm.getOperand());
+        break;
+      case 0x39:
+        newPAP.setWAlignFont (sprm.getOperand());
+        break;
+      case 0x3a:
+        newPAP.setFontAlign ((short) sprm.getOperand());
+        break;
+      case 0x3b:
+
+        //obsolete
+        break;
+      case 0x3e:
+      {
+        byte[] buf = new byte[sprm.size() - 3];
+        System.arraycopy(buf, 0, sprm.getGrpprl(), sprm.getGrpprlOffset(),
+                         buf.length);
+        newPAP.setAnld(buf);
+        break;
+      }
+      case 0x3f:
+        //don't really need this. spec is confusing regarding this
+        //sprm
+        try
+        {
+          byte[] varParam = sprm.getGrpprl();
+          int offset = sprm.getGrpprlOffset();
+          newPAP.setFPropRMark ((int) varParam[offset]);
+          newPAP.setIbstPropRMark ((int) LittleEndian.getShort (varParam, offset + 1));
+          newPAP.setDttmPropRMark (new DateAndTime(varParam, offset + 3));
+        }
+        catch (Exception e)
+        {
+          e.printStackTrace ();
+        }
+        break;
+      case 0x40:
+
+        //newPAP._lvl = param;
+        if (newPAP.getIstd () >= 1 && newPAP.getIstd () <= 9)
+        {
+          newPAP.setIlvl ((byte) sprm.getOperand());
+        }
+        break;
+      case 0x41:
+
+        // undocumented
+        break;
+      case 0x43:
+
+        //pap.fNumRMIns
+        newPAP.setFNumRMIns ((byte) sprm.getOperand());
+        break;
+      case 0x44:
+
+        //undocumented
+        break;
+      case 0x45:
+        if (sprm.getSizeCode() == 6)
+        {
+          byte[] buf = new byte[sprm.size() - 3];
+          System.arraycopy(buf, 0, sprm.getGrpprl(), sprm.getGrpprlOffset(), buf.length);
+          newPAP.setNumrm (buf);
+        }
+        else
+        {
+          /**@todo handle large PAPX from data stream*/
+        }
+        break;
+
+      case 0x47:
+        newPAP.setFUsePgsuSettings ((byte) sprm.getOperand());
+        break;
+      case 0x48:
+        newPAP.setFAdjustRight ((byte) sprm.getOperand());
+        break;
+      default:
+        break;
+    }
+  }
+
+  private static void handleTabs(ParagraphProperties pap, SprmOperation sprm)
+  {
+    byte[] grpprl = sprm.getGrpprl();
+    int offset = sprm.getGrpprlOffset();
+    int delSize = grpprl[offset++];
+    int[] tabPositions = pap.getRgdxaTab();
+    byte[] tabDescriptors = pap.getRgtbd();
+
+    HashMap tabMap = new HashMap();
+    for (int x = 0; x < tabPositions.length; x++)
+    {
+      tabMap.put(new Integer(tabPositions[x]), new Byte(tabDescriptors[x]));
+    }
+
+    for (int x = 0; x < delSize; x++)
+    {
+      tabMap.remove(new Integer(LittleEndian.getInt(grpprl, offset)));
+      offset += LittleEndian.INT_SIZE;;
+    }
+
+    int addSize = grpprl[offset++];
+    for (int x = 0; x < addSize; x++)
+    {
+      Integer key = new Integer(LittleEndian.getInt(grpprl, offset));
+      Byte val = new Byte(grpprl[(LittleEndian.INT_SIZE * (addSize - x)) + x]);
+      tabMap.put(key, val);
+      offset += LittleEndian.INT_SIZE;
+    }
+
+    tabPositions = new int[tabMap.size()];
+    tabDescriptors = new byte[tabPositions.length];
+    ArrayList list = new ArrayList();
+
+    Iterator keyIT = tabMap.keySet().iterator();
+    while (keyIT.hasNext())
+    {
+      list.add(keyIT.next());
+    }
+    Collections.sort(list);
+
+    for (int x = 0; x < tabPositions.length; x++)
+    {
+      Integer key = ((Integer)list.get(x));
+      tabPositions[x] = key.intValue();
+      tabDescriptors[x] = ((Byte)tabMap.get(key)).byteValue();
+    }
+
+    pap.setRgdxaTab(tabPositions);
+    pap.setRgtbd(tabDescriptors);
+  }
+
+//  private static void handleTabsAgain(ParagraphProperties pap, SprmOperation sprm)
+//  {
+//    byte[] grpprl = sprm.getGrpprl();
+//    int offset = sprm.getGrpprlOffset();
+//    int delSize = grpprl[offset++];
+//    int[] tabPositions = pap.getRgdxaTab();
+//    byte[] tabDescriptors = pap.getRgtbd();
+//
+//    HashMap tabMap = new HashMap();
+//    for (int x = 0; x < tabPositions.length; x++)
+//    {
+//      tabMap.put(new Integer(tabPositions[x]), new Byte(tabDescriptors[x]));
+//    }
+//
+//    for (int x = 0; x < delSize; x++)
+//    {
+//      tabMap.remove(new Integer(LittleEndian.getInt(grpprl, offset)));
+//      offset += LittleEndian.INT_SIZE;;
+//    }
+//
+//    int addSize = grpprl[offset++];
+//    for (int x = 0; x < addSize; x++)
+//    {
+//      Integer key = new Integer(LittleEndian.getInt(grpprl, offset));
+//      Byte val = new Byte(grpprl[(LittleEndian.INT_SIZE * (addSize - x)) + x]);
+//      tabMap.put(key, val);
+//      offset += LittleEndian.INT_SIZE;
+//    }
+//
+//    tabPositions = new int[tabMap.size()];
+//    tabDescriptors = new byte[tabPositions.length];
+//    ArrayList list = new ArrayList();
+//
+//    Iterator keyIT = tabMap.keySet().iterator();
+//    while (keyIT.hasNext())
+//    {
+//      list.add(keyIT.next());
+//    }
+//    Collections.sort(list);
+//
+//    for (int x = 0; x < tabPositions.length; x++)
+//    {
+//      Integer key = ((Integer)list.get(x));
+//      tabPositions[x] = key.intValue();
+//      tabDescriptors[x] = ((Byte)tabMap.get(key)).byteValue();
+//    }
+//
+//    pap.setRgdxaTab(tabPositions);
+//    pap.setRgtbd(tabDescriptors);
+//  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmCompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmCompressor.java
new file mode 100644 (file)
index 0000000..55457c7
--- /dev/null
@@ -0,0 +1,272 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.apache.poi.hwpf.model.hdftypes.definitions.SEPAbstractType;
+import org.apache.poi.hwpf.usermodel.SectionProperties;
+import org.apache.poi.util.LittleEndian;
+
+
+public class SectionSprmCompressor
+{
+  private final static SectionProperties DEFAULT_SEP = new SectionProperties();
+  public SectionSprmCompressor()
+  {
+  }
+  public static byte[] compressSectionProperty(SectionProperties newSEP,
+                                               SectionProperties oldSEP)
+  {
+    int size = 0;
+    ArrayList sprmList = new ArrayList();
+
+    if (newSEP.getCnsPgn() != DEFAULT_SEP.getCnsPgn())
+    {
+      size += SprmUtils.addSprm((short)0x3000, newSEP.getCnsPgn(), null, sprmList);
+    }
+    if (newSEP.getIHeadingPgn() != DEFAULT_SEP.getIHeadingPgn())
+    {
+      size += SprmUtils.addSprm((short)0x3001, newSEP.getIHeadingPgn(), null, sprmList);
+    }
+    if (!Arrays.equals(newSEP.getOlstAnm(), DEFAULT_SEP.getOlstAnm()))
+    {
+      size += SprmUtils.addSprm((short)0xD202, 0, newSEP.getOlstAnm(), sprmList);
+    }
+    if (newSEP.getFEvenlySpaced() != DEFAULT_SEP.getFEvenlySpaced())
+    {
+      size += SprmUtils.addSprm((short)0x3005, newSEP.getFEvenlySpaced() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getFUnlocked() != DEFAULT_SEP.getFUnlocked())
+    {
+      size += SprmUtils.addSprm((short)0x3006, newSEP.getFUnlocked() ? 1 :0, null, sprmList);
+    }
+    if (newSEP.getDmBinFirst() != DEFAULT_SEP.getDmBinFirst())
+    {
+      size += SprmUtils.addSprm((short)0x5007, newSEP.getDmBinFirst(), null, sprmList);
+    }
+    if (newSEP.getDmBinOther() != DEFAULT_SEP.getDmBinOther())
+    {
+      size += SprmUtils.addSprm((short)0x5008, newSEP.getDmBinOther(), null, sprmList);
+    }
+    if (newSEP.getBkc() != DEFAULT_SEP.getBkc())
+    {
+      size += SprmUtils.addSprm((short)0x3009, newSEP.getBkc(), null, sprmList);
+    }
+    if (newSEP.getFTitlePage() != DEFAULT_SEP.getFTitlePage())
+    {
+      size += SprmUtils.addSprm((short)0x300A, newSEP.getFTitlePage() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getCcolM1() != DEFAULT_SEP.getCcolM1())
+    {
+      size += SprmUtils.addSprm((short)0x500B, newSEP.getCcolM1(), null, sprmList);
+    }
+    if (newSEP.getDxaColumns() != DEFAULT_SEP.getDxaColumns())
+    {
+      size += SprmUtils.addSprm((short)0x900C, newSEP.getDxaColumns(), null, sprmList);
+    }
+    if (newSEP.getFAutoPgn() != DEFAULT_SEP.getFAutoPgn())
+    {
+      size += SprmUtils.addSprm((short)0x300D, newSEP.getFAutoPgn() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getNfcPgn() != DEFAULT_SEP.getNfcPgn())
+    {
+      size += SprmUtils.addSprm((short)0x300E, newSEP.getNfcPgn(), null, sprmList);
+    }
+    if (newSEP.getDyaPgn() != DEFAULT_SEP.getDyaPgn())
+    {
+      size += SprmUtils.addSprm((short)0xB00F, newSEP.getDyaPgn(), null, sprmList);
+    }
+    if (newSEP.getDxaPgn() != DEFAULT_SEP.getDxaPgn())
+    {
+      size += SprmUtils.addSprm((short)0xB010, newSEP.getDxaPgn(), null, sprmList);
+    }
+    if (newSEP.getFPgnRestart() != DEFAULT_SEP.getFPgnRestart())
+    {
+      size += SprmUtils.addSprm((short)0x3011, newSEP.getFPgnRestart() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getFEndNote() != DEFAULT_SEP.getFEndNote())
+    {
+      size += SprmUtils.addSprm((short)0x3012, newSEP.getFEndNote() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getLnc() != DEFAULT_SEP.getLnc())
+    {
+      size += SprmUtils.addSprm((short)0x3013, newSEP.getLnc(), null, sprmList);
+    }
+    if (newSEP.getGrpfIhdt() != DEFAULT_SEP.getGrpfIhdt())
+    {
+      size += SprmUtils.addSprm((short)0x3014, newSEP.getGrpfIhdt(), null, sprmList);
+    }
+    if (newSEP.getNLnnMod() != DEFAULT_SEP.getNLnnMod())
+    {
+      size += SprmUtils.addSprm((short)0x5015, newSEP.getNLnnMod(), null, sprmList);
+    }
+    if (newSEP.getDxaLnn() != DEFAULT_SEP.getDxaLnn())
+    {
+      size += SprmUtils.addSprm((short)0x9016, newSEP.getDxaLnn(), null, sprmList);
+    }
+    if (newSEP.getDyaHdrTop() != DEFAULT_SEP.getDyaHdrTop())
+    {
+      size += SprmUtils.addSprm((short)0xB017, newSEP.getDyaHdrTop(), null, sprmList);
+    }
+    if (newSEP.getDyaHdrBottom() != DEFAULT_SEP.getDyaHdrBottom())
+    {
+      size += SprmUtils.addSprm((short)0xB018, newSEP.getDyaHdrBottom(), null, sprmList);
+    }
+    if (newSEP.getFLBetween() != DEFAULT_SEP.getFLBetween())
+    {
+      size += SprmUtils.addSprm((short)0x3019, newSEP.getFLBetween() ? 1 : 0, null, sprmList);
+    }
+    if (newSEP.getVjc() != DEFAULT_SEP.getVjc())
+    {
+      size += SprmUtils.addSprm((short)0x301A, newSEP.getVjc(), null, sprmList);
+    }
+    if (newSEP.getLnnMin() != DEFAULT_SEP.getLnnMin())
+    {
+      size += SprmUtils.addSprm((short)0x501B, newSEP.getLnnMin(), null, sprmList);
+    }
+    if (newSEP.getPgnStart() != DEFAULT_SEP.getPgnStart())
+    {
+      size += SprmUtils.addSprm((short)0x501C, newSEP.getPgnStart(), null, sprmList);
+    }
+    if (newSEP.getDmOrientPage() != DEFAULT_SEP.getDmOrientPage())
+    {
+      size += SprmUtils.addSprm((short)0x301D, newSEP.getDmOrientPage(), null, sprmList);
+    }
+    if (newSEP.getXaPage() != DEFAULT_SEP.getXaPage())
+    {
+      size += SprmUtils.addSprm((short)0xB01F, newSEP.getXaPage(), null, sprmList);
+    }
+    if (newSEP.getYaPage() != DEFAULT_SEP.getYaPage())
+    {
+      size += SprmUtils.addSprm((short)0xB020, newSEP.getYaPage(), null, sprmList);
+    }
+    if (newSEP.getDxaLeft() != DEFAULT_SEP.getDxaLeft())
+    {
+      size += SprmUtils.addSprm((short)0xB021, newSEP.getDxaLeft(), null, sprmList);
+    }
+    if (newSEP.getDxaRight() != DEFAULT_SEP.getDxaRight())
+    {
+      size += SprmUtils.addSprm((short)0xB022, newSEP.getDxaRight(), null, sprmList);
+    }
+    if (newSEP.getDyaTop() != DEFAULT_SEP.getDyaTop())
+    {
+      size += SprmUtils.addSprm((short)0x9023, newSEP.getDyaTop(), null, sprmList);
+    }
+    if (newSEP.getDyaBottom() != DEFAULT_SEP.getDyaBottom())
+    {
+      size += SprmUtils.addSprm((short)0x9024, newSEP.getDyaBottom(), null, sprmList);
+    }
+    if (newSEP.getDzaGutter() != DEFAULT_SEP.getDzaGutter())
+    {
+      size += SprmUtils.addSprm((short)0xB025, newSEP.getDzaGutter(), null, sprmList);
+    }
+    if (newSEP.getDmPaperReq() != DEFAULT_SEP.getDmPaperReq())
+    {
+      size += SprmUtils.addSprm((short)0x5026, newSEP.getDmPaperReq(), null, sprmList);
+    }
+    if (newSEP.getFPropMark() != DEFAULT_SEP.getFPropMark() ||
+        newSEP.getIbstPropRMark() != DEFAULT_SEP.getIbstPropRMark() ||
+        newSEP.getDttmPropRMark() != DEFAULT_SEP.getDttmPropRMark())
+    {
+      byte[] buf = new byte[7];
+      buf[0] = (byte)(newSEP.getFPropMark() ? 1 : 0);
+      int offset = LittleEndian.BYTE_SIZE;
+      LittleEndian.putShort(buf, (short)newSEP.getIbstPropRMark());
+      offset += LittleEndian.SHORT_SIZE;
+      LittleEndian.putInt(buf, newSEP.getDttmPropRMark());
+      size += SprmUtils.addSprm((short)0xD227, -1, buf, sprmList);
+    }
+    if (!Arrays.equals(newSEP.getBrcTop(), DEFAULT_SEP.getBrcTop()))
+    {
+      size += SprmUtils.addSprm((short)0x702B, SprmUtils.convertBrcToInt(newSEP.getBrcTop()), null, sprmList);
+    }
+    if (!Arrays.equals(newSEP.getBrcLeft(), DEFAULT_SEP.getBrcLeft()))
+    {
+      size += SprmUtils.addSprm((short)0x702C, SprmUtils.convertBrcToInt(newSEP.getBrcLeft()), null, sprmList);
+    }
+    if (!Arrays.equals(newSEP.getBrcBottom(), DEFAULT_SEP.getBrcBottom()))
+    {
+      size += SprmUtils.addSprm((short)0x702D, SprmUtils.convertBrcToInt(newSEP.getBrcBottom()), null, sprmList);
+    }
+    if (!Arrays.equals(newSEP.getBrcRight(), DEFAULT_SEP.getBrcRight()))
+    {
+      size += SprmUtils.addSprm((short)0x702E, SprmUtils.convertBrcToInt(newSEP.getBrcRight()), null, sprmList);
+    }
+    if (newSEP.getPgbProp() != DEFAULT_SEP.getPgbProp())
+    {
+      size += SprmUtils.addSprm((short)0x522F, newSEP.getPgbProp(), null, sprmList);
+    }
+    if (newSEP.getDxtCharSpace() != DEFAULT_SEP.getDxtCharSpace())
+    {
+      size += SprmUtils.addSprm((short)0x7030, newSEP.getDxtCharSpace(), null, sprmList);
+    }
+    if (newSEP.getDyaLinePitch() != DEFAULT_SEP.getDyaLinePitch())
+    {
+      size += SprmUtils.addSprm((short)0x9031, newSEP.getDyaLinePitch(), null, sprmList);
+    }
+    if (newSEP.getClm() != DEFAULT_SEP.getClm())
+    {
+      size += SprmUtils.addSprm((short)0x5032, newSEP.getClm(), null, sprmList);
+    }
+    if (newSEP.getWTextFlow() != DEFAULT_SEP.getWTextFlow())
+    {
+      size += SprmUtils.addSprm((short)0x5033, newSEP.getWTextFlow(), null, sprmList);
+    }
+
+    return SprmUtils.getGrpprl(sprmList, size);
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmUncompressor.java
new file mode 100644 (file)
index 0000000..0ffc0e8
--- /dev/null
@@ -0,0 +1,262 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.hwpf.usermodel.SectionProperties;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+
+public class SectionSprmUncompressor extends SprmUncompressor
+{
+  public SectionSprmUncompressor()
+  {
+  }
+  public static SectionProperties uncompressSEP(SectionProperties parent,
+                                                  byte[] grpprl,
+                                                  int offset)
+  {
+    SectionProperties newProperties = null;
+    try
+    {
+      newProperties = (SectionProperties) parent.clone();
+    }
+    catch (CloneNotSupportedException cnse)
+    {
+      throw new RuntimeException("There is no way this exception should happen!!");
+    }
+    SprmIterator sprmIt = new SprmIterator(grpprl, offset);
+
+    while (sprmIt.hasNext())
+    {
+      SprmOperation sprm = (SprmOperation)sprmIt.next();
+      unCompressSEPOperation(newProperties, sprm);
+    }
+
+    return newProperties;
+  }
+
+  /**
+   * Used in decompression of a sepx. This performs an operation defined by
+   * a single sprm.
+   *
+   * @param newSEP The SectionProperty to perfrom the operation on.
+   * @param operand The operation to perform.
+   * @param param The operation's parameter.
+   * @param varParam The operation variable length parameter.
+   */
+  static void unCompressSEPOperation (SectionProperties newSEP, SprmOperation sprm)
+  {
+    switch (sprm.getOperation())
+    {
+      case 0:
+        newSEP.setCnsPgn ((byte) sprm.getOperand());
+        break;
+      case 0x1:
+        newSEP.setIHeadingPgn ((byte) sprm.getOperand());
+        break;
+      case 0x2:
+        byte[] buf = new byte[sprm.size() - 3];
+        System.arraycopy(sprm.getGrpprl(), sprm.getGrpprlOffset(), buf, 0, buf.length);
+        newSEP.setOlstAnm (buf);
+        break;
+      case 0x3:
+        //not quite sure
+        break;
+      case 0x4:
+        //not quite sure
+        break;
+      case 0x5:
+        newSEP.setFEvenlySpaced (getFlag (sprm.getOperand()));
+        break;
+      case 0x6:
+        newSEP.setFUnlocked (getFlag (sprm.getOperand()));
+        break;
+      case 0x7:
+        newSEP.setDmBinFirst ((short) sprm.getOperand());
+        break;
+      case 0x8:
+        newSEP.setDmBinOther ((short) sprm.getOperand());
+        break;
+      case 0x9:
+        newSEP.setBkc ((byte) sprm.getOperand());
+        break;
+      case 0xa:
+        newSEP.setFTitlePage (getFlag (sprm.getOperand()));
+        break;
+      case 0xb:
+        newSEP.setCcolM1 ((short) sprm.getOperand());
+        break;
+      case 0xc:
+        newSEP.setDxaColumns (sprm.getOperand());
+        break;
+      case 0xd:
+        newSEP.setFAutoPgn (getFlag (sprm.getOperand()));
+        break;
+      case 0xe:
+        newSEP.setNfcPgn ((byte) sprm.getOperand());
+        break;
+      case 0xf:
+        newSEP.setDyaPgn ((short) sprm.getOperand());
+        break;
+      case 0x10:
+        newSEP.setDxaPgn ((short) sprm.getOperand());
+        break;
+      case 0x11:
+        newSEP.setFPgnRestart (getFlag (sprm.getOperand()));
+        break;
+      case 0x12:
+        newSEP.setFEndNote (getFlag (sprm.getOperand()));
+        break;
+      case 0x13:
+        newSEP.setLnc ((byte) sprm.getOperand());
+        break;
+      case 0x14:
+        newSEP.setGrpfIhdt ((byte) sprm.getOperand());
+        break;
+      case 0x15:
+        newSEP.setNLnnMod ((short) sprm.getOperand());
+        break;
+      case 0x16:
+        newSEP.setDxaLnn (sprm.getOperand());
+        break;
+      case 0x17:
+        newSEP.setDyaHdrTop (sprm.getOperand());
+        break;
+      case 0x18:
+        newSEP.setDyaHdrBottom (sprm.getOperand());
+        break;
+      case 0x19:
+        newSEP.setFLBetween (getFlag (sprm.getOperand()));
+        break;
+      case 0x1a:
+        newSEP.setVjc ((byte) sprm.getOperand());
+        break;
+      case 0x1b:
+        newSEP.setLnnMin ((short) sprm.getOperand());
+        break;
+      case 0x1c:
+        newSEP.setPgnStart ((short) sprm.getOperand());
+        break;
+      case 0x1d:
+        newSEP.setDmOrientPage ((byte) sprm.getOperand());
+        break;
+      case 0x1e:
+
+        //nothing
+        break;
+      case 0x1f:
+        newSEP.setXaPage (sprm.getOperand());
+        break;
+      case 0x20:
+        newSEP.setYaPage (sprm.getOperand());
+        break;
+      case 0x21:
+        newSEP.setDxaLeft (sprm.getOperand());
+        break;
+      case 0x22:
+        newSEP.setDxaRight (sprm.getOperand());
+        break;
+      case 0x23:
+        newSEP.setDyaTop (sprm.getOperand());
+        break;
+      case 0x24:
+        newSEP.setDyaBottom (sprm.getOperand());
+        break;
+      case 0x25:
+        newSEP.setDzaGutter (sprm.getOperand());
+        break;
+      case 0x26:
+        newSEP.setDmPaperReq ((short) sprm.getOperand());
+        break;
+      case 0x27:
+        newSEP.setFPropMark (getFlag (sprm.getOperand()));
+        break;
+      case 0x28:
+        break;
+      case 0x29:
+        break;
+      case 0x2a:
+        break;
+      case 0x2b:
+        newSEP.setBrcTop(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x2c:
+        newSEP.setBrcLeft(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x2d:
+        newSEP.setBrcBottom(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x2e:
+        newSEP.setBrcRight(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
+        break;
+      case 0x2f:
+        newSEP.setPgbProp (sprm.getOperand());
+        break;
+      case 0x30:
+        newSEP.setDxtCharSpace (sprm.getOperand());
+        break;
+      case 0x31:
+        newSEP.setDyaLinePitch (sprm.getOperand());
+        break;
+      case 0x33:
+        newSEP.setWTextFlow ((short) sprm.getOperand());
+        break;
+      default:
+        break;
+    }
+
+  }
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmBuffer.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmBuffer.java
new file mode 100644 (file)
index 0000000..9478602
--- /dev/null
@@ -0,0 +1,120 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.util.LittleEndian;
+
+public class SprmBuffer
+{
+  byte[] _buf;
+  int _offset;
+
+  public SprmBuffer(byte[] buf)
+  {
+    _offset = _buf.length;
+  }
+
+  public void addSprm(short opcode, byte operand)
+  {
+    int addition = LittleEndian.SHORT_SIZE + LittleEndian.BYTE_SIZE;
+    ensureCapacity(addition);
+    LittleEndian.putShort(_buf, _offset, opcode);
+    _offset += LittleEndian.SHORT_SIZE;
+    _buf[_offset++] = operand;
+  }
+  public void addSprm(short opcode, short operand)
+  {
+    int addition = LittleEndian.SHORT_SIZE + LittleEndian.SHORT_SIZE;
+    ensureCapacity(addition);
+    LittleEndian.putShort(_buf, _offset, opcode);
+    _offset += LittleEndian.SHORT_SIZE;
+    LittleEndian.putShort(_buf, _offset, operand);
+    _offset += LittleEndian.SHORT_SIZE;
+  }
+  public void addSprm(short opcode, int operand)
+  {
+    int addition = LittleEndian.SHORT_SIZE + LittleEndian.INT_SIZE;
+    ensureCapacity(addition);
+    LittleEndian.putShort(_buf, _offset, opcode);
+    _offset += LittleEndian.SHORT_SIZE;
+    LittleEndian.putInt(_buf, _offset, operand);
+    _offset += LittleEndian.INT_SIZE;
+  }
+  public void addSprm(short opcode, byte[] operand)
+  {
+    int addition = LittleEndian.SHORT_SIZE + LittleEndian.BYTE_SIZE + operand.length;
+    ensureCapacity(addition);
+    LittleEndian.putShort(_buf, _offset, opcode);
+    _offset += LittleEndian.SHORT_SIZE;
+    _buf[_offset++] = (byte)operand.length;
+    System.arraycopy(operand, 0, _buf, _offset, operand.length);
+  }
+
+  public byte[] toByteArray()
+  {
+    return _buf;
+  }
+
+  private void ensureCapacity(int addition)
+  {
+    if (_offset + addition >= _buf.length)
+    {
+      // add 6 more than they need for use the next iteration
+      byte[] newBuf = new byte[_offset + addition + 6];
+      System.arraycopy(_buf, 0, newBuf, 0, _buf.length);
+    }
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmIterator.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmIterator.java
new file mode 100644 (file)
index 0000000..83bac99
--- /dev/null
@@ -0,0 +1,88 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+/**
+ * This class is used to iterate through a list of sprms from a Word 97/2000/XP
+ * document.
+ * @author Ryan Ackley
+ * @version 1.0
+ */
+
+public class SprmIterator
+{
+  private byte[] _grpprl;
+  int _offset;
+
+  public SprmIterator(byte[] grpprl, int offset)
+  {
+    _grpprl = grpprl;
+    _offset = offset;
+  }
+
+  public boolean hasNext()
+  {
+    return _offset < _grpprl.length;
+  }
+
+  public SprmOperation next()
+  {
+    SprmOperation op = new SprmOperation(_grpprl, _offset);
+    _offset += op.size();
+    return op;
+  }
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java
new file mode 100644 (file)
index 0000000..1de7adc
--- /dev/null
@@ -0,0 +1,164 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.LittleEndian;
+
+/**
+ * This class is used to represent a sprm operation from a Word 97/2000/XP
+ * document.
+ * @author Ryan Ackley
+ * @version 1.0
+ */
+public class SprmOperation
+{
+  final static private BitField OP_BITFIELD = new BitField(0x1ff);
+  final static private BitField SPECIAL_BITFIELD = new BitField(0x200);
+  final static private BitField TYPE_BITFIELD = new BitField(0x1c00);
+  final static private BitField SIZECODE_BITFIELD = new BitField(0xe000);
+
+  private int _type;
+  private int _operation;
+  private int _gOffset;
+  private byte[] _grpprl;
+  private int _sizeCode;
+
+  public SprmOperation(byte[] grpprl, int offset)
+  {
+    _grpprl = grpprl;
+
+    short sprmStart = LittleEndian.getShort(grpprl, offset);
+
+    _gOffset = offset + 2;
+
+    _operation = OP_BITFIELD.getValue(sprmStart);
+    _type = TYPE_BITFIELD.getValue(sprmStart);
+    _sizeCode = SIZECODE_BITFIELD.getValue(sprmStart);
+  }
+
+  public int getType()
+  {
+    return _type;
+  }
+
+  public int getOperation()
+  {
+    return _operation;
+  }
+
+  public int getGrpprlOffset()
+  {
+    return _gOffset;
+  }
+  public int getOperand()
+  {
+    switch (_sizeCode)
+    {
+      case 0:
+      case 1:
+        return _grpprl[_gOffset];
+      case 2:
+      case 4:
+      case 5:
+        return LittleEndian.getShort(_grpprl, _gOffset);
+      case 3:
+        return LittleEndian.getInt(_grpprl, _gOffset);
+      case 6:
+        throw new UnsupportedOperationException("This SPRM contains a variable length operand");
+      case 7:
+        byte threeByteInt[] = new byte[4];
+        threeByteInt[0] = _grpprl[_gOffset];
+        threeByteInt[1] = _grpprl[_gOffset + 1];
+        threeByteInt[2] = _grpprl[_gOffset + 2];
+        threeByteInt[3] = (byte)0;
+        return LittleEndian.getInt(threeByteInt, 0);
+      default:
+        throw new IllegalArgumentException("SPRM contains an invalid size code");
+    }
+  }
+  public int getSizeCode()
+  {
+    return _sizeCode;
+  }
+
+  public int size()
+  {
+    switch (_sizeCode)
+    {
+      case 0:
+      case 1:
+        return 3;
+      case 2:
+      case 4:
+      case 5:
+        return 4;
+      case 3:
+        return 6;
+      case 6:
+        return _grpprl[_gOffset] + 3;
+      case 7:
+        return 5;
+      default:
+        throw new IllegalArgumentException("SPRM contains an invalid size code");
+    }
+
+  }
+
+  public byte[] getGrpprl()
+  {
+    return _grpprl;
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmUncompressor.java
new file mode 100644 (file)
index 0000000..4a539c2
--- /dev/null
@@ -0,0 +1,86 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+
+
+public class SprmUncompressor
+{
+  public SprmUncompressor()
+  {
+  }
+
+  /**
+   * Converts an int into a boolean. If the int is non-zero, it returns true.
+   * Otherwise it returns false.
+   *
+   * @param x The int to convert.
+   *
+   * @return A boolean whose value depends on x.
+   */
+  public static boolean getFlag (int x)
+  {
+    if (x != 0)
+    {
+      return true;
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmCompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmCompressor.java
new file mode 100644 (file)
index 0000000..151fdee
--- /dev/null
@@ -0,0 +1,147 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.hwpf.usermodel.TableProperties;
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
+import org.apache.poi.hwpf.usermodel.ShadingDescriptor;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class TableSprmCompressor
+{
+  public TableSprmCompressor()
+  {
+  }
+  public static byte[] compressTableProperty(TableProperties newTAP)
+  {
+    int size = 0;
+    ArrayList sprmList = new ArrayList();
+
+    if (newTAP.getJc() != 0)
+    {
+      size += SprmUtils.addSprm((short)0x5400, newTAP.getJc(), null, sprmList);
+    }
+    if (newTAP.getFCantSplit())
+    {
+      size += SprmUtils.addSprm((short)0x3403, 1, null, sprmList);
+    }
+    if (newTAP.getFTableHeader())
+    {
+      size += SprmUtils.addSprm((short)0x3404, 1, null, sprmList);
+    }
+    byte[] brcBuf = new byte[6 * BorderCode.SIZE];
+    int offset = 0;
+    newTAP.getBrcTop().serialize(brcBuf, offset);
+    offset += BorderCode.SIZE;
+    newTAP.getBrcLeft().serialize(brcBuf, offset);
+    offset += BorderCode.SIZE;
+    newTAP.getBrcBottom().serialize(brcBuf, offset);
+    offset += BorderCode.SIZE;
+    newTAP.getBrcRight().serialize(brcBuf, offset);
+    offset += BorderCode.SIZE;
+    newTAP.getBrcHorizontal().serialize(brcBuf, offset);
+    offset += BorderCode.SIZE;
+    newTAP.getBrcVertical().serialize(brcBuf, offset);
+    byte[] compare = new byte[6 * BorderCode.SIZE];
+    if (!Arrays.equals(brcBuf, compare))
+    {
+      size += SprmUtils.addSprm((short)0xD605, 0, brcBuf, sprmList);
+    }
+    if (newTAP.getDyaRowHeight() != 0)
+    {
+      size += SprmUtils.addSprm((short)0x9407, newTAP.getDyaRowHeight(), null, sprmList);
+    }
+    if (newTAP.getItcMac() > 0)
+    {
+      int itcMac = newTAP.getItcMac();
+      byte[] buf = new byte[1 + (LittleEndian.SHORT_SIZE*(itcMac + 1)) + (TableCellDescriptor.SIZE*itcMac)];
+      buf[0] = (byte)itcMac;
+
+      short[] dxaCenters = newTAP.getRgdxaCenter();
+      for (int x = 0; x < dxaCenters.length; x++)
+      {
+        LittleEndian.putShort(buf, 1 + (x * LittleEndian.SHORT_SIZE),
+                              dxaCenters[x]);
+      }
+
+      TableCellDescriptor[] cellDescriptors = newTAP.getRgtc();
+      for (int x = 0; x < cellDescriptors.length; x++)
+      {
+        cellDescriptors[x].serialize(buf,
+          1+((itcMac+1)*LittleEndian.SHORT_SIZE)+(x*TableCellDescriptor.SIZE));
+      }
+      size += SprmUtils.addSprm((short)0xD608, 0, buf, sprmList);
+
+      buf = new byte[(itcMac * ShadingDescriptor.SIZE) + 1];
+      buf[0] = (byte)itcMac;
+      ShadingDescriptor[] shds = newTAP.getRgshd();
+      for (int x = 0; x < itcMac; x++)
+      {
+        shds[x].serialize(buf, 1 + (x * ShadingDescriptor.SIZE));
+      }
+      size += SprmUtils.addSprm((short)0xD608, 0, buf, sprmList);
+    }
+    if (newTAP.getTlp() != 0)
+    {
+      size += SprmUtils.addSprm((short)0x740a, newTAP.getTlp(), null, sprmList);
+    }
+
+    return SprmUtils.getGrpprl(sprmList, size);
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java
new file mode 100644 (file)
index 0000000..09b4719
--- /dev/null
@@ -0,0 +1,285 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.sprm;
+
+import org.apache.poi.hwpf.usermodel.TableProperties;
+import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
+import org.apache.poi.hwpf.usermodel.BorderCode;
+
+import org.apache.poi.util.LittleEndian;
+
+public class TableSprmUncompressor
+  extends SprmUncompressor
+{
+  public TableSprmUncompressor()
+  {
+  }
+
+  public static TableProperties uncompressTAP(TableProperties parent,
+                                                  byte[] grpprl,
+                                                  int offset)
+  {
+    TableProperties newProperties = null;
+    try
+    {
+      newProperties = (TableProperties) parent.clone();
+    }
+    catch (CloneNotSupportedException cnse)
+    {
+      throw new RuntimeException("There is no way this exception should happen!!");
+    }
+    SprmIterator sprmIt = new SprmIterator(grpprl, offset);
+
+    while (sprmIt.hasNext())
+    {
+      SprmOperation sprm = (SprmOperation)sprmIt.next();
+      unCompressTAPOperation(newProperties, sprm);
+    }
+
+    return newProperties;
+  }
+
+  /**
+   * Used to uncompress a table property. Performs an operation defined
+   * by a sprm stored in a tapx.
+   *
+   * @param newTAP The TableProperties object to perform the operation on.
+   * @param operand The operand that defines this operation.
+   * @param param The parameter for this operation.
+   * @param varParam Variable length parameter for this operation.
+   */
+  static void unCompressTAPOperation (TableProperties newTAP, SprmOperation sprm)
+  {
+    switch (sprm.getOperation())
+    {
+      case 0:
+        newTAP.setJc ((short) sprm.getOperand());
+        break;
+      case 0x01:
+      {
+        short[] rgdxaCenter = newTAP.getRgdxaCenter ();
+        short itcMac = newTAP.getItcMac ();
+        int adjust = sprm.getOperand() - (rgdxaCenter[0] + newTAP.getDxaGapHalf ());
+        for (int x = 0; x < itcMac; x++)
+        {
+          rgdxaCenter[x] += adjust;
+        }
+        break;
+      }
+      case 0x02:
+      {
+        short[] rgdxaCenter = newTAP.getRgdxaCenter ();
+        if (rgdxaCenter != null)
+        {
+          int adjust = newTAP.getDxaGapHalf () - sprm.getOperand();
+          rgdxaCenter[0] += adjust;
+        }
+        newTAP.setDxaGapHalf (sprm.getOperand());
+        break;
+      }
+      case 0x03:
+        newTAP.setFCantSplit (getFlag(sprm.getOperand()));
+        break;
+      case 0x04:
+        newTAP.setFTableHeader (getFlag (sprm.getOperand()));
+        break;
+      case 0x05:
+      {
+        byte[] buf = sprm.getGrpprl();
+        int offset = sprm.getGrpprlOffset();
+        newTAP.setBrcTop(new BorderCode(buf, offset));
+        offset += BorderCode.SIZE;
+        newTAP.setBrcLeft(new BorderCode(buf, offset));
+        offset += BorderCode.SIZE;
+        newTAP.setBrcBottom(new BorderCode(buf, offset));
+        offset += BorderCode.SIZE;
+        newTAP.setBrcRight(new BorderCode(buf, offset));
+        offset += BorderCode.SIZE;
+        newTAP.setBrcHorizontal(new BorderCode(buf, offset));
+        offset += BorderCode.SIZE;
+        newTAP.setBrcVertical(new BorderCode(buf, offset));
+        break;
+      }
+      case 0x06:
+
+        //obsolete, used in word 1.x
+        break;
+      case 0x07:
+        newTAP.setDyaRowHeight (sprm.getOperand());
+        break;
+      case 0x08:
+      {
+        byte[] grpprl = sprm.getGrpprl();
+        int offset = sprm.getGrpprlOffset();
+        short itcMac = grpprl[offset];
+        short[] rgdxaCenter = new short[itcMac + 1];
+        TableCellDescriptor[] rgtc = new TableCellDescriptor[itcMac];
+        //I use varParam[0] and newTAP._itcMac interchangably
+        newTAP.setItcMac (itcMac);
+        newTAP.setRgdxaCenter (rgdxaCenter);
+        newTAP.setRgtc (rgtc);
+
+        for (int x = 0; x < itcMac; x++)
+        {
+          rgdxaCenter[x] = LittleEndian.getShort (grpprl, offset + (1 + (x * 2)));
+          rgtc[x] = TableCellDescriptor.convertBytesToTC (grpprl,
+            offset + (1 + ((itcMac + 1) * 2) + (x * 20)));
+        }
+        rgdxaCenter[itcMac] = LittleEndian.getShort (grpprl, offset + (1 + (itcMac * 2)));
+        break;
+      }
+      case 0x09:
+
+        /** @todo handle cell shading*/
+        break;
+      case 0x0a:
+
+        /** @todo handle word defined table styles*/
+        break;
+      case 0x20:
+//      {
+//        TableCellDescriptor[] rgtc = newTAP.getRgtc();
+//
+//        for (int x = varParam[0]; x < varParam[1]; x++)
+//        {
+//
+//          if ((varParam[2] & 0x08) > 0)
+//          {
+//            short[] brcRight = rgtc[x].getBrcRight ();
+//            brcRight[0] = LittleEndian.getShort (varParam, 6);
+//            brcRight[1] = LittleEndian.getShort (varParam, 8);
+//          }
+//          else if ((varParam[2] & 0x04) > 0)
+//          {
+//            short[] brcBottom = rgtc[x].getBrcBottom ();
+//            brcBottom[0] = LittleEndian.getShort (varParam, 6);
+//            brcBottom[1] = LittleEndian.getShort (varParam, 8);
+//          }
+//          else if ((varParam[2] & 0x02) > 0)
+//          {
+//            short[] brcLeft = rgtc[x].getBrcLeft ();
+//            brcLeft[0] = LittleEndian.getShort (varParam, 6);
+//            brcLeft[1] = LittleEndian.getShort (varParam, 8);
+//          }
+//          else if ((varParam[2] & 0x01) > 0)
+//          {
+//            short[] brcTop = rgtc[x].getBrcTop ();
+//            brcTop[0] = LittleEndian.getShort (varParam, 6);
+//            brcTop[1] = LittleEndian.getShort (varParam, 8);
+//          }
+//        }
+//        break;
+//      }
+        break;
+      case 0x21:
+      {
+        int param = sprm.getOperand();
+        int index = (param & 0xff000000) >> 24;
+        int count = (param & 0x00ff0000) >> 16;
+        int width = (param & 0x0000ffff);
+        int itcMac = newTAP.getItcMac();
+
+        short[] rgdxaCenter = new short[itcMac + count + 1];
+        TableCellDescriptor[] rgtc = new TableCellDescriptor[itcMac + count];
+        if (index >= itcMac)
+        {
+          index = itcMac;
+          System.arraycopy(newTAP.getRgdxaCenter(), 0, rgdxaCenter, 0,
+                           itcMac + 1);
+          System.arraycopy(newTAP.getRgtc(), 0, rgtc, 0, itcMac);
+        }
+        else
+        {
+          //copy rgdxaCenter
+          System.arraycopy(newTAP.getRgdxaCenter(), 0, rgdxaCenter, 0,
+                           index + 1);
+          System.arraycopy(newTAP.getRgdxaCenter(), index + 1, rgdxaCenter,
+                           index + count, itcMac - (index));
+          //copy rgtc
+          System.arraycopy(newTAP.getRgtc(), 0, rgtc, 0, index);
+          System.arraycopy(newTAP.getRgtc(), index, rgtc, index + count,
+                           itcMac - index);
+        }
+
+        for (int x = index; x < index + count; x++)
+        {
+          rgtc[x] = new TableCellDescriptor();
+          rgdxaCenter[x] = (short)(rgdxaCenter[x - 1] + width);
+        }
+        rgdxaCenter[index +
+          count] = (short)(rgdxaCenter[(index + count) - 1] + width);
+        break;
+      }
+      /**@todo handle table sprms from complex files*/
+      case 0x22:
+      case 0x23:
+      case 0x24:
+      case 0x25:
+      case 0x26:
+      case 0x27:
+      case 0x28:
+      case 0x29:
+      case 0x2a:
+      case 0x2b:
+      case 0x2c:
+        break;
+      default:
+        break;
+    }
+  }
+
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/BorderCode.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/BorderCode.java
new file mode 100644 (file)
index 0000000..386d78e
--- /dev/null
@@ -0,0 +1,99 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.LittleEndian;
+
+public class BorderCode
+  implements Cloneable
+{
+  public static final int SIZE = 4;
+  private short _info;
+    private final static BitField _dptLineWidth = new BitField(0xff);
+    private final static BitField _brcType = new BitField(0xff00);
+  private short _info2;
+    private final static BitField _ico = new BitField(0xff);
+    private final static BitField _dptDpace = new BitField(0x1f00);
+    private final static BitField _fShadow = new BitField(0x2000);
+    private final static BitField _fFrame = new BitField(0x4000);
+
+  public BorderCode()
+  {
+  }
+
+  public BorderCode(byte[] buf, int offset)
+  {
+    _info = LittleEndian.getShort(buf, offset);
+    _info2 = LittleEndian.getShort(buf, offset + LittleEndian.SHORT_SIZE);
+  }
+
+  public void serialize(byte[] buf, int offset)
+  {
+    LittleEndian.putShort(buf, offset, _info);
+    LittleEndian.putShort(buf, offset + LittleEndian.SHORT_SIZE, _info2);
+  }
+
+  public boolean isEmpty()
+  {
+    return _info == 0 && _info2 == 0;
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    return super.clone();
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRange.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRange.java
new file mode 100644 (file)
index 0000000..6e8c943
--- /dev/null
@@ -0,0 +1,73 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.*;
+
+import java.util.List;
+
+public class CharacterRange extends Range
+{
+  public CharacterRange(int start, int end, HWPFDocument doc)
+  {
+    super(start, end, doc);
+  }
+  public CharacterRange(int start, int end, Range parent)
+  {
+    super(start, end, parent);
+  }
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/DateAndTime.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/DateAndTime.java
new file mode 100644 (file)
index 0000000..ccb2d35
--- /dev/null
@@ -0,0 +1,94 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.LittleEndian;
+
+public class DateAndTime
+  implements Cloneable
+{
+  public static final int SIZE = 4;
+  private short _info;
+    private static final BitField _minutes = new BitField(0x3f);
+    private static final BitField _hours = new BitField(0x7c0);
+    private static final BitField _dom = new BitField(0xf800);
+  private short _info2;
+    private static final BitField _months = new BitField(0xf);
+    private static final BitField _years = new BitField(0x1ff0);
+    private static final BitField _weekday = new BitField(0xe000);
+
+  public DateAndTime()
+  {
+  }
+
+  public DateAndTime(byte[] buf, int offset)
+  {
+    _info = LittleEndian.getShort(buf, offset);
+    _info2 = LittleEndian.getShort(buf, offset + LittleEndian.SHORT_SIZE);
+  }
+
+  public void serialize(byte[] buf, int offset)
+  {
+    LittleEndian.putShort(buf, offset, _info);
+    LittleEndian.putShort(buf, offset + LittleEndian.SHORT_SIZE, _info2);
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    return super.clone();
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/LineSpacingDescriptor.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/LineSpacingDescriptor.java
new file mode 100644 (file)
index 0000000..d660a6f
--- /dev/null
@@ -0,0 +1,90 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.util.LittleEndian;
+
+public class LineSpacingDescriptor
+  implements Cloneable
+{
+  short _dyaLine;
+  short _fMultiLinespace;
+
+  public LineSpacingDescriptor()
+  {
+  }
+
+  public LineSpacingDescriptor(byte[] buf, int offset)
+  {
+    _dyaLine = LittleEndian.getShort(buf, offset);
+    _fMultiLinespace = LittleEndian.getShort(buf, offset + LittleEndian.SHORT_SIZE);
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    return super.clone();
+  }
+
+  public void setMultiLinespace(short fMultiLinespace)
+  {
+    _fMultiLinespace = fMultiLinespace;
+  }
+
+  public void setDyaLine(short dyaLine)
+  {
+    _dyaLine = dyaLine;
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphRange.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphRange.java
new file mode 100644 (file)
index 0000000..13258eb
--- /dev/null
@@ -0,0 +1,72 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.*;
+
+import java.util.List;
+
+public class ParagraphRange extends Range
+{
+  public ParagraphRange(int start, int end, HWPFDocument doc)
+  {
+    super(start, end, doc);
+  }
+  public ParagraphRange(int start, int end, Range parent)
+  {
+   super(start, end, parent);
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionProperties.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionProperties.java
new file mode 100644 (file)
index 0000000..803499d
--- /dev/null
@@ -0,0 +1,84 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.model.hdftypes.definitions.SEPAbstractType;
+
+public class SectionProperties
+  extends SEPAbstractType
+{
+  public SectionProperties()
+  {
+    field_20_brcTop = new BorderCode();
+    field_21_brcLeft = new BorderCode();
+    field_22_brcBottom = new BorderCode();
+    field_23_brcRight = new BorderCode();
+    field_26_dttmPropRMark = new DateAndTime();
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    SectionProperties copy = (SectionProperties)super.clone();
+    copy.field_20_brcTop = (BorderCode)field_20_brcTop.clone();
+    copy.field_21_brcLeft = (BorderCode)field_21_brcLeft.clone();
+    copy.field_22_brcBottom = (BorderCode)field_22_brcBottom.clone();
+    copy.field_23_brcRight = (BorderCode)field_23_brcRight.clone();
+    copy.field_26_dttmPropRMark = (DateAndTime)field_26_dttmPropRMark.clone();
+
+    return copy;
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionRange.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionRange.java
new file mode 100644 (file)
index 0000000..32106ec
--- /dev/null
@@ -0,0 +1,72 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.*;
+
+import java.util.List;
+
+public class SectionRange extends Range
+{
+  public SectionRange(int start, int end, HWPFDocument doc)
+  {
+    super(start, end, doc);
+  }
+  public SectionRange(int start, int end, Range parent)
+  {
+   super(start, end, parent);
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ShadingDescriptor.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ShadingDescriptor.java
new file mode 100644 (file)
index 0000000..3c79ce5
--- /dev/null
@@ -0,0 +1,94 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.LittleEndian;
+
+public class ShadingDescriptor
+  implements Cloneable
+{
+  public static final int SIZE = 2;
+
+  private short _info;
+    private final static BitField _icoFore = new BitField(0x1f);
+    private final static BitField _icoBack = new BitField(0x3e0);
+    private final static BitField _ipat = new BitField(0xfc00);
+
+  public ShadingDescriptor()
+  {
+  }
+
+  public ShadingDescriptor(byte[] buf, int offset)
+  {
+    _info = LittleEndian.getShort(buf, offset);
+  }
+
+  public short toShort()
+  {
+    return _info;
+  }
+
+  public void serialize(byte[] buf, int offset)
+  {
+    LittleEndian.putShort(buf, offset, _info);
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    return super.clone();
+  }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableCellDescriptor.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableCellDescriptor.java
new file mode 100644 (file)
index 0000000..4fc2cad
--- /dev/null
@@ -0,0 +1,86 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.model.hdftypes.definitions.TCAbstractType;
+
+public class TableCellDescriptor
+  extends TCAbstractType
+{
+  public static final int SIZE = 20;
+
+  public TableCellDescriptor()
+  {
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    TableCellDescriptor tc = (TableCellDescriptor)super.clone();
+    tc.field_3_brcTop = (BorderCode)field_3_brcTop.clone();
+    tc.field_4_brcLeft = (BorderCode)field_4_brcLeft.clone();
+    tc.field_5_brcBottom = (BorderCode)field_5_brcBottom.clone();
+    tc.field_6_brcRight = (BorderCode)field_6_brcRight.clone();
+    return tc;
+  }
+
+  public static TableCellDescriptor convertBytesToTC(byte[] buf, int offset)
+  {
+    TableCellDescriptor tc = new TableCellDescriptor();
+    tc.fillFields(buf, offset);
+    return tc;
+  }
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableProperties.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableProperties.java
new file mode 100644 (file)
index 0000000..1622051
--- /dev/null
@@ -0,0 +1,91 @@
+/* ====================================================================
+ * 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/>.
+ */
+
+package org.apache.poi.hwpf.usermodel;
+
+import org.apache.poi.hwpf.model.hdftypes.definitions.TAPAbstractType;
+
+public class TableProperties
+  extends TAPAbstractType
+    implements Cloneable
+{
+  public TableProperties()
+  {
+  }
+
+  public Object clone()
+    throws CloneNotSupportedException
+  {
+    TableProperties tap = (TableProperties)super.clone();
+    tap.field_10_rgshd = new ShadingDescriptor[field_10_rgshd.length];
+    for (int x = 0; x < field_10_rgshd.length; x++)
+    {
+      tap.field_10_rgshd[x] = (ShadingDescriptor)field_10_rgshd[x].clone();
+    }
+    tap.field_11_brcBottom = (BorderCode)field_11_brcBottom.clone();
+    tap.field_12_brcTop = (BorderCode)field_12_brcTop.clone();
+    tap.field_13_brcLeft = (BorderCode)field_13_brcLeft.clone();
+    tap.field_14_brcRight = (BorderCode)field_14_brcRight.clone();
+    tap.field_15_brcVertical = (BorderCode)field_15_brcVertical.clone();
+    tap.field_16_brcHorizontal = (BorderCode)field_16_brcHorizontal.clone();
+    tap.field_8_rgdxaCenter = (short[])field_8_rgdxaCenter.clone();
+    tap.field_9_rgtc = new TableCellDescriptor[field_9_rgtc.length];
+    for (int x = 0; x < field_9_rgtc.length; x++)
+    {
+      tap.field_9_rgtc[x] = (TableCellDescriptor)field_9_rgtc[x].clone();
+    }
+    return tap;
+  }
+
+}