package fr.lyrgard.hexScape.gui.desktop.view.room.games;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.gui.desktop.action.OpenNewGameDialogAction;
import fr.lyrgard.hexScape.gui.desktop.message.GameSelectedMessage;
import fr.lyrgard.hexScape.gui.desktop.view.common.HexaFont;
import fr.lyrgard.hexScape.message.GameCreatedMessage;
import fr.lyrgard.hexScape.message.GameEndedMessage;
import fr.lyrgard.hexScape.message.GameJoinedMessage;
import fr.lyrgard.hexScape.message.GameLeftMessage;
import fr.lyrgard.hexScape.message.GameStartedMessage;
import fr.lyrgard.hexScape.message.RoomJoinedMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.room.Room;
public class GameListPanel extends JPanel{
private static final long serialVersionUID = 1506378477490002770L;
private GameListModel gameListModel;
private JList<Game> gameList;
public GameListPanel() {
setLayout(new BorderLayout());
JLabel title = new JLabel("GAMES");
title.setFont(HexaFont.getFont().deriveFont(35f));
title.setHorizontalAlignment(SwingConstants.CENTER);
add(title, BorderLayout.PAGE_START);
gameListModel = new GameListModel();
gameList = new JList<Game>(gameListModel);
gameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
gameList.setLayoutOrientation(JList.VERTICAL);
gameList.setVisibleRowCount(0);
gameList.setCellRenderer(new GameCellRenderer());
JScrollPane gameListScroller = new JScrollPane(gameList);
gameListScroller.setPreferredSize(new Dimension(200, 400));
add(gameListScroller, BorderLayout.CENTER);
gameList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
Game game = gameList.getSelectedValue();
GuiMessageBus.post(new GameSelectedMessage(game));
}
}
});
JPanel buttonsPanel = new JPanel();
add(buttonsPanel, BorderLayout.PAGE_END);
buttonsPanel.add(new JButton(new OpenNewGameDialogAction(getTopLevelAncestor())));
GuiMessageBus.register(this);
}
@Subscribe public void onRoomJoined(RoomJoinedMessage message) {
final Room room = message.getRoom();
EventQueue.invokeLater(new Runnable() {
public void run() {
gameListModel.redraw();
}
});
}
@Subscribe public void onGameCreated(GameCreatedMessage message) {
final Game newGame = message.getGame();
final String userId = message.getUserId();
if (newGame != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game selectedGame = gameList.getSelectedValue();
gameListModel.redraw();
if (CurrentUserInfo.getInstance().getId().equals(userId)) {
gameList.setSelectedValue(newGame, true);
} else {
if (selectedGame != null) {
gameList.setSelectedValue(selectedGame, true);
}
}
}
});
}
}
@Subscribe public void onGameEnded(GameEndedMessage message) {
final String gameId = message.getGameId();
if (gameId != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game game = gameList.getSelectedValue();
boolean gameSelectedEnded = game != null && game.getId().equals(gameId);
if (gameSelectedEnded || gameListModel.getSize() == 0) {
gameList.clearSelection();
GuiMessageBus.post(new GameSelectedMessage(null));
}
gameListModel.redraw();
if (!gameSelectedEnded && game != null) {
gameList.setSelectedValue(game, true);
}
}
});
}
}
@Subscribe public void onGameJoined(GameJoinedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game game = gameList.getSelectedValue();
gameListModel.redraw();
if (game != null) {
gameList.setSelectedValue(game, true);
}
}
});
}
@Subscribe public void onGameLeft(GameLeftMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game game = gameList.getSelectedValue();
gameListModel.redraw();
if (game != null) {
gameList.setSelectedValue(game, true);
}
}
});
}
@Subscribe public void onGameStarted(GameStartedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game game = gameList.getSelectedValue();
gameListModel.redraw();
if (game != null) {
gameList.setSelectedValue(game, true);
}
}
});
}
}