package magic.ui.screen.stats;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import magic.data.DeckType;
import magic.model.player.PlayerProfiles;
import magic.ui.MagicSound;
import magic.ui.ScreenController;
import magic.ui.helpers.ColorHelper;
import magic.ui.helpers.MouseHelper;
import magic.ui.widget.cards.table.CardsTableStyle;
import magic.utility.DeckUtils;
@SuppressWarnings("serial")
public class GameStatsJTable extends JTable {
private static final int ROW_HEIGHT = 20; // pixels
/*
Default cell renderer
*/
private static final DefaultTableCellRenderer defaultCellRenderer = new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final JComponent c = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBorder(noFocusBorder);
return c;
}
};
private static final Color GRID_COLOR = new Color(194, 197, 203);
private Color DEFAULT_GRID_COLOR;
private final TableColumnAdjuster tca;
public GameStatsJTable(TableModel dm) {
super(dm);
setDefaultProperties();
setDefaultColumnProperties();
setColumnRenderers();
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tca = new TableColumnAdjuster(this);
tca.adjustColumns();
setMouseListeners();
}
private void setMouseListeners() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent ev) {
int row = rowAtPoint(ev.getPoint());
int col = columnAtPoint(ev.getPoint());
if (col == 2 || col == 11) { // P1_ID, P2_ID
String guid = (String)getModel().getValueAt(row, col);
if (PlayerProfiles.getPlayerProfiles().get(guid) != null) {
MouseHelper.showBusyCursor(GameStatsJTable.this);
ScreenController.showPlayerScreen(guid);
MouseHelper.showDefaultCursor();
}
} else if (col == 6 || col == 15) { // P1_DECK, P2_DECK
final TableModel dm = getModel();
String deckName = (String) dm.getValueAt(row, col);
long expectedChecksum = Long.parseLong((String) dm.getValueAt(row, col + 1));
DeckType deckType = DeckType.valueOf((String) dm.getValueAt(row, col + 2));
if (deckType != DeckType.Random) {
long fileChecksum = DeckUtils.getDeckFileChecksum(deckName, deckType);
if (fileChecksum == expectedChecksum) {
MouseHelper.showBusyCursor(GameStatsJTable.this);
ScreenController.showDeckEditor(DeckUtils.loadDeckFromFile(deckName, deckType));
MouseHelper.showDefaultCursor();
}
} else {
MagicSound.BEEP.play();
}
}
}
});
addMouseMotionListener(new MouseMotionListener() {
private int lastCol = -1;
@Override
public void mouseDragged(MouseEvent e) { }
@Override
public void mouseMoved(MouseEvent e) {
JTable aTable = (JTable) e.getSource();
int mCol = aTable.columnAtPoint(e.getPoint());
if (mCol == 2 || mCol == 11 || mCol == 6 || mCol == 15) {
aTable.repaint();
MouseHelper.showHandCursor(aTable);
} else if (lastCol == 2 || lastCol == 11 || lastCol == 6 || lastCol == 15) {
aTable.repaint();
MouseHelper.showDefaultCursor(aTable);
}
lastCol = mCol;
}
});
}
private void setColumnRenderers() {
// setColCentered(CardTableColumn.Rating);
// setColCentered(CardTableColumn.Power);
// setColCentered(CardTableColumn.Toughness);
// TIME_START
getColumnModel().getColumn(0).setCellRenderer(new StartTimeCellRenderer());
// P1_ID
getColumnModel().getColumn(2).setCellRenderer(new PlayerCellRenderer());
// P2_ID
getColumnModel().getColumn(11).setCellRenderer(new PlayerCellRenderer());
// WINNER
getColumnModel().getColumn(20).setCellRenderer(new PlayerCellRenderer());
// P1_DECK
getColumnModel().getColumn(6).setCellRenderer(new DeckCellRenderer());
getColumnModel().getColumn(15).setCellRenderer(new DeckCellRenderer());
}
private void setDefaultColumnProperties() {
final TableColumnModel cm = getColumnModel();
// set initial column widths.
for (int i = 0; i < cm.getColumnCount(); i++) {
cm.getColumn(i).setMinWidth(50);
cm.getColumn(i).setPreferredWidth(50);
}
final JTableHeader header = getTableHeader();
header.setReorderingAllowed(true);
final DefaultTableCellRenderer renderer =
(DefaultTableCellRenderer) header.getDefaultRenderer();
// center the column header captions.
renderer.setHorizontalAlignment(SwingConstants.CENTER);
}
private void setDefaultProperties() {
DEFAULT_GRID_COLOR = getGridColor();
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setRowSelectionAllowed(false);
setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // otherwise horizontal scrollbar won't work
setRowHeight(ROW_HEIGHT);
setOpaque(false);
setStyleProperties();
setDefaultRenderer(Object.class, defaultCellRenderer);
}
private void setStyleProperties() {
setForeground(ColorHelper.getOppositeColor(getBackground()));
CardsTableStyle style = CardsTableStyle.LIGHT;
setShowGrid(style != CardsTableStyle.THEME);
setGridColor(style == CardsTableStyle.LIGHT ? GRID_COLOR : DEFAULT_GRID_COLOR);
}
@Override
public void setModel(TableModel dataModel) {
super.setModel(dataModel);
setColumnRenderers();
if (tca != null) {
tca.adjustColumns();
}
}
}