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 index 0000000000..1854893b39 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/Range.java @@ -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 + * . + */ + +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 index 0000000000..9066f71dd5 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverride.java @@ -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 + * . + */ + +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 index 0000000000..da1e056edb --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListFormatOverrideLevel.java @@ -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 + * . + */ + +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 index 0000000000..9b2f822ebc --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListLevel.java @@ -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 + * . + */ + +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 index 0000000000..90529cbed1 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/ListTables.java @@ -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 + * . + */ + +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 index 0000000000..57f5f0277f --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/UPX.java @@ -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 + * . + */ + +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 index 0000000000..05c3a724c3 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/CharacterSprmUncompressor.java @@ -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 + * . + */ + +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 index 0000000000..a2a8e2d621 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java @@ -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 + * . + */ + +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 index 0000000000..55457c7700 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmCompressor.java @@ -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 + * . + */ + +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 index 0000000000..0ffc0e8435 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SectionSprmUncompressor.java @@ -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 + * . + */ + +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 index 0000000000..94786020d0 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmBuffer.java @@ -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 + * . + */ + +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 index 0000000000..83bac99e01 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmIterator.java @@ -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 + * . + */ + +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 index 0000000000..1de7adcf0e --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmOperation.java @@ -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 + * . + */ + +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 index 0000000000..4a539c2103 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmUncompressor.java @@ -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 + * . + */ + +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 index 0000000000..151fdeeb91 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmCompressor.java @@ -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 + * . + */ + +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 index 0000000000..09b47199cb --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java @@ -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 + * . + */ + +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 index 0000000000..386d78e0ab --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/BorderCode.java @@ -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 + * . + */ + +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 index 0000000000..6e8c9434e6 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRange.java @@ -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 + * . + */ + +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 index 0000000000..ccb2d3530a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/DateAndTime.java @@ -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 + * . + */ + +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 index 0000000000..d660a6f41d --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/LineSpacingDescriptor.java @@ -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 + * . + */ + +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 index 0000000000..13258ebb30 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphRange.java @@ -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 + * . + */ + +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 index 0000000000..803499d650 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionProperties.java @@ -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 + * . + */ + +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 index 0000000000..32106ec60e --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionRange.java @@ -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 + * . + */ + +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 index 0000000000..3c79ce565c --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ShadingDescriptor.java @@ -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 + * . + */ + +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 index 0000000000..4fc2cad431 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableCellDescriptor.java @@ -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 + * . + */ + +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 index 0000000000..1622051142 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableProperties.java @@ -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 + * . + */ + +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; + } + +}