diff --git a/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGamePanel.java b/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGamePanel.java index d30d86d4e8..fcc5802f99 100644 --- a/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGamePanel.java +++ b/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGamePanel.java @@ -6,11 +6,11 @@ import games.strategy.engine.lobby.client.ui.action.FetchChatHistory; import games.strategy.engine.lobby.client.ui.action.ShowPlayersAction; import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Font; import java.awt.event.MouseEvent; import java.net.URI; -import java.util.Collection; import java.util.List; -import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; @@ -20,7 +20,12 @@ import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.ListSelectionModel; +import javax.swing.RowSorter; +import javax.swing.SortOrder; import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableRowSorter; import org.triplea.lobby.common.GameDescription; import org.triplea.swing.MouseListenerBuilder; import org.triplea.swing.SwingAction; @@ -28,11 +33,11 @@ class LobbyGamePanel extends JPanel { private static final long serialVersionUID = -2576314388949606337L; private final JFrame parent; - private final JButton joinGame; + private final JButton joinGameButton; private final LobbyGameTableModel gameTableModel; private final LobbyClient lobbyClient; - private final JTable gameTable; private final URI lobbyUri; + private final JTable gameTable; LobbyGamePanel( final JFrame parent, @@ -44,10 +49,46 @@ class LobbyGamePanel extends JPanel { this.gameTableModel = lobbyGameTableModel; this.lobbyUri = lobbyUri; - final JButton hostGame = new JButton("Host Game"); - joinGame = new JButton("Join Game"); + final JButton hostGameButton = new JButton("Host Game"); + joinGameButton = new JButton("Join Game"); + + gameTable = + new JTable(gameTableModel) { + @Override + // Custom renderer to show 'bot' rows in italic font + public Component prepareRenderer( + final TableCellRenderer renderer, final int rowIndex, final int colIndex) { + + final Component component = super.prepareRenderer(renderer, rowIndex, colIndex); + final GameDescription gameDescription = + lobbyGameTableModel.get(convertRowIndexToModel(rowIndex)); + component.setFont( + gameDescription.isBot() + ? UIManager.getDefaults().getFont("Table.font").deriveFont(Font.ITALIC) + : UIManager.getDefaults().getFont("Table.font")); + return component; + } + }; + gameTable + .getSelectionModel() + .addListSelectionListener( + e -> { + final boolean selected = gameTable.getSelectedRow() >= 0; + joinGameButton.setEnabled(selected); + }); + gameTable.addMouseListener( + new MouseListenerBuilder() + .mouseClicked(this::mouseClicked) + .mousePressed(this::mousePressed) + .mouseReleased(this::mouseOnGamesList) + .build()); + + final TableRowSorter tableSorter = new TableRowSorter<>(gameTableModel); + // by default, sort by host + final int hostColumn = gameTableModel.getColumnIndex(LobbyGameTableModel.Column.Host); + tableSorter.setSortKeys(List.of(new RowSorter.SortKey(hostColumn, SortOrder.DESCENDING))); + gameTable.setRowSorter(tableSorter); - gameTable = new LobbyGameTable(gameTableModel); // only allow one row to be selected gameTable.setColumnSelectionAllowed(false); gameTable.setCellSelectionEnabled(false); @@ -93,26 +134,13 @@ class LobbyGamePanel extends JPanel { setLayout(new BorderLayout()); add(scroll, BorderLayout.CENTER); final JToolBar toolBar = new JToolBar(); - toolBar.add(hostGame); - toolBar.add(joinGame); + toolBar.add(hostGameButton); + toolBar.add(joinGameButton); toolBar.setFloatable(false); add(toolBar, BorderLayout.SOUTH); - hostGame.addActionListener(e -> hostGame(lobbyUri)); - joinGame.addActionListener(e -> joinGame()); - gameTable - .getSelectionModel() - .addListSelectionListener( - e -> { - final boolean selected = gameTable.getSelectedRow() >= 0; - joinGame.setEnabled(selected); - }); - gameTable.addMouseListener( - new MouseListenerBuilder() - .mouseClicked(this::mouseClicked) - .mousePressed(this::mousePressed) - .mouseReleased(this::mouseOnGamesList) - .build()); + hostGameButton.addActionListener(e -> hostGame(lobbyUri)); + joinGameButton.addActionListener(e -> joinGame()); } private void mouseClicked(final MouseEvent mouseEvent) { @@ -163,11 +191,12 @@ private void mouseOnGamesList(final MouseEvent mouseEvent) { .forEach(menu::add); if (lobbyClient.isModerator()) { - final Collection generalAdminActions = getGeneralAdminGamesListContextActions(); - if (!generalAdminActions.isEmpty()) { - menu.addSeparator(); - generalAdminActions.forEach(menu::add); - } + menu.addSeparator(); + List.of( + SwingAction.of("Show Chat History", e -> showChatHistory()), + SwingAction.of("Boot Game", e -> bootGame()), + SwingAction.of("Shutdown", e -> shutdown())) + .forEach(menu::add); } if (menu.getComponentCount() > 0) { @@ -175,13 +204,6 @@ private void mouseOnGamesList(final MouseEvent mouseEvent) { } } - private Collection getGeneralAdminGamesListContextActions() { - return List.of( - SwingAction.of("Show Chat History", e -> showChatHistory()), - SwingAction.of("Boot Game", e -> bootGame()), - SwingAction.of("Shutdown", e -> shutdown())); - } - private void joinGame() { final int selectedIndex = gameTable.getSelectedRow(); if (selectedIndex == -1) { diff --git a/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGameTable.java b/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGameTable.java deleted file mode 100644 index 22e7bcd30b..0000000000 --- a/game-app/game-headed/src/main/java/games/strategy/engine/lobby/client/ui/LobbyGameTable.java +++ /dev/null @@ -1,38 +0,0 @@ -package games.strategy.engine.lobby.client.ui; - -import java.awt.Component; -import java.awt.Font; -import java.util.List; -import javax.swing.JTable; -import javax.swing.RowSorter; -import javax.swing.SortOrder; -import javax.swing.UIManager; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableRowSorter; -import org.triplea.lobby.common.GameDescription; - -class LobbyGameTable extends JTable { - private static final long serialVersionUID = 8632519876114231003L; - private static final Font DEFAULT_FONT = UIManager.getDefaults().getFont("Table.font"); - private static final Font ITALIC_FONT = DEFAULT_FONT.deriveFont(Font.ITALIC); - - LobbyGameTable(final LobbyGameTableModel gameTableModel) { - super(gameTableModel); - final TableRowSorter tableSorter = new TableRowSorter<>(gameTableModel); - // by default, sort by host - final int hostColumn = gameTableModel.getColumnIndex(LobbyGameTableModel.Column.Host); - tableSorter.setSortKeys(List.of(new RowSorter.SortKey(hostColumn, SortOrder.DESCENDING))); - setRowSorter(tableSorter); - } - - @Override - public Component prepareRenderer( - final TableCellRenderer renderer, final int rowIndex, final int colIndex) { - final Component component = super.prepareRenderer(renderer, rowIndex, colIndex); - final LobbyGameTableModel lobbyGameTableModel = (LobbyGameTableModel) getModel(); - final GameDescription gameDescription = - lobbyGameTableModel.get(convertRowIndexToModel(rowIndex)); - component.setFont(gameDescription.isBot() ? ITALIC_FONT : DEFAULT_FONT); - return component; - } -}