package fr.lyrgard.hexScape.gui.desktop.view.game.leftPanel;
import java.awt.EventQueue;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JTabbedPane;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.message.ArmyLoadedMessage;
import fr.lyrgard.hexScape.message.GameJoinedMessage;
import fr.lyrgard.hexScape.message.GameLeftMessage;
import fr.lyrgard.hexScape.message.GameObservedMessage;
import fr.lyrgard.hexScape.message.GameStartedMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.Universe;
import fr.lyrgard.hexScape.model.card.Army;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.player.Player;
public class ArmiesTabbedPane extends JTabbedPane {
private static final long serialVersionUID = 7018446148678245684L;
private Map<String, ArmyPanel> armyPanelByPlayerIds = new HashMap<String, ArmyPanel>();
private Map<String, Integer> tabIndexByPlayerId = new HashMap<>();
public ArmiesTabbedPane() {
//addTab("Your army", yourArmyPanel);
//setBorder(new LineBorder(Color.red, 2));
GuiMessageBus.register(this);
}
public void empty() {
removeAll();
//yourArmyPanel.setArmy(null, null);
//addTab("Your army", yourArmyPanel);
}
@Subscribe public void onArmyLoaded(final ArmyLoadedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String playerId = message.getPlayerId();
Army army = message.getArmy();
Game game = Universe.getInstance().getGamesByGameIds().get(CurrentUserInfo.getInstance().getGameId());
if (game != null) {
ArmyPanel armyPanel = armyPanelByPlayerIds.get(playerId);
if (armyPanel != null) {
armyPanel.setArmy(army);
}
}
}
});
}
@Subscribe public void onGameStart(GameStartedMessage message) {
String gameId = message.getGameId();
reload(gameId);
}
@Subscribe public void onGameObserved(GameObservedMessage message) {
String gameId = message.getGameId();
reload(gameId);
}
public void reload(String gameId) {
final Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game != null && gameId.equals(CurrentUserInfo.getInstance().getGameId())) {
EventQueue.invokeLater(new Runnable() {
public void run() {
removeAll();
armyPanelByPlayerIds.clear();
tabIndexByPlayerId.clear();
Player currentPlayer = game.getPlayer(CurrentUserInfo.getInstance().getPlayerId());
if (currentPlayer != null) {
ArmyPanel yourArmyPanel = new ArmyPanel(currentPlayer.getId());
addTab("Your army (" + CurrentUserInfo.getInstance().getPlayer().getName() + ")", yourArmyPanel);
yourArmyPanel.setArmy(currentPlayer.getArmy());
armyPanelByPlayerIds.put(currentPlayer.getId(), yourArmyPanel);
tabIndexByPlayerId.put(currentPlayer.getId(), 0);
}
int i = 1;
for (Player player : game.getPlayers()) {
if (!player.getId().equals(CurrentUserInfo.getInstance().getPlayerId())) {
if (player != null) {
ArmyPanel otherPlayerArmyPanel = new ArmyPanel(player.getId(), player.getArmy());
addTab(player.getDisplayName(), otherPlayerArmyPanel);
armyPanelByPlayerIds.put(player.getId(), otherPlayerArmyPanel);
tabIndexByPlayerId.put(player.getId(), i);
i++;
}
}
}
}
});
}
}
@Subscribe public void onGameJoined(GameJoinedMessage message) {
Game game = message.getGame();
String playerId = message.getPlayerId();
if (game != null && game.getId().equals(CurrentUserInfo.getInstance().getGameId()) && game.isStarted()) {
Player player = game.getPlayer(playerId);
Integer tabIndex = tabIndexByPlayerId.get(playerId);
if (tabIndex != null && player != null) {
setTitleAt(tabIndex, player.getDisplayName());
}
}
}
@Subscribe public void onGameLeft(GameLeftMessage message) {
String gameId = message.getGameId();
String playerId = message.getPlayerId();
if (CurrentUserInfo.getInstance().getPlayer() == null) {
// current player is null == we left the game
EventQueue.invokeLater(new Runnable() {
public void run() {
empty();
}
});
} else if (gameId.equals(CurrentUserInfo.getInstance().getGameId())){
Game game = CurrentUserInfo.getInstance().getGame();
Player player = game.getPlayer(playerId);
Integer tabIndex = tabIndexByPlayerId.get(playerId);
if (tabIndex != null && player != null) {
setTitleAt(tabIndex, player.getName());
}
}
}
}