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; @SuppressWarnings("serial") public class CardTablePanelA extends CardsTablePanel { // fired when selection changes. public static final String CP_CARD_SELECTED = "7f9bfa20-a363-4ce4-8491-8bfb219a808d"; // fired on mouse event. public static final String CP_CARD_LCLICKED = "fb5f3d15-c764-4436-a790-4aa349c24b73"; public static final String CP_CARD_RCLICKED = "575ebbc6-c67b-45b5-9f3e-e03ae1d879be"; public static final String CP_CARD_DCLICKED = "d3a081c1-a66c-402a-814e-819678257d3b"; private boolean isAdjusting = false; private int lastSelectedRow = -1; public CardTablePanelA(final List<MagicCardDefinition> defs, final String title) { super(defs, title); // listener to change card image on selection table.getSelectionModel().addListSelectionListener(getTableListSelectionListener()); // Raise events on mouse clicks. table.addMouseListener(getTableMouseAdapter()); } public CardTablePanelA(final List<MagicCardDefinition> defs) { this(defs, ""); } @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 new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { isAdjusting = e.getValueIsAdjusting(); if (!isAdjusting) { firePropertyChange(CP_CARD_SELECTED, false, true); } } }; } private MouseAdapter getTableMouseAdapter() { return new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (!isAdjusting) { if (SwingUtilities.isLeftMouseButton(e)) { if (hasDoubleClickListeners() && e.getClickCount() == 2) { firePropertyChange(CP_CARD_DCLICKED, false, true); } else { firePropertyChange(CP_CARD_LCLICKED, false, true); } } else if (SwingUtilities.isRightMouseButton(e)) { final Point p = e.getPoint(); final int rowNumber = table.rowAtPoint(p); final boolean isRowSelected = table.isRowSelected(rowNumber); if (!isRowSelected) { table.getSelectionModel().setSelectionInterval(rowNumber, rowNumber); } else { firePropertyChange(CP_CARD_RCLICKED, false, true); } } } } }; } public void setDeckEditorSelectionMode() { //table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } 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 setCards(final List<MagicCardDefinition> defs) { final boolean isRowSelected = table.getSelectedRow() != -1; tableModel.setCards(defs); table.tableChanged(new TableModelEvent(tableModel)); table.repaint(); if (isRowSelected) { reselectLastCards(); } } public void clearSelection() { table.clearSelection(); } public JTable getDeckTable() { return table; } public void setDeckTable(CardsJTable aDeckTable) { this.table = aDeckTable; scrollpane.setViewportView(table); } public JTable getTable() { return table; } private boolean hasDoubleClickListeners() { return getPropertyChangeListeners(CP_CARD_DCLICKED).length > 0; } public void selectFirstRow() { if (table.getRowCount() > 0) { table.setRowSelectionInterval(0, 0); firePropertyChange(CP_CARD_SELECTED, false, true); } } public void setSelectedCard(MagicCardDefinition aCard) { final int index = tableModel.findCardIndex(aCard); if (index != -1 && getSelectedCards().contains(aCard) == false) { table.getSelectionModel().addSelectionInterval(index, index); } else if (tableModel.getRowCount() > 0) { table.getSelectionModel().addSelectionInterval(0, 0); } } public void showCardCount(final boolean b) { tableModel.showCardCount(b); } }