package magic.ui.widget.cards.table;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import magic.data.GeneralConfig;
import magic.model.MagicCardDefinition;
import magic.ui.FontsAndBorders;
import magic.ui.widget.M.MScrollPane;
import magic.ui.widget.TexturedPanel;
import magic.ui.widget.TitleBar;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
abstract class CardsTablePanel extends TexturedPanel {
protected final MScrollPane scrollpane = new MScrollPane();
private final TitleBar titleBar;
protected CardsJTable table;
protected final MigLayout migLayout = new MigLayout();
protected final CardTableModel tableModel;
protected List<MagicCardDefinition> lastSelectedCards = new ArrayList<>();
protected abstract MouseAdapter getRowMouseOverListener();
public CardsTablePanel(List<MagicCardDefinition> defs, String title) {
tableModel = new CardTableModel(defs);
table = new CardsJTable(tableModel);
titleBar = new TitleBar(title);
setTitle(title);
if (!GeneralConfig.getInstance().isPreviewCardOnSelect()) {
table.addMouseMotionListener(getRowMouseOverListener());
}
// listener to sort on column header click
final JTableHeader header = table.getTableHeader();
header.addMouseListener(new ColumnListener());
// add table to scroll pane
scrollpane.setViewportView(table);
scrollpane.setBorder(FontsAndBorders.NO_BORDER);
scrollpane.setOpaque(false);
setLayout(migLayout);
refreshLayout();
setEmptyBackgroundColor();
}
public CardsTablePanel(List<MagicCardDefinition> defs) {
this(defs, "");
}
protected void setEmptyBackgroundColor() {
setBackground(CardsTableStyle.getStyle().getEmptyBackgroundColor());
}
private void refreshLayout() {
removeAll();
migLayout.setLayoutConstraints("flowy, insets 0, gap 0");
add(titleBar, "w 100%, h 26!, hidemode 3");
add(scrollpane.component(), "w 100%, h 100%");
revalidate();
}
public void setTitle(final String title) {
titleBar.setText(title);
titleBar.setVisible(!title.isEmpty());
refreshLayout();
}
private void setSelectedRow() {
if (table.getRowCount() > 0) {
table.setRowSelectionInterval(0, 0);
}
}
protected void reselectLastCards() {
// select previous card if possible
if (lastSelectedCards.size() > 0) {
final List<MagicCardDefinition> newSelectedCards = new ArrayList<>();
for (final MagicCardDefinition card : lastSelectedCards) {
final int index = tableModel.findCardIndex(card);
if (index != -1) {
// previous card still in list
table.getSelectionModel().addSelectionInterval(index,index);
newSelectedCards.add(card);
}
}
lastSelectedCards = newSelectedCards;
} else {
setSelectedRow();
}
}
private class ColumnListener extends MouseAdapter {
@Override
public void mouseClicked(final MouseEvent e) {
final TableColumnModel colModel = table.getColumnModel();
final int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
final int modelIndex = colModel.getColumn(columnModelIndex).getModelIndex();
if (modelIndex < 0) {
return;
}
// sort
tableModel.sort(modelIndex);
// redraw
table.tableChanged(new TableModelEvent(tableModel));
table.repaint();
reselectLastCards();
}
}
}