package cryodex.modules.xwing; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Font; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import cryodex.CryodexController; import cryodex.widget.ComponentUtils; import cryodex.widget.TimerPanel; public class XWingRankingTable extends JPanel { private static final long serialVersionUID = 5587297504827909147L; private JTable table; private RankingTableModel model; private final XWingTournament tournament; private JLabel title; private JLabel statsLabel; private long lastResetTimestamp = 0; private long minResetWait = 1000; public XWingRankingTable(XWingTournament tournament) { super(new BorderLayout()); JScrollPane scrollPane = new JScrollPane(getTable()); ComponentUtils.forceSize(this, 400, 300); this.tournament = tournament; getTable().setFillsViewportHeight(true); updateLabel(); JPanel labelPanel = ComponentUtils.addToVerticalBorderLayout( getTitleLabel(), getStatsLabel(), null); labelPanel.setAlignmentX(Component.LEFT_ALIGNMENT); this.add(labelPanel, BorderLayout.NORTH); this.add(scrollPane, BorderLayout.CENTER); this.add(new TimerPanel(), BorderLayout.SOUTH); } private JLabel getStatsLabel() { if (statsLabel == null) { statsLabel = new JLabel(); } return statsLabel; } private JLabel getTitleLabel() { if (title == null) { title = new JLabel("Player Rankings"); title.setFont(new Font(title.getFont().getName(), title.getFont() .getStyle(), 20)); } return title; } public void updateLabel() { int total = tournament.getAllXWingPlayers().size(); int active = tournament.getXWingPlayers().size(); if (total == 0) { total = active; } int dropped = total - active; if (total == active) { getStatsLabel().setText("Total Players: " + total); } else { getStatsLabel().setText( "Total Players: " + total + " Active Players: " + active + " Dropped Players: " + dropped); } } private JTable getTable() { if (table == null) { table = new JTable(getTableModel()); table.setDefaultRenderer(Object.class, new RankingTableCellRenderer()); table.setDefaultRenderer(Integer.class, new RankingTableCellRenderer()); table.getColumnModel().getColumn(0).setPreferredWidth(200); RankingTableCellRenderer centerRenderer = new RankingTableCellRenderer(); centerRenderer.setHorizontalAlignment(JLabel.CENTER); table.getColumnModel().getColumn(1).setCellRenderer(centerRenderer); table.getColumnModel().getColumn(2).setCellRenderer(centerRenderer); table.getColumnModel().getColumn(3).setCellRenderer(centerRenderer); table.getColumnModel().getColumn(4).setCellRenderer(centerRenderer); table.getColumnModel().getColumn(5).setCellRenderer(centerRenderer); } return table; } private RankingTableModel getTableModel() { if (model == null) { model = new RankingTableModel(new ArrayList<XWingPlayer>()); } return model; } public void setPlayers(Set<XWingPlayer> players) { List<XWingPlayer> playerList = new ArrayList<XWingPlayer>(); playerList.addAll(players); Collections.sort(playerList, new XWingComparator(tournament, XWingComparator.rankingCompare)); if (this.isVisible() == false) { this.setVisible(true); } getTableModel().setData(playerList); CryodexController.saveData(); updateLabel(); } public void resetPlayers() { //This prevents multiple resets. Need a more permanent solution. if(System.currentTimeMillis() - lastResetTimestamp > minResetWait){ getTableModel().resetData(); updateLabel(); lastResetTimestamp = System.currentTimeMillis(); } } public class RankingTableCellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); // Working on adding color to the top 4/8/16 for easy visualization // if(row < 4){ // c.setBackground(Color.cyan); // } else if(row < 8){ // c.setBackground(Color.green); // } else if(row < 16){ // c.setBackground(Color.yellow); // } else if(row < 32){ // c.setBackground(Color.red.brighter()); // } // if(row % 2 == 1){ // c.setBackground(c.getBackground().darker()); // } // c.setForeground(Color.black); setBorder(noFocusBorder); return c; } } private class RankingTableModel extends AbstractTableModel { private static final long serialVersionUID = -1591431777250055477L; private List<XWingPlayer> data; public RankingTableModel(List<XWingPlayer> data) { setData(data); } public void resetData() { Collections.sort(data, new XWingComparator(tournament, XWingComparator.rankingCompare)); this.fireTableDataChanged(); } public void setData(List<XWingPlayer> data) { this.data = data; Collections.sort(data, new XWingComparator(tournament, XWingComparator.rankingCompare)); this.fireTableDataChanged(); } @Override public String getColumnName(int column) { String value = null; switch (column) { case 0: value = "Name"; break; case 1: value = "Score"; break; case 2: value = "MoV"; break; case 3: value = "SoS"; break; case 4: value = "Record"; break; case 5: value = "Byes"; break; } return value; } @Override public int getColumnCount() { return 6; } @Override public int getRowCount() { return data.size(); } @Override public Object getValueAt(int arg0, int arg1) { XWingPlayer user = data.get(arg0); Object value = null; switch (arg1) { case 0: value = ". " + user.getPlayer().getName(); if (tournament.getXWingPlayers().contains(user) == false) { value = ". (D#" + user.getRoundDropped(tournament) + ")" + value; } value = "" + (arg0+1) + value; break; case 1: value = user.getScore(tournament); break; case 2: value = user.getMarginOfVictory(tournament); break; case 3: value = user.getAverageSoS(tournament); break; case 4: value = user.getWins(tournament) + " / " + user.getLosses(tournament); break; case 5: value = user.getByes(tournament); break; } return value; } } public class NoCellSelectionRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setBorder(noFocusBorder); return this; } } }