package magic.ui.deck.games;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
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.MagicDeck;
import magic.translate.MText;
import magic.ui.MagicSound;
import magic.ui.ScreenController;
import magic.ui.helpers.ColorHelper;
import magic.ui.helpers.MouseHelper;
import magic.ui.screen.stats.TableColumnAdjuster;
import magic.ui.widget.cards.table.CardsTableStyle;
import magic.utility.DeckUtils;
@SuppressWarnings("serial")
class DeckGamesJTable extends JTable {
// translatable UI text (prefix with _S).
private static final String _S1 = "Opponent deck";
private static final int ROW_HEIGHT = 40; // 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;
private final DeckCellRenderer deckCellRenderer = new DeckCellRenderer();
private MouseHoverListener mouseHoverListener;
DeckGamesJTable(TableModel dm, boolean hasDeckLinks) {
super(dm);
setDefaultProperties();
setDefaultColumnProperties();
setColumnRenderers();
tca = new TableColumnAdjuster(this);
tca.adjustColumns();
deckCellRenderer.setEnabled(hasDeckLinks);
if (hasDeckLinks) {
mouseHoverListener = new MouseHoverListener();
addMouseMotionListener(mouseHoverListener);
setOnMouseClickAction();
}
}
private void setOnMouseClickAction() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent ev) {
doOnMousePressed(ev.getPoint());
}
@Override
public void mouseExited(MouseEvent e) {
doOnMouseExited();
}
@Override
public void mouseEntered(MouseEvent e) {
doOnMouseEntered();
}
});
}
private void doOnMousePressed(Point mousePosition) {
int col = columnAtPoint(mousePosition);
if (col == 4) {
final TableModel dm = getModel();
int row = rowAtPoint(mousePosition);
DeckInfo deckInfo = (DeckInfo) dm.getValueAt(row, col);
if (deckInfo.deckType != DeckType.Random) {
long fileChecksum = DeckUtils.getDeckFileChecksum(deckInfo.deckName, deckInfo.deckType);
if (fileChecksum == deckInfo.checksum) {
MouseHelper.showBusyCursor(DeckGamesJTable.this);
MagicDeck deck = DeckUtils.loadDeckFromFile(deckInfo.deckName, deckInfo.deckType);
ScreenController.showDeckScreen(deck, MText.get(_S1));
mouseHoverListener.clear();
MouseHelper.showDefaultCursor();
}
} else {
MagicSound.BEEP.play();
}
}
}
private void doOnMouseEntered() {
deckCellRenderer.setEnabled(true);
}
private void doOnMouseExited() {
deckCellRenderer.setEnabled(false);
mouseHoverListener.clear();
repaint();
}
private class MouseHoverListener extends MouseMotionAdapter {
private int lastMCol = -1;
private int lastMRow = -1;
@Override
public void mouseMoved(MouseEvent e) {
JTable aTable = (JTable) e.getSource();
int mCol = aTable.columnAtPoint(e.getPoint());
int mRow = aTable.rowAtPoint(e.getPoint());
if (mCol != lastMCol || mRow != lastMRow) {
lastMCol = mCol;
lastMRow = mRow;
if (mCol == 4) {
aTable.repaint();
MouseHelper.showHandCursor(aTable);
} else {
aTable.repaint();
MouseHelper.showDefaultCursor(aTable);
}
}
}
private void clear() {
lastMCol = -1;
lastMRow = -1;
}
}
private void setColumnRenderers() {
getColumnModel().getColumn(0).setCellRenderer(new ResultCellRenderer());
getColumnModel().getColumn(1).setCellRenderer(new GameCellRenderer());
getColumnModel().getColumn(2).setCellRenderer(new PlayerCellRenderer());
getColumnModel().getColumn(3).setCellRenderer(new PlayerCellRenderer());
getColumnModel().getColumn(4).setCellRenderer(deckCellRenderer);
}
private void setDefaultColumnProperties() {
final TableColumnModel cm = getColumnModel();
// set initial column widths.
cm.getColumn(0).setMinWidth(30);
cm.getColumn(1).setMinWidth(130);
cm.getColumn(2).setMinWidth(170);
cm.getColumn(3).setMinWidth(170);
cm.getColumn(4).setMinWidth(180);
final JTableHeader header = getTableHeader();
header.setEnabled(false);
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();
}
}
}