Start implementing color changing over network
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@442 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
3ffad85972
commit
1b9c7c4778
7 changed files with 119 additions and 8 deletions
|
@ -219,4 +219,10 @@ public class MockSettingsPanel implements ISettingsPanel {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayerColors(Set<Color> colors) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,21 @@
|
||||||
package jrummikub.control;
|
package jrummikub.control;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import jrummikub.model.GameSettings;
|
import jrummikub.model.GameSettings;
|
||||||
import jrummikub.model.PlayerSettings;
|
import jrummikub.model.PlayerSettings;
|
||||||
import jrummikub.model.PlayerSettings.Type;
|
import jrummikub.model.PlayerSettings.Type;
|
||||||
import jrummikub.util.Connection;
|
|
||||||
import jrummikub.util.Event1;
|
import jrummikub.util.Event1;
|
||||||
import jrummikub.util.IEvent1;
|
import jrummikub.util.IEvent1;
|
||||||
import jrummikub.util.IListener;
|
import jrummikub.util.IListener;
|
||||||
import jrummikub.view.ISettingsPanel;
|
import jrummikub.view.ISettingsPanel;
|
||||||
import jrummikub.view.IView;
|
|
||||||
import jrummikub.view.ISettingsPanel.SettingsMode;
|
import jrummikub.view.ISettingsPanel.SettingsMode;
|
||||||
|
import jrummikub.view.IView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The settings control controls the settings panel
|
* The settings control controls the settings panel
|
||||||
|
@ -35,6 +36,7 @@ public class SettingsControl extends AbstractSettingsControl {
|
||||||
view.getSettingsPanel().setSettingsMode(SettingsMode.DEFAULT);
|
view.getSettingsPanel().setSettingsMode(SettingsMode.DEFAULT);
|
||||||
view.getSettingsPanel().setPlayerNamesEditable(
|
view.getSettingsPanel().setPlayerNamesEditable(
|
||||||
Collections.<Boolean> emptyList());
|
Collections.<Boolean> emptyList());
|
||||||
|
view.getSettingsPanel().setPlayerColors(new HashSet<Color>(Arrays.asList(ISettingsPanel.PLAYER_COLORS)));
|
||||||
|
|
||||||
addPlayer();
|
addPlayer();
|
||||||
addPlayer();
|
addPlayer();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package jrummikub.control.network;
|
package jrummikub.control.network;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
@ -8,10 +9,12 @@ import jrummikub.model.GameSettings;
|
||||||
import jrummikub.util.Event;
|
import jrummikub.util.Event;
|
||||||
import jrummikub.util.Event1;
|
import jrummikub.util.Event1;
|
||||||
import jrummikub.util.Event2;
|
import jrummikub.util.Event2;
|
||||||
|
import jrummikub.util.Event3;
|
||||||
import jrummikub.util.GameData;
|
import jrummikub.util.GameData;
|
||||||
import jrummikub.util.IEvent;
|
import jrummikub.util.IEvent;
|
||||||
import jrummikub.util.IEvent1;
|
import jrummikub.util.IEvent1;
|
||||||
import jrummikub.util.IEvent2;
|
import jrummikub.util.IEvent2;
|
||||||
|
import jrummikub.util.IEvent3;
|
||||||
import jrummikub.util.LoginData;
|
import jrummikub.util.LoginData;
|
||||||
|
|
||||||
import org.jivesoftware.smack.Connection;
|
import org.jivesoftware.smack.Connection;
|
||||||
|
@ -50,6 +53,8 @@ class ConnectionControl {
|
||||||
|
|
||||||
private Event2<UUID, Boolean> gameJoinAckEvent = new Event2<UUID, Boolean>();
|
private Event2<UUID, Boolean> gameJoinAckEvent = new Event2<UUID, Boolean>();
|
||||||
|
|
||||||
|
private Event3<UUID, String, Color> changeColorEvent = new Event3<UUID, String, Color>();
|
||||||
|
|
||||||
private volatile GameData offeredGame;
|
private volatile GameData offeredGame;
|
||||||
|
|
||||||
ConnectionControl(LoginData loginData) {
|
ConnectionControl(LoginData loginData) {
|
||||||
|
@ -99,6 +104,10 @@ class ConnectionControl {
|
||||||
return gameJoinAckEvent;
|
return gameJoinAckEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEvent3<UUID, String, Color> getChangeColorEvent() {
|
||||||
|
return changeColorEvent;
|
||||||
|
}
|
||||||
|
|
||||||
void offerGame(GameData data) {
|
void offerGame(GameData data) {
|
||||||
offeredGame = data;
|
offeredGame = data;
|
||||||
|
|
||||||
|
@ -181,6 +190,9 @@ class ConnectionControl {
|
||||||
} else if (messageType.equals("game_join_ack")) {
|
} else if (messageType.equals("game_join_ack")) {
|
||||||
gameJoinAckEvent.emit(UUID.fromString(extension.getValue("uuid")),
|
gameJoinAckEvent.emit(UUID.fromString(extension.getValue("uuid")),
|
||||||
Boolean.valueOf(extension.getValue("ack")));
|
Boolean.valueOf(extension.getValue("ack")));
|
||||||
|
} else if (messageType.equals("changeColor")) {
|
||||||
|
changeColorEvent.emit(UUID.fromString(extension.getValue("uuid")),
|
||||||
|
sender, (Color) Base64.decodeToObject(extension.getValue("color")));
|
||||||
} else {
|
} else {
|
||||||
System.err.println("Received unrecognized message of type '"
|
System.err.println("Received unrecognized message of type '"
|
||||||
+ messageType + "'");
|
+ messageType + "'");
|
||||||
|
@ -225,6 +237,15 @@ class ConnectionControl {
|
||||||
return createMessage(extension);
|
return createMessage(extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Message createChangeColorMessage(Color color) {
|
||||||
|
DefaultPacketExtension extension = createJRummikubExtension();
|
||||||
|
|
||||||
|
extension.setValue("messageType", "change_color");
|
||||||
|
extension.setValue("color", Base64.encodeObject(color, Base64.GZIP));
|
||||||
|
|
||||||
|
return createMessage(extension);
|
||||||
|
}
|
||||||
|
|
||||||
private Message createGameAckMessage(UUID uuid, String recipient, boolean ack) {
|
private Message createGameAckMessage(UUID uuid, String recipient, boolean ack) {
|
||||||
DefaultPacketExtension extension = createJRummikubExtension();
|
DefaultPacketExtension extension = createJRummikubExtension();
|
||||||
|
|
||||||
|
@ -376,6 +397,23 @@ class ConnectionControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class SendChangeColorRunner implements Runnable {
|
||||||
|
private Color color;
|
||||||
|
|
||||||
|
public SendChangeColorRunner(Color color) {
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
synchronized (ConnectionControl.this) {
|
||||||
|
if (connection != null) {
|
||||||
|
connection.sendPacket(createChangeColorMessage(color));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class SendGameLeaveRunner implements Runnable {
|
private class SendGameLeaveRunner implements Runnable {
|
||||||
private UUID uuid;
|
private UUID uuid;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package jrummikub.control.network;
|
package jrummikub.control.network;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import jrummikub.model.GameSettings;
|
import jrummikub.model.GameSettings;
|
||||||
import jrummikub.model.PlayerSettings;
|
import jrummikub.model.PlayerSettings;
|
||||||
|
@ -9,6 +13,7 @@ import jrummikub.model.PlayerSettings.Type;
|
||||||
import jrummikub.util.Connection;
|
import jrummikub.util.Connection;
|
||||||
import jrummikub.util.GameData;
|
import jrummikub.util.GameData;
|
||||||
import jrummikub.util.IListener1;
|
import jrummikub.util.IListener1;
|
||||||
|
import jrummikub.view.ISettingsPanel;
|
||||||
import jrummikub.view.ISettingsPanel.SettingsMode;
|
import jrummikub.view.ISettingsPanel.SettingsMode;
|
||||||
import jrummikub.view.IView;
|
import jrummikub.view.IView;
|
||||||
|
|
||||||
|
@ -38,12 +43,26 @@ public class GameJoinControl {
|
||||||
fixGameSettings(settings);
|
fixGameSettings(settings);
|
||||||
|
|
||||||
gameData.setGameSettings(settings);
|
gameData.setGameSettings(settings);
|
||||||
view.getSettingsPanel().setGameSettings(settings);
|
|
||||||
|
updateSettingsPanel(settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateSettingsPanel(GameSettings settings) {
|
||||||
|
view.getSettingsPanel().setGameSettings(settings);
|
||||||
|
|
||||||
|
Set<Color> colors = new HashSet<Color>(
|
||||||
|
Arrays.asList(ISettingsPanel.PLAYER_COLORS));
|
||||||
|
|
||||||
|
for (PlayerSettings player : settings.getPlayerList()) {
|
||||||
|
colors.remove(player.getColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
view.getSettingsPanel().setPlayerColors(colors);
|
||||||
|
}
|
||||||
|
|
||||||
private void fixGameSettings(GameSettings settings) {
|
private void fixGameSettings(GameSettings settings) {
|
||||||
for (PlayerSettings player : settings.getPlayerList()) {
|
for (PlayerSettings player : settings.getPlayerList()) {
|
||||||
if (player.getType() == Type.HUMAN) {
|
if (player.getType() == Type.HUMAN) {
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package jrummikub.control.network;
|
package jrummikub.control.network;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import jrummikub.model.GameSettings;
|
import jrummikub.model.GameSettings;
|
||||||
|
@ -10,6 +14,7 @@ import jrummikub.model.PlayerSettings.Type;
|
||||||
import jrummikub.util.Connection;
|
import jrummikub.util.Connection;
|
||||||
import jrummikub.util.GameData;
|
import jrummikub.util.GameData;
|
||||||
import jrummikub.util.IListener2;
|
import jrummikub.util.IListener2;
|
||||||
|
import jrummikub.view.ISettingsPanel;
|
||||||
import jrummikub.view.ISettingsPanel.SettingsMode;
|
import jrummikub.view.ISettingsPanel.SettingsMode;
|
||||||
import jrummikub.view.IView;
|
import jrummikub.view.IView;
|
||||||
|
|
||||||
|
@ -28,7 +33,7 @@ public class GameOfferControl {
|
||||||
|
|
||||||
view.getSettingsPanel().setSettingsMode(SettingsMode.NETWORK_OFFER);
|
view.getSettingsPanel().setSettingsMode(SettingsMode.NETWORK_OFFER);
|
||||||
view.getSettingsPanel().enableAddPlayerButton(false);
|
view.getSettingsPanel().enableAddPlayerButton(false);
|
||||||
view.getSettingsPanel().setGameSettings(settings);
|
updateSettingsPanel(settings);
|
||||||
|
|
||||||
connections.add(connectionControl.getGameJoinEvent().add(
|
connections.add(connectionControl.getGameJoinEvent().add(
|
||||||
new IListener2<UUID, String>() {
|
new IListener2<UUID, String>() {
|
||||||
|
@ -42,7 +47,7 @@ public class GameOfferControl {
|
||||||
if (player.getType() == Type.VACANT) {
|
if (player.getType() == Type.VACANT) {
|
||||||
player.setName(sender);
|
player.setName(sender);
|
||||||
player.setType(Type.NETWORK);
|
player.setType(Type.NETWORK);
|
||||||
view.getSettingsPanel().setGameSettings(settings);
|
updateSettingsPanel(settings);
|
||||||
connectionControl.ackJoinGame(uuid, sender, true);
|
connectionControl.ackJoinGame(uuid, sender, true);
|
||||||
connectionControl.offerGame(gameData);
|
connectionControl.offerGame(gameData);
|
||||||
return;
|
return;
|
||||||
|
@ -52,6 +57,32 @@ public class GameOfferControl {
|
||||||
connectionControl.ackJoinGame(uuid, sender, false);
|
connectionControl.ackJoinGame(uuid, sender, false);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
connections.add(view.getSettingsPanel().getChangePlayerColorEvent()
|
||||||
|
.add(new IListener2<Integer, Color>() {
|
||||||
|
@Override
|
||||||
|
public void handle(Integer i, Color color) {
|
||||||
|
for (PlayerSettings player : settings.getPlayerList()) {
|
||||||
|
if (player.getColor() == color) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.getPlayerList().get(i).setColor(color);
|
||||||
|
updateSettingsPanel(settings);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSettingsPanel(GameSettings settings) {
|
||||||
|
view.getSettingsPanel().setGameSettings(settings);
|
||||||
|
|
||||||
|
Set<Color> colors = new HashSet<Color>(
|
||||||
|
Arrays.asList(ISettingsPanel.PLAYER_COLORS));
|
||||||
|
|
||||||
|
for (PlayerSettings player : settings.getPlayerList()) {
|
||||||
|
colors.remove(player.getColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
view.getSettingsPanel().setPlayerColors(colors);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startGameOffer() {
|
public void startGameOffer() {
|
||||||
|
|
|
@ -237,6 +237,8 @@ public interface ISettingsPanel {
|
||||||
*/
|
*/
|
||||||
public IEvent getOfferGameEvent();
|
public IEvent getOfferGameEvent();
|
||||||
|
|
||||||
|
public void setPlayerColors(Set<Color> colors);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the different kinds of settings errors that can be displayed
|
* Specifies the different kinds of settings errors that can be displayed
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -41,6 +41,7 @@ import javax.swing.JTabbedPane;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.JToggleButton;
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.SpinnerNumberModel;
|
import javax.swing.SpinnerNumberModel;
|
||||||
|
import javax.swing.UIManager;
|
||||||
import javax.swing.border.CompoundBorder;
|
import javax.swing.border.CompoundBorder;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
import javax.swing.border.LineBorder;
|
import javax.swing.border.LineBorder;
|
||||||
|
@ -67,6 +68,8 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
private List<Boolean> removeButtonsEnabled = Collections.emptyList();
|
private List<Boolean> removeButtonsEnabled = Collections.emptyList();
|
||||||
private List<Boolean> playerNamesEditable = Collections.emptyList();
|
private List<Boolean> playerNamesEditable = Collections.emptyList();
|
||||||
|
|
||||||
|
private Set<Color> playerColors;
|
||||||
|
|
||||||
private SettingsMode settingsMode = SettingsMode.DEFAULT;
|
private SettingsMode settingsMode = SettingsMode.DEFAULT;
|
||||||
|
|
||||||
private JTabbedPane tabbedPane;
|
private JTabbedPane tabbedPane;
|
||||||
|
@ -234,6 +237,11 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
playerTypeChoices = choices;
|
playerTypeChoices = choices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayerColors(Set<Color> colors) {
|
||||||
|
playerColors = colors;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setError(SettingsError error) {
|
public void setError(SettingsError error) {
|
||||||
switch (error) {
|
switch (error) {
|
||||||
|
@ -454,7 +462,7 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
jokerNumberLabel = new JLabel();
|
jokerNumberLabel = new JLabel();
|
||||||
jokerNumberSpinner = createOptionSpinner(1, 999, 1, changeJokerNumberEvent);
|
jokerNumberSpinner = createOptionSpinner(1, 999, 1, changeJokerNumberEvent);
|
||||||
|
|
||||||
makeOptionLabel(row++, "Zeit für Spielzug:");
|
makeOptionLabel(row++, "Zeit f\u00fcr Spielzug:");
|
||||||
timeLabel = new JLabel();
|
timeLabel = new JLabel();
|
||||||
timeSpinner = createOptionSpinner(1, 999, 1, changeTimeEvent);
|
timeSpinner = createOptionSpinner(1, 999, 1, changeTimeEvent);
|
||||||
|
|
||||||
|
@ -1019,7 +1027,12 @@ class SettingsPanel extends JPanel implements ISettingsPanel {
|
||||||
JPopupMenu menu = new JPopupMenu();
|
JPopupMenu menu = new JPopupMenu();
|
||||||
|
|
||||||
for (Color c : PLAYER_COLORS) {
|
for (Color c : PLAYER_COLORS) {
|
||||||
|
if (playerColors.contains(c)) {
|
||||||
add(new ColorButton(c, menu));
|
add(new ColorButton(c, menu));
|
||||||
|
} else {
|
||||||
|
add(new JLabel(ImageUtil.createColorIcon(
|
||||||
|
UIManager.getColor("PopupMenu.background"), 16, 0)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.setLayout(new BorderLayout());
|
menu.setLayout(new BorderLayout());
|
||||||
|
|
Reference in a new issue