summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/SettingsControl.java
blob: 6d736a69e523170db8fd7e8d3e95e76642533437 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package jrummikub.control;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import jrummikub.model.GameSettings;
import jrummikub.model.PlayerSettings;
import jrummikub.model.PlayerSettings.Type;
import jrummikub.util.Connection;
import jrummikub.util.Event1;
import jrummikub.util.IEvent1;
import jrummikub.util.IListener;
import jrummikub.view.ISettingsPanel;
import jrummikub.view.IView;

/**
 * The settings control controls the settings panel
 */
public class SettingsControl extends AbstractSettingsControl {
	private Event1<GameSettings> startGameEvent = new Event1<GameSettings>();
	
	/**
	 * Create a new settings control
	 * 
	 * @param view
	 *            the view to use
	 * @param settings
	 *            initial game settings
	 */
	public SettingsControl(IView view, GameSettings settings) {
		super(view, settings);
		view.getSettingsPanel().enableNetworkMode(false);
		view.getSettingsPanel().setPlayerNamesEditable(
				Collections.<Boolean> emptyList());

		addPlayer();
		addPlayer();

		addListeners();

		connections.add(view.getSettingsPanel().getStartGameEvent()
				.add(new IListener() {
					@Override
					public void handle() {
						startGame();
					}
				}));
	}


	/**
	 * 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<GameSettings> getStartGameEvent() {
		return startGameEvent;
	}
	
	@Override
	protected 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;
		}

		settings.getPlayerList().add(
				new PlayerSettings("Spieler " + num, findUnusedColor()));

		update();
	}

	@Override
	protected void setPlayerType(int i, Type type) {
		settings.getPlayerList().get(i).setType(type);
		update();
	}

	@Override
	protected void update() {
		boolean enableRemoveButtons = settings.getPlayerList().size() > 2;
		view.getSettingsPanel().enableRemovePlayerButtons(
				Collections.nCopies(settings.getPlayerList().size(),
						enableRemoveButtons));
		view.getSettingsPanel()
				.enableAddPlayerButton(
						settings.getPlayerList().size() < ISettingsPanel.PLAYER_COLORS.length);

		checkSettings();

		List<List<Type>> choices = new ArrayList<List<Type>>();
		for (int i = 0; i < settings.getPlayerList().size(); i++) {
			choices.add(Arrays.asList(Type.HUMAN, Type.COMPUTER));
		}
		view.getSettingsPanel().setPlayerTypeChoices(choices);
		view.getSettingsPanel().setGameSettings(settings);
	}

	private void startGame() {
		if (!checkSettings()) {
			return;
		}

		abort();
		startGameEvent.emit(settings);
	}

	/**
	 * Abort settings control once settings are set
	 */
	public void abort() {
		view.showSettingsPanel(false);
		for (Connection c : connections) {
			c.remove();
		}
	}
}