package fr.lyrgard.hexScape.gui.desktop.view.room.games;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Collection;
import javax.swing.BoxLayout;
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.border.EmptyBorder;
import org.apache.commons.lang.StringUtils;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.HexScapeCore;
import fr.lyrgard.hexScape.bus.CoreMessageBus;
import fr.lyrgard.hexScape.gui.desktop.HexScapeFrame;
import fr.lyrgard.hexScape.gui.desktop.action.JoinGameAction;
import fr.lyrgard.hexScape.gui.desktop.action.LeaveGameAction;
import fr.lyrgard.hexScape.gui.desktop.action.ObserveGameAction;
import fr.lyrgard.hexScape.gui.desktop.action.StartGameAction;
import fr.lyrgard.hexScape.gui.desktop.message.GameSelectedMessage;
import fr.lyrgard.hexScape.gui.desktop.view.common.newGame.PlayerCellRenderer;
import fr.lyrgard.hexScape.gui.desktop.view.common.newGame.PlayerListModel;
import fr.lyrgard.hexScape.gui.desktop.view.room.ActivateOnlineService;
import fr.lyrgard.hexScape.message.DisplayMapMessage;
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.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.Universe;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.player.Player;
public class SelectedGamePanel extends JPanel {
private static final long serialVersionUID = 1356336562513756827L;
private PlayerListModel playerListModel;
private JLabel gameTitle = new JLabel();
private Game game;
private JButton joinButton;
private JButton startButton;
private JButton leaveButton;
private JButton observeButton;
public SelectedGamePanel() {
setLayout(new BorderLayout());
gameTitle.setFont(gameTitle.getFont().deriveFont(25f));
gameTitle.setHorizontalAlignment(SwingConstants.CENTER);
add(gameTitle, BorderLayout.PAGE_START);
playerListModel = new PlayerListModel();
JList<Player> playerList = new JList<Player>(playerListModel);
playerList.setCellRenderer(new PlayerCellRenderer());
playerList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
playerList.setLayoutOrientation(JList.VERTICAL);
playerList.setVisibleRowCount(0);
JScrollPane playerListScroller = new JScrollPane(playerList);
playerListScroller.setPreferredSize(new Dimension(200, 200));
add(playerListScroller, BorderLayout.LINE_END);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
add(buttonPanel, BorderLayout.LINE_START);
joinButton = new JButton();
buttonPanel.add(joinButton);
startButton = new JButton("Start");
buttonPanel.add(startButton);
leaveButton = new JButton("Leave");
buttonPanel.add(leaveButton);
observeButton = new JButton("Observe");
buttonPanel.add(observeButton);
setBorder(new EmptyBorder(5, 5, 5, 5));
ActivateOnlineService.getInstance().register(this);
}
public Game getGame() {
return game;
}
@Subscribe public void gameSelected(GameSelectedMessage message) {
if (message.getGame() == null) {
game = null;
EventQueue.invokeLater(new Runnable() {
public void run() {
setVisible(false);
}
});
} else {
if (game == null || !game.getId().equals(message.getGame().getId())) {
game = message.getGame();
EventQueue.invokeLater(new Runnable() {
public void run() {
Component view3d = HexScapeFrame.getInstance().getView3d().getComponent();
view3d.setSize(new Dimension(50, 50));
view3d.setPreferredSize(new Dimension(UNDEFINED_CONDITION, 150));
add(view3d, BorderLayout.CENTER);
System.out.println("SELECTED GAME VIEW TAKES 3D");
DisplayMapMessage displayMapMessage = new DisplayMapMessage(game.getId(), false);
CoreMessageBus.post(displayMapMessage);
gameTitle.setText(getTitle());
playerListModel.removeAllPlayers();
Collection<Player> freePlayers = game.getFreePlayers();
boolean canJoin = !freePlayers.isEmpty();
boolean canStart = false;
boolean isInTheGame = false;
boolean canObserve = false;
for (Player player : game.getPlayers()) {
if (player != null) {
playerListModel.addPlayer(player);
}
if (game.getId().equals(CurrentUserInfo.getInstance().getGameId()) && player.getId().equals(CurrentUserInfo.getInstance().getPlayerId())) {
canJoin = false;
canStart = !game.isStarted();
isInTheGame = true;
}
}
if (canJoin) {
if (CurrentUserInfo.getInstance().getGameId() != null) {
canJoin = false;
}
}
canObserve = !isInTheGame && game.isStarted();
if (canJoin) {
joinButton.setAction(new JoinGameAction(game.getId()));
}
joinButton.setVisible(canJoin);
if (canStart) {
startButton.setAction(new StartGameAction(game.getId()));
leaveButton.setAction(new LeaveGameAction());
}
startButton.setVisible(canStart);
leaveButton.setVisible(canStart);
if (canObserve) {
observeButton.setAction(new ObserveGameAction(game.getId()));
}
observeButton.setVisible(canObserve);
setVisible(true);
}
});
}
}
}
private String getTitle() {
String title = game.getName();
if (game.isStarted()) {
title += " - STARTED";
} else if (game.getFreePlayers().size() > 0) {
title += " - WAITING PLAYERS";
} else {
title += " - READY TO START";
}
return title;
}
@Subscribe public void onGameEnded(GameEndedMessage message) {
final String gameId = message.getGameId();
if (gameId != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
SelectedGamePanel.this.setVisible(false);
}
});
}
}
@Subscribe public void gameJoined(GameJoinedMessage message) {
final Game game = message.getGame();
final String playerId = message.getPlayerId();
EventQueue.invokeLater(new Runnable() {
public void run() {
if (SelectedGamePanel.this.game != null && StringUtils.equals(game.getId(), SelectedGamePanel.this.game.getId())) {
Player player = game.getPlayer(playerId);
if (player != null) {
playerListModel.removeAllPlayers();
for (Player p : game.getPlayers()) {
playerListModel.addPlayer(p);
}
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
joinButton.setVisible(false);
startButton.setAction(new StartGameAction(game.getId()));
startButton.setVisible(true);
leaveButton.setAction(new LeaveGameAction());
leaveButton.setVisible(true);
observeButton.setVisible(false);
} else {
if (game.getFreePlayers().isEmpty()) {
joinButton.setVisible(false);
}
}
gameTitle.setText(getTitle());
}
}
}
});
}
@Subscribe public void onGameStarted(GameStartedMessage message) {
final String gameId = message.getGameId();
if (HexScapeCore.getInstance().isOnline()) {
if (gameId != null && game != null && gameId.equals(game.getId())) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null) {
if (game.getFreePlayers().isEmpty()) {
joinButton.setVisible(false);
}
startButton.setVisible(false);
leaveButton.setVisible(false);
gameTitle.setText(getTitle());
if (CurrentUserInfo.getInstance().getGameId() == null) {
observeButton.setAction(new ObserveGameAction(gameId));
observeButton.setVisible(true);
}
}
}
});
}
}
}
@Subscribe public void onGameLeft(GameLeftMessage message) {
final String gameId = message.getGameId();
final String playerId = message.getPlayerId();
if (HexScapeCore.getInstance().isOnline()) {
if (gameId != null && game != null && gameId.equals(game.getId())) {
EventQueue.invokeLater(new Runnable() {
public void run() {
Player player = game.getPlayer(playerId);
if (player != null) {
playerListModel.redraw();
if (CurrentUserInfo.getInstance().getGame() == null) {
// game null == we left the game or we were not on this game.
startButton.setVisible(false);
leaveButton.setVisible(false);
joinButton.setAction(new JoinGameAction(gameId));
joinButton.setVisible(true);
}
}
}
});
}
}
}
}