package games.strategy.engine.lobby.client.ui;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import games.strategy.engine.lobby.server.GameDescription;
import games.strategy.net.GUID;
public class LobbyGameTable extends JTable {
private static final long serialVersionUID = 8632519876114231003L;
private GUID m_selectedGame;
private boolean inTableChange = false;
private final Font m_defaultFont = UIManager.getDefaults().getFont("Table.font");
private final Font m_italicFont = new Font(m_defaultFont.getFamily(), Font.ITALIC, m_defaultFont.getSize());
public LobbyGameTable(final TableModel model) {
super(model);
getSelectionModel().addListSelectionListener(e -> {
if (!inTableChange) {
markSelection();
}
});
}
@Override
public Component prepareRenderer(final TableCellRenderer renderer, final int rowIndex, final int vColIndex) {
final Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
if (this.dataModel instanceof TableSorter) {
final TableSorter tmodel = (TableSorter) this.dataModel;
if (tmodel.getTableModel() instanceof LobbyGameTableModel) {
final LobbyGameTableModel lmodel = (LobbyGameTableModel) tmodel.getTableModel();
final int row = tmodel.getUnderlyingModelRowAt(rowIndex);
final GameDescription gd = lmodel.get(row);
if (gd.getBotSupportEmail() != null && gd.getBotSupportEmail().length() > 0) {
c.setFont(m_italicFont);
} else {
c.setFont(m_defaultFont);
}
}
}
return c;
}
/**
* The sorting model will loose the currently selected row.
* So we need to restore the selection after it has updated
*/
@Override
public void tableChanged(final TableModelEvent e) {
inTableChange = true;
try {
super.tableChanged(e);
} finally {
inTableChange = false;
}
restoreSelection();
}
/**
* record the id of the currently selected game.
*/
private void markSelection() {
final int selected = getSelectedRow();
if (selected >= 0) {
m_selectedGame = (GUID) getModel().getValueAt(selected, LobbyGameTableModel.Column.GUID.ordinal());
} else {
m_selectedGame = null;
}
}
/**
* Restore the selection to the marked value.
*/
private void restoreSelection() {
if (m_selectedGame == null) {
return;
}
for (int i = 0; i < getModel().getRowCount(); i++) {
final GUID current = (GUID) getModel().getValueAt(i, LobbyGameTableModel.Column.GUID.ordinal());
if (current.equals(m_selectedGame)) {
getSelectionModel().setSelectionInterval(i, i);
break;
}
}
}
}