// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.datatype;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import org.infinity.gui.StructViewer;
import org.infinity.gui.TextListPanel;
import org.infinity.icon.Icons;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.StructEntry;
public class Bitmap extends Datatype implements Editable, IsNumeric
{
private final String[] table;
private TextListPanel list;
private int value;
public Bitmap(ByteBuffer buffer, int offset, int length, String name, String[] table)
{
this(null, buffer, offset, length, name, table);
}
public Bitmap(StructEntry parent, ByteBuffer buffer, int offset, int length, String name, String[] table)
{
super(parent, offset, length, name);
this.table = table;
read(buffer, offset);
}
// --------------------- Begin Interface Editable ---------------------
@Override
public JComponent edit(final ActionListener container)
{
if (list == null) {
List<String> values = new ArrayList<String>(Math.max(table.length, value + 1));
for (int i = 0; i < Math.max(table.length, value + 1); i++) {
values.add(toString(i));
}
list = new TextListPanel(values, false);
list.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
container.actionPerformed(new ActionEvent(this, 0, StructViewer.UPDATE_VALUE));
}
}
});
}
if (value >= 0 && value < list.getModel().getSize()) {
int index = 0;
while (!list.getModel().getElementAt(index).equals(toString(value))) {
index++;
}
list.setSelectedIndex(index);
}
JButton bUpdate = new JButton("Update value", Icons.getIcon(Icons.ICON_REFRESH_16));
bUpdate.addActionListener(container);
bUpdate.setActionCommand(StructViewer.UPDATE_VALUE);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel panel = new JPanel(gbl);
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(list, gbc);
panel.add(list);
gbc.weightx = 0.0;
gbc.fill = GridBagConstraints.NONE;
gbc.insets.left = 6;
gbl.setConstraints(bUpdate, gbc);
panel.add(bUpdate);
panel.setMinimumSize(DIM_MEDIUM);
panel.setPreferredSize(DIM_MEDIUM);
return panel;
}
@Override
public void select()
{
list.ensureIndexIsVisible(list.getSelectedIndex());
}
@Override
public boolean updateValue(AbstractStruct struct)
{
// updating value
String svalue = (String)list.getSelectedValue();
value = 0;
while (!svalue.equals(toString(value))) {
value++;
}
// notifying listeners
fireValueUpdated(new UpdateEvent(this, struct));
return true;
}
// --------------------- End Interface Editable ---------------------
// --------------------- Begin Interface Writeable ---------------------
@Override
public void write(OutputStream os) throws IOException
{
writeInt(os, value);
}
// --------------------- End Interface Writeable ---------------------
//--------------------- Begin Interface Readable ---------------------
@Override
public int read(ByteBuffer buffer, int offset)
{
buffer.position(offset);
switch (getSize()) {
case 1:
value = buffer.get();
break;
case 2:
value = buffer.getShort();
break;
case 4:
value = buffer.getInt();
break;
default:
throw new IllegalArgumentException();
}
return offset + getSize();
}
//--------------------- End Interface Readable ---------------------
//--------------------- Begin Interface IsNumeric ---------------------
@Override
public long getLongValue()
{
return (long)value & 0xffffffffL;
}
@Override
public int getValue()
{
return value;
}
//--------------------- End Interface IsNumeric ---------------------
@Override
public String toString()
{
return toString(value);
}
/** Returns the unformatted description of the specified value. */
protected String getString(int nr)
{
if (nr >= 0 && nr < table.length) {
return table[nr];
}
return null;
}
// Returns a formatted description of the specified value.
private String toString(int nr)
{
if (nr >= table.length) {
return "Unknown (" + nr + ')';
} else if (nr < 0) {
return "Error (" + nr + ')';
} else if (table[nr] == null || table[nr].equals("")) {
return "Unknown (" + nr + ')';
} else {
return new StringBuffer(table[nr]).append(" (").append(nr).append(')').toString();
}
}
}