diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java index 26c46a524..116b8905e 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java @@ -53,9 +53,6 @@ */ package org.apache.poi.hdf.model.hdftypes; -import java.util.List; -import java.util.ArrayList; - import org.apache.poi.util.LittleEndian; /** @@ -76,15 +73,7 @@ import org.apache.poi.util.LittleEndian; */ public class CHPFormattedDiskPage extends FormattedDiskPage { - private static final int FC_SIZE = 4; - private ArrayList _chpxList = new ArrayList(); - private ArrayList _overFlow; - - - public CHPFormattedDiskPage() - { - } /** * This constructs a CHPFormattedDiskPage from a raw fkp (512 byte array @@ -92,29 +81,9 @@ public class CHPFormattedDiskPage extends FormattedDiskPage * * @param fkp The 512 byte array to read data from */ - public CHPFormattedDiskPage(byte[] documentStream, int offset, int fcMin) + public CHPFormattedDiskPage(byte[] fkp) { - super(documentStream, offset); - - for (int x = 0; x < _crun; x++) - { - _chpxList.add(new CHPX(getStart(x) - fcMin, getEnd(x) - fcMin, getGrpprl(x))); - } - } - - public CHPX getCHPX(int index) - { - return (CHPX)_chpxList.get(index); - } - - public void fill(List filler) - { - _chpxList.addAll(filler); - } - - public ArrayList getOverflow() - { - return _overFlow; + super(fkp); } /** @@ -123,87 +92,22 @@ public class CHPFormattedDiskPage extends FormattedDiskPage * @param index The index of the chpx to get. * @return a chpx grpprl. */ - protected byte[] getGrpprl(int index) + public byte[] getGrpprl(int index) { - int chpxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * 4) + index)); + int chpxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + index); //optimization if offset == 0 use "Normal" style if(chpxOffset == 0) { return new byte[0]; + } - int size = LittleEndian.getUnsignedByte(_fkp, _offset + chpxOffset); + int size = LittleEndian.getUnsignedByte(_fkp, chpxOffset); byte[] chpx = new byte[size]; - System.arraycopy(_fkp, _offset + ++chpxOffset, chpx, 0, size); + System.arraycopy(_fkp, ++chpxOffset, chpx, 0, size); return chpx; } - - protected byte[] toByteArray(int fcMin) - { - byte[] buf = new byte[512]; - int size = _chpxList.size(); - int grpprlOffset = 0; - int offsetOffset = 0; - int fcOffset = 0; - - // total size is currently the size of one FC - int totalSize = FC_SIZE; - - int index = 0; - for (; index < size; index++) - { - int grpprlLength = ((CHPX)_chpxList.get(index)).getGrpprl().length; - - // check to see if we have enough room for an FC, a byte, and the grpprl. - totalSize += (FC_SIZE + 1 + grpprlLength); - // if size is uneven we will have to add one so the first grpprl falls - // on a word boundary - if (totalSize > 511 + (index % 2)) - { - totalSize -= (FC_SIZE + 1 + grpprlLength); - break; - } - - // grpprls must fall on word boundaries - if (grpprlLength % 2 > 0) - { - totalSize += 1; - } - } - - // see if we couldn't fit some - if (index != size) - { - _overFlow = new ArrayList(); - _overFlow.addAll(index, _chpxList); - } - - // index should equal number of CHPXs that will be in this fkp now. - buf[511] = (byte)index; - - offsetOffset = (FC_SIZE * index) + FC_SIZE; - grpprlOffset = offsetOffset + index + (grpprlOffset % 2); - - CHPX chpx = null; - for (int x = 0; x < index; x++) - { - chpx = (CHPX)_chpxList.get(x); - byte[] grpprl = chpx.getGrpprl(); - - LittleEndian.putInt(buf, fcOffset, chpx.getStart() + fcMin); - buf[offsetOffset] = (byte)(grpprlOffset/2); - System.arraycopy(grpprl, 0, buf, grpprlOffset, grpprl.length); - - grpprlOffset += grpprl.length + (grpprl.length % 2); - offsetOffset += 1; - fcOffset += FC_SIZE; - } - // put the last chpx's end in - LittleEndian.putInt(buf, fcOffset, chpx.getEnd() + fcMin); - return buf; - } - } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/DocumentProperties.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/DocumentProperties.java index c00e027c4..559f67ea3 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/DocumentProperties.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/DocumentProperties.java @@ -1,5 +1,3 @@ - - /* ==================================================================== * The Apache Software License, Version 1.1 * @@ -58,20 +56,35 @@ package org.apache.poi.hdf.model.hdftypes; import org.apache.poi.util.LittleEndian; -import org.apache.poi.hwpf.model.hdftypes.definitions.DOPAbstractType; - /** * Comment me * * @author Ryan Ackley */ -public class DocumentProperties extends DOPAbstractType +public class DocumentProperties implements HDFType { + public boolean _fFacingPages; + public int _fpc; + public int _epc; + public int _rncFtn; + public int _nFtn; + public int _rncEdn; + public int _nEdn; - public DocumentProperties(byte[] tableStream, int offset) + public DocumentProperties(byte[] dopArray) { - super.fillFields(tableStream, (short)0, offset); + _fFacingPages = (dopArray[0] & 0x1) > 0; + _fpc = (dopArray[0] & 0x60) >> 5; + + short num = LittleEndian.getShort(dopArray, 2); + _rncFtn = (num & 0x3); + _nFtn = (short)(num & 0xfffc) >> 2; + num = LittleEndian.getShort(dopArray, 52); + _rncEdn = num & 0x3; + _nEdn = (short)(num & 0xfffc) >> 2; + num = LittleEndian.getShort(dopArray, 54); + _epc = num & 0x3; } } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FileInformationBlock.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FileInformationBlock.java index 368047b9d..371e9ce10 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FileInformationBlock.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FileInformationBlock.java @@ -1,65 +1,10 @@ -/* - * ==================================================================== - * 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.hdf.model.hdftypes; import org.apache.poi.util.BitField; import org.apache.poi.util.LittleEndian; -import org.apache.poi.hwpf.model.hdftypes.definitions.FIBAbstractType; +import org.apache.poi.hdf.model.hdftypes.definitions.FIBAbstractType; /** * @@ -359,3 +304,4 @@ public class FileInformationBlock extends FIBAbstractType } + diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FormattedDiskPage.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FormattedDiskPage.java index 9b39fbc65..cb7a15b57 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FormattedDiskPage.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/FormattedDiskPage.java @@ -80,40 +80,32 @@ public abstract class FormattedDiskPage { protected byte[] _fkp; protected int _crun; - protected int _offset; - - - public FormattedDiskPage() - { - - } /** * Uses a 512-byte array to create a FKP */ - public FormattedDiskPage(byte[] documentStream, int offset) + public FormattedDiskPage(byte[] fkp) { - _crun = LittleEndian.getUnsignedByte(documentStream, offset + 511); - _fkp = documentStream; - _offset = offset; + _crun = LittleEndian.getUnsignedByte(fkp, 511); + _fkp = fkp; } /** * Used to get a text offset corresponding to a grpprl in this fkp. * @param index The index of the property in this FKP * @return an int representing an offset in the "WordDocument" stream */ - protected int getStart(int index) + public int getStart(int index) { - return LittleEndian.getInt(_fkp, _offset + (index * 4)); + return LittleEndian.getInt(_fkp, (index * 4)); } /** * Used to get the end of the text corresponding to a grpprl in this fkp. * @param index The index of the property in this fkp. * @return an int representing an offset in the "WordDocument" stream */ - protected int getEnd(int index) + public int getEnd(int index) { - return LittleEndian.getInt(_fkp, _offset + ((index + 1) * 4)); + return LittleEndian.getInt(_fkp, ((index + 1) * 4)); } /** * Used to get the total number of grrprl's stored int this FKP @@ -124,5 +116,5 @@ public abstract class FormattedDiskPage return _crun; } - protected abstract byte[] getGrpprl(int index); + public abstract byte[] getGrpprl(int index); } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java index d53185155..51c5bf700 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java @@ -53,12 +53,8 @@ */ package org.apache.poi.hdf.model.hdftypes; -import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.LittleEndian; -import java.util.ArrayList; -import java.util.List; - /** * Represents a PAP FKP. The style properties for paragraph and character runs * are stored in fkps. There are PAP fkps for paragraph properties and CHP fkps @@ -78,62 +74,29 @@ import java.util.List; public class PAPFormattedDiskPage extends FormattedDiskPage { - private static final int BX_SIZE = 13; - private static final int FC_SIZE = 4; - - private ArrayList _papxList = new ArrayList(); - private ArrayList _overFlow; - - - public PAPFormattedDiskPage() - { - - } - /** * Creates a PAPFormattedDiskPage from a 512 byte array * * @param fkp a 512 byte array. */ - public PAPFormattedDiskPage(byte[] documentStream, int offset, int fcMin) + public PAPFormattedDiskPage(byte[] fkp) { - super(documentStream, offset); - - for (int x = 0; x < _crun; x++) - { - _papxList.add(new PAPX(getStart(x) - fcMin, getEnd(x) - fcMin, getGrpprl(x), getParagraphHeight(x))); - } - _fkp = null; - } - - public void fill(List filler) - { - _papxList.addAll(filler); - } - - public ArrayList getOverflow() - { - return _overFlow; - } - - public PAPX getPAPX(int index) - { - return (PAPX)_papxList.get(index); + super(fkp); } /** - * Gets the papx for the paragraph at index in this fkp. + * Gets the papx for the pagraph at index in this fkp. * * @param index The index of the papx to get. * @return a papx grpprl. */ - protected byte[] getGrpprl(int index) + public byte[] getGrpprl(int index) { - int papxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * FC_SIZE) + (index * BX_SIZE))); - int size = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + papxOffset); + int papxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + (index * 13)); + int size = 2 * LittleEndian.getUnsignedByte(_fkp, papxOffset); if(size == 0) { - size = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + ++papxOffset); + size = 2 * LittleEndian.getUnsignedByte(_fkp, ++papxOffset); } else { @@ -141,100 +104,7 @@ public class PAPFormattedDiskPage extends FormattedDiskPage } byte[] papx = new byte[size]; - System.arraycopy(_fkp, _offset + ++papxOffset, papx, 0, size); + System.arraycopy(_fkp, ++papxOffset, papx, 0, size); return papx; } - - protected byte[] toByteArray(int fcMin) - { - byte[] buf = new byte[512]; - int size = _papxList.size(); - int grpprlOffset = 0; - int bxOffset = 0; - int fcOffset = 0; - - // total size is currently the size of one FC - int totalSize = FC_SIZE; - - int index = 0; - for (; index < size; index++) - { - int grpprlLength = ((PAPX)_papxList.get(index)).getGrpprl().length; - - // check to see if we have enough room for an FC, a BX, and the grpprl - // and the 1 byte size of the grpprl. - totalSize += (FC_SIZE + BX_SIZE + grpprlLength + 1); - // if size is uneven we will have to add one so the first grpprl falls - // on a word boundary - if (totalSize > 511 + (index % 2)) - { - totalSize -= (FC_SIZE + BX_SIZE + grpprlLength); - break; - } - - // grpprls must fall on word boundaries - if (grpprlLength % 2 > 0) - { - totalSize += 1; - } - else - { - totalSize += 2; - } - } - - // see if we couldn't fit some - if (index != size) - { - _overFlow = new ArrayList(); - _overFlow.addAll(index, _papxList); - } - - // index should equal number of papxs that will be in this fkp now. - buf[511] = (byte)index; - - bxOffset = (FC_SIZE * index) + FC_SIZE; - grpprlOffset = bxOffset + (BX_SIZE * index) + (grpprlOffset % 2); - - PAPX papx = null; - for (int x = 0; x < index; x++) - { - papx = (PAPX)_papxList.get(x); - byte[] phe = papx.getParagraphHeight().toByteArray(); - byte[] grpprl = papx.getGrpprl(); - - LittleEndian.putInt(buf, fcOffset, papx.getStart() + fcMin); - buf[bxOffset] = (byte)(grpprlOffset/2); - System.arraycopy(phe, 0, buf, bxOffset + 1, phe.length); - - // refer to the section on PAPX in the spec. Places a size on the front - // of the PAPX. Has to do with how the grpprl stays on word - // boundaries. - if ((grpprl.length % 2) > 0) - { - buf[grpprlOffset++] = (byte)((grpprl.length + 1)/2); - } - else - { - buf[++grpprlOffset] = (byte)((grpprl.length)/2); - grpprlOffset++; - } - System.arraycopy(grpprl, 0, buf, grpprlOffset, grpprl.length); - - bxOffset += BX_SIZE; - fcOffset += FC_SIZE; - } - // put the last papx's end in - LittleEndian.putInt(buf, fcOffset, papx.getEnd() + fcMin); - return buf; - } - - private ParagraphHeight getParagraphHeight(int index) - { - int pheOffset = 1 + (2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * 4) + (index * 13)))); - - ParagraphHeight phe = new ParagraphHeight(_fkp, pheOffset); - - return phe; - } } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java index 65e6dcd26..5ab5f1f18 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java @@ -53,127 +53,60 @@ */ package org.apache.poi.hdf.model.hdftypes; -import java.util.ArrayList; - -import org.apache.poi.util.LittleEndian; - - /** * common data structure in a Word file. Contains an array of 4 byte ints in * the front that relate to an array of abitrary data structures in the back. * + * This class acts more like a pointer. In the sense that it doesn't store any + * data. It only provides convenience methods for accessing a particular + * PlexOfCps * * @author Ryan Ackley */ public class PlexOfCps { - private int _count; - private int _offset; - private int _sizeOfStruct; - private ArrayList _props; + private int _count; + private int _offset; + private int _sizeOfStruct; - public PlexOfCps(int sizeOfStruct) - { - _props = new ArrayList(); - _sizeOfStruct = sizeOfStruct; - } - - /** - * Constructor - * - * @param size The size in bytes of this PlexOfCps - * @param sizeOfStruct The size of the data structure type stored in - * this PlexOfCps. - */ - public PlexOfCps(byte[] buf, int start, int size, int sizeOfStruct) - { - _count = (size - 4)/(4 + sizeOfStruct); - _sizeOfStruct = sizeOfStruct; - _props = new ArrayList(_count); - - for (int x = 0; x < _count; x++) + /** + * Constructor + * + * @param size The size in bytes of this PlexOfCps + * @param sizeOfStruct The size of the data structure type stored in + * this PlexOfCps. + */ + public PlexOfCps(int size, int sizeOfStruct) { - _props.add(getProperty(x, buf, start)); + _count = (size - 4)/(4 + sizeOfStruct); + _sizeOfStruct = sizeOfStruct; } - } - - public PropertyNode getProperty(int index) - { - return (PropertyNode)_props.get(index); - } - - public void addProperty(PropertyNode node) - { - _props.add(node); - } - - public byte[] toByteArray() - { - int size = _props.size(); - int cpBufSize = ((size + 1) * LittleEndian.INT_SIZE); - int structBufSize = + (_sizeOfStruct * size); - int bufSize = cpBufSize + structBufSize; - - byte[] buf = new byte[bufSize]; - - PropertyNode node = null; - for (int x = 0; x < size; x++) + public int getIntOffset(int index) { - node = (PropertyNode)_props.get(x); - - // put the starting offset of the property into the plcf. - LittleEndian.putInt(buf, (LittleEndian.INT_SIZE * x), node.getStart()); - - // put the struct into the plcf - System.arraycopy(node.getBuf(), 0, buf, cpBufSize + (x * _sizeOfStruct), - _sizeOfStruct); + return index * 4; + } + /** + * returns the number of data structures in this PlexOfCps. + * + * @return The number of data structures in this PlexOfCps + */ + public int length() + { + return _count; + } + /** + * Returns the offset, in bytes, from the beginning if this PlexOfCps to + * the data structure at index. + * + * @param index The index of the data structure. + * + * @return The offset, in bytes, from the beginning if this PlexOfCps to + * the data structure at index. + */ + public int getStructOffset(int index) + { + return (4 * (_count + 1)) + (_sizeOfStruct * index); } - // put the ending offset of the last property into the plcf. - LittleEndian.putInt(buf, LittleEndian.INT_SIZE * size, node.getEnd()); - - return buf; - - } - - private PropertyNode getProperty(int index, byte[] buf, int offset) - { - int start = LittleEndian.getInt(buf, offset + getIntOffset(index)); - int end = LittleEndian.getInt(buf, offset + getIntOffset(index+1)); - - byte[] struct = new byte[_sizeOfStruct]; - System.arraycopy(buf, offset + getStructOffset(index), struct, 0, _sizeOfStruct); - - return new PropertyNode(start, end, struct); - } - - private int getIntOffset(int index) - { - return index * 4; - } - - /** - * returns the number of data structures in this PlexOfCps. - * - * @return The number of data structures in this PlexOfCps - */ - public int length() - { - return _count; - } - - /** - * Returns the offset, in bytes, from the beginning if this PlexOfCps to - * the data structure at index. - * - * @param index The index of the data structure. - * - * @return The offset, in bytes, from the beginning if this PlexOfCps to - * the data structure at index. - */ - private int getStructOffset(int index) - { - return (4 * (_count + 1)) + (_sizeOfStruct * index); - } } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PropertyNode.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PropertyNode.java index 88a4c95d9..12657ccb4 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PropertyNode.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PropertyNode.java @@ -54,62 +54,61 @@ package org.apache.poi.hdf.model.hdftypes; - /** - * Represents a lightweight node in the Trees used to store content + * Represents a lightweight node in the Trees used to store formatting * properties. * * @author Ryan Ackley */ public class PropertyNode implements Comparable { - private byte[] _buf; - private int _cpStart; - private int _cpEnd; + private byte[] _grpprl; + private int _fcStart; + private int _fcEnd; /** * @param fcStart The start of the text for this property. * @param fcEnd The end of the text for this property. * @param grpprl The property description in compressed form. */ - public PropertyNode(int fcStart, int fcEnd, byte[] buf) + public PropertyNode(int fcStart, int fcEnd, byte[] grpprl) { - _cpStart = fcStart; - _cpEnd = fcEnd; - _buf = buf; + _fcStart = fcStart; + _fcEnd = fcEnd; + _grpprl = grpprl; } /** * @return The offset of this property's text. */ public int getStart() { - return _cpStart; + return _fcStart; } /** * @retrun The offset of the end of this property's text. */ public int getEnd() { - return _cpEnd; + return _fcEnd; } /** * @return This property's property in copmpressed form. */ - public byte[] getBuf() + protected byte[] getGrpprl() { - return _buf; + return _grpprl; } /** * Used for sorting in collections. */ public int compareTo(Object o) { - int cpEnd = ((PropertyNode)o).getEnd(); - if(_cpEnd == cpEnd) + int fcEnd = ((PropertyNode)o).getEnd(); + if(_fcEnd == fcEnd) { return 0; } - else if(_cpEnd < cpEnd) + else if(_fcEnd < fcEnd) { return -1; } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleDescription.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleDescription.java index 4719ac5ad..c99ec6e65 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleDescription.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleDescription.java @@ -1,4 +1,3 @@ - /* ==================================================================== * The Apache Software License, Version 1.1 * @@ -56,10 +55,7 @@ package org.apache.poi.hdf.model.hdftypes; -import java.io.UnsupportedEncodingException; - import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.BitField; /** * Comment me * @@ -72,44 +68,27 @@ public class StyleDescription implements HDFType private static int PARAGRAPH_STYLE = 1; private static int CHARACTER_STYLE = 2; - private short _infoShort; - private static BitField _sti = new BitField(0xfff); - private static BitField _fScratch = new BitField(0x1000); - private static BitField _fInvalHeight = new BitField(0x2000); - private static BitField _fHasUpe = new BitField(0x4000); - private static BitField _fMassCopy = new BitField(0x8000); - private short _infoShort2; - private static BitField _styleTypeCode = new BitField(0xf); - private static BitField _baseStyle = new BitField(0xfff0); - private static BitField _numUPX = new BitField(0xf); - private static BitField _nextStyle = new BitField(0xfff0); - private short _bchUpe; - private short _infoShort3; - private static BitField _fAutoRedef = new BitField(0x1); - private static BitField _fHidden = new BitField(0x2); - + int _baseStyleIndex; + int _styleTypeCode; + int _numUPX; byte[] _papx; byte[] _chpx; - String _name; -// ParagraphProperties _pap; -// CharacterProperties _chp; + ParagraphProperties _pap; + CharacterProperties _chp; public StyleDescription() { -// _pap = new ParagraphProperties(); -// _chp = new CharacterProperties(); + _pap = new ParagraphProperties(); + _chp = new CharacterProperties(); } - public StyleDescription(byte[] std, int baseLength, int offset, boolean word9) + public StyleDescription(byte[] std, int baseLength, boolean word9) { - int nameStart = offset + baseLength; - _infoShort = LittleEndian.getShort(std, offset); - offset += LittleEndian.SHORT_SIZE; - _infoShort2 = LittleEndian.getShort(std, offset); - offset += LittleEndian.SHORT_SIZE; - _bchUpe = LittleEndian.getShort(std, offset); - offset += LittleEndian.SHORT_SIZE; - _infoShort3 = LittleEndian.getShort(std, offset); - offset += LittleEndian.SHORT_SIZE; + int infoShort = LittleEndian.getShort(std, 2); + _styleTypeCode = (infoShort & 0xf); + _baseStyleIndex = (infoShort & 0xfff0) >> 4; + + infoShort = LittleEndian.getShort(std, 4); + _numUPX = infoShort & 0xf; //first byte(s) of variable length section of std is the length of the //style name and aliases string @@ -117,66 +96,52 @@ public class StyleDescription implements HDFType int multiplier = 1; if(word9) { - nameLength = LittleEndian.getShort(std, nameStart); + nameLength = LittleEndian.getShort(std, baseLength); multiplier = 2; - nameStart += LittleEndian.SHORT_SIZE; } else { - nameLength = std[nameStart]; + nameLength = std[baseLength]; } - - try - { - _name = new String(std, nameStart, nameLength * multiplier, "UTF-16LE"); - } - catch (UnsupportedEncodingException ignore) - { - // ignore - } - //2 bytes for length, length then null terminator. - int grupxStart = multiplier + ((nameLength + 1) * multiplier) + nameStart; + int grupxStart = multiplier + ((nameLength + 1) * multiplier) + baseLength; - // the spec only refers to two possible upxs but it mentions - // that more may be added in the future - int add = 0; - int numUPX = _numUPX.getValue(_infoShort2); - for(int x = 0; x < numUPX; x++) + int offset = 0; + for(int x = 0; x < _numUPX; x++) { - int upxSize = LittleEndian.getShort(std, grupxStart + add); - if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE) + int upxSize = LittleEndian.getShort(std, grupxStart + offset); + if(_styleTypeCode == PARAGRAPH_STYLE) { if(x == 0) { _papx = new byte[upxSize]; - System.arraycopy(std, grupxStart + add + 2, _papx, 0, upxSize); + System.arraycopy(std, grupxStart + offset + 2, _papx, 0, upxSize); } else if(x == 1) { _chpx = new byte[upxSize]; - System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize); + System.arraycopy(std, grupxStart + offset + 2, _chpx, 0, upxSize); } } - else if(_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE && x == 0) + else if(_styleTypeCode == CHARACTER_STYLE && x == 0) { _chpx = new byte[upxSize]; - System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize); + System.arraycopy(std, grupxStart + offset + 2, _chpx, 0, upxSize); } - // the upx will always start on a word boundary. if(upxSize % 2 == 1) { ++upxSize; } - add += 2 + upxSize; + offset += 2 + upxSize; } + } public int getBaseStyle() { - return _baseStyle.getValue(_infoShort2); + return _baseStyleIndex; } public byte[] getCHPX() { @@ -186,83 +151,20 @@ public class StyleDescription implements HDFType { return _papx; } -// public ParagraphProperties getPAP() -// { -// return _pap; -// } -// public CharacterProperties getCHP() -// { -// return _chp; -// } -// public void setPAP(ParagraphProperties pap) -// { -// _pap = pap; -// } -// public void setCHP(CharacterProperties chp) -// { -// _chp = chp; -// } - public byte[] toByteArray() + public ParagraphProperties getPAP() { - // size equals 8 bytes for known variables plus 2 bytes for name length plus - // name length * 2 plus 2 bytes for null plus upx's preceded by length - int size = 8 + 2 + ((_name.length() + 1) * 2); - - //only worry about papx and chpx for upxs - if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE) - { - size += _papx.length + 2 + (_papx.length % 2); - size += _chpx.length + 2; - } - else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE) - { - size += _chpx.length + 2; - } - - byte[] buf = new byte[size]; - - int offset = 0; - LittleEndian.putShort(buf, offset, _infoShort); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, _infoShort2); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, _bchUpe); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, _infoShort3); - offset += LittleEndian.SHORT_SIZE; - - char[] letters = _name.toCharArray(); - LittleEndian.putShort(buf, offset, (short)letters.length); - offset += LittleEndian.SHORT_SIZE; - for (int x = 0; x < letters.length; x++) - { - LittleEndian.putShort(buf, offset, (short)letters[x]); - offset += LittleEndian.SHORT_SIZE; - } - // get past the null delimiter for the name. - offset += LittleEndian.SHORT_SIZE; - - //only worry about papx and chpx for upxs - if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE) - { - LittleEndian.putShort(buf, offset, (short)_papx.length); - offset += LittleEndian.SHORT_SIZE; - System.arraycopy(_papx, 0, buf, offset, _papx.length); - offset += _papx.length + (_papx.length % 2); - - LittleEndian.putShort(buf, offset, (short)_chpx.length); - offset += LittleEndian.SHORT_SIZE; - System.arraycopy(_chpx, 0, buf, offset, _chpx.length); - offset += _chpx.length; - } - else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE) - { - LittleEndian.putShort(buf, offset, (short)_chpx.length); - offset += LittleEndian.SHORT_SIZE; - System.arraycopy(_chpx, 0, buf, offset, _chpx.length); - offset += _chpx.length; - } - - return buf; + return _pap; + } + public CharacterProperties getCHP() + { + return _chp; + } + public void setPAP(ParagraphProperties pap) + { + _pap = pap; + } + public void setCHP(CharacterProperties chp) + { + _chp = chp; } } diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleSheet.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleSheet.java index 2ceaedbd7..91c7e3a80 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleSheet.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/StyleSheet.java @@ -1,5 +1,3 @@ - - /* ==================================================================== * The Apache Software License, Version 1.1 * @@ -58,11 +56,8 @@ package org.apache.poi.hdf.model.hdftypes; import java.util.*; -import java.io.IOException; - import org.apache.poi.util.LittleEndian; -import org.apache.poi.hwpf.model.io.HWPFOutputStream; -//import org.apache.poi.hdf.model.hdftypes.definitions.TCAbstractType; +import org.apache.poi.hdf.model.hdftypes.definitions.TCAbstractType; /** * Represents a document's stylesheet. A word documents formatting is stored as @@ -81,16 +76,7 @@ public class StyleSheet implements HDFType private static final int CHP_TYPE = 2; private static final int SEP_TYPE = 4; private static final int TAP_TYPE = 5; - - - private int _stshiLength; - private int _baseLength; - private int _flags; - private int _maxIndex; - private int _maxFixedIndex; - private int _stylenameVersion; - private int[] _rgftc; - + //Vector _styleDescriptions; StyleDescription _nilStyle = new StyleDescription(); StyleDescription[] _styleDescriptions; @@ -101,110 +87,48 @@ public class StyleSheet implements HDFType * info. Found by using FileInformationBlock.getFcStshf() and * FileInformationBLock.getLcbStshf() */ - public StyleSheet(byte[] styleSheet, int offset) + public StyleSheet(byte[] styleSheet) { - _stshiLength = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - int stdCount = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _baseLength = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _flags = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _maxIndex = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _maxFixedIndex = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _stylenameVersion = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; + int stshiLength = LittleEndian.getShort(styleSheet, 0); + int stdCount = LittleEndian.getShort(styleSheet, 2); + int baseLength = LittleEndian.getShort(styleSheet, 4); + int[] rgftc = new int[3]; - _rgftc = new int[3]; - _rgftc[0] = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _rgftc[1] = LittleEndian.getShort(styleSheet, offset); - offset += LittleEndian.SHORT_SIZE; - _rgftc[2] = LittleEndian.getShort(styleSheet, offset); + rgftc[0] = LittleEndian.getInt(styleSheet, 14); + rgftc[1] = LittleEndian.getInt(styleSheet, 18); + rgftc[2] = LittleEndian.getInt(styleSheet, 22); - offset = (2 + _stshiLength); + int offset = 0; _styleDescriptions = new StyleDescription[stdCount]; for(int x = 0; x < stdCount; x++) { - - int stdSize = LittleEndian.getShort(styleSheet, offset); + int stdOffset = (2 + stshiLength) + offset; + int stdSize = LittleEndian.getShort(styleSheet, stdOffset); if(stdSize > 0) { byte[] std = new byte[stdSize]; //get past the size - offset += 2; - - StyleDescription aStyle = new StyleDescription(styleSheet, - _baseLength, offset, true); + stdOffset += 2; + System.arraycopy(styleSheet, stdOffset, std, 0, stdSize); + StyleDescription aStyle = new StyleDescription(std, baseLength, true); _styleDescriptions[x] = aStyle; } - offset += stdSize; + + offset += stdSize + 2; } for(int x = 0; x < _styleDescriptions.length; x++) { if(_styleDescriptions[x] != null) { -// createPap(x); -// createChp(x); + createPap(x); + createChp(x); } } } - - public void write(HWPFOutputStream out) - throws IOException - { - int offset = 0; - byte[] buf = new byte[_stshiLength]; - LittleEndian.putShort(buf, offset, (short)_stshiLength); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_styleDescriptions.length); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_baseLength); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_flags); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_maxIndex); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_maxFixedIndex); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_stylenameVersion); - offset += LittleEndian.SHORT_SIZE; - - LittleEndian.putShort(buf, offset, (short)_rgftc[0]); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_rgftc[1]); - offset += LittleEndian.SHORT_SIZE; - LittleEndian.putShort(buf, offset, (short)_rgftc[2]); - - out.write(buf); - - byte[] sizeHolder = new byte[2]; - for (int x = 0; x < _styleDescriptions.length; x++) - { - if(_styleDescriptions[x] != null) - { - byte[] std = _styleDescriptions[x].toByteArray(); - - LittleEndian.putShort(sizeHolder, (short)std.length); - out.write(sizeHolder); - out.write(std); - } - else - { - sizeHolder[0] = 0; - sizeHolder[1] = 0; - out.write(sizeHolder); - } - } - - } /** * Creates a PartagraphProperties object from a papx stored in the * StyleDescription at the index istd in the StyleDescription array. The PAP @@ -215,66 +139,66 @@ public class StyleSheet implements HDFType * @param istd The index of the StyleDescription to create the * ParagraphProperties from (and also place the finished PAP in) */ -// private void createPap(int istd) -// { -// StyleDescription sd = _styleDescriptions[istd]; -// ParagraphProperties pap = sd.getPAP(); -// byte[] papx = sd.getPAPX(); -// int baseIndex = sd.getBaseStyle(); -// if(pap == null && papx != null) -// { -// ParagraphProperties parentPAP = _nilStyle.getPAP(); -// if(baseIndex != NIL_STYLE) -// { -// -// parentPAP = _styleDescriptions[baseIndex].getPAP(); -// if(parentPAP == null) -// { -// createPap(baseIndex); -// parentPAP = _styleDescriptions[baseIndex].getPAP(); -// } -// -// } -// -// pap = (ParagraphProperties)uncompressProperty(papx, parentPAP, this); -// sd.setPAP(pap); -// } -// } -// /** -// * Creates a CharacterProperties object from a chpx stored in the -// * StyleDescription at the index istd in the StyleDescription array. The -// * CharacterProperties object is placed in the StyleDescription at istd after -// * its been created. Not every StyleDescription will contain a chpx. In these -// * cases this function does nothing. -// * -// * @param istd The index of the StyleDescription to create the -// * CharacterProperties object from. -// */ -// private void createChp(int istd) -// { -// StyleDescription sd = _styleDescriptions[istd]; -// CharacterProperties chp = sd.getCHP(); -// byte[] chpx = sd.getCHPX(); -// int baseIndex = sd.getBaseStyle(); -// if(chp == null && chpx != null) -// { -// CharacterProperties parentCHP = _nilStyle.getCHP(); -// if(baseIndex != NIL_STYLE) -// { -// -// parentCHP = _styleDescriptions[baseIndex].getCHP(); -// if(parentCHP == null) -// { -// createChp(baseIndex); -// parentCHP = _styleDescriptions[baseIndex].getCHP(); -// } -// -// } -// -// chp = (CharacterProperties)uncompressProperty(chpx, parentCHP, this); -// sd.setCHP(chp); -// } -// } + private void createPap(int istd) + { + StyleDescription sd = _styleDescriptions[istd]; + ParagraphProperties pap = sd.getPAP(); + byte[] papx = sd.getPAPX(); + int baseIndex = sd.getBaseStyle(); + if(pap == null && papx != null) + { + ParagraphProperties parentPAP = _nilStyle.getPAP(); + if(baseIndex != NIL_STYLE) + { + + parentPAP = _styleDescriptions[baseIndex].getPAP(); + if(parentPAP == null) + { + createPap(baseIndex); + parentPAP = _styleDescriptions[baseIndex].getPAP(); + } + + } + + pap = (ParagraphProperties)uncompressProperty(papx, parentPAP, this); + sd.setPAP(pap); + } + } + /** + * Creates a CharacterProperties object from a chpx stored in the + * StyleDescription at the index istd in the StyleDescription array. The + * CharacterProperties object is placed in the StyleDescription at istd after + * its been created. Not every StyleDescription will contain a chpx. In these + * cases this function does nothing. + * + * @param istd The index of the StyleDescription to create the + * CharacterProperties object from. + */ + private void createChp(int istd) + { + StyleDescription sd = _styleDescriptions[istd]; + CharacterProperties chp = sd.getCHP(); + byte[] chpx = sd.getCHPX(); + int baseIndex = sd.getBaseStyle(); + if(chp == null && chpx != null) + { + CharacterProperties parentCHP = _nilStyle.getCHP(); + if(baseIndex != NIL_STYLE) + { + + parentCHP = _styleDescriptions[baseIndex].getCHP(); + if(parentCHP == null) + { + createChp(baseIndex); + parentCHP = _styleDescriptions[baseIndex].getCHP(); + } + + } + + chp = (CharacterProperties)uncompressProperty(chpx, parentCHP, this); + sd.setCHP(chp); + } + } /** * Gets the StyleDescription at index x. @@ -286,460 +210,460 @@ public class StyleSheet implements HDFType return _styleDescriptions[x]; } -// /** -// * 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 doCHPOperation(CharacterProperties oldCHP, CharacterProperties newCHP, -// int operand, int param, -// byte[] varParam, byte[] grpprl, int offset, -// StyleSheet styleSheet) -// { -// switch(operand) -// { -// case 0: -// newCHP.setFRMarkDel(getFlag(param)); -// break; -// case 0x1: -// newCHP.setFRMark(getFlag(param)); -// break; -// case 0x2: -// break; -// case 0x3: -// newCHP.setFcPic(param); -// newCHP.setFSpec(true); -// break; -// case 0x4: -// newCHP.setIbstRMark((short)param); -// break; -// case 0x5: -// short[] dttmRMark = new short[2]; -// dttmRMark[0] = LittleEndian.getShort(grpprl, (offset - 4)); -// dttmRMark[1] = LittleEndian.getShort(grpprl, (offset - 2)); -// newCHP.setDttmRMark(dttmRMark); -// break; -// case 0x6: -// newCHP.setFData(getFlag(param)); -// break; -// case 0x7: -// //don't care about this -// break; -// case 0x8: -// short chsDiff = (short)((param & 0xff0000) >>> 8); -// newCHP.setFChsDiff(getFlag(chsDiff)); -// newCHP.setChse((short)(param & 0xffff)); -// break; -// case 0x9: -// newCHP.setFSpec(true); -// newCHP.setFtcSym((short)LittleEndian.getShort(varParam, 0)); -// newCHP.setXchSym((short)LittleEndian.getShort(varParam, 2)); -// break; -// case 0xa: -// newCHP.setFOle2(getFlag(param)); -// break; -// case 0xb: -// //? -// break; -// case 0xc: -// newCHP.setIcoHighlight((byte)param); -// newCHP.setFHighlight(getFlag(param)); -// break; -// case 0xd: -// break; -// case 0xe: -// newCHP.setFcObj(param); -// break; -// case 0xf: -// break; -// case 0x10: -// //? -// break; -// 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(param); -// 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 -// { -// newCHP = (CharacterProperties)oldCHP.clone(); -// } -// catch(CloneNotSupportedException e) -// { -// //do nothing -// } -// return; -// case 0x34: -// break; -// case 0x35: -// newCHP.setFBold(getCHPFlag((byte)param, oldCHP.isFBold())); -// break; -// case 0x36: -// newCHP.setFItalic(getCHPFlag((byte)param, oldCHP.isFItalic())); -// break; -// case 0x37: -// newCHP.setFStrike(getCHPFlag((byte)param, oldCHP.isFStrike())); -// break; -// case 0x38: -// newCHP.setFOutline(getCHPFlag((byte)param, oldCHP.isFOutline())); -// break; -// case 0x39: -// newCHP.setFShadow(getCHPFlag((byte)param, oldCHP.isFShadow())); -// break; -// case 0x3a: -// newCHP.setFSmallCaps(getCHPFlag((byte)param, oldCHP.isFSmallCaps())); -// break; -// case 0x3b: -// newCHP.setFCaps(getCHPFlag((byte)param, oldCHP.isFCaps())); -// break; -// case 0x3c: -// newCHP.setFVanish(getCHPFlag((byte)param, oldCHP.isFVanish())); -// break; -// case 0x3d: -// newCHP.setFtcAscii((short)param); -// break; -// case 0x3e: -// newCHP.setKul((byte)param); -// break; -// case 0x3f: -// int hps = param & 0xff; -// if(hps != 0) -// { -// newCHP.setHps(hps); -// } -// byte cInc = (byte)(((byte)(param & 0xfe00) >>> 4) >> 1); -// if(cInc != 0) -// { -// newCHP.setHps(Math.max(newCHP.getHps() + (cInc * 2), 2)); -// } -// byte hpsPos = (byte)((param & 0xff0000) >>> 8); -// if(hpsPos != 0x80) -// { -// newCHP.setHpsPos(hpsPos); -// } -// boolean fAdjust = (param & 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(param); -// break; -// case 0x41: -// newCHP.setLidDefault((short)param); -// break; -// case 0x42: -// newCHP.setIco((byte)param); -// break; -// case 0x43: -// newCHP.setHps(param); -// break; -// case 0x44: -// byte hpsLvl = (byte)param; -// newCHP.setHps(Math.max(newCHP.getHps() + (hpsLvl * 2), 2)); -// break; -// case 0x45: -// newCHP.setHpsPos((short)param); -// break; -// case 0x46: -// if(param != 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)param); -// break; -// case 0x49: -// newCHP.setHps(LittleEndian.getShort(varParam, 0)); -// break; -// case 0x4a: -// int increment = LittleEndian.getShort(varParam, 0); -// newCHP.setHps(Math.max(newCHP.getHps() + increment, 8)); -// break; -// case 0x4b: -// newCHP.setHpsKern(param); -// break; -// case 0x4c: -// doCHPOperation(oldCHP, newCHP, 0x47, param, varParam, grpprl, offset, styleSheet); -// break; -// case 0x4d: -// float percentage = (float)param/100.0f; -// int add = (int)((float)percentage * (float)newCHP.getHps()); -// newCHP.setHps(newCHP.getHps() + add); -// break; -// case 0x4e: -// newCHP.setYsr((byte)param); -// break; -// case 0x4f: -// newCHP.setFtcAscii((short)param); -// break; -// case 0x50: -// newCHP.setFtcFE((short)param); -// break; -// case 0x51: -// newCHP.setFtcOther((short)param); -// break; -// case 0x52: -// break; -// case 0x53: -// newCHP.setFDStrike(getFlag(param)); -// break; -// case 0x54: -// newCHP.setFImprint(getFlag(param)); -// break; -// case 0x55: -// newCHP.setFSpec(getFlag(param)); -// break; -// case 0x56: -// newCHP.setFObj(getFlag(param)); -// break; -// case 0x57: -// newCHP.setFPropMark(varParam[0]); -// newCHP.setIbstPropRMark((short)LittleEndian.getShort(varParam, 1)); -// newCHP.setDttmPropRMark(LittleEndian.getInt(varParam, 3)); -// break; -// case 0x58: -// newCHP.setFEmboss(getFlag(param)); -// break; -// case 0x59: -// newCHP.setSfxtText((byte)param); -// break; -// 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]; -// newCHP.setFDispFldRMark(varParam[0]); -// newCHP.setIbstDispFldRMark((short)LittleEndian.getShort(varParam, 1)); -// newCHP.setDttmDispFldRMark(LittleEndian.getInt(varParam, 3)); -// System.arraycopy(varParam, 7, xstDispFldRMark, 0, 32); -// newCHP.setXstDispFldRMark(xstDispFldRMark); -// break; -// case 0x63: -// newCHP.setIbstRMarkDel((short)param); -// break; -// case 0x64: -// short[] dttmRMarkDel = new short[2]; -// dttmRMarkDel[0] = LittleEndian.getShort(grpprl, offset - 4); -// dttmRMarkDel[1] = LittleEndian.getShort(grpprl, offset - 2); -// newCHP.setDttmRMarkDel(dttmRMarkDel); -// break; -// case 0x65: -// short[] brc = new short[2]; -// brc[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brc[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// newCHP.setBrc(brc); -// break; -// case 0x66: -// newCHP.setShd((short)param); -// break; -// case 0x67: -// break; -// case 0x68: -// break; -// case 0x69: -// break; -// case 0x6a: -// break; -// case 0x6b: -// break; -// case 0x6c: -// break; -// case 0x6d: -// newCHP.setLidDefault((short)param); -// break; -// case 0x6e: -// newCHP.setLidFE((short)param); -// break; -// case 0x6f: -// newCHP.setIdctHint((byte)param); -// break; -// } -// } + /** + * 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 doCHPOperation(CharacterProperties oldCHP, CharacterProperties newCHP, + int operand, int param, + byte[] varParam, byte[] grpprl, int offset, + StyleSheet styleSheet) + { + switch(operand) + { + case 0: + newCHP.setFRMarkDel(getFlag(param)); + break; + case 0x1: + newCHP.setFRMark(getFlag(param)); + break; + case 0x2: + break; + case 0x3: + newCHP.setFcPic(param); + newCHP.setFSpec(true); + break; + case 0x4: + newCHP.setIbstRMark((short)param); + break; + case 0x5: + short[] dttmRMark = new short[2]; + dttmRMark[0] = LittleEndian.getShort(grpprl, (offset - 4)); + dttmRMark[1] = LittleEndian.getShort(grpprl, (offset - 2)); + newCHP.setDttmRMark(dttmRMark); + break; + case 0x6: + newCHP.setFData(getFlag(param)); + break; + case 0x7: + //don't care about this + break; + case 0x8: + short chsDiff = (short)((param & 0xff0000) >>> 8); + newCHP.setFChsDiff(getFlag(chsDiff)); + newCHP.setChse((short)(param & 0xffff)); + break; + case 0x9: + newCHP.setFSpec(true); + newCHP.setFtcSym((short)LittleEndian.getShort(varParam, 0)); + newCHP.setXchSym((short)LittleEndian.getShort(varParam, 2)); + break; + case 0xa: + newCHP.setFOle2(getFlag(param)); + break; + case 0xb: + //? + break; + case 0xc: + newCHP.setIcoHighlight((byte)param); + newCHP.setFHighlight(getFlag(param)); + break; + case 0xd: + break; + case 0xe: + newCHP.setFcObj(param); + break; + case 0xf: + break; + case 0x10: + //? + break; + 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(param); + 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 + { + newCHP = (CharacterProperties)oldCHP.clone(); + } + catch(CloneNotSupportedException e) + { + //do nothing + } + return; + case 0x34: + break; + case 0x35: + newCHP.setFBold(getCHPFlag((byte)param, oldCHP.isFBold())); + break; + case 0x36: + newCHP.setFItalic(getCHPFlag((byte)param, oldCHP.isFItalic())); + break; + case 0x37: + newCHP.setFStrike(getCHPFlag((byte)param, oldCHP.isFStrike())); + break; + case 0x38: + newCHP.setFOutline(getCHPFlag((byte)param, oldCHP.isFOutline())); + break; + case 0x39: + newCHP.setFShadow(getCHPFlag((byte)param, oldCHP.isFShadow())); + break; + case 0x3a: + newCHP.setFSmallCaps(getCHPFlag((byte)param, oldCHP.isFSmallCaps())); + break; + case 0x3b: + newCHP.setFCaps(getCHPFlag((byte)param, oldCHP.isFCaps())); + break; + case 0x3c: + newCHP.setFVanish(getCHPFlag((byte)param, oldCHP.isFVanish())); + break; + case 0x3d: + newCHP.setFtcAscii((short)param); + break; + case 0x3e: + newCHP.setKul((byte)param); + break; + case 0x3f: + int hps = param & 0xff; + if(hps != 0) + { + newCHP.setHps(hps); + } + byte cInc = (byte)(((byte)(param & 0xfe00) >>> 4) >> 1); + if(cInc != 0) + { + newCHP.setHps(Math.max(newCHP.getHps() + (cInc * 2), 2)); + } + byte hpsPos = (byte)((param & 0xff0000) >>> 8); + if(hpsPos != 0x80) + { + newCHP.setHpsPos(hpsPos); + } + boolean fAdjust = (param & 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(param); + break; + case 0x41: + newCHP.setLidDefault((short)param); + break; + case 0x42: + newCHP.setIco((byte)param); + break; + case 0x43: + newCHP.setHps(param); + break; + case 0x44: + byte hpsLvl = (byte)param; + newCHP.setHps(Math.max(newCHP.getHps() + (hpsLvl * 2), 2)); + break; + case 0x45: + newCHP.setHpsPos((short)param); + break; + case 0x46: + if(param != 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)param); + break; + case 0x49: + newCHP.setHps(LittleEndian.getShort(varParam, 0)); + break; + case 0x4a: + int increment = LittleEndian.getShort(varParam, 0); + newCHP.setHps(Math.max(newCHP.getHps() + increment, 8)); + break; + case 0x4b: + newCHP.setHpsKern(param); + break; + case 0x4c: + doCHPOperation(oldCHP, newCHP, 0x47, param, varParam, grpprl, offset, styleSheet); + break; + case 0x4d: + float percentage = (float)param/100.0f; + int add = (int)((float)percentage * (float)newCHP.getHps()); + newCHP.setHps(newCHP.getHps() + add); + break; + case 0x4e: + newCHP.setYsr((byte)param); + break; + case 0x4f: + newCHP.setFtcAscii((short)param); + break; + case 0x50: + newCHP.setFtcFE((short)param); + break; + case 0x51: + newCHP.setFtcOther((short)param); + break; + case 0x52: + break; + case 0x53: + newCHP.setFDStrike(getFlag(param)); + break; + case 0x54: + newCHP.setFImprint(getFlag(param)); + break; + case 0x55: + newCHP.setFSpec(getFlag(param)); + break; + case 0x56: + newCHP.setFObj(getFlag(param)); + break; + case 0x57: + newCHP.setFPropMark(varParam[0]); + newCHP.setIbstPropRMark((short)LittleEndian.getShort(varParam, 1)); + newCHP.setDttmPropRMark(LittleEndian.getInt(varParam, 3)); + break; + case 0x58: + newCHP.setFEmboss(getFlag(param)); + break; + case 0x59: + newCHP.setSfxtText((byte)param); + break; + 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]; + newCHP.setFDispFldRMark(varParam[0]); + newCHP.setIbstDispFldRMark((short)LittleEndian.getShort(varParam, 1)); + newCHP.setDttmDispFldRMark(LittleEndian.getInt(varParam, 3)); + System.arraycopy(varParam, 7, xstDispFldRMark, 0, 32); + newCHP.setXstDispFldRMark(xstDispFldRMark); + break; + case 0x63: + newCHP.setIbstRMarkDel((short)param); + break; + case 0x64: + short[] dttmRMarkDel = new short[2]; + dttmRMarkDel[0] = LittleEndian.getShort(grpprl, offset - 4); + dttmRMarkDel[1] = LittleEndian.getShort(grpprl, offset - 2); + newCHP.setDttmRMarkDel(dttmRMarkDel); + break; + case 0x65: + short[] brc = new short[2]; + brc[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brc[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + newCHP.setBrc(brc); + break; + case 0x66: + newCHP.setShd((short)param); + break; + case 0x67: + break; + case 0x68: + break; + case 0x69: + break; + case 0x6a: + break; + case 0x6b: + break; + case 0x6c: + break; + case 0x6d: + newCHP.setLidDefault((short)param); + break; + case 0x6e: + newCHP.setLidFE((short)param); + break; + case 0x6f: + newCHP.setIdctHint((byte)param); + break; + } + } /** * Used to uncompress a property stored in a grpprl. These include @@ -752,800 +676,800 @@ public class StyleSheet implements HDFType * * @return An object that should be casted to the appropriate property. */ -// public static Object uncompressProperty(byte[] grpprl, Object parent, StyleSheet styleSheet) -// { -// return uncompressProperty(grpprl, parent, styleSheet, true); -// } + public static Object uncompressProperty(byte[] grpprl, Object parent, StyleSheet styleSheet) + { + return uncompressProperty(grpprl, parent, styleSheet, true); + } -// /** -// * Used to uncompress a property stored in a grpprl. These include -// * CharacterProperties, ParagraphProperties, TableProperties, and -// * SectionProperties. -// * -// * @param grpprl The compressed form of the property. -// * @param parent The base property of the property. -// * @param styleSheet The document's stylesheet. -// * -// * @return An object that should be casted to the appropriate property. -// */ -// public static Object uncompressProperty(byte[] grpprl, Object parent, StyleSheet styleSheet, boolean doIstd) -// { -// Object newProperty = null; -// int offset = 0; -// int propertyType = PAP_TYPE; -// -// -// if(parent instanceof ParagraphProperties) -// { -// try -// { -// newProperty = ((ParagraphProperties)parent).clone(); -// } -// catch(Exception e){} -// if(doIstd) -// { -// ((ParagraphProperties)newProperty).setIstd(LittleEndian.getShort(grpprl, 0)); -// -// offset = 2; -// } -// } -// else if(parent instanceof CharacterProperties) -// { -// try -// { -// newProperty = ((CharacterProperties)parent).clone(); -// ((CharacterProperties)newProperty).setBaseIstd(((CharacterProperties)parent).getIstd()); -// } -// catch(Exception e){} -// propertyType = CHP_TYPE; -// } -// else if(parent instanceof SectionProperties) -// { -// newProperty = parent; -// propertyType = SEP_TYPE; -// } -// else if(parent instanceof TableProperties) -// { -// newProperty = parent; -// propertyType = TAP_TYPE; -// offset = 2;//because this is really just a papx -// } -// else -// { -// return null; -// } -// -// while(offset < grpprl.length) -// { -// short sprm = LittleEndian.getShort(grpprl, offset); -// offset += 2; -// -// byte spra = (byte)((sprm & 0xe000) >> 13); -// int opSize = 0; -// int param = 0; -// byte[] varParam = null; -// -// switch(spra) -// { -// case 0: -// case 1: -// opSize = 1; -// param = grpprl[offset]; -// break; -// case 2: -// opSize = 2; -// param = LittleEndian.getShort(grpprl, offset); -// break; -// case 3: -// opSize = 4; -// param = LittleEndian.getInt(grpprl, offset); -// break; -// case 4: -// case 5: -// opSize = 2; -// param = LittleEndian.getShort(grpprl, offset); -// break; -// case 6://variable size -// -// //there is one sprm that is a very special case -// if(sprm != (short)0xd608) -// { -// opSize = LittleEndian.getUnsignedByte(grpprl, offset); -// offset++; -// } -// else -// { -// opSize = LittleEndian.getShort(grpprl, offset) - 1; -// offset += 2; -// } -// varParam = new byte[opSize]; -// System.arraycopy(grpprl, offset, varParam, 0, opSize); -// -// break; -// case 7: -// opSize = 3; -// byte threeByteInt[] = new byte[4]; -// threeByteInt[0] = grpprl[offset]; -// threeByteInt[1] = grpprl[offset + 1]; -// threeByteInt[2] = grpprl[offset + 2]; -// threeByteInt[3] = (byte)0; -// param = LittleEndian.getInt(threeByteInt, 0); -// break; -// default: -// throw new RuntimeException("unrecognized pap opcode"); -// } -// -// offset += opSize; -// short operand = (short)(sprm & 0x1ff); -// byte type = (byte)((sprm & 0x1c00) >> 10); -// switch(propertyType) -// { -// case PAP_TYPE: -// if(type == 1)//papx stores TAP sprms along with PAP sprms -// { -// doPAPOperation((ParagraphProperties)newProperty, operand, -// param, varParam, grpprl, -// offset, spra); -// } -// break; -// case CHP_TYPE: -// -// doCHPOperation((CharacterProperties)parent, -// (CharacterProperties)newProperty, -// operand, param, varParam, -// grpprl, offset, styleSheet); -// break; -// case SEP_TYPE: -// -// doSEPOperation((SectionProperties)newProperty, operand, param, varParam); -// break; -// case TAP_TYPE: -// if(type == 5) -// { -// doTAPOperation((TableProperties)newProperty, operand, param, varParam); -// } -// break; -// } -// -// -// } -// return newProperty; -// -// } -// /** -// * 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 doPAPOperation(ParagraphProperties newPAP, int operand, int param, -// byte[] varParam, byte[] grpprl, int offset, -// int spra) -// { -// switch(operand) -// { -// case 0: -// newPAP.setIstd(param); -// break; -// case 0x1: -// //permuteIstd(newPAP, varParam); -// break; -// case 0x2: -// if(newPAP.getIstd() <=9 || newPAP.getIstd() >=1) -// { -// newPAP.setIstd(newPAP.getIstd() + param); -// if(param > 0) -// { -// newPAP.setIstd(Math.max(newPAP.getIstd(), 9)); -// } -// else -// { -// newPAP.setIstd(Math.min(newPAP.getIstd(), 1)); -// } -// } -// break; -// case 0x3: -// newPAP.setJc((byte)param); -// break; -// case 0x4: -// newPAP.setFSideBySide((byte)param); -// break; -// case 0x5: -// newPAP.setFKeep((byte)param); -// break; -// case 0x6: -// newPAP.setFKeepFollow((byte)param); -// break; -// case 0x7: -// newPAP.setFPageBreakBefore((byte)param); -// break; -// case 0x8: -// newPAP.setBrcl((byte)param); -// break; -// case 0x9: -// newPAP.setBrcp((byte)param); -// break; -// case 0xa: -// newPAP.setIlvl((byte)param); -// break; -// case 0xb: -// newPAP.setIlfo(param); -// break; -// case 0xc: -// newPAP.setFNoLnn((byte)param); -// break; -// case 0xd: -// /**@todo handle tabs*/ -// break; -// case 0xe: -// newPAP.setDxaRight(param); -// break; -// case 0xf: -// newPAP.setDxaLeft(param); -// break; -// case 0x10: -// newPAP.setDxaLeft(newPAP.getDxaLeft() + param); -// newPAP.setDxaLeft(Math.max(0, newPAP.getDxaLeft())); -// break; -// case 0x11: -// newPAP.setDxaLeft1(param); -// break; -// case 0x12: -// short[] lspd = newPAP.getLspd(); -// lspd[0] = LittleEndian.getShort(grpprl, offset - 4); -// lspd[1] = LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x13: -// newPAP.setDyaBefore(param); -// break; -// case 0x14: -// newPAP.setDyaAfter(param); -// break; -// case 0x15: -// /**@todo handle tabs*/ -// break; -// case 0x16: -// newPAP.setFInTable((byte)param); -// break; -// case 0x17: -// newPAP.setFTtp((byte)param); -// break; -// case 0x18: -// newPAP.setDxaAbs(param); -// break; -// case 0x19: -// newPAP.setDyaAbs(param); -// break; -// case 0x1a: -// newPAP.setDxaWidth(param); -// break; -// case 0x1b: -// /** @todo handle paragraph postioning*/ -// /*byte pcVert = (param & 0x0c) >> 2; -// byte pcHorz = param & 0x03; -// if(pcVert != 3) -// { -// newPAP._pcVert = pcVert; -// } -// if(pcHorz != 3) -// { -// newPAP._pcHorz = pcHorz; -// }*/ -// break; -// 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(param); -// break; -// case 0x23: -// newPAP.setWr((byte)param); -// break; -// case 0x24: -// short[] brcTop = newPAP.getBrcTop(); -// brcTop[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcTop[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x25: -// short[] brcLeft = newPAP.getBrcLeft(); -// brcLeft[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcLeft[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x26: -// short[] brcBottom = newPAP.getBrcBottom(); -// brcBottom[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcBottom[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x27: -// short[] brcRight = newPAP.getBrcRight(); -// brcRight[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcRight[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x28: -// short[] brcBetween = newPAP.getBrcBetween(); -// brcBetween[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcBetween[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x29: -// short[] brcBar = newPAP.getBrcBar(); -// brcBar[0] = (short)LittleEndian.getShort(grpprl, offset - 4); -// brcBar[1] = (short)LittleEndian.getShort(grpprl, offset - 2); -// break; -// case 0x2a: -// newPAP.setFNoAutoHyph((byte)param); -// break; -// case 0x2b: -// newPAP.setDyaHeight(param); -// break; -// case 0x2c: -// newPAP.setDcs((short)param); -// break; -// case 0x2d: -// newPAP.setShd((short)param); -// break; -// case 0x2e: -// newPAP.setDyaFromText(param); -// break; -// case 0x2f: -// newPAP.setDxaFromText(param); -// break; -// case 0x30: -// newPAP.setFLocked((byte)param); -// break; -// case 0x31: -// newPAP.setFWidowControl((byte)param); -// break; -// case 0x32: -// //undocumented -// break; -// case 0x33: -// newPAP.setFKinsoku((byte)param); -// break; -// case 0x34: -// newPAP.setFWordWrap((byte)param); -// break; -// case 0x35: -// newPAP.setFOverflowPunct((byte)param); -// break; -// case 0x36: -// newPAP.setFTopLinePunct((byte)param); -// break; -// case 0x37: -// newPAP.setFAutoSpaceDE((byte)param); -// break; -// case 0x38: -// newPAP.setFAutoSpaceDN((byte)param); -// break; -// case 0x39: -// newPAP.setWAlignFont(param); -// break; -// case 0x3a: -// newPAP.setFontAlign((short)param); -// break; -// case 0x3b: -// //obsolete -// break; -// case 0x3e: -// newPAP.setAnld(varParam); -// break; -// case 0x3f: -// //don't really need this. spec is confusing regarding this -// //sprm -// break; -// case 0x40: -// //newPAP._lvl = param; -// break; -// case 0x41: -// //? -// break; -// case 0x43: -// //? -// break; -// case 0x44: -// //? -// break; -// case 0x45: -// if(spra == 6) -// { -// newPAP.setNumrm(varParam); -// } -// else -// { -// /**@todo handle large PAPX from data stream*/ -// } -// break; -// -// case 0x47: -// newPAP.setFUsePgsuSettings((byte)param); -// break; -// case 0x48: -// newPAP.setFAdjustRight((byte)param); -// break; -// default: -// break; -// } -// } -// /** -// * 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 doTAPOperation(TableProperties newTAP, int operand, int param, byte[] varParam) -// { -// switch(operand) -// { -// case 0: -// newTAP.setJc((short)param); -// break; -// case 0x01: -// { -// short[] rgdxaCenter = newTAP.getRgdxaCenter(); -// short itcMac = newTAP.getItcMac(); -// int adjust = param - (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() - param; -// rgdxaCenter[0] += adjust; -// } -// newTAP.setDxaGapHalf(param); -// break; -// } -// case 0x03: -// newTAP.setFCantSplit(getFlag(param)); -// break; -// case 0x04: -// newTAP.setFTableHeader(getFlag(param)); -// break; -// case 0x05: -// { -// short[] brcTop = newTAP.getBrcTop(); -// short[] brcLeft = newTAP.getBrcLeft(); -// short[] brcBottom = newTAP.getBrcBottom(); -// short[] brcRight = newTAP.getBrcRight(); -// short[] brcVertical = newTAP.getBrcVertical(); -// short[] brcHorizontal = newTAP.getBrcHorizontal(); -// -// brcTop[0] = LittleEndian.getShort(varParam, 0); -// brcTop[1] = LittleEndian.getShort(varParam, 2); -// -// brcLeft[0] = LittleEndian.getShort(varParam, 4); -// brcLeft[1] = LittleEndian.getShort(varParam, 6); -// -// brcBottom[0] = LittleEndian.getShort(varParam, 8); -// brcBottom[1] = LittleEndian.getShort(varParam, 10); -// -// brcRight[0] = LittleEndian.getShort(varParam, 12); -// brcRight[1] = LittleEndian.getShort(varParam, 14); -// -// brcHorizontal[0] = LittleEndian.getShort(varParam, 16); -// brcHorizontal[1] = LittleEndian.getShort(varParam, 18); -// -// brcVertical[0] = LittleEndian.getShort(varParam, 20); -// brcVertical[1] = LittleEndian.getShort(varParam, 22); -// break; -// } -// case 0x06: -// //obsolete, used in word 1.x -// break; -// case 0x07: -// newTAP.setDyaRowHeight(param); -// break; -// case 0x08: -// { -// short[] rgdxaCenter = new short[varParam[0] + 1]; -// TableCellDescriptor[] rgtc = new TableCellDescriptor[varParam[0]]; -// short itcMac = varParam[0]; -// //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(varParam , 1 + (x * 2)); -// rgtc[x] = TableCellDescriptor.convertBytesToTC(varParam, 1 + ((itcMac + 1) * 2) + (x * 20)); -// } -// rgdxaCenter[itcMac] = LittleEndian.getShort(varParam , 1 + (itcMac * 2)); -// break; -// } -// case 0x09: -// /** @todo handle cell shading*/ -// break; -// case 0x0a: -// /** @todo handle word defined table styles*/ -// break; -// case 0x20: -// { -// TCAbstractType[] 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; -// } -// case 0x21: -// 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; -// } -// } -// /** -// * 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 doSEPOperation(SectionProperties newSEP, int operand, int param, byte[] varParam) -// { -// switch(operand) -// { -// case 0: -// newSEP.setCnsPgn((byte)param); -// break; -// case 0x1: -// newSEP.setIHeadingPgn((byte)param); -// break; -// case 0x2: -// newSEP.setOlstAnm(varParam); -// break; -// case 0x3: -// //not quite sure -// break; -// case 0x4: -// //not quite sure -// break; -// case 0x5: -// newSEP.setFEvenlySpaced(getFlag(param)); -// break; -// case 0x6: -// newSEP.setFUnlocked(getFlag(param)); -// break; -// case 0x7: -// newSEP.setDmBinFirst((short)param); -// break; -// case 0x8: -// newSEP.setDmBinOther((short)param); -// break; -// case 0x9: -// newSEP.setBkc((byte)param); -// break; -// case 0xa: -// newSEP.setFTitlePage(getFlag(param)); -// break; -// case 0xb: -// newSEP.setCcolM1((short)param); -// break; -// case 0xc: -// newSEP.setDxaColumns(param); -// break; -// case 0xd: -// newSEP.setFAutoPgn(getFlag(param)); -// break; -// case 0xe: -// newSEP.setNfcPgn((byte)param); -// break; -// case 0xf: -// newSEP.setDyaPgn((short)param); -// break; -// case 0x10: -// newSEP.setDxaPgn((short)param); -// break; -// case 0x11: -// newSEP.setFPgnRestart(getFlag(param)); -// break; -// case 0x12: -// newSEP.setFEndNote(getFlag(param)); -// break; -// case 0x13: -// newSEP.setLnc((byte)param); -// break; -// case 0x14: -// newSEP.setGrpfIhdt((byte)param); -// break; -// case 0x15: -// newSEP.setNLnnMod((short)param); -// break; -// case 0x16: -// newSEP.setDxaLnn(param); -// break; -// case 0x17: -// newSEP.setDyaHdrTop(param); -// break; -// case 0x18: -// newSEP.setDyaHdrBottom(param); -// break; -// case 0x19: -// newSEP.setFLBetween(getFlag(param)); -// break; -// case 0x1a: -// newSEP.setVjc((byte)param); -// break; -// case 0x1b: -// newSEP.setLnnMin((short)param); -// break; -// case 0x1c: -// newSEP.setPgnStart((short)param); -// break; -// case 0x1d: -// newSEP.setDmOrientPage((byte)param); -// break; -// case 0x1e: -// //nothing -// break; -// case 0x1f: -// newSEP.setXaPage(param); -// break; -// case 0x20: -// newSEP.setYaPage(param); -// break; -// case 0x21: -// newSEP.setDxaLeft(param); -// break; -// case 0x22: -// newSEP.setDxaRight(param); -// break; -// case 0x23: -// newSEP.setDyaTop(param); -// break; -// case 0x24: -// newSEP.setDyaBottom(param); -// break; -// case 0x25: -// newSEP.setDzaGutter(param); -// break; -// case 0x26: -// newSEP.setDmPaperReq((short)param); -// break; -// case 0x27: -// newSEP.setFPropMark(getFlag(varParam[0])); -// break; -// case 0x28: -// break; -// case 0x29: -// break; -// case 0x2a: -// break; -// case 0x2b: -// short[] brcTop = newSEP.getBrcTop(); -// brcTop[0] = (short)(param & 0xffff); -// brcTop[1] = (short)((param & 0xffff0000) >> 16); -// break; -// case 0x2c: -// short[] brcLeft = newSEP.getBrcLeft(); -// brcLeft[0] = (short)(param & 0xffff); -// brcLeft[1] = (short)((param & 0xffff0000) >> 16); -// break; -// case 0x2d: -// short[] brcBottom = newSEP.getBrcBottom(); -// brcBottom[0] = (short)(param & 0xffff); -// brcBottom[1] = (short)((param & 0xffff0000) >> 16); -// break; -// case 0x2e: -// short[] brcRight = newSEP.getBrcRight(); -// brcRight[0] = (short)(param & 0xffff); -// brcRight[1] = (short)((param & 0xffff0000) >> 16); -// break; -// case 0x2f: -// newSEP.setPgbProp(param); -// break; -// case 0x30: -// newSEP.setDxtCharSpace(param); -// break; -// case 0x31: -// newSEP.setDyaLinePitch(param); -// break; -// case 0x33: -// newSEP.setWTextFlow((short)param); -// break; -// default: -// break; -// } -// -// } + /** + * Used to uncompress a property stored in a grpprl. These include + * CharacterProperties, ParagraphProperties, TableProperties, and + * SectionProperties. + * + * @param grpprl The compressed form of the property. + * @param parent The base property of the property. + * @param styleSheet The document's stylesheet. + * + * @return An object that should be casted to the appropriate property. + */ + public static Object uncompressProperty(byte[] grpprl, Object parent, StyleSheet styleSheet, boolean doIstd) + { + Object newProperty = null; + int offset = 0; + int propertyType = PAP_TYPE; + + + if(parent instanceof ParagraphProperties) + { + try + { + newProperty = ((ParagraphProperties)parent).clone(); + } + catch(Exception e){} + if(doIstd) + { + ((ParagraphProperties)newProperty).setIstd(LittleEndian.getShort(grpprl, 0)); + + offset = 2; + } + } + else if(parent instanceof CharacterProperties) + { + try + { + newProperty = ((CharacterProperties)parent).clone(); + ((CharacterProperties)newProperty).setBaseIstd(((CharacterProperties)parent).getIstd()); + } + catch(Exception e){} + propertyType = CHP_TYPE; + } + else if(parent instanceof SectionProperties) + { + newProperty = parent; + propertyType = SEP_TYPE; + } + else if(parent instanceof TableProperties) + { + newProperty = parent; + propertyType = TAP_TYPE; + offset = 2;//because this is really just a papx + } + else + { + return null; + } + + while(offset < grpprl.length) + { + short sprm = LittleEndian.getShort(grpprl, offset); + offset += 2; + + byte spra = (byte)((sprm & 0xe000) >> 13); + int opSize = 0; + int param = 0; + byte[] varParam = null; + + switch(spra) + { + case 0: + case 1: + opSize = 1; + param = grpprl[offset]; + break; + case 2: + opSize = 2; + param = LittleEndian.getShort(grpprl, offset); + break; + case 3: + opSize = 4; + param = LittleEndian.getInt(grpprl, offset); + break; + case 4: + case 5: + opSize = 2; + param = LittleEndian.getShort(grpprl, offset); + break; + case 6://variable size + + //there is one sprm that is a very special case + if(sprm != (short)0xd608) + { + opSize = LittleEndian.getUnsignedByte(grpprl, offset); + offset++; + } + else + { + opSize = LittleEndian.getShort(grpprl, offset) - 1; + offset += 2; + } + varParam = new byte[opSize]; + System.arraycopy(grpprl, offset, varParam, 0, opSize); + + break; + case 7: + opSize = 3; + byte threeByteInt[] = new byte[4]; + threeByteInt[0] = grpprl[offset]; + threeByteInt[1] = grpprl[offset + 1]; + threeByteInt[2] = grpprl[offset + 2]; + threeByteInt[3] = (byte)0; + param = LittleEndian.getInt(threeByteInt, 0); + break; + default: + throw new RuntimeException("unrecognized pap opcode"); + } + + offset += opSize; + short operand = (short)(sprm & 0x1ff); + byte type = (byte)((sprm & 0x1c00) >> 10); + switch(propertyType) + { + case PAP_TYPE: + if(type == 1)//papx stores TAP sprms along with PAP sprms + { + doPAPOperation((ParagraphProperties)newProperty, operand, + param, varParam, grpprl, + offset, spra); + } + break; + case CHP_TYPE: + + doCHPOperation((CharacterProperties)parent, + (CharacterProperties)newProperty, + operand, param, varParam, + grpprl, offset, styleSheet); + break; + case SEP_TYPE: + + doSEPOperation((SectionProperties)newProperty, operand, param, varParam); + break; + case TAP_TYPE: + if(type == 5) + { + doTAPOperation((TableProperties)newProperty, operand, param, varParam); + } + break; + } + + + } + return newProperty; + + } + /** + * 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 doPAPOperation(ParagraphProperties newPAP, int operand, int param, + byte[] varParam, byte[] grpprl, int offset, + int spra) + { + switch(operand) + { + case 0: + newPAP.setIstd(param); + break; + case 0x1: + //permuteIstd(newPAP, varParam); + break; + case 0x2: + if(newPAP.getIstd() <=9 || newPAP.getIstd() >=1) + { + newPAP.setIstd(newPAP.getIstd() + param); + if(param > 0) + { + newPAP.setIstd(Math.max(newPAP.getIstd(), 9)); + } + else + { + newPAP.setIstd(Math.min(newPAP.getIstd(), 1)); + } + } + break; + case 0x3: + newPAP.setJc((byte)param); + break; + case 0x4: + newPAP.setFSideBySide((byte)param); + break; + case 0x5: + newPAP.setFKeep((byte)param); + break; + case 0x6: + newPAP.setFKeepFollow((byte)param); + break; + case 0x7: + newPAP.setFPageBreakBefore((byte)param); + break; + case 0x8: + newPAP.setBrcl((byte)param); + break; + case 0x9: + newPAP.setBrcp((byte)param); + break; + case 0xa: + newPAP.setIlvl((byte)param); + break; + case 0xb: + newPAP.setIlfo(param); + break; + case 0xc: + newPAP.setFNoLnn((byte)param); + break; + case 0xd: + /**@todo handle tabs*/ + break; + case 0xe: + newPAP.setDxaRight(param); + break; + case 0xf: + newPAP.setDxaLeft(param); + break; + case 0x10: + newPAP.setDxaLeft(newPAP.getDxaLeft() + param); + newPAP.setDxaLeft(Math.max(0, newPAP.getDxaLeft())); + break; + case 0x11: + newPAP.setDxaLeft1(param); + break; + case 0x12: + short[] lspd = newPAP.getLspd(); + lspd[0] = LittleEndian.getShort(grpprl, offset - 4); + lspd[1] = LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x13: + newPAP.setDyaBefore(param); + break; + case 0x14: + newPAP.setDyaAfter(param); + break; + case 0x15: + /**@todo handle tabs*/ + break; + case 0x16: + newPAP.setFInTable((byte)param); + break; + case 0x17: + newPAP.setFTtp((byte)param); + break; + case 0x18: + newPAP.setDxaAbs(param); + break; + case 0x19: + newPAP.setDyaAbs(param); + break; + case 0x1a: + newPAP.setDxaWidth(param); + break; + case 0x1b: + /** @todo handle paragraph postioning*/ + /*byte pcVert = (param & 0x0c) >> 2; + byte pcHorz = param & 0x03; + if(pcVert != 3) + { + newPAP._pcVert = pcVert; + } + if(pcHorz != 3) + { + newPAP._pcHorz = pcHorz; + }*/ + break; + 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(param); + break; + case 0x23: + newPAP.setWr((byte)param); + break; + case 0x24: + short[] brcTop = newPAP.getBrcTop(); + brcTop[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcTop[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x25: + short[] brcLeft = newPAP.getBrcLeft(); + brcLeft[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcLeft[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x26: + short[] brcBottom = newPAP.getBrcBottom(); + brcBottom[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcBottom[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x27: + short[] brcRight = newPAP.getBrcRight(); + brcRight[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcRight[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x28: + short[] brcBetween = newPAP.getBrcBetween(); + brcBetween[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcBetween[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x29: + short[] brcBar = newPAP.getBrcBar(); + brcBar[0] = (short)LittleEndian.getShort(grpprl, offset - 4); + brcBar[1] = (short)LittleEndian.getShort(grpprl, offset - 2); + break; + case 0x2a: + newPAP.setFNoAutoHyph((byte)param); + break; + case 0x2b: + newPAP.setDyaHeight(param); + break; + case 0x2c: + newPAP.setDcs((short)param); + break; + case 0x2d: + newPAP.setShd((short)param); + break; + case 0x2e: + newPAP.setDyaFromText(param); + break; + case 0x2f: + newPAP.setDxaFromText(param); + break; + case 0x30: + newPAP.setFLocked((byte)param); + break; + case 0x31: + newPAP.setFWidowControl((byte)param); + break; + case 0x32: + //undocumented + break; + case 0x33: + newPAP.setFKinsoku((byte)param); + break; + case 0x34: + newPAP.setFWordWrap((byte)param); + break; + case 0x35: + newPAP.setFOverflowPunct((byte)param); + break; + case 0x36: + newPAP.setFTopLinePunct((byte)param); + break; + case 0x37: + newPAP.setFAutoSpaceDE((byte)param); + break; + case 0x38: + newPAP.setFAutoSpaceDN((byte)param); + break; + case 0x39: + newPAP.setWAlignFont(param); + break; + case 0x3a: + newPAP.setFontAlign((short)param); + break; + case 0x3b: + //obsolete + break; + case 0x3e: + newPAP.setAnld(varParam); + break; + case 0x3f: + //don't really need this. spec is confusing regarding this + //sprm + break; + case 0x40: + //newPAP._lvl = param; + break; + case 0x41: + //? + break; + case 0x43: + //? + break; + case 0x44: + //? + break; + case 0x45: + if(spra == 6) + { + newPAP.setNumrm(varParam); + } + else + { + /**@todo handle large PAPX from data stream*/ + } + break; + + case 0x47: + newPAP.setFUsePgsuSettings((byte)param); + break; + case 0x48: + newPAP.setFAdjustRight((byte)param); + break; + default: + break; + } + } + /** + * 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 doTAPOperation(TableProperties newTAP, int operand, int param, byte[] varParam) + { + switch(operand) + { + case 0: + newTAP.setJc((short)param); + break; + case 0x01: + { + short[] rgdxaCenter = newTAP.getRgdxaCenter(); + short itcMac = newTAP.getItcMac(); + int adjust = param - (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() - param; + rgdxaCenter[0] += adjust; + } + newTAP.setDxaGapHalf(param); + break; + } + case 0x03: + newTAP.setFCantSplit(getFlag(param)); + break; + case 0x04: + newTAP.setFTableHeader(getFlag(param)); + break; + case 0x05: + { + short[] brcTop = newTAP.getBrcTop(); + short[] brcLeft = newTAP.getBrcLeft(); + short[] brcBottom = newTAP.getBrcBottom(); + short[] brcRight = newTAP.getBrcRight(); + short[] brcVertical = newTAP.getBrcVertical(); + short[] brcHorizontal = newTAP.getBrcHorizontal(); + + brcTop[0] = LittleEndian.getShort(varParam, 0); + brcTop[1] = LittleEndian.getShort(varParam, 2); + + brcLeft[0] = LittleEndian.getShort(varParam, 4); + brcLeft[1] = LittleEndian.getShort(varParam, 6); + + brcBottom[0] = LittleEndian.getShort(varParam, 8); + brcBottom[1] = LittleEndian.getShort(varParam, 10); + + brcRight[0] = LittleEndian.getShort(varParam, 12); + brcRight[1] = LittleEndian.getShort(varParam, 14); + + brcHorizontal[0] = LittleEndian.getShort(varParam, 16); + brcHorizontal[1] = LittleEndian.getShort(varParam, 18); + + brcVertical[0] = LittleEndian.getShort(varParam, 20); + brcVertical[1] = LittleEndian.getShort(varParam, 22); + break; + } + case 0x06: + //obsolete, used in word 1.x + break; + case 0x07: + newTAP.setDyaRowHeight(param); + break; + case 0x08: + { + short[] rgdxaCenter = new short[varParam[0] + 1]; + TableCellDescriptor[] rgtc = new TableCellDescriptor[varParam[0]]; + short itcMac = varParam[0]; + //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(varParam , 1 + (x * 2)); + rgtc[x] = TableCellDescriptor.convertBytesToTC(varParam, 1 + ((itcMac + 1) * 2) + (x * 20)); + } + rgdxaCenter[itcMac] = LittleEndian.getShort(varParam , 1 + (itcMac * 2)); + break; + } + case 0x09: + /** @todo handle cell shading*/ + break; + case 0x0a: + /** @todo handle word defined table styles*/ + break; + case 0x20: + { + TCAbstractType[] 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; + } + case 0x21: + 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; + } + } + /** + * 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 doSEPOperation(SectionProperties newSEP, int operand, int param, byte[] varParam) + { + switch(operand) + { + case 0: + newSEP.setCnsPgn((byte)param); + break; + case 0x1: + newSEP.setIHeadingPgn((byte)param); + break; + case 0x2: + newSEP.setOlstAnm(varParam); + break; + case 0x3: + //not quite sure + break; + case 0x4: + //not quite sure + break; + case 0x5: + newSEP.setFEvenlySpaced(getFlag(param)); + break; + case 0x6: + newSEP.setFUnlocked(getFlag(param)); + break; + case 0x7: + newSEP.setDmBinFirst((short)param); + break; + case 0x8: + newSEP.setDmBinOther((short)param); + break; + case 0x9: + newSEP.setBkc((byte)param); + break; + case 0xa: + newSEP.setFTitlePage(getFlag(param)); + break; + case 0xb: + newSEP.setCcolM1((short)param); + break; + case 0xc: + newSEP.setDxaColumns(param); + break; + case 0xd: + newSEP.setFAutoPgn(getFlag(param)); + break; + case 0xe: + newSEP.setNfcPgn((byte)param); + break; + case 0xf: + newSEP.setDyaPgn((short)param); + break; + case 0x10: + newSEP.setDxaPgn((short)param); + break; + case 0x11: + newSEP.setFPgnRestart(getFlag(param)); + break; + case 0x12: + newSEP.setFEndNote(getFlag(param)); + break; + case 0x13: + newSEP.setLnc((byte)param); + break; + case 0x14: + newSEP.setGrpfIhdt((byte)param); + break; + case 0x15: + newSEP.setNLnnMod((short)param); + break; + case 0x16: + newSEP.setDxaLnn(param); + break; + case 0x17: + newSEP.setDyaHdrTop(param); + break; + case 0x18: + newSEP.setDyaHdrBottom(param); + break; + case 0x19: + newSEP.setFLBetween(getFlag(param)); + break; + case 0x1a: + newSEP.setVjc((byte)param); + break; + case 0x1b: + newSEP.setLnnMin((short)param); + break; + case 0x1c: + newSEP.setPgnStart((short)param); + break; + case 0x1d: + newSEP.setDmOrientPage((byte)param); + break; + case 0x1e: + //nothing + break; + case 0x1f: + newSEP.setXaPage(param); + break; + case 0x20: + newSEP.setYaPage(param); + break; + case 0x21: + newSEP.setDxaLeft(param); + break; + case 0x22: + newSEP.setDxaRight(param); + break; + case 0x23: + newSEP.setDyaTop(param); + break; + case 0x24: + newSEP.setDyaBottom(param); + break; + case 0x25: + newSEP.setDzaGutter(param); + break; + case 0x26: + newSEP.setDmPaperReq((short)param); + break; + case 0x27: + newSEP.setFPropMark(getFlag(varParam[0])); + break; + case 0x28: + break; + case 0x29: + break; + case 0x2a: + break; + case 0x2b: + short[] brcTop = newSEP.getBrcTop(); + brcTop[0] = (short)(param & 0xffff); + brcTop[1] = (short)((param & 0xffff0000) >> 16); + break; + case 0x2c: + short[] brcLeft = newSEP.getBrcLeft(); + brcLeft[0] = (short)(param & 0xffff); + brcLeft[1] = (short)((param & 0xffff0000) >> 16); + break; + case 0x2d: + short[] brcBottom = newSEP.getBrcBottom(); + brcBottom[0] = (short)(param & 0xffff); + brcBottom[1] = (short)((param & 0xffff0000) >> 16); + break; + case 0x2e: + short[] brcRight = newSEP.getBrcRight(); + brcRight[0] = (short)(param & 0xffff); + brcRight[1] = (short)((param & 0xffff0000) >> 16); + break; + case 0x2f: + newSEP.setPgbProp(param); + break; + case 0x30: + newSEP.setDxtCharSpace(param); + break; + case 0x31: + newSEP.setDyaLinePitch(param); + break; + case 0x33: + newSEP.setWTextFlow((short)param); + break; + default: + break; + } + + } /** * Converts an byte value into a boolean. The byte parameter can be 1,0, 128, * or 129. if it is 128, this function returns the same value as oldVal. If diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/TextPiece.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/TextPiece.java index 812fc4c01..d72ffa0aa 100644 --- a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/TextPiece.java +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/TextPiece.java @@ -66,7 +66,6 @@ public class TextPiece extends PropertyNode implements Comparable { private boolean _usesUnicode; private int _length; - private PieceDescriptor _pd; /** * @param start Offset in main document stream. @@ -74,11 +73,12 @@ public class TextPiece extends PropertyNode implements Comparable * does not necessarily refer to 1 byte. * @param unicode true if this text is unicode. */ - public TextPiece(int start, int end, byte[] text, PieceDescriptor pd) + public TextPiece(int start, int length, boolean unicode) { - super(start, end, text); - _usesUnicode = pd.isUnicode(); - _length = end - start; + super(start, start + length, null); + _usesUnicode = unicode; + _length = length; + } /** * @return If this text piece uses unicode @@ -87,9 +87,5 @@ public class TextPiece extends PropertyNode implements Comparable { return _usesUnicode; } - - public PieceDescriptor getPieceDescriptor() - { - return _pd; - } } +