package cryodex.modules.destiny;
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 DestinyRankingTable extends JPanel {
private static final long serialVersionUID = 5587297504827909147L;
private JTable table;
private RankingTableModel model;
private final DestinyTournament tournament;
private JLabel title;
private JLabel statsLabel;
public DestinyRankingTable(DestinyTournament 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.getAllDestinyPlayers().size();
int active = tournament.getDestinyPlayers().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 NoCellSelectionRenderer());
table.setDefaultRenderer(Integer.class,
new NoCellSelectionRenderer());
table.getColumnModel().getColumn(0).setPreferredWidth(200);
NoCellSelectionRenderer centerRenderer = new NoCellSelectionRenderer();
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<DestinyPlayer>());
}
return model;
}
public void setPlayers(Set<DestinyPlayer> players) {
List<DestinyPlayer> playerList = new ArrayList<DestinyPlayer>();
playerList.addAll(players);
Collections.sort(playerList, new DestinyComparator(tournament,
DestinyComparator.rankingCompare));
if (this.isVisible() == false) {
this.setVisible(true);
}
getTableModel().setData(playerList);
CryodexController.saveData();
updateLabel();
}
public void resetPlayers() {
getTableModel().resetData();
CryodexController.saveData();
updateLabel();
}
private class RankingTableModel extends AbstractTableModel {
private static final long serialVersionUID = -1591431777250055477L;
private List<DestinyPlayer> data;
public RankingTableModel(List<DestinyPlayer> data) {
setData(data);
}
public void resetData() {
Collections.sort(data, new DestinyComparator(tournament,
DestinyComparator.rankingCompare));
this.fireTableDataChanged();
}
public void setData(List<DestinyPlayer> data) {
this.data = data;
Collections.sort(data, new DestinyComparator(tournament,
DestinyComparator.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 = "SoS";
break;
case 3:
value = "Ext 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) {
DestinyPlayer user = data.get(arg0);
Object value = null;
switch (arg1) {
case 0:
value = user.getPlayer().getName();
if (tournament.getDestinyPlayers().contains(user) == false) {
value = "(D#" + user.getRoundDropped(tournament) + ")"
+ value;
}
break;
case 1:
value = user.getScore(tournament);
break;
case 2:
value = user.getAverageSoS(tournament);
break;
case 3:
value = user.getExtendedStrengthOfSchedule(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;
}
}
}