/* * MoveTableModel.java * * Created on March 21, 2007, 5:20 PM * * This file is a part of Shoddy Battle. * Copyright (C) 2007 Catherine Fitzpatrick * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. */ package shoddybattleclient.utils; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.table.*; import java.util.*; import javax.swing.JButton; import shoddybattleclient.forms.TeamBuilderForm; import shoddybattleclient.shoddybattle.PokemonMove; import shoddybattleclient.utils.SortableJTable.SortableTableModel; /** * * @author Catherine * @author Ben */ public class MoveTableModel extends AbstractTableModel implements SortableTableModel { protected List<TableRow> m_row = new ArrayList<TableRow>(); private TeamBuilderForm m_parent = null; private int m_sortIndex = 1; private boolean m_sortReverse = false; public class TableRow { private String m_category; private String m_move; private String m_type; private Integer m_pp; private Integer m_power; private Integer m_accuracy; private JButton m_button; private Integer m_ppUps = 3; private boolean m_selected = false; private MoveTableModel m_model = null; public TableRow(String category, String move, String type, int pp, int power, int accuracy) { m_category = category; m_move = move; m_type = type; m_pp = new Integer(pp); m_power = new Integer(power); m_accuracy = new Integer(accuracy); m_button = new JButton("+"); m_button.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { m_model.selectMove(TableRow.this); } }); } public void setSelected(boolean selected) { m_selected = selected; m_button.setText(selected ? "-" : "+"); } public boolean equals(TableRow t2) { return m_move.equals(t2.m_move); } public boolean isSelected() { return m_selected; } public void addMouseListener(MouseListener m) { m_button.addMouseListener(m); } public String getMove() { return m_move; } } public static class SelectedMoveModel extends MoveTableModel { public SelectedMoveModel(TeamBuilderForm parent) { super(null, new String[0], parent); m_row = new ArrayList<TableRow>(); } @Override public boolean addMove(TableRow row) { if (m_row.size() >= 4) return false; boolean success = super.addMove(row); if (success) row.setSelected(true); return success; } @Override public Object getValueAt(int i, int j) { TableRow row = m_row.get(i); switch (j) { case 0: return row.m_button; case 1: return row.m_ppUps; default: return super.getValueAt(i, j - 1); } } public String getColumnName(int col) { switch (col) { case 0: return ""; case 1: return "PP Ups"; default: return super.getColumnName(col - 1); } } public int getColumnCount() { return super.getColumnCount() + 1; } public boolean isCellEditable(int i, int j) { return (j == 1); } public void setValueAt(Object value, int i, int j) { if (j == 1) { int ppUps; try { ppUps = Integer.parseInt(value.toString()); } catch (NumberFormatException e) { ppUps = 3; } if (ppUps < 0) ppUps = 0; else if (ppUps > 3) ppUps = 3; m_row.get(i).m_ppUps = ppUps; } } public String[] getMoves() { String[] ret = new String[m_row.size()]; for (int i = 0; i < m_row.size(); i++) { ret[i] = m_row.get(i).m_move; } return ret; } public int[] getPpUps() { int[] ret = new int[m_row.size()]; for (int i = 0; i < m_row.size(); i++) { ret[i] = m_row.get(i).m_ppUps; } return ret; } public void sort(final int col, boolean reverse) { if (col <= 1) { super.sort(1, reverse); } super.sort(col - 1, reverse); } public void clear() { m_row.clear(); fireTableDataChanged(); } } /** * Get a value from the table at (i, j). */ public Object getValueAt(int i, int j) { final TableRow row = m_row.get(i); switch (j) { case 0: return row.m_button; case 1: return row.m_move; case 2: return row.m_category; case 3: return row.m_type; case 4: return row.m_pp; case 5: return (row.m_power <= 1) ? "---" : row.m_power; case 6: return (row.m_accuracy == 0) ? "---" : row.m_accuracy; } assert false; return null; } public String getColumnName(int col) { switch (col) { case 0: return ""; case 1: return "Name"; case 2: return "Class"; case 3: return "Type"; case 4: return "PP"; case 5: return "Power"; case 6: return "Accuracy"; } assert false; return null; } public int getColumnCount() { return 7; } public int getRowCount() { return m_row.size(); } @Override public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public void setValueAt(Object value, int i, int j) { TableRow row = m_row.get(i); switch (j) { case 0: break; case 1: row.m_move = (String)value; break; case 2: row.m_category = (String)value; break; case 3: row.m_type = (String)value; break; case 4: row.m_pp = (Integer)value; break; case 5: row.m_power = (Integer)value; break; case 6: try { int acc = (Integer)value; row.m_accuracy = acc; } catch (Exception e) { row.m_accuracy = 0; } default: assert false; } fireTableCellUpdated(i, j); } /** * Creates a new instance of MoveTableModel */ public MoveTableModel(List<PokemonMove> moveList, String[] moves, TeamBuilderForm parent) { m_parent = parent; List<TableRow> list = new ArrayList<TableRow>(); HashSet<String> set = new HashSet<String>(); for (int i = 0; i < moves.length; i++) { if (set.contains(moves[i])) { continue; } PokemonMove m = getMove(moves[i], moveList); set.add(moves[i]); if (m == null) { continue; } TableRow row = new TableRow( m.damageClass, m.name, m.type, m.pp, m.power, m.accuracy); row.m_model = this; list.add(row); } Collections.sort(list, new Comparator<TableRow>() { public int compare(TableRow o1, TableRow o2) { TableRow t1 = (TableRow)o1; TableRow t2 = (TableRow)o2; return t1.m_move.compareToIgnoreCase(t2.m_move); } }); m_row = list; } protected void selectMove(TableRow row) { boolean success = m_parent.moveSelected(row); if (success) { m_row.remove(row); fireTableDataChanged(); } } public boolean addMove(final TableRow row) { if (m_row.contains(row)) return false; row.setSelected(false); row.m_model = this; m_row.add(row); sort(m_sortIndex, m_sortReverse); this.fireTableDataChanged(); return true; } // Finds a move in an ArrayList by name private PokemonMove getMove(String name, List<PokemonMove> moveList) { for (PokemonMove m : moveList) { if (m.name.equals(name)) { return m; } } return null; } public void sort(final int col, boolean reverse) { m_sortIndex = col; m_sortReverse = reverse; Collections.sort(m_row, new Comparator<TableRow>() { public int compare(TableRow t1, TableRow t2) { switch(col) { case 0: return 1; case 1: return t1.m_move.compareTo(t2.m_move); case 2: return t1.m_category.compareTo(t2.m_category); case 3: return t1.m_type.compareTo(t2.m_type); case 4: return -(t1.m_pp.compareTo(t2.m_pp)); case 5: return -(t1.m_power.compareTo(t2.m_power)); case 6: return -(t1.m_accuracy.compareTo(t2.m_accuracy)); } assert false; return 0; } }); if (reverse) Collections.reverse(m_row); } public void selectMoves(String[] moves, int[] ppUps) { List<TableRow> selected = new ArrayList<TableRow>(); for (int i = 0; i < moves.length; i++) { for (TableRow row: m_row) { if (row.m_move.equalsIgnoreCase(moves[i])) { row.m_ppUps = ppUps[i]; selected.add(row); } } } for (TableRow row : selected) { selectMove(row); } } }