// 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.vef;
import java.nio.ByteBuffer;
import javax.swing.JComponent;
import org.infinity.datatype.SectionCount;
import org.infinity.datatype.SectionOffset;
import org.infinity.datatype.TextString;
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.AddRemovable;
import org.infinity.resource.HasAddRemovable;
import org.infinity.resource.HasViewerTabs;
import org.infinity.resource.Resource;
import org.infinity.resource.StructEntry;
import org.infinity.resource.key.ResourceEntry;
public final class VefResource extends AbstractStruct implements Resource, HasAddRemovable, HasViewerTabs
{
// VEF-specific field labels
public static final String VEF_OFFSET_COMPONENT_PRI = "Primary component offset";
public static final String VEF_NUM_COMPONENT_PRI = "Primary component count";
public static final String VEF_OFFSET_COMPONENT_SEC = "Secondary component offset";
public static final String VEF_NUM_COMPONENT_SEC = "Secondary component count";
private StructHexViewer hexViewer;
public VefResource(ResourceEntry entry) throws Exception
{
super(entry);
}
// --------------------- Begin Interface HasAddRemovable ---------------------
@Override
public AddRemovable[] getAddRemovables() throws Exception
{
return new AddRemovable[]{new PrimaryComponent(), new SecondaryComponent()};
}
@Override
public AddRemovable confirmAddEntry(AddRemovable entry) throws Exception
{
return entry;
}
@Override
public boolean confirmRemoveEntry(AddRemovable entry) throws Exception
{
return true;
}
// --------------------- End Interface HasAddRemovable ---------------------
//--------------------- 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) {
hexViewer = new StructHexViewer(this, new BasicColorMap(this, true));
}
return hexViewer;
}
@Override
public boolean viewerTabAddedBefore(int index)
{
return false;
}
//--------------------- End Interface HasViewerTabs ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
addField(new TextString(buffer, offset, 4, COMMON_SIGNATURE));
addField(new TextString(buffer, offset + 4, 4, COMMON_VERSION));
SectionOffset offset_component1 = new SectionOffset(buffer, offset + 8, VEF_OFFSET_COMPONENT_PRI,
PrimaryComponent.class);
addField(offset_component1);
SectionCount count_component1 = new SectionCount(buffer, offset + 12, 4, VEF_NUM_COMPONENT_PRI,
PrimaryComponent.class);
addField(count_component1);
SectionOffset offset_component2 = new SectionOffset(buffer, offset + 16, VEF_OFFSET_COMPONENT_SEC,
SecondaryComponent.class);
addField(offset_component2);
SectionCount count_component2 = new SectionCount(buffer, offset + 20, 4, VEF_NUM_COMPONENT_SEC,
SecondaryComponent.class);
addField(count_component2);
offset = offset_component1.getValue();
for (int i = 0; i < count_component1.getValue(); i++) {
PrimaryComponent comp1 = new PrimaryComponent(this, buffer, offset, i);
offset = comp1.getEndOffset();
addField(comp1);
}
offset = offset_component2.getValue();
for (int i = 0; i < count_component2.getValue(); i++) {
SecondaryComponent comp2 = new SecondaryComponent(this, buffer, offset, i);
offset = comp2.getEndOffset();
addField(comp2);
}
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);
}
@Override
protected void datatypeAdded(AddRemovable datatype)
{
if (hexViewer != null) {
hexViewer.dataModified();
}
}
@Override
protected void datatypeAddedInChild(AbstractStruct child, AddRemovable datatype)
{
super.datatypeAddedInChild(child, datatype);
if (hexViewer != null) {
hexViewer.dataModified();
}
}
@Override
protected void datatypeRemoved(AddRemovable datatype)
{
if (hexViewer != null) {
hexViewer.dataModified();
}
}
@Override
protected void datatypeRemovedInChild(AbstractStruct child, AddRemovable datatype)
{
super.datatypeRemovedInChild(child, datatype);
if (hexViewer != null) {
hexViewer.dataModified();
}
}
}