/** * @param in the stream to read data from * @param cbFContinued the seconf short in the record header * @param cmoOt the Containing Obj's {@link CommonObjectDataSubRecord#field_1_objectType} */ public LbsDataSubRecord(ILittleEndianInput in1, int cbFContinued, int cmoOt) { _cbFContinued = cbFContinued; int encodedTokenLen = in1.ReadUShort(); if (encodedTokenLen > 0) { int formulaSize = in1.ReadUShort(); _unknownPreFormulaInt = in1.ReadInt(); Ptg[] ptgs = Ptg.ReadTokens(formulaSize, in1); if (ptgs.Length != 1) { throw new RecordFormatException("Read " + ptgs.Length + " tokens but expected exactly 1"); } _linkPtg = ptgs[0]; switch (encodedTokenLen - formulaSize - 6) { case 1: _unknownPostFormulaByte = (byte)in1.ReadByte(); break; case 0: _unknownPostFormulaByte = null; break; default: throw new RecordFormatException("Unexpected leftover bytes"); } } _cLines = in1.ReadUShort(); _iSel = in1.ReadUShort(); _flags = in1.ReadUShort(); _idEdit = in1.ReadUShort(); // From [MS-XLS].pdf 2.5.147 FtLbsData: // This field MUST exist if and only if the Containing Obj?s cmo.ot is equal to 0x14. if (cmoOt == 0x14) { _dropData = new LbsDropData(in1); } // From [MS-XLS].pdf 2.5.147 FtLbsData: // This array MUST exist if and only if the fValidPlex flag (0x2) is set if ((_flags & 0x2) != 0) { _rgLines = new String[_cLines]; for (int i = 0; i < _cLines; i++) { _rgLines[i] = StringUtil.ReadUnicodeString(in1); } } // bits 5-6 in the _flags specify the type // of selection behavior this list control is expected to support // From [MS-XLS].pdf 2.5.147 FtLbsData: // This array MUST exist if and only if the wListType field is not equal to 0. if (((_flags >> 4) & 0x2) != 0) { _bsels = new bool[_cLines]; for (int i = 0; i < _cLines; i++) { _bsels[i] = in1.ReadByte() == 1; } } }