// 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.wmp; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import javax.swing.JComponent; import javax.swing.JTabbedPane; import org.infinity.datatype.DecNumber; 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.HasViewerTabs; import org.infinity.resource.Resource; import org.infinity.resource.key.ResourceEntry; public final class WmpResource extends AbstractStruct implements Resource, HasViewerTabs { // WMP-specific field labels public static final String WMP_NUM_MAPS = "# maps"; public static final String WMP_OFFSET_MAPS = "Maps offset"; private StructHexViewer hexViewer; public WmpResource(ResourceEntry entry) throws Exception { super(entry); } // --------------------- Begin Interface HasViewerTabs --------------------- @Override public int getViewerTabCount() { return 2; } @Override public String getViewerTabName(int index) { switch (index) { case 0: return StructViewer.TAB_VIEW; case 1: return StructViewer.TAB_RAW; } return null; } @Override public JComponent getViewerTab(int index) { switch (index) { case 0: { JTabbedPane tabbedPane = new JTabbedPane(); int count = ((DecNumber)getAttribute(WMP_NUM_MAPS)).getValue(); for (int i = 0; i < count; i++) { MapEntry entry = (MapEntry)getAttribute(MapEntry.WMP_MAP + " " + i); tabbedPane.addTab(entry.getName(), entry.getViewerTab(0)); } return tabbedPane; } case 1: { if (hexViewer == null) { hexViewer = new StructHexViewer(this, new BasicColorMap(this, true)); } return hexViewer; } } return null; } @Override public boolean viewerTabAddedBefore(int index) { return (index == 0); } // --------------------- End Interface HasViewerTabs --------------------- // --------------------- Begin Interface Writeable --------------------- @Override public void write(OutputStream os) throws IOException { super.writeFlatList(os); } // --------------------- End Interface Writeable --------------------- @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)); SectionCount entry_count = new SectionCount(buffer, offset + 8, 4, WMP_NUM_MAPS, MapEntry.class); addField(entry_count); SectionOffset entry_offset = new SectionOffset(buffer, offset + 12, WMP_OFFSET_MAPS, MapEntry.class); addField(entry_offset); offset = entry_offset.getValue(); for (int i = 0; i < entry_count.getValue(); i++) { MapEntry entry = new MapEntry(this, buffer, offset, i); offset = entry.getEndOffset(); addField(entry); } return offset; } @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(); } } }