Return-Path: Delivered-To: apmail-jakarta-poi-dev-archive@www.apache.org Received: (qmail 9848 invoked from network); 10 Nov 2003 11:51:12 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 10 Nov 2003 11:51:12 -0000 Received: (qmail 13731 invoked by uid 500); 10 Nov 2003 11:51:10 -0000 Delivered-To: apmail-jakarta-poi-dev-archive@jakarta.apache.org Received: (qmail 13709 invoked by uid 500); 10 Nov 2003 11:51:09 -0000 Mailing-List: contact poi-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "POI Developers List" Reply-To: "POI Developers List" Delivered-To: mailing list poi-dev@jakarta.apache.org Received: (qmail 13691 invoked by uid 500); 10 Nov 2003 11:51:09 -0000 Received: (qmail 13688 invoked from network); 10 Nov 2003 11:51:09 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 10 Nov 2003 11:51:09 -0000 Received: (qmail 9839 invoked by uid 1477); 10 Nov 2003 11:51:09 -0000 Date: 10 Nov 2003 11:51:09 -0000 Message-ID: <20031110115109.9838.qmail@minotaur.apache.org> From: sackley@apache.org To: jakarta-poi-cvs@apache.org Subject: cvs commit: jakarta-poi/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes StyleSheet.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N sackley 2003/11/10 03:51:09 Modified: src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes StyleSheet.java Log: latest changes...still not working though! Revision Changes Path 1.4 +72 -1367 jakarta-poi/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleSheet.java Index: StyleSheet.java =================================================================== RCS file: /home/cvs/jakarta-poi/src/scratchpad/src/org/apache/poi/hwpf/model/hdftypes/StyleSheet.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- StyleSheet.java 15 Jul 2003 03:22:53 -0000 1.3 +++ StyleSheet.java 10 Nov 2003 11:51:09 -0000 1.4 @@ -62,7 +62,10 @@ 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.hwpf.usermodel.CharacterProperties; +import org.apache.poi.hwpf.usermodel.ParagraphProperties; +import org.apache.poi.hwpf.sprm.ParagraphSprmUncompressor; +import org.apache.poi.hwpf.sprm.CharacterSprmUncompressor; /** * Represents a document's stylesheet. A word documents formatting is stored as @@ -91,7 +94,6 @@ private int _stylenameVersion; private int[] _rgftc; - StyleDescription _nilStyle = new StyleDescription(); StyleDescription[] _styleDescriptions; /** @@ -126,11 +128,10 @@ _rgftc[2] = LittleEndian.getShort(tableStream, offset); offset += LittleEndian.SHORT_SIZE; - //offset = (2 + _stshiLength); + offset = (LittleEndian.SHORT_SIZE + _stshiLength); _styleDescriptions = new StyleDescription[stdCount]; for(int x = 0; x < stdCount; x++) { - int stdSize = LittleEndian.getShort(tableStream, offset); //get past the size offset += 2; @@ -151,8 +152,8 @@ { if(_styleDescriptions[x] != null) { -// createPap(x); -// createChp(x); + createPap(x); + createChp(x); } } } @@ -244,1381 +245,85 @@ * @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); -// } -// } - - /** - * Gets the StyleDescription at index x. - * - * @param x the index of the desired StyleDescription. - */ - public StyleDescription getStyleDescription(int x) + private void createPap(int istd) { - return _styleDescriptions[x]; - } + StyleDescription sd = _styleDescriptions[istd]; + ParagraphProperties pap = sd.getPAP(); + byte[] papx = sd.getPAPX(); + int baseIndex = sd.getBaseStyle(); + if(pap == null && papx != null) + { + ParagraphProperties parentPAP = new ParagraphProperties(); + if(baseIndex != NIL_STYLE) + { -// /** -// * 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; -// } -// } + parentPAP = _styleDescriptions[baseIndex].getPAP(); + if(parentPAP == null) + { + createPap(baseIndex); + parentPAP = _styleDescriptions[baseIndex].getPAP(); + } + } + + pap = (ParagraphProperties)ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2); + sd.setPAP(pap); + } + } /** - * 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) -// { -// 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; -// } -// -// } - /** - * 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 - * it is 129, this function returns !oldVal. This is used for certain sprms + * 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 x The byte value to convert. - * @param oldVal The old boolean value. - * - * @return A boolean whose value depends on x and oldVal. + * @param istd The index of the StyleDescription to create the + * CharacterProperties object from. */ - private static boolean getCHPFlag(byte x, boolean oldVal) + private void createChp(int istd) { - switch(x) + StyleDescription sd = _styleDescriptions[istd]; + CharacterProperties chp = sd.getCHP(); + byte[] chpx = sd.getCHPX(); + int baseIndex = sd.getBaseStyle(); + if(chp == null && chpx != null) { - case 0: - return false; - case 1: - return true; - case (byte)0x80: - return oldVal; - case (byte)0x81: - return !oldVal; - default: - return false; + CharacterProperties parentCHP = new CharacterProperties(); + if(baseIndex != NIL_STYLE) + { + + parentCHP = _styleDescriptions[baseIndex].getCHP(); + if(parentCHP == null) + { + createChp(baseIndex); + parentCHP = _styleDescriptions[baseIndex].getCHP(); + } + + } + + chp = (CharacterProperties)CharacterSprmUncompressor.uncompressCHP(parentCHP, chpx, 0); + sd.setCHP(chp); } } /** - * Converts an int into a boolean. If the int is non-zero, it returns true. - * Otherwise it returns false. - * - * @param x The int to convert. + * Gets the StyleDescription at index x. * - * @return A boolean whose value depends on x. + * @param x the index of the desired StyleDescription. */ - public static boolean getFlag(int x) + public StyleDescription getStyleDescription(int x) { - if(x != 0) - { - return true; - } - else - { - return false; - } + return _styleDescriptions[x]; } + + public CharacterProperties getCharacterStyle(int x) + { + return (_styleDescriptions[x] != null ? _styleDescriptions[x].getCHP() : null); + } + + public ParagraphProperties getParagraphStyle(int x) + { + return (_styleDescriptions[x] != null ? _styleDescriptions[x].getPAP() : null); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org For additional commands, e-mail: poi-dev-help@jakarta.apache.org