package jrummikub.control; import java.awt.Color; import java.util.ArrayList; import java.util.List; import jrummikub.control.turn.TurnControlFactory; import jrummikub.control.turn.TurnControlFactory.Type; import jrummikub.model.GameSettings; import jrummikub.model.PlayerSettings; import jrummikub.util.Connection; import jrummikub.util.Event1; import jrummikub.util.IEvent1; import jrummikub.util.IListener; import jrummikub.util.IListener1; import jrummikub.util.IListener2; import jrummikub.view.ISettingsPanel; import jrummikub.view.IView; /** * The settings control controls the settings panel */ public class SettingsControl { private IView view; private Event1 startGameEvent = new Event1(); private List connections = new ArrayList(); private GameSettings settings; /** * Create a new settings control * * @param view * the view to use * @param settings * initial game settings */ public SettingsControl(IView view, GameSettings settings) { this.view = view; this.settings = settings; addPlayer(); addPlayer(); } /** * the start game event is emitted when the user wants to start a game and * the settings made are valid * * @return the event */ public IEvent1 getStartGameEvent() { return startGameEvent; } /** * Start the operation of the settings control */ public void startSettings() { view.getSettingsPanel().setInitialMeldThreshold( settings.getInitialMeldThreshold()); view.getSettingsPanel().setJokerNumber(settings.getJokerNumber()); connections.add(view.getSettingsPanel() .getChangeInitialMeldThresholdEvent() .add(new IListener1() { @Override public void handle(Integer value) { settings.setInitialMeldThreshold(value); update(); } })); connections.add(view.getSettingsPanel().getChangeJokerNumberEvent() .add(new IListener1() { @Override public void handle(Integer value) { settings.setJokerNumber(value); update(); } })); addPlayerSettingsListeners(); view.showSettingsPanel(true); } private void addPlayerSettingsListeners() { connections.add(view.getSettingsPanel().getStartGameEvent() .add(new IListener() { @Override public void handle() { startGame(); } })); connections.add(view.getSettingsPanel().getAddPlayerEvent() .add(new IListener() { @Override public void handle() { addPlayer(); } })); connections.add(view.getSettingsPanel().getRemovePlayerEvent() .add(new IListener1() { @Override public void handle(Integer i) { removePlayer(i); } })); connections.add(view.getSettingsPanel().getChangePlayerColorEvent() .add(new IListener2() { @Override public void handle(Integer i, Color color) { setPlayerColor(i, color); } })); connections.add(view.getSettingsPanel().getChangePlayerNameEvent() .add(new IListener2() { @Override public void handle(Integer i, String name) { setPlayerName(i, name); } })); connections.add(view.getSettingsPanel().getChangePlayerTypeEvent() .add(new IListener2() { @Override public void handle(Integer i, TurnControlFactory.Type type) { setPlayerType(i, type); } })); } private void addPlayer() { if (settings.getPlayerList().size() >= ISettingsPanel.PLAYER_COLORS.length) { return; } // Find unused player name int num = settings.getPlayerList().size(); nameLoop: while (true) { num++; String playerName = "Spieler " + num; for (PlayerSettings player : settings.getPlayerList()) { if (playerName.equals(player.getName())) { continue nameLoop; } } break; } // Next, find unused color Color color = null; colorLoop: for (Color c : ISettingsPanel.PLAYER_COLORS) { color = c; for (PlayerSettings player : settings.getPlayerList()) { if (c == player.getColor()) { continue colorLoop; } } break; } settings.getPlayerList().add( new PlayerSettings("Spieler " + num, color)); update(); } private void removePlayer(int i) { settings.getPlayerList().remove(i); update(); } private void setPlayerColor(int i, Color color) { PlayerSettings player = settings.getPlayerList().get(i); if (player.getColor() == color) { return; } for (PlayerSettings other : settings.getPlayerList()) { if (other.getColor() == color) { other.setColor(player.getColor()); break; } } player.setColor(color); update(); } private void setPlayerName(int i, String name) { settings.getPlayerList().get(i).setName(name); update(); } private void setPlayerType(Integer i, Type type) { settings.getPlayerList().get(i).setTurnControlType(type); update(); } private void update() { view.getSettingsPanel().enableRemovePlayerButtons( settings.getPlayerList().size() > 2); view.getSettingsPanel() .enableAddPlayerButton( settings.getPlayerList().size() < ISettingsPanel.PLAYER_COLORS.length); checkSettings(); view.getSettingsPanel().setGameSettings(settings); } private boolean checkSettings() { for (PlayerSettings player : settings.getPlayerList()) { if (player.getName().isEmpty()) { view.getSettingsPanel().setError( ISettingsPanel.SettingsError.NO_PLAYER_NAME); view.getSettingsPanel().enableStartGameButton(false); return false; } } for (int i = 0; i < settings.getPlayerList().size(); ++i) { String name = settings.getPlayerList().get(i).getName(); for (int j = i + 1; j < settings.getPlayerList().size(); ++j) { if (settings.getPlayerList().get(j).getName().equals(name)) { view.getSettingsPanel().setError( ISettingsPanel.SettingsError.DUPLICATE_PLAYER_NAME); view.getSettingsPanel().enableStartGameButton(false); return false; } } } view.getSettingsPanel().setError(ISettingsPanel.SettingsError.NO_ERROR); view.getSettingsPanel().enableStartGameButton(true); return true; } private void startGame() { if (!checkSettings()) { return; } view.showSettingsPanel(false); for (Connection c : connections) { c.remove(); } startGameEvent.emit(settings); } }