package jrummikub.control.network; import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; import jrummikub.model.GameSettings; import jrummikub.model.PlayerSettings; import jrummikub.model.PlayerSettings.Type; import jrummikub.util.Connection; import jrummikub.util.GameData; import jrummikub.util.IListener; import jrummikub.util.IListener1; import jrummikub.util.IListener2; import jrummikub.view.ISettingsPanel; import jrummikub.view.ISettingsPanel.SettingsMode; import jrummikub.view.IView; public class GameOfferControl { private List connections = new ArrayList(); private GameData gameData; private ConnectionControl connectionControl; private IView view; public GameOfferControl(final ConnectionControl connectionControl, final GameSettings settings, final IView view) { this.connectionControl = connectionControl; this.view = view; gameData = new GameData(UUID.randomUUID(), settings); view.getSettingsPanel().setSettingsMode(SettingsMode.NETWORK_OFFER); view.getSettingsPanel().enableAddPlayerButton(false); updateSettingsPanel(settings); connections.add(connectionControl.getGameJoinEvent().add( new IListener1() { @Override public void handle(String sender) { for (PlayerSettings player : settings.getPlayerList()) { if (player.getType() == Type.VACANT) { player.setName(sender); player.setType(Type.NETWORK); updateSettingsPanel(settings); connectionControl.ackJoinGame(sender, true); connectionControl.offerGame(gameData); return; } } connectionControl.ackJoinGame(sender, false); } })); connections.add(view.getSettingsPanel().getChangePlayerColorEvent() .add(new IListener2() { @Override public void handle(Integer i, Color color) { for (PlayerSettings player : settings.getPlayerList()) { if (player.getColor() == color) { return; } } settings.getPlayerList().get(i).setColor(color); updateSettingsPanel(settings); } })); connections.add(connectionControl.getGameLeaveEvent().add(new IListener1() { @Override public void handle(String sender) { List players = gameData.getGameSettings().getPlayerList(); int index=0; for(PlayerSettings s:players){ if (s.getName().equals(sender)){ break; } index++; } //Only remove network players if(gameData.getGameSettings().getPlayerList().get(index).getType() == Type.NETWORK){ gameData.getGameSettings().getPlayerList().get(index).setType(Type.VACANT); gameData.getGameSettings().getPlayerList().get(index).setName("Offen"); } updateSettingsPanel(gameData.getGameSettings()); connectionControl.offerGame(gameData); } })); connections.add(view.getSettingsPanel().getBackEvent().add(new IListener() { @Override public void handle() { // TODO Auto-generated method stub } })); } private void updateSettingsPanel(GameSettings settings) { view.getSettingsPanel().setGameSettings(settings); Set colors = new HashSet( Arrays.asList(ISettingsPanel.PLAYER_COLORS)); for (PlayerSettings player : settings.getPlayerList()) { colors.remove(player.getColor()); } view.getSettingsPanel().setPlayerColors(colors); } public void startGameOffer() { connectionControl.offerGame(gameData); view.showSettingsPanel(true); } public void abort() { connectionControl.withdrawGame(); } }