// 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.cre;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.ResourceRef;
import org.infinity.gui.ToolTipTableCellRenderer;
import org.infinity.gui.ViewFrame;
import org.infinity.icon.Icons;
import org.infinity.resource.Resource;
import org.infinity.resource.ResourceFactory;
import org.infinity.resource.StructEntry;
final class ViewerSpells extends JPanel implements ActionListener
{
private final JButton bOpen = new JButton("View/Edit", Icons.getIcon(Icons.ICON_ZOOM_16));
private final JTable table;
private final MemSpellTableModel tableModel;
ViewerSpells(CreResource cre)
{
super(new BorderLayout(0, 3));
tableModel = new MemSpellTableModel(cre);
table = new JTable(tableModel);
table.setDefaultRenderer(Object.class, new ToolTipTableCellRenderer());
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().getColumn(0).setMaxWidth(45);
table.getColumnModel().getColumn(1).setMaxWidth(5);
table.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2 && table.getSelectedRowCount() == 1) {
ResourceRef ref = (ResourceRef)tableModel.getValueAt(table.getSelectedRow(), 2);
if (ref != null) {
Resource res = ResourceFactory.getResource(
ResourceFactory.getResourceEntry(ref.getResourceName()));
new ViewFrame(getTopLevelAncestor(), res);
}
}
}
});
table.getSelectionModel().setSelectionInterval(0, 0);
add(new JLabel("Memorized spells"), BorderLayout.NORTH);
add(new JScrollPane(table), BorderLayout.CENTER);
bOpen.addActionListener(this);
bOpen.setEnabled(tableModel.getRowCount() > 0);
add(bOpen, BorderLayout.SOUTH);
}
// --------------------- Begin Interface ActionListener ---------------------
@Override
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == bOpen) {
ResourceRef ref = (ResourceRef)tableModel.getValueAt(table.getSelectedRow(), 2);
if (ref != null) {
Resource res = ResourceFactory.getResource(
ResourceFactory.getResourceEntry(ref.getResourceName()));
new ViewFrame(getTopLevelAncestor(), res);
}
}
}
// --------------------- End Interface ActionListener ---------------------
// -------------------------- INNER CLASSES --------------------------
private static final class MemSpellTableModel extends AbstractTableModel implements TableModelListener
{
private final List<MemSpellTableEntry> list = new ArrayList<MemSpellTableEntry>();
private final CreResource cre;
private MemSpellTableModel(CreResource cre)
{
this.cre = cre;
updateTable();
cre.addTableModelListener(this);
}
private void updateTable()
{
list.clear();
for (int i = 0; i < cre.getFieldCount(); i++) {
StructEntry o = cre.getField(i);
if (o instanceof SpellMemorization) {
SpellMemorization inf = (SpellMemorization)o;
int lvl = ((DecNumber)inf.getAttribute(SpellMemorization.CRE_MEMORIZATION_LEVEL)).getValue();
for (int j = 0; j < inf.getFieldCount(); j++) {
StructEntry p = inf.getField(j);
if (p instanceof MemorizedSpells) {
MemorizedSpells spell = (MemorizedSpells)p;
addSpell(lvl, (ResourceRef)spell.getAttribute(MemorizedSpells.CRE_MEMORIZED_RESREF));
}
}
}
}
}
private void addSpell(int lvl, ResourceRef spell)
{
for (int i = 0; i < list.size(); i++) {
MemSpellTableEntry entry = list.get(i);
if (spell.getResourceName().equalsIgnoreCase(entry.spell.getResourceName())) {
entry.count++;
return;
}
}
MemSpellTableEntry entry = new MemSpellTableEntry(lvl, spell);
list.add(entry);
}
@Override
public void tableChanged(TableModelEvent e)
{
updateTable();
fireTableStructureChanged();
}
@Override
public int getRowCount()
{
return list.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
MemSpellTableEntry entry = list.get(rowIndex);
switch (columnIndex) {
case 0: return new Integer(entry.lvl + 1);
case 1: return new Integer(entry.count + 1);
default: return entry.spell;
}
}
@Override
public int getColumnCount()
{
return 3;
}
@Override
public String getColumnName(int column)
{
switch (column) {
case 0: return "Level";
case 1: return "#";
default: return "Spell";
}
}
}
private static final class MemSpellTableEntry
{
private final int lvl;
private int count;
private final ResourceRef spell;
private MemSpellTableEntry(int lvl, ResourceRef spell)
{
this.lvl = lvl;
this.spell = spell;
}
}
}