summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/ApplicationControl.java
blob: e4ddb55d4955ffe69436f6292264e7e369b4dfa0 (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
package jrummikub.control;

import jrummikub.model.GameSettings;
import jrummikub.model.GameState;
import jrummikub.model.IRoundState;
import jrummikub.util.IListener;
import jrummikub.util.IListener1;
import jrummikub.util.IListener3;
import jrummikub.view.IView;
import jrummikub.view.IView.BottomPanelType;

/**
 * The application control controls the settings for a new games and create the
 * game control
 */
public class ApplicationControl {
	private SaveControl saveControl;
	private IView view;
	private GameControl gameControl;

	/**
	 * Creates a new application control
	 * 
	 * @param view
	 *            the view to use
	 */
	public ApplicationControl(IView view) {
		this.view = view;
		saveControl = new SaveControl(view);

		view.getMenuQuitEvent().add(new IListener() {
			@Override
			public void handle() {
				System.exit(0);
			}
		});
	}

	/**
	 * Starts the application by showing the game settings dialog panel
	 */
	public void startApplication() {
		view.showScorePanel(false);
		view.setBottomPanel(BottomPanelType.START_GAME_PANEL);
		saveControl.setGameSettings(null);
		saveControl.setGameState(null);
		final SettingsControl settingsControl = new SettingsControl(view,
				new GameSettings());

		saveControl.getLoadEvent().add(
				new IListener3<GameSettings, GameState, IRoundState>() {

					@Override
					public void handle(GameSettings settings,
							GameState gameState, IRoundState roundState) {
						settingsControl.abort();
						if (gameControl != null){
							gameControl.abortGame();
						}
						gameControl = new GameControl(settings,
								saveControl, view);
						addGameControlListeners(gameControl);
						gameControl.continueGame(gameState, roundState);

					}
				});

		settingsControl.getStartGameEvent().add(new IListener1<GameSettings>() {
			@Override
			public void handle(GameSettings settings) {
				saveControl.setGameSettings(settings);

				gameControl = new GameControl(settings,
						saveControl, view);
				addGameControlListeners(gameControl);

				gameControl.startGame();
			}
		});
		settingsControl.startSettings();
	}

	private void addGameControlListeners(GameControl gameControl) {
		gameControl.getEndOfGameEvent().add(new IListener() {
			@Override
			public void handle() {
				startApplication();
			}
		});
	}
}