From eee80d605c95bac3a2489f0dbadadd81ec1ad753 Mon Sep 17 00:00:00 2001 From: Ida Massow Date: Tue, 14 Jun 2011 00:55:58 +0200 Subject: neue GameOfferControl git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@430 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/control/AbstractSettingsControl.java | 345 +++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 src/jrummikub/control/AbstractSettingsControl.java (limited to 'src/jrummikub/control/AbstractSettingsControl.java') diff --git a/src/jrummikub/control/AbstractSettingsControl.java b/src/jrummikub/control/AbstractSettingsControl.java new file mode 100644 index 0000000..693e0f0 --- /dev/null +++ b/src/jrummikub/control/AbstractSettingsControl.java @@ -0,0 +1,345 @@ +package jrummikub.control; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import jrummikub.model.GameSettings; +import jrummikub.model.PlayerSettings; +import jrummikub.model.PlayerSettings.Type; +import jrummikub.model.StoneColor; +import jrummikub.util.Connection; +import jrummikub.util.IListener; +import jrummikub.util.IListener1; +import jrummikub.util.IListener2; +import jrummikub.view.ISettingsPanel; +import jrummikub.view.IView; + +public abstract class AbstractSettingsControl { + protected IView view; + protected List connections = new ArrayList(); + + protected GameSettings settings; + + /** + * Create a new settings control + * + * @param view + * the view to use + * @param settings + * initial game settings + */ + protected AbstractSettingsControl(IView view, GameSettings settings) { + this.view = view; + this.settings = settings; + } + + protected void addListeners() { + addPlayerSettingsListeners(); + + addOptionListeners1(); + addOptionListeners2(); + addVariantListeners(); + } + + private void addPlayerSettingsListeners() { + 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, Type type) { + setPlayerType(i, type); + } + })); + } + + private void addOptionListeners1() { + 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(); + } + })); + + connections.add(view.getSettingsPanel().getChangeStoneSetNumberEvent() + .add(new IListener1() { + @Override + public void handle(Integer value) { + settings.setStoneSetNumber(value); + update(); + } + })); + connections.add(view.getSettingsPanel() + .getChangeNumberOfStonesDealtEvent() + .add(new IListener1() { + @Override + public void handle(Integer value) { + settings.setNumberOfStonesDealt(value); + update(); + } + })); + } + + private void addOptionListeners2() { + connections.add(view.getSettingsPanel().getChangeHighestValueEvent() + .add(new IListener1() { + @Override + public void handle(Integer value) { + settings.setHighestValue(value); + update(); + } + })); + connections.add(view.getSettingsPanel().getChangeTimeEvent() + .add(new IListener1() { + @Override + public void handle(Integer value) { + settings.setTotalTime(value); + update(); + } + })); + connections.add(view.getSettingsPanel().getChangeStoneColorsEvent() + .add(new IListener1>() { + @Override + public void handle(Set value) { + settings.setStoneColors(new HashSet(value)); + update(); + } + })); + + connections.add(view.getSettingsPanel().getChangeNoLimitsEvent() + .add(new IListener1() { + @Override + public void handle(Boolean value) { + settings.setNoLimits(value); + update(); + } + })); + } + + /** + * Add event listeners for variants, e.g. standard or children + */ + private void addVariantListeners() { + connections.add(view.getSettingsPanel().getSetVariantDefaultEvent() + .add(new IListener() { + @Override + public void handle() { + settings.reset(); + update(); + } + })); + connections.add(view.getSettingsPanel().getSetVariantChildrenEvent() + .add(new IListener() { + @Override + public void handle() { + settings.reset(); + settings.setHighestValue(10); + settings.setJokerNumber(6); + settings.setTotalTime(120); + settings.setInitialMeldThreshold(20); + update(); + } + })); + } + + /** + * Start the operation of the settings control + */ + public void startSettings() { + view.showSettingsPanel(true); + } + + protected Color findUnusedColor() { + Color color = null; + colorLoop: for (Color c : ISettingsPanel.PLAYER_COLORS) { + color = c; + for (PlayerSettings player : settings.getPlayerList()) { + if (c == player.getColor()) { + continue colorLoop; + } + } + break; + } + return color; + } + + 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 removePlayer(int i) { + settings.getPlayerList().remove(i); + update(); + } + + protected boolean checkSettings() { + if (!checkName()) { + return false; + } + if (!checkErrors()) { + return false; + } + + view.getSettingsPanel().setError(ISettingsPanel.SettingsError.NO_ERROR); + view.getSettingsPanel().enableStartGameButton(true); + + checkWarnings(); + + return true; + } + + private boolean checkName() { + for (PlayerSettings player : settings.getPlayerList()) { + if (player.getName().isEmpty()) { + view.getSettingsPanel().setError( + ISettingsPanel.SettingsError.NO_PLAYER_NAME_ERROR); + view.getSettingsPanel().enableStartGameButton(false); + return false; + } + } + for (int i = 0; i < settings.getPlayerList().size(); ++i) { + PlayerSettings player1 = settings.getPlayerList().get(i); + String name = player1.getName(); + Type type = player1.getType(); + + if (type == Type.NETWORK) { + continue; + } + + for (int j = i + 1; j < settings.getPlayerList().size(); ++j) { + PlayerSettings player2 = settings.getPlayerList().get(j); + if (player2.getName().equals(name) && player2.getType() == type) { + view.getSettingsPanel() + .setError( + ISettingsPanel.SettingsError.DUPLICATE_PLAYER_NAME_ERROR); + view.getSettingsPanel().enableStartGameButton(false); + return false; + } + } + } + return true; + } + + private boolean checkErrors() { + int totalStonesDealt = settings.getNumberOfStonesDealt() + * settings.getPlayerList().size(); + int totalStones = settings.getHighestValue() + * settings.getStoneSetNumber() + * settings.getStoneColors().size() + settings.getJokerNumber(); + + if (totalStones <= totalStonesDealt) { + view.getSettingsPanel().setError( + ISettingsPanel.SettingsError.NOT_ENOUGH_STONES_ERROR); + view.getSettingsPanel().enableStartGameButton(false); + return false; + } + + if (settings.getStoneColors().size() < 3) { + view.getSettingsPanel().setError( + ISettingsPanel.SettingsError.NOT_ENOUGH_COLORS_ERROR); + view.getSettingsPanel().enableStartGameButton(false); + return false; + } + + return true; + } + + private void checkWarnings() { + if (settings.getInitialMeldThreshold() >= 100) { + view.getSettingsPanel().setError( + ISettingsPanel.SettingsError.TOO_HIGH_THRESHOLD_WARNING); + return; + } + + boolean humanPlayerFound = false; + for (PlayerSettings player : settings.getPlayerList()) { + if (player.getType() == Type.HUMAN) { + humanPlayerFound = true; + break; + } + } + + if (!humanPlayerFound) { + view.getSettingsPanel().setError( + ISettingsPanel.SettingsError.COMPUTER_PLAYERS_ONLY_WARNING); + return; + } + } + + /** + * Abort settings control once settings are set + */ + public void abort() { + view.showSettingsPanel(false); + for (Connection c : connections) { + c.remove(); + } + } + + abstract protected void addPlayer(); + + abstract protected void setPlayerType(int i, Type type); + + abstract protected void update(); + +} -- cgit v1.2.3