package org.openntf.domino.nsfdata.structs.cd; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.openntf.domino.nsfdata.NSFCompiledFormula; import org.openntf.domino.nsfdata.structs.FONTID; import org.openntf.domino.nsfdata.structs.LIST; import org.openntf.domino.nsfdata.structs.NFMT; import org.openntf.domino.nsfdata.structs.ODSUtils; import org.openntf.domino.nsfdata.structs.SIG; import org.openntf.domino.nsfdata.structs.TFMT; import org.openntf.domino.nsfdata.structs.WSIG; /** * This defines the structure of a CDFIELD record in the $Body item of a form note. Each CDFIELD record defines the attributes of one field * in the form. (editods.h) * */ public class CDFIELD extends CDRecord { public final WSIG Header = inner(new WSIG()); /** * Use getFlags for access. */ @Deprecated public final Unsigned16 Flags = new Unsigned16(); // TODO make enum - this is weirder than it seems at first blush // public final Enum16<FieldType> DataType = new Enum16<FieldType>(FieldType.values()); public final Unsigned16 DataType = new Unsigned16(); /** * Use getListDelim for access. */ @Deprecated public final Unsigned16 ListDelim = new Unsigned16(); public final NFMT NumberFormat = inner(new NFMT()); public final TFMT TimeFormat = inner(new TFMT()); public final FONTID FontID = inner(new FONTID()); public final Unsigned16 DVLength = new Unsigned16(); public final Unsigned16 ITLength = new Unsigned16(); public final Unsigned16 TabOrder = new Unsigned16(); public final Unsigned16 IVLength = new Unsigned16(); public final Unsigned16 NameLength = new Unsigned16(); public final Unsigned16 DescLength = new Unsigned16(); public final Unsigned16 TextValueLength = new Unsigned16(); static { addVariableData("DV", "DVLength"); addVariableData("IT", "ITLength"); addVariableData("IV", "IVLength"); addVariableString("Name", "NameLength"); addVariableString("Desc", "DescLength"); } @Override public SIG getHeader() { return Header; } public Set<FieldFlag> getFlags() { return FieldFlag.valuesOf((short) Flags.get()); } public Set<ListDelimiter> getListDelim() { // TODO make this properly distinguish between display and input formats return ListDelimiter.valuesOf((short) ListDelim.get()); } public NSFCompiledFormula getDefaultValueFormula() { int length = DVLength.get(); if (length > 0) { return new NSFCompiledFormula((byte[]) getVariableElement("DV")); } else { return null; } } public NSFCompiledFormula getInputTranslationFormula() { int length = ITLength.get(); if (length > 0) { return new NSFCompiledFormula((byte[]) getVariableElement("IT")); } else { return null; } } public NSFCompiledFormula getInputValidationFormula() { int length = IVLength.get(); if (length > 0) { return new NSFCompiledFormula((byte[]) getVariableElement("IV")); } else { return null; } } public String getItemName() { return (String) getVariableElement("Name"); } public String getDescription() { return (String) getVariableElement("Desc"); } /** * @return For non-keyword fields, null; for static-keyword fields, a List<String>; for formula-keyword fields, an NSFCompiledFormula */ public Object getTextValues() { int totalLength = TextValueLength.get(); if (totalLength > 0) { // TODO see how this works with actual values int preceding = DVLength.get() + ITLength.get() + IVLength.get() + (NameLength.get() & 0xFFFF) + DescLength.get(); ByteBuffer data = getData().duplicate(); data.order(ByteOrder.LITTLE_ENDIAN); data.position(data.position() + 32 + preceding); data.limit(data.position() + 2); LIST list = new LIST(); list.init(data); int listEntries = list.ListEntries.get(); data = getData().duplicate(); data.order(ByteOrder.LITTLE_ENDIAN); data.position(data.position() + 32 + preceding + 2); if (listEntries == 0 && totalLength > 2) { return new NSFCompiledFormula(data); } else { List<String> result = new ArrayList<String>(listEntries); short[] lengths = new short[listEntries]; for (int i = 0; i < listEntries; i++) { lengths[i] = data.getShort(); } for (int i = 0; i < listEntries; i++) { byte[] stringData = new byte[lengths[i]]; data.get(stringData); result.add(ODSUtils.fromLMBCS(stringData)); } return result; } } else { return null; } } // @Override // public String toString() { // return "[" + getClass().getSimpleName() + ": Flags=" + getFlags() + ", DataType=" + getDataType() + ", ListDelim=" + getListDelim() // + ", NumberFormat=" + getNumberFormat() + ", TimeFormat=" + getTimeFormat() + ", FontID=" + getFontId() + ", DVLength=" // + getDVLength() + ", ITLength=" + getITLength() + ", TabOrder=" + getTabOrder() + ", DefaultValueFormula=" // + getDefaultValueFormula() + ", InputTranslationFormula=" + getInputTranslationFormula() + ", InputValidationFormula=" // + getInputValidationFormula() + ", ItemName=" + getItemName() + ", Description=" + getDescription() + ", TextValues=" // + getTextValues() + "]"; // } }