// 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.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import org.infinity.gui.StructViewer;
import org.infinity.icon.Icons;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.StructEntry;
import org.infinity.util.Misc;
import org.infinity.util.io.StreamUtils;
public final class TextBitmap extends Datatype implements Editable, IsTextual
{
private final String[] ids;
private final String[] names;
private JTable table;
private String text;
public TextBitmap(ByteBuffer buffer, int offset, int length, String name, String[] ids, String[] names)
{
this(null, buffer, offset, length, name, ids, names);
}
public TextBitmap(StructEntry parent, ByteBuffer buffer, int offset, int length, String name,
String[] ids, String[] names)
{
super(parent, offset, length, name);
read(buffer, offset);
this.ids = ids;
this.names = names;
}
// --------------------- Begin Interface Editable ---------------------
@Override
public JComponent edit(ActionListener container)
{
if (table == null) {
table = new JTable(new BitmapTableModel());
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setDragEnabled(false);
table.setTableHeader(null);
}
for (int i = 0; i < ids.length; i++) {
if (ids[i].equalsIgnoreCase(text)) {
table.getSelectionModel().setSelectionInterval(i, i);
}
}
JScrollPane scroll = new JScrollPane(table);
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(scroll, gbc);
panel.add(scroll);
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()
{
table.scrollRectToVisible(table.getCellRect(table.getSelectedRow(), 0, false));
}
@Override
public boolean updateValue(AbstractStruct struct)
{
int index = table.getSelectedRow();
if (index == -1) {
return false;
}
text = ids[index];
// notifying listeners
fireValueUpdated(new UpdateEvent(this, struct));
return true;
}
// --------------------- End Interface Editable ---------------------
// --------------------- Begin Interface Writeable ---------------------
@Override
public void write(OutputStream os) throws IOException
{
StreamUtils.writeString(os, text, getSize());
}
// --------------------- End Interface Writeable ---------------------
//--------------------- Begin Interface Readable ---------------------
@Override
public int read(ByteBuffer buffer, int offset)
{
buffer.position(offset);
text = StreamUtils.readString(buffer, getSize(), Misc.CHARSET_ASCII);
// filling missing characters with spaces
if (text.length() < getSize()) {
StringBuilder sb = new StringBuilder();
while (sb.length() < getSize() - text.length()) {
sb.append(' ');
}
text = text + sb.toString();
}
return offset + getSize();
}
//--------------------- End Interface Readable ---------------------
@Override
public String toString()
{
for (int i = 0; i < ids.length; i++)
if (ids[i].equalsIgnoreCase(text)) {
return text + " - " + names[i];
}
return text;
}
//--------------------- Begin Interface IsTextual ---------------------
/** Returns the unprocessed textual symbol of fixed number of characters. */
@Override
public String getText()
{
return text;
}
//--------------------- End Interface IsTextual ---------------------
/** Returns the textual description of the symbol. */
public String getDescription()
{
for (int i = 0; i < ids.length; i++) {
if (text.equals(ids[i])) {
if (i < names.length) {
return names[i];
} else {
break;
}
}
}
return "";
}
// -------------------------- INNER CLASSES --------------------------
private final class BitmapTableModel extends AbstractTableModel
{
private BitmapTableModel()
{
}
@Override
public int getRowCount()
{
return ids.length;
}
@Override
public int getColumnCount()
{
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
if (columnIndex == 0)
return ids[rowIndex];
return names[rowIndex];
}
}
}