package auctionsniper.ui; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; import auctionsniper.AuctionSniper; import auctionsniper.SniperListener; import auctionsniper.SniperSnapshot; import auctionsniper.SniperState; import auctionsniper.SniperPortfolio.PortfolioListener; import auctionsniper.util.Defect; public class SnipersTableModel extends AbstractTableModel implements SniperListener, PortfolioListener { private final static String[] STATUS_TEXT = { "Joining", "Bidding", "Winning", "Losing", "Lost", "Won", "Failed" }; private ArrayList<SniperSnapshot> snapshots = new ArrayList<SniperSnapshot>(); public int getColumnCount() { return Column.values().length; } public int getRowCount() { return snapshots.size(); } @Override public String getColumnName(int column) { return Column.at(column).name; } public Object getValueAt(int rowIndex, int columnIndex) { return Column.at(columnIndex).valueIn(snapshots.get(rowIndex)); } public static String textFor(SniperState state) { return STATUS_TEXT[state.ordinal()]; } public void sniperStateChanged(SniperSnapshot newSnapshot) { for (int i = 0; i < snapshots.size(); i++) { if (newSnapshot.isForSameItemAs(snapshots.get(i))) { snapshots.set(i, newSnapshot); fireTableRowsUpdated(i, i); return; } } throw new Defect("No existing Sniper state for " + newSnapshot.itemId); } public void sniperAdded(AuctionSniper sniper) { addSniperSnapshot(sniper.getSnapshot()); sniper.addSniperListener(new SwingThreadSniperListener(this)); } private void addSniperSnapshot(SniperSnapshot newSniper) { snapshots.add(newSniper); int row = snapshots.size() - 1; fireTableRowsInserted(row, row); } }