From 2f49b346d1ccb044a365f352cd7c42f048cde163 Mon Sep 17 00:00:00 2001 From: Said Ryan Ackley Date: Mon, 9 Jun 2003 01:58:15 +0000 Subject: [PATCH] brought over from old code and converted. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353127 13f79535-47bb-0310-9956-ffa450edef68 --- .../hwpf/model/hdftypes/StyleDescription.java | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleDescription.java diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleDescription.java b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleDescription.java new file mode 100644 index 000000000..4fc63703a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleDescription.java @@ -0,0 +1,205 @@ + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + + +package org.apache.poi.hwpf.model.hdftypes; + +import java.io.UnsupportedEncodingException; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.BitField; +/** + * Comment me + * + * @author Ryan Ackley + */ + +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); + + byte[] _papx; + byte[] _chpx; + String _name; +// ParagraphProperties _pap; +// CharacterProperties _chp; + + public StyleDescription() + { +// _pap = new ParagraphProperties(); +// _chp = new CharacterProperties(); + } + public StyleDescription(byte[] std, int baseLength, int offset, 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; + + //first byte(s) of variable length section of std is the length of the + //style name and aliases string + int nameLength = 0; + int multiplier = 1; + if(word9) + { + nameLength = LittleEndian.getShort(std, nameStart); + multiplier = 2; + nameStart += LittleEndian.SHORT_SIZE; + } + else + { + nameLength = std[nameStart]; + } + + 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; + + // 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 upxSize = LittleEndian.getShort(std, grupxStart + add); + if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE) + { + if(x == 0) + { + _papx = new byte[upxSize]; + System.arraycopy(std, grupxStart + add + 2, _papx, 0, upxSize); + } + else if(x == 1) + { + _chpx = new byte[upxSize]; + System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize); + } + } + else if(_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE && x == 0) + { + _chpx = new byte[upxSize]; + System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize); + } + + // the upx will always start on a word boundary. + if(upxSize % 2 == 1) + { + ++upxSize; + } + add += 2 + upxSize; + } + + + } + public int getBaseStyle() + { + return _baseStyle.getValue(_infoShort2); + } + public byte[] getCHPX() + { + return _chpx; + } + public byte[] getPAPX() + { + 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; +// } +}