summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mock/jrummikub/model/MockHand.java1
-rw-r--r--mock/jrummikub/model/MockPlayer.java1
-rw-r--r--mock/jrummikub/model/MockRoundState.java1
-rw-r--r--mock/jrummikub/model/MockTable.java1
-rw-r--r--mock/jrummikub/view/MockView.java21
-rw-r--r--src/jrummikub/control/ApplicationControl.java9
-rw-r--r--src/jrummikub/control/GameControl.java18
-rw-r--r--src/jrummikub/control/SaveControl.java81
-rw-r--r--src/jrummikub/view/IView.java19
-rw-r--r--src/jrummikub/view/impl/View.java50
-rw-r--r--test/jrummikub/control/GameControlTest.java2
11 files changed, 167 insertions, 37 deletions
diff --git a/mock/jrummikub/model/MockHand.java b/mock/jrummikub/model/MockHand.java
index ab949d0..13f6450 100644
--- a/mock/jrummikub/model/MockHand.java
+++ b/mock/jrummikub/model/MockHand.java
@@ -11,6 +11,7 @@ import jrummikub.util.Pair;
/**
* Mock class for {@link Hand}
*/
+@SuppressWarnings("serial")
public class MockHand implements IHand {
/** */
public List<Pair<Stone, Position>> stones = new ArrayList<Pair<Stone, Position>>();
diff --git a/mock/jrummikub/model/MockPlayer.java b/mock/jrummikub/model/MockPlayer.java
index 0f83528..f7baee8 100644
--- a/mock/jrummikub/model/MockPlayer.java
+++ b/mock/jrummikub/model/MockPlayer.java
@@ -3,6 +3,7 @@ package jrummikub.model;
/**
* Mock class for {@link Player}
*/
+@SuppressWarnings("serial")
public class MockPlayer implements IPlayer {
/** */
public IHand hand;
diff --git a/mock/jrummikub/model/MockRoundState.java b/mock/jrummikub/model/MockRoundState.java
index 3f64d53..c387396 100644
--- a/mock/jrummikub/model/MockRoundState.java
+++ b/mock/jrummikub/model/MockRoundState.java
@@ -7,6 +7,7 @@ import java.util.List;
/**
* Mock class for {@link RoundState}
*/
+@SuppressWarnings("serial")
public class MockRoundState implements IRoundState {
/** */
public MockTable table;
diff --git a/mock/jrummikub/model/MockTable.java b/mock/jrummikub/model/MockTable.java
index b077b7f..295321c 100644
--- a/mock/jrummikub/model/MockTable.java
+++ b/mock/jrummikub/model/MockTable.java
@@ -11,6 +11,7 @@ import jrummikub.util.Pair;
/**
* Mock class for {@link Table}
*/
+@SuppressWarnings("serial")
public class MockTable implements ITable {
/** */
public Map<Stone, StoneSet> findStoneSet = new HashMap<Stone, StoneSet>();
diff --git a/mock/jrummikub/view/MockView.java b/mock/jrummikub/view/MockView.java
index 044e52f..80240a9 100644
--- a/mock/jrummikub/view/MockView.java
+++ b/mock/jrummikub/view/MockView.java
@@ -1,11 +1,14 @@
package jrummikub.view;
import java.awt.Color;
+import java.io.File;
import java.util.Collection;
import jrummikub.model.Stone;
import jrummikub.util.IEvent;
+import jrummikub.util.IEvent1;
import jrummikub.util.MockEvent;
+import jrummikub.util.MockEvent1;
/**
* Mock class for View
@@ -41,11 +44,11 @@ public class MockView implements IView {
/** */
public MockEvent menuNewGameEvent = new MockEvent();
/** */
- public MockEvent menuLoadEvent = new MockEvent();
+ public MockEvent menuQuitEvent = new MockEvent();
/** */
- public MockEvent menuSaveEvent = new MockEvent();
+ public MockEvent1<File> loadEvent = new MockEvent1<File>();
/** */
- public MockEvent menuQuitEvent = new MockEvent();
+ public MockEvent1<File> saveEvent = new MockEvent1<File>();
@Override
public MockTablePanel getTablePanel() {
@@ -137,17 +140,17 @@ public class MockView implements IView {
}
@Override
- public IEvent getMenuLoadEvent() {
- return menuLoadEvent;
+ public IEvent getMenuQuitEvent() {
+ return menuQuitEvent;
}
@Override
- public IEvent getMenuSaveEvent() {
- return menuSaveEvent;
+ public IEvent1<File> getLoadEvent() {
+ return loadEvent;
}
@Override
- public IEvent getMenuQuitEvent() {
- return menuQuitEvent;
+ public IEvent1<File> getSaveEvent() {
+ return saveEvent;
}
}
diff --git a/src/jrummikub/control/ApplicationControl.java b/src/jrummikub/control/ApplicationControl.java
index 0f73310..a0bdf35 100644
--- a/src/jrummikub/control/ApplicationControl.java
+++ b/src/jrummikub/control/ApplicationControl.java
@@ -11,6 +11,7 @@ import jrummikub.view.IView.BottomPanelType;
* game control
*/
public class ApplicationControl {
+ private SaveControl saveControl;
private IView view;
/**
@@ -21,6 +22,7 @@ public class ApplicationControl {
*/
public ApplicationControl(IView view) {
this.view = view;
+ saveControl = new SaveControl(view);
view.getMenuQuitEvent().add(new IListener() {
@Override
@@ -38,11 +40,13 @@ public class ApplicationControl {
view.setBottomPanel(BottomPanelType.START_GAME_PANEL);
SettingsControl settingsControl = new SettingsControl(view,
new GameSettings());
- settingsControl.getStartGameEvent().add(new IListener1<GameSettings>() {
+ settingsControl.getStartGameEvent().add(new IListener1<GameSettings>() {
@Override
public void handle(GameSettings settings) {
- GameControl gameControl = new GameControl(settings, view);
+ saveControl.setGameSettings(settings);
+
+ GameControl gameControl = new GameControl(settings, saveControl, view);
gameControl.getEndOfGameEvent().add(new IListener() {
@Override
public void handle() {
@@ -55,5 +59,4 @@ public class ApplicationControl {
});
settingsControl.startSettings();
}
-
}
diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java
index 247e67a..fb3fcf8 100644
--- a/src/jrummikub/control/GameControl.java
+++ b/src/jrummikub/control/GameControl.java
@@ -20,6 +20,8 @@ import jrummikub.view.IView.BottomPanelType;
* Controls a Game, at some point including all Rounds, starts new Rounds
*/
public class GameControl {
+ private SaveControl saveControl;
+
private GameSettings gameSettings;
private IView view;
RoundControl roundControl;
@@ -31,15 +33,21 @@ public class GameControl {
* Constructor
*
* @param gameSettings
- * the game settings
+ * the game settings
+ * @param saveControl
+ * the save control
* @param view
- * the view
+ * the view
*/
- public GameControl(GameSettings gameSettings, IView view) {
+ public GameControl(GameSettings gameSettings, SaveControl saveControl,
+ IView view) {
this.gameSettings = gameSettings;
+ this.saveControl = saveControl;
this.view = view;
gameState = new GameState();
+ saveControl.setGameState(gameState);
+
gameState.setFirstRoundFirstPlayer((int) (Math.random() * gameSettings
.getPlayerList().size()));
@@ -96,6 +104,7 @@ public class GameControl {
view.showScorePanel(false);
IRoundState roundState = new RoundState(gameSettings);
+ saveControl.setRoundState(roundState);
roundState.setActivePlayerNumber(gameState.getFirstRoundFirstPlayer()
+ gameState.getScores().size());
@@ -133,8 +142,7 @@ public class GameControl {
view.getScorePanel().setPlayers(gameSettings.getPlayerList());
view.getScorePanel().setScores(gameState.getScores());
- view.getScorePanel().setAccumulatedScore(
- gameState.getAccumulatedScore());
+ view.getScorePanel().setAccumulatedScore(gameState.getAccumulatedScore());
view.getScorePanel().update();
view.showScorePanel(true);
}
diff --git a/src/jrummikub/control/SaveControl.java b/src/jrummikub/control/SaveControl.java
new file mode 100644
index 0000000..458c0dc
--- /dev/null
+++ b/src/jrummikub/control/SaveControl.java
@@ -0,0 +1,81 @@
+package jrummikub.control;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.ObjectOutputStream;
+
+import jrummikub.model.GameSettings;
+import jrummikub.model.GameState;
+import jrummikub.model.IRoundState;
+import jrummikub.util.IListener1;
+import jrummikub.view.IView;
+
+/**
+ * The save control is responsible for loading and saving game and round states
+ */
+public class SaveControl {
+ private GameSettings gameSettings;
+ private GameState gameState;
+ private IRoundState roundState;
+
+ /**
+ * Creates a new SaveControl
+ *
+ * @param view
+ * the view to use
+ */
+ public SaveControl(IView view) {
+ view.getSaveEvent().add(new IListener1<File>() {
+ @Override
+ public void handle(File file) {
+ save(file);
+ }
+ });
+ }
+
+ /**
+ * Sets the current game settings
+ *
+ * @param gameSettings
+ * the game settings
+ */
+ public void setGameSettings(GameSettings gameSettings) {
+ this.gameSettings = gameSettings;
+ }
+
+ /**
+ * Sets the current game state
+ *
+ * @param gameState
+ * the game state
+ */
+ public void setGameState(GameState gameState) {
+ this.gameState = gameState;
+ }
+
+ /**
+ * Sets the current round state
+ *
+ * @param roundState
+ * the round state
+ */
+ public void setRoundState(IRoundState roundState) {
+ this.roundState = roundState;
+ }
+
+ private void save(File file) {
+ try {
+ ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(
+ file));
+
+ stream.writeObject(gameSettings);
+ stream.writeObject(gameState);
+ stream.writeObject(roundState);
+ stream.flush();
+
+ stream.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java
index 1c95ad4..8280a1b 100644
--- a/src/jrummikub/view/IView.java
+++ b/src/jrummikub/view/IView.java
@@ -1,10 +1,12 @@
package jrummikub.view;
import java.awt.Color;
+import java.io.File;
import java.util.Collection;
import jrummikub.model.Stone;
import jrummikub.util.IEvent;
+import jrummikub.util.IEvent1;
/**
* The top-level view interface
@@ -154,26 +156,25 @@ public interface IView {
public IEvent getMenuNewGameEvent();
/**
- * The menu load event is emitted when the user selects the load menu
- * entry
+ * The menu quit event is emitted when the user selects the quit menu entry
*
* @return the event
*/
- public IEvent getMenuLoadEvent();
+ public IEvent getMenuQuitEvent();
/**
- * The menu save event is emitted when the user selects the save menu
- * entry
+ * The load event is emitted when the user wants to load a previously saved
+ * game state
*
* @return the event
*/
- public IEvent getMenuSaveEvent();
+ IEvent1<File> getLoadEvent();
/**
- * The menu quit event is emitted when the user selects the quit menu
- * entry
+ * The save event is emitted when the user wants to save the current game
+ * state
*
* @return the event
*/
- public IEvent getMenuQuitEvent();
+ IEvent1<File> getSaveEvent();
}
diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java
index 0bc7120..a3bded6 100644
--- a/src/jrummikub/view/impl/View.java
+++ b/src/jrummikub/view/impl/View.java
@@ -5,11 +5,13 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
+import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
@@ -17,13 +19,16 @@ import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
+import javax.swing.filechooser.FileNameExtensionFilter;
import jrummikub.model.Position;
import jrummikub.model.Stone;
import jrummikub.model.StoneColor;
import jrummikub.model.StoneSet;
import jrummikub.util.Event;
+import jrummikub.util.Event1;
import jrummikub.util.IEvent;
+import jrummikub.util.IEvent1;
import jrummikub.util.Pair;
import jrummikub.view.IHandPanel;
import jrummikub.view.IPlayerPanel;
@@ -52,11 +57,14 @@ public class View extends JFrame implements IView {
private SettingsPanel settingsPanel;
private ScorePanel scorePanel;
+ private JFileChooser chooser;
+
private Event menuNewGameEvent = new Event();
- private Event menuLoadEvent = new Event();
- private Event menuSaveEvent = new Event();
private Event menuQuitEvent = new Event();
+ private Event1<File> loadEvent = new Event1<File>();
+ private Event1<File> saveEvent = new Event1<File>();
+
private static int even(double d) {
return 2 * (int) (d / 2);
}
@@ -92,18 +100,25 @@ public class View extends JFrame implements IView {
}
@Override
- public IEvent getMenuLoadEvent() {
- return menuLoadEvent;
+ public IEvent getMenuQuitEvent() {
+ return menuQuitEvent;
}
@Override
- public IEvent getMenuSaveEvent() {
- return menuSaveEvent;
+ public IEvent1<File> getLoadEvent() {
+ return loadEvent;
}
@Override
- public IEvent getMenuQuitEvent() {
- return menuQuitEvent;
+ public IEvent1<File> getSaveEvent() {
+ return saveEvent;
+ }
+
+ private void createFileChooser() {
+ chooser = new JFileChooser();
+ FileNameExtensionFilter filter = new FileNameExtensionFilter(
+ "JRummikub-Spiele", "rum");
+ chooser.setFileFilter(filter);
}
private void createMenuBar() {
@@ -127,7 +142,7 @@ public class View extends JFrame implements IView {
loadItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- menuLoadEvent.emit();
+ load();
}
});
gameMenu.add(loadItem);
@@ -135,7 +150,7 @@ public class View extends JFrame implements IView {
saveItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- menuSaveEvent.emit();
+ save();
}
});
gameMenu.add(saveItem);
@@ -154,6 +169,20 @@ public class View extends JFrame implements IView {
setJMenuBar(menuBar);
}
+ private void load() {
+ int returnVal = chooser.showOpenDialog(View.this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ loadEvent.emit(chooser.getSelectedFile());
+ }
+ }
+
+ private void save() {
+ int returnVal = chooser.showSaveDialog(View.this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ saveEvent.emit(chooser.getSelectedFile());
+ }
+ }
+
/**
* Create a new instance of the view
*/
@@ -164,6 +193,7 @@ public class View extends JFrame implements IView {
setSize(1000, 700);
setDefaultCloseOperation(EXIT_ON_CLOSE);
+ createFileChooser();
createMenuBar();
layeredPane = new JLayeredPane();
diff --git a/test/jrummikub/control/GameControlTest.java b/test/jrummikub/control/GameControlTest.java
index db60b05..be8c8d8 100644
--- a/test/jrummikub/control/GameControlTest.java
+++ b/test/jrummikub/control/GameControlTest.java
@@ -34,7 +34,7 @@ public class GameControlTest {
new PlayerSettings("Foo", new Color(1.0f, 0, 0)));
gameSettings.getPlayerList().add(
new PlayerSettings("Bar", new Color(0, 1.0f, 0)));
- gameControl = new GameControl(gameSettings, view);
+ gameControl = new GameControl(gameSettings, new SaveControl(view), view);
}
/** */