package apps.tiltyard; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.table.DefaultTableModel; import player.gamer.event.GamerCompletedMatchEvent; import player.gamer.event.GamerNewMatchEvent; import util.observer.Event; import util.observer.Observer; import apps.common.table.JZebraTable; /** * TiltyardEventsPanel is responsible for displaying information * about the matches that Tiltyard has played (and is currently * playing). It observes the currently running match, and renders * its information onto a JZebraTable. * * @author Sam Schreiber */ @SuppressWarnings("serial") public final class TiltyardEventsPanel extends JPanel implements Observer { private TiltyardEvent currentEvent; private final JZebraTable matchTable; public void setCurrentEvent(TiltyardEvent currentEvent) { this.currentEvent = currentEvent; updateAggregates(); } public TiltyardEventsPanel() { super(new GridBagLayout()); DefaultTableModel model = new DefaultTableModel(); model.addColumn("Game"); model.addColumn("Clocks"); model.addColumn("Status"); model.addColumn("Goal Summary"); model.addColumn("PC"); model.addColumn("TO"); model.addColumn("IM"); model.addColumn("CE"); matchTable = new JZebraTable(model) { @Override public boolean isCellEditable(int rowIndex, int colIndex) { return false; } }; matchTable.setShowHorizontalLines(true); matchTable.setShowVerticalLines(true); setColumnWidths(); model.addRow(new String[] { "", "", "", "", "", "", "", "", "" }); this.add(new JScrollPane(matchTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 5, 5)); } public void observe(Event event) { if (event instanceof GamerCompletedMatchEvent) { observe((GamerCompletedMatchEvent) event); } else if (event instanceof GamerNewMatchEvent) { observe((GamerNewMatchEvent) event); } } private void setColumnWidths() { matchTable.getColumnModel().getColumn(4).setPreferredWidth(1); matchTable.getColumnModel().getColumn(5).setPreferredWidth(1); matchTable.getColumnModel().getColumn(6).setPreferredWidth(1); matchTable.getColumnModel().getColumn(7).setPreferredWidth(1); } private void observe(GamerCompletedMatchEvent event) { DefaultTableModel model = (DefaultTableModel) matchTable.getModel(); model.setValueAt(currentEvent.gameName, model.getRowCount() - 1, 0); model.setValueAt("(" + currentEvent.startClock + ", " + currentEvent.playClock + ")", model.getRowCount() - 1, 1); model.setValueAt(currentEvent.theStatus, model.getRowCount() - 1, 2); model.setValueAt(currentEvent.getGoalString(), model.getRowCount() - 1, 3); model.setValueAt(currentEvent.moveCount, model.getRowCount() - 1, 4); model.setValueAt(currentEvent.errorCount_Timeouts, model.getRowCount() - 1, 5); model.setValueAt(currentEvent.errorCount_IllegalMoves, model.getRowCount() - 1, 6); model.setValueAt(currentEvent.errorCount_ConnectionErrors, model.getRowCount() - 1, 7); // This is a pretty simple heuristic to estimate which players // won a particular match, based on the goal values. Still, it // seems to work pretty well. if(currentEvent.latestGoals != null) { boolean wasTie = true; for(int i = 0; i < currentEvent.numPlayers; i++) { int nGoal = currentEvent.latestGoals.get(i); if(nGoal > 75) { wasTie = false; totalWins.set(i, totalWins.get(i) + 1); } } if(wasTie) { totalTies++; } updateAggregates(); } setColumnWidths(); } private void observe(GamerNewMatchEvent event) { DefaultTableModel model = (DefaultTableModel) matchTable.getModel(); model.addRow(new String[] { "", "", "", "", "", "", "", "", "" }); setColumnWidths(); } private List<Integer> totalWins = null; private int totalTies = 0; private void updateAggregates() { if(totalWins == null) { totalWins = new ArrayList<Integer>(); for(int i = 0; i < currentEvent.numPlayers; i++) totalWins.add(0); } DefaultTableModel model = (DefaultTableModel) matchTable.getModel(); for(int i = 0; i < currentEvent.numPlayers; i++) { if(i < 4) { model.setValueAt("Player " + (i+1) + " Wins: " + totalWins.get(i), 0, i); } else { model.setValueAt("P" + (i+1) + " Wins: " + totalWins.get(i), 0, i); } } model.setValueAt("Ties: " + totalTies, 0, currentEvent.numPlayers); setColumnWidths(); } }