// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.to;
import java.nio.ByteBuffer;
import javax.swing.JComponent;
import org.infinity.datatype.Unknown;
import org.infinity.gui.StructViewer;
import org.infinity.gui.hexview.BasicColorMap;
import org.infinity.gui.hexview.StructHexViewer;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.HasViewerTabs;
import org.infinity.resource.Resource;
import org.infinity.resource.StructEntry;
import org.infinity.resource.key.ResourceEntry;
public final class TotResource extends AbstractStruct implements Resource, HasViewerTabs
{
// TOT-specific field labels
public static final String TOT_EMPTY = "(empty)";
private StructHexViewer hexViewer;
public TotResource(ResourceEntry entry) throws Exception
{
super(entry);
}
//--------------------- Begin Interface HasViewerTabs ---------------------
@Override
public int getViewerTabCount()
{
return 1;
}
@Override
public String getViewerTabName(int index)
{
return StructViewer.TAB_RAW;
}
@Override
public JComponent getViewerTab(int index)
{
if (hexViewer == null) {
BasicColorMap colorMap = new BasicColorMap(this, false);
colorMap.setColoredEntry(BasicColorMap.Coloring.BLUE, StringEntry.class);
hexViewer = new StructHexViewer(this, colorMap);
}
return hexViewer;
}
@Override
public boolean viewerTabAddedBefore(int index)
{
return false;
}
//--------------------- End Interface HasViewerTabs ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
if (buffer != null && buffer.limit() > 0) {
// TODO: fetch number of valid string entries from associated TOH resource
for (int i = 0; offset + 524 <= buffer.limit(); i++) {
StringEntry entry = new StringEntry(this, buffer, offset, i);
offset = entry.getEndOffset();
addField(entry);
}
} else {
addField(new Unknown(buffer, offset, 0, TOT_EMPTY)); // Placeholder for empty structure
}
int endoffset = offset;
for (int i = 0; i < getFieldCount(); i++) {
StructEntry entry = getField(i);
if (entry.getOffset() + entry.getSize() > endoffset)
endoffset = entry.getOffset() + entry.getSize();
}
return endoffset;
}
@Override
protected void viewerInitialized(StructViewer viewer)
{
viewer.addTabChangeListener(hexViewer);
}
}