package org.openntf.domino.nsfdata.structs;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.List;
import org.openntf.domino.nsfdata.NSFCompiledFormula;
/**
* ViewFormat is a convenience class to wrap the components of a $VIEWFORMAT item
*
* @author jgallagher
*
*/
public class ViewFormat {
private VIEW_TABLE_FORMAT format_;
private VIEW_COLUMN_FORMAT[] columnFormats_;
private String[] itemNames_;
private NSFCompiledFormula[] formulas_;
private NSFCompiledFormula[] constantValues_;
private String[] columnTitles_;
private VIEW_TABLE_FORMAT2 format2_;
private VIEW_COLUMN_FORMAT2[] columnFormats2_;
private NSFCompiledFormula[] hideWhenFormulas_;
private String[] twistieResources_;
private VIEW_TABLE_FORMAT3 format3_;
public ViewFormat(final ByteBuffer data) {
ByteBuffer localData = data.duplicate().order(ByteOrder.LITTLE_ENDIAN);
// Read in the opening VIEW_TABLE_FORMAT
format_ = new VIEW_TABLE_FORMAT();
format_.init(localData);
localData.position(localData.position() + format_.size());
int columnCount = format_.Columns.get();
// Read in the array of VIEW_COLUMN_FORMATs
columnFormats_ = new VIEW_COLUMN_FORMAT[columnCount];
for (int i = 0; i < columnCount; i++) {
columnFormats_[i] = new VIEW_COLUMN_FORMAT();
ByteBuffer columnData = localData.duplicate();
columnData.limit(columnData.position() + columnFormats_[i].size());
columnFormats_[i].init(columnData);
localData.position(localData.position() + columnFormats_[i].size());
}
// Read in the item name, formula, and title pairs for each column
itemNames_ = new String[columnCount];
formulas_ = new NSFCompiledFormula[columnCount];
constantValues_ = new NSFCompiledFormula[columnCount];
columnTitles_ = new String[columnCount];
for (int i = 0; i < columnCount; i++) {
int itemNameSize = columnFormats_[i].ItemNameSize.get();
if (itemNameSize > 0) {
byte[] itemNameBytes = new byte[itemNameSize];
localData.get(itemNameBytes);
itemNames_[i] = ODSUtils.fromLMBCS(itemNameBytes);
} else {
itemNames_[i] = "";
}
int columnTitleSize = columnFormats_[i].TitleSize.get();
if (columnTitleSize > 0) {
byte[] columnTitleBytes = new byte[columnTitleSize];
localData.get(columnTitleBytes);
columnTitles_[i] = ODSUtils.fromLMBCS(columnTitleBytes);
} else {
columnTitles_[i] = "";
}
int formulaSize = columnFormats_[i].FormulaSize.get();
if (formulaSize > 0) {
byte[] formulaBytes = new byte[formulaSize];
localData.get(formulaBytes);
formulas_[i] = new NSFCompiledFormula(formulaBytes);
} else {
formulas_[i] = null;
}
int constantValueSize = columnFormats_[i].ConstantValueSize.get();
if (constantValueSize > 0) {
byte[] constantValueBytes = new byte[constantValueSize];
localData.get(constantValueBytes);
constantValues_[i] = new NSFCompiledFormula(constantValueBytes);
} else {
constantValues_[i] = null;
}
}
// VIEW_TABLE_FORMAT2 exists for views saved in Notes 2.0 and later
if (localData.hasRemaining()) {
format2_ = new VIEW_TABLE_FORMAT2();
format2_.init(localData);
localData.position(localData.position() + format2_.size());
} else {
format2_ = null;
}
// one VIEW_COLUMN_FORMAT2 for each column saved in Notes 4.0 and later
if (localData.hasRemaining()) {
columnFormats2_ = new VIEW_COLUMN_FORMAT2[columnCount];
for (int i = 0; i < columnCount; i++) {
columnFormats2_[i] = new VIEW_COLUMN_FORMAT2();
ByteBuffer columnData = localData.duplicate();
columnData.limit(columnData.position() + columnFormats2_[i].size());
columnFormats2_[i].init(columnData);
localData.position(localData.position() + columnFormats2_[i].size());
}
// Now read in their variable data
hideWhenFormulas_ = new NSFCompiledFormula[columnCount];
twistieResources_ = new String[columnCount];
for (int i = 0; i < columnCount; i++) {
int hideWhenFormulaSize = columnFormats2_[i].wHideWhenFormulaSize.get();
if (hideWhenFormulaSize > 0) {
byte[] hideWhenFormulaBytes = new byte[hideWhenFormulaSize];
localData.get(hideWhenFormulaBytes);
hideWhenFormulas_[i] = new NSFCompiledFormula(hideWhenFormulaBytes);
} else {
hideWhenFormulas_[i] = null;
}
int twistieResourceSize = columnFormats2_[i].wTwistieResourceSize.get();
if (twistieResourceSize > 0) {
byte[] twistieResourceBytes = new byte[twistieResourceSize];
localData.get(twistieResourceBytes);
twistieResources_[i] = ODSUtils.fromLMBCS(twistieResourceBytes);
} else {
twistieResources_[i] = "";
}
}
} else {
columnFormats2_ = new VIEW_COLUMN_FORMAT2[0];
hideWhenFormulas_ = new NSFCompiledFormula[0];
twistieResources_ = new String[0];
}
// one VIEW_COLUMN_FORMAT3 for each column saved in Notes 5.0 and later
// TODO Nifty 50 trleader.nsf view "TeamRoom Leader's Guide" has 8 bytes remaining at this point somehow
// if (localData.hasRemaining()) {
// System.out.println("remaining amount: " + localData.remaining());
// format3_ = new VIEW_TABLE_FORMAT3();
// format3_.init(localData);
// localData.position(localData.position() + format3_.size());
// }
}
public VIEW_TABLE_FORMAT getFormat() {
return format_;
}
public List<VIEW_COLUMN_FORMAT> getColumnFormats() {
return Arrays.asList(columnFormats_);
}
public List<String> getItemNames() {
return Arrays.asList(itemNames_);
}
public List<NSFCompiledFormula> getFormulas() {
return Arrays.asList(formulas_);
}
public List<NSFCompiledFormula> getConstantValues() {
return Arrays.asList(constantValues_);
}
public List<String> getColumnTitles() {
return Arrays.asList(columnTitles_);
}
public VIEW_TABLE_FORMAT2 getFormat2() {
return format2_;
}
public List<VIEW_COLUMN_FORMAT2> getColumnFormats2() {
return Arrays.asList(columnFormats2_);
}
public List<NSFCompiledFormula> getHideWhenFormulas() {
return Arrays.asList(hideWhenFormulas_);
}
public List<String> getTwistieResources() {
return Arrays.asList(twistieResources_);
}
public VIEW_TABLE_FORMAT3 getFormat3() {
return format3_;
}
}