package magic.ui.widget.cards.table;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import magic.model.MagicCardDefinition;
import magic.model.MagicRandom;
@SuppressWarnings("serial")
public class CardTablePanelB extends CardsTablePanel
implements ListSelectionListener {
private final List<ICardSelectionListener> cardSelectionListeners = new ArrayList<>();
private final boolean isDeck;
public CardTablePanelB(final List<MagicCardDefinition> defs, final String title, final boolean isDeck) {
super(defs, title);
this.isDeck = isDeck;
// listener to change card image on selection
table.getSelectionModel().addListSelectionListener(this);
}
@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);
final MagicCardDefinition card = tableModel.getCardDef(row);
notifyCardSelectionListeners(card);
}
};
}
public CardTablePanelB(List<MagicCardDefinition> defs, boolean isDeck) {
this(defs, "", isDeck);
}
public CardTablePanelB(List<MagicCardDefinition> defs) {
this(defs, false);
}
public void setDeckEditorSelectionMode() {
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
@Override
public void addMouseListener(final MouseListener m) {
table.addMouseListener(m);
}
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) {
tableModel.setCards(defs);
table.tableChanged(new TableModelEvent(tableModel));
table.repaint();
if (!isDeck) {
reselectLastCards();
}
}
@Override
public void valueChanged(final ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
// If cell selection is enabled, both row and column change events are fired
if (e.getSource() == table.getSelectionModel() && table.getRowSelectionAllowed()) {
final MagicCardDefinition card = tableModel.getCardDef(table.getSelectionModel().getLeadSelectionIndex());
notifyCardSelectionListeners(card);
}
}
}
public void selectRandomCard() {
if (tableModel.getRowCount() > 0) {
int row = MagicRandom.nextRNGInt(tableModel.getRowCount());
table.setRowSelectionInterval(row, row);
scrollRowToViewportCenter(row);
}
}
private void scrollRowToViewportCenter(int row) {
JViewport viewport = (JViewport) table.getParent();
Rectangle viewRect = viewport.getViewRect();
Rectangle rect = table.getCellRect(row, 0, true);
int y = rect.y < viewRect.y || rect.y > (viewRect.y + viewRect.height)
? rect.y - (viewRect.height / 2) + rect.height
: viewRect.y;
viewport.setViewPosition(new Point(viewRect.x, y));
}
public void setStyle() {
table.setStyle();
setEmptyBackgroundColor();
}
public void addCardSelectionListener(final ICardSelectionListener listener) {
cardSelectionListeners.add(listener);
}
private void notifyCardSelectionListeners(final MagicCardDefinition card) {
if (card != null) {
for (final ICardSelectionListener listener : cardSelectionListeners) {
listener.newCardSelected(card);
}
}
}
public void showCardCount(final boolean b) {
tableModel.showCardCount(b);
}
}