package magic.ui.widget.cards.table;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import magic.model.MagicCardDefinition;
import magic.model.MagicDeck;
@SuppressWarnings("serial")
public class DeckTablePanel extends CardsTablePanel {
// fired when selection changes.
public static final String CP_CARD_SELECTED = "21b18a13-afbb-4d6a-9edc-3119653f4560";
// fired on mouse event.
public static final String CP_CARD_LCLICKED = "d1b4df60-feb9-4bfe-88e2-49cd823efeb0";
public static final String CP_CARD_RCLICKED = "0c0fc5c6-3be3-40f4-9b79-ded9e304a96d";
private boolean isAdjusting = false;
private int lastSelectedRow = -1;
private final ListSelectionListener listSelListener;
public DeckTablePanel(final List<MagicCardDefinition> defs) {
super(defs);
// listener to change card image on selection
this.listSelListener = getTableListSelectionListener();
table.getSelectionModel().addListSelectionListener(listSelListener);
// Raise events on mouse clicks.
table.addMouseListener(getTableMouseAdapter());
}
@Override
protected MouseAdapter getRowMouseOverListener() {
return new MouseAdapter() {
@Override
public void mouseMoved(final MouseEvent e) {
final Point p = e.getPoint();
final int row = table.rowAtPoint(p);
if (row != lastSelectedRow) {
lastSelectedRow = row;
}
}
};
}
private ListSelectionListener getTableListSelectionListener() {
return (ListSelectionEvent e) -> {
isAdjusting = e.getValueIsAdjusting();
if (!isAdjusting) {
firePropertyChange(CP_CARD_SELECTED, false, true);
}
};
}
private void doLeftClickAction() {
table.getSelectionModel().removeListSelectionListener(listSelListener);
firePropertyChange(CP_CARD_LCLICKED, false, true);
}
private void doRightClickAction() {
firePropertyChange(CP_CARD_RCLICKED, false, true);
}
private boolean isMouseRowSelected(MouseEvent e) {
int rowNumber = table.rowAtPoint(e.getPoint());
return table.isRowSelected(rowNumber);
}
private void doMousePressedAction(MouseEvent e) {
if (isMouseRowSelected(e)) {
if (SwingUtilities.isLeftMouseButton(e)) {
doLeftClickAction();
} else if (SwingUtilities.isRightMouseButton(e)) {
doRightClickAction();
}
}
}
private MouseAdapter getTableMouseAdapter() {
return new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (!isAdjusting) {
doMousePressedAction(e);
}
}
};
}
public List<MagicCardDefinition> getSelectedCards() {
final List<MagicCardDefinition> selectedCards = new ArrayList<>();
for (final int row : table.getSelectedRows()) {
final MagicCardDefinition card = tableModel.getCardDef(row);
if (card != null) {
selectedCards.add(card);
}
}
return selectedCards;
}
public void setDeck(MagicDeck aDeck) {
tableModel.setCards(aDeck);
table.tableChanged(new TableModelEvent(tableModel));
table.repaint();
reselectLastCards();
table.getSelectionModel().addListSelectionListener(listSelListener);
}
public void setCards(final List<MagicCardDefinition> defs) {
tableModel.setCards(defs);
table.repaint();
table.getSelectionModel().addListSelectionListener(listSelListener);
}
public void clearSelection() {
table.clearSelection();
}
public CardsJTable getDeckTable() {
return table;
}
public void setDeckTable(CardsJTable aDeckTable) {
this.table = aDeckTable;
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // ensures horizontal scrollbar is visible.
scrollpane.setViewportView(table);
}
public void selectFirstRow() {
if (table.getRowCount() > 0) {
table.setRowSelectionInterval(0, 0);
}
}
public void setSelectedCard(MagicCardDefinition card) {
final int index = tableModel.findCardIndex(card);
if (index != -1) {
table.getSelectionModel().addSelectionInterval(index, index);
} else if (tableModel.getRowCount() > 0) {
table.getSelectionModel().addSelectionInterval(0, 0);
}
}
public void showCardCount(final boolean b) {
tableModel.showCardCount(b);
}
}