From cc4797fd8b894cc7e02346dc93f891cccb4c0a09 Mon Sep 17 00:00:00 2001 From: Ida Massow Date: Sat, 11 Jun 2011 00:02:42 +0200 Subject: Netzwerk hat Panel mit laufenden Spielen und einem funktionierenden Abbrechen-Button git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@406 72836036-5685-4462-b002-a69064685172 --- mock/jrummikub/view/MockGameListPanel.java | 29 +++++ mock/jrummikub/view/MockView.java | 17 ++- src/jrummikub/control/ApplicationControl.java | 20 ++-- .../control/network/ConnectionControl.java | 114 ++++++++++++++++++ src/jrummikub/control/network/NetworkControl.java | 132 ++++++++++----------- src/jrummikub/view/IGameListPanel.java | 54 +++++++++ src/jrummikub/view/ILoginPanel.java | 9 ++ src/jrummikub/view/IView.java | 4 + src/jrummikub/view/impl/GameListPanel.java | 111 +++++++++++++++++ src/jrummikub/view/impl/LoginPanel.java | 3 + src/jrummikub/view/impl/View.java | 72 +++++++---- 11 files changed, 464 insertions(+), 101 deletions(-) create mode 100644 mock/jrummikub/view/MockGameListPanel.java create mode 100644 src/jrummikub/control/network/ConnectionControl.java create mode 100644 src/jrummikub/view/IGameListPanel.java create mode 100644 src/jrummikub/view/impl/GameListPanel.java diff --git a/mock/jrummikub/view/MockGameListPanel.java b/mock/jrummikub/view/MockGameListPanel.java new file mode 100644 index 0000000..feff097 --- /dev/null +++ b/mock/jrummikub/view/MockGameListPanel.java @@ -0,0 +1,29 @@ +package jrummikub.view; + +import jrummikub.util.IEvent; +import jrummikub.util.IEvent1; +import jrummikub.util.MockEvent; +import jrummikub.util.MockEvent1; + +/** */ +public class MockGameListPanel implements IGameListPanel { + public MockEvent1 joinEvent = new MockEvent1(); + public MockEvent openNewGameEvent = new MockEvent(); + public MockEvent cancelEvent = new MockEvent(); + + @Override + public IEvent getOpenNewGameEvent() { + return openNewGameEvent; + } + + @Override + public IEvent getCancelEvent() { + return cancelEvent; + } + + @Override + public IEvent1 getJoinEvent() { + return joinEvent; + } + +} diff --git a/mock/jrummikub/view/MockView.java b/mock/jrummikub/view/MockView.java index 2b716e2..4f3342d 100644 --- a/mock/jrummikub/view/MockView.java +++ b/mock/jrummikub/view/MockView.java @@ -27,11 +27,15 @@ public class MockView implements IView { /** */ public MockLoginPanel loginPanel = new MockLoginPanel(); /** */ + public MockGameListPanel gameListPanel = new MockGameListPanel(); + /** */ public boolean isSettingsPanelVisible = false; /** */ public boolean isScorePanelVisible = false; /** */ public boolean isLoginPanelVisible = false; + /** */ + public boolean isGameListPanelVisible = false; /** */ public Collection selectedStones; @@ -127,13 +131,11 @@ public class MockView implements IView { @Override public void setCurrentPlayerColor(Color color) { // TODO Auto-generated method stub - } @Override public void setCurrentPlayerHasLaidOut(boolean hasLaidOut) { // TODO Auto-generated method stub - } @Override @@ -173,7 +175,6 @@ public class MockView implements IView { @Override public void enablePauseMode(boolean enable) { // TODO Auto-generated method stub - } @Override @@ -199,6 +200,16 @@ public class MockView implements IView { @Override public void showLoginPanel(boolean show) { isLoginPanelVisible = show; + } + @Override + public void showGameListPanel(boolean show) { + isGameListPanelVisible = show; } + + @Override + public IGameListPanel getGameListPanel() { + return gameListPanel; + } + } diff --git a/src/jrummikub/control/ApplicationControl.java b/src/jrummikub/control/ApplicationControl.java index 29114a1..85fb663 100644 --- a/src/jrummikub/control/ApplicationControl.java +++ b/src/jrummikub/control/ApplicationControl.java @@ -28,7 +28,7 @@ public class ApplicationControl { * Creates a new application control * * @param view - * the view to use + * the view to use */ public ApplicationControl(final IView view) { this.view = view; @@ -54,10 +54,11 @@ public class ApplicationControl { new IListener3() { @Override - public void handle(GameSettings settings, GameState gameState, - IRoundState roundState) { + public void handle(GameSettings settings, + GameState gameState, IRoundState roundState) { abortControls(); - gameControl = new GameControl(settings, saveControl, view); + gameControl = new GameControl(settings, saveControl, + view); addGameControlListeners(gameControl); gameControl.continueGame(gameState, roundState); @@ -154,10 +155,15 @@ public class ApplicationControl { } private void createNetworkControl(LoginData loginData) { - networkControl = new NetworkControl(loginData); + networkControl = new NetworkControl(loginData, view); - // TODO Add listeners + networkControl.getStopNetworkEvent().add(new IListener() { + @Override + public void handle() { + startApplication(); + } + }); - networkControl.connect(); + networkControl.startNetwork(); } } diff --git a/src/jrummikub/control/network/ConnectionControl.java b/src/jrummikub/control/network/ConnectionControl.java new file mode 100644 index 0000000..9777853 --- /dev/null +++ b/src/jrummikub/control/network/ConnectionControl.java @@ -0,0 +1,114 @@ +package jrummikub.control.network; + +import javax.swing.SwingUtilities; + +import jrummikub.util.Event; +import jrummikub.util.IEvent; +import jrummikub.util.LoginData; + +import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.XMPPError; +import org.jivesoftware.smack.packet.XMPPError.Type; +import org.jivesoftware.smackx.muc.MultiUserChat; + +class ConnectionControl { + private final LoginData loginData; + private volatile Connection connection; + private volatile MultiUserChat muc; + + private Event connectedEvent = new Event(); + private Event connectionFailedEvent = new Event(); + + ConnectionControl(LoginData loginData) { + this.loginData = loginData; + } + + void connect() { + new Thread(new ConnectRunner()).start(); + } + + void disconnect() { + connectedEvent = new Event(); + connectionFailedEvent = new Event(); + new Thread(new DisconnectRunner()).start(); + + } + + IEvent getConnectedEvent() { + return connectedEvent; + } + + IEvent getConnectionFailedEvent() { + return connectionFailedEvent; + } + + private static void emitLater(final Event event) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + event.emit(); + } + }); + } + + private class ConnectRunner implements Runnable { + @Override + public void run() { + synchronized (ConnectionControl.this) { + connection = new XMPPConnection(loginData.getServerName()); + try { + connection.connect(); + connection.login(loginData.getUserName(), + loginData.getPassword(), "JRummikub"); + muc = new MultiUserChat(connection, + loginData.getChannelName()); + + String nickname = loginData.getUserName(); + // Loop until a unused nickname is found + while (true) { + try { + muc.join(nickname); + break; // Join was successful, break the loop + } catch (XMPPException e) { + XMPPError error = e.getXMPPError(); + if (error.getType() == Type.CANCEL + && error.getCode() == 409) { + // There was a conflict, try again with another + // nickname + nickname += "_"; + continue; + } else { + // An unknown error has occurred, cancel connect + throw e; + } + } + } + + emitLater(connectedEvent); + } catch (XMPPException e) { + connection.disconnect(); + connection = null; + + // TODO Auto-generated catch block + e.printStackTrace(); + + emitLater(connectionFailedEvent); + } + } + } + } + + private class DisconnectRunner implements Runnable { + @Override + public void run() { + synchronized (ConnectionControl.this) { + if (connection != null) { + connection.disconnect(); + connection = null; + } + } + } + } +} diff --git a/src/jrummikub/control/network/NetworkControl.java b/src/jrummikub/control/network/NetworkControl.java index 4494cb6..d56ea0e 100644 --- a/src/jrummikub/control/network/NetworkControl.java +++ b/src/jrummikub/control/network/NetworkControl.java @@ -1,87 +1,87 @@ package jrummikub.control.network; -import javax.swing.SwingUtilities; +import java.util.ArrayList; +import java.util.List; +import jrummikub.util.Connection; import jrummikub.util.Event; +import jrummikub.util.IEvent; +import jrummikub.util.IListener; +import jrummikub.util.IListener1; import jrummikub.util.LoginData; - -import org.jivesoftware.smack.Connection; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.XMPPError; -import org.jivesoftware.smack.packet.XMPPError.Type; -import org.jivesoftware.smackx.muc.MultiUserChat; +import jrummikub.view.IGameListPanel; +import jrummikub.view.IGameListPanel.GameData; +import jrummikub.view.IView; public class NetworkControl { - private final LoginData loginData; - private Connection connection; - private MultiUserChat muc; - private Thread networkThread; + private ConnectionControl connectionControl; + private IView view; + private List connections = new ArrayList(); + private Event stopNetworkEvent = new Event(); - private Event connectedEvent = new Event(); - private Event connectionFailedEvent = new Event(); + public NetworkControl(LoginData loginData, final IView view) { + this.view = view; + connectionControl = new ConnectionControl(loginData); - public NetworkControl(LoginData loginData) { - this.loginData = loginData; - } + connections.add(connectionControl.getConnectedEvent().add( + new IListener() { + @Override + public void handle() { + view.showGameListPanel(true); + } + })); - public void connect() { - new Thread(new ConnectRunner()).run(); - } + connections.add(connectionControl.getConnectionFailedEvent().add( + new IListener() { + @Override + public void handle() { + // TODO Auto-generated method stub - public void abort() { - // TODO Implement this - } + } + })); - private static void emitLater(final Event event) { - SwingUtilities.invokeLater(new Runnable() { + connections.add(view.getGameListPanel().getJoinEvent() + .add(new IListener1() { + @Override + public void handle(GameData value) { + // TODO Auto-generated method stub - @Override - public void run() { - event.emit(); - } - }); - } + } + })); + + connections.add(view.getGameListPanel().getOpenNewGameEvent() + .add(new IListener() { + @Override + public void handle() { + // TODO Auto-generated method stub - private class ConnectRunner implements Runnable { - @Override - public void run() { - connection = new XMPPConnection(loginData.getServerName()); - try { - connection.connect(); - connection.login(loginData.getUserName(), loginData.getPassword(), - "JRummikub"); - muc = new MultiUserChat(connection, loginData.getChannelName()); - - String nickname = loginData.getUserName(); - // Loop until a unused nickname is found - while (true) { - try { - muc.join(nickname); - break; // Join was successful, break the loop - } catch (XMPPException e) { - XMPPError error = e.getXMPPError(); - if (error.getType() == Type.CANCEL && error.getCode() == 409) { - // There was a conflict, try again with another nickname - nickname += "_"; - continue; - } else { - // An unknown error has occurred, cancel connect - throw e; - } } - } + })); - emitLater(connectedEvent); - } catch (XMPPException e) { - connection.disconnect(); - connection = null; + connections.add(view.getGameListPanel().getCancelEvent() + .add(new IListener() { + @Override + public void handle() { + abort(); + stopNetworkEvent.emit(); + } + })); + } - // TODO Auto-generated catch block - e.printStackTrace(); + public void startNetwork() { + connectionControl.connect(); + } - emitLater(connectionFailedEvent); - } + public void abort() { + for (Connection c : connections) { + c.remove(); } + connectionControl.disconnect(); + view.showGameListPanel(false); + } + + public IEvent getStopNetworkEvent() { + return stopNetworkEvent; } + } diff --git a/src/jrummikub/view/IGameListPanel.java b/src/jrummikub/view/IGameListPanel.java new file mode 100644 index 0000000..adb754b --- /dev/null +++ b/src/jrummikub/view/IGameListPanel.java @@ -0,0 +1,54 @@ +package jrummikub.view; + +import java.util.UUID; + +import jrummikub.util.Event; +import jrummikub.util.Event1; +import jrummikub.util.IEvent; +import jrummikub.util.IEvent1; +import jrummikub.view.IGameListPanel.GameData; + +public interface IGameListPanel { + public static class GameData { + private UUID gameID; + private String host; + private int currentPlayerCount = 0; + private int maxPlayerCount = 0; + + public GameData(UUID gameID, String host) { + this.gameID = gameID; + this.host = host; + + } + + public void setCurrentPlayerCount(int i) { + currentPlayerCount = i; + } + + public int getCurrentPlayerCount() { + return currentPlayerCount; + } + + public void setMaxPlayerCount(int i) { + maxPlayerCount = i; + } + + public int getMaxPlayerCount() { + return maxPlayerCount; + } + + public String getHost() { + return host; + } + + public UUID getGameID() { + return gameID; + } + } + + public IEvent getOpenNewGameEvent(); + + public IEvent getCancelEvent(); + + public IEvent1 getJoinEvent(); +} \ No newline at end of file diff --git a/src/jrummikub/view/ILoginPanel.java b/src/jrummikub/view/ILoginPanel.java index f464c77..688d7e3 100644 --- a/src/jrummikub/view/ILoginPanel.java +++ b/src/jrummikub/view/ILoginPanel.java @@ -4,8 +4,17 @@ import jrummikub.util.IEvent; import jrummikub.util.IEvent1; import jrummikub.util.LoginData; +/** + * LoginPanel for network game + * + */ public interface ILoginPanel { + /** + * Player has offered all information and wants to connect + * + * @return LoginData username, server, password, channel + */ public IEvent1 getLoginEvent(); public IEvent getCancelEvent(); diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java index 722d89b..1121b44 100644 --- a/src/jrummikub/view/IView.java +++ b/src/jrummikub/view/IView.java @@ -172,10 +172,14 @@ public interface IView { public ILoginPanel getLoginPanel(); + public IGameListPanel getGameListPanel(); + public void showLoginPanel(boolean show); public void enablePauseMode(boolean enable); + public void showGameListPanel(boolean show); + /** * Different types of bottom panels */ diff --git a/src/jrummikub/view/impl/GameListPanel.java b/src/jrummikub/view/impl/GameListPanel.java new file mode 100644 index 0000000..d509a6e --- /dev/null +++ b/src/jrummikub/view/impl/GameListPanel.java @@ -0,0 +1,111 @@ +package jrummikub.view.impl; + +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; + +import jrummikub.util.Event; +import jrummikub.util.Event1; +import jrummikub.util.IEvent; +import jrummikub.util.IEvent1; +import jrummikub.view.IGameListPanel; + +class GameListPanel extends JPanel implements IGameListPanel { + private JLabel title; + private JList gameList; + private JButton joinButton; + private JButton openNewGameButton; + private JButton cancelButton; + private Event1 joinEvent = new Event1(); + private Event openNewGameEvent = new Event(); + private Event cancelEvent = new Event(); + + GameListPanel() { + setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.BOTH; + c.gridwidth = GridBagConstraints.REMAINDER; + c.weightx = 1; + c.weighty = 0; + + title = new JLabel(); + add(title, c); + + gameList = new JList(); + c.weighty = 1; + add(new JScrollPane(gameList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), c); + + joinButton = new JButton("Beitreten"); + c.weighty = 0; + c.gridwidth = 1; + add(joinButton, c); + joinButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + // joinEvent.emit(); + } + }); + + c.weightx = 0; + add(Box.createHorizontalStrut(10), c); + + openNewGameButton = new JButton("Neues Spiel"); + c.weightx = 1; + add(openNewGameButton, c); + openNewGameButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + // TODO Auto-generated method stub + openNewGameEvent.emit(); + } + }); + + c.weightx = 0; + add(Box.createHorizontalStrut(10), c); + + cancelButton = new JButton("Abbrechen"); + c.weightx = 1; + c.weighty = 0; + c.gridwidth = GridBagConstraints.REMAINDER; + add(cancelButton, c); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + cancelEvent.emit(); + } + }); + + setBorder(new CompoundBorder(new LineBorder(Color.BLACK), + new EmptyBorder(10, 10, 10, 10))); + } + + @Override + public IEvent getOpenNewGameEvent() { + return openNewGameEvent; + } + + @Override + public IEvent1 getJoinEvent() { + return joinEvent; + } + + @Override + public IEvent getCancelEvent() { + return cancelEvent; + } + +} diff --git a/src/jrummikub/view/impl/LoginPanel.java b/src/jrummikub/view/impl/LoginPanel.java index 842bf74..5241896 100644 --- a/src/jrummikub/view/impl/LoginPanel.java +++ b/src/jrummikub/view/impl/LoginPanel.java @@ -41,9 +41,12 @@ class LoginPanel extends JPanel implements ILoginPanel { c.weighty = 1; userNameField = addInputRow("Benutzername:", new JTextField()); + userNameField.setText("test1"); serverNameField = addInputRow("Server:", new JTextField()); + serverNameField.setText("universe-factory.net"); passwordField = addInputRow("Passwort:", new JPasswordField()); channelNameField = addInputRow("Channel:", new JTextField()); + channelNameField.setText("jrummikub@muc.universe-factory.net"); add(Box.createVerticalGlue(), c); c.gridwidth = 1; diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java index 99e8924..01623d2 100644 --- a/src/jrummikub/view/impl/View.java +++ b/src/jrummikub/view/impl/View.java @@ -31,6 +31,7 @@ import jrummikub.util.IEvent; import jrummikub.util.IEvent1; import jrummikub.util.IListener; import jrummikub.util.Pair; +import jrummikub.view.IGameListPanel; import jrummikub.view.IHandPanel; import jrummikub.view.ILoginPanel; import jrummikub.view.IPlayerPanel; @@ -60,6 +61,7 @@ public class View extends JFrame implements IView { private SettingsPanel settingsPanel; private LoginPanel loginPanel; private ScorePanel scorePanel; + private GameListPanel gameListPanel; private BottomPanelType bottomPanelType; @@ -106,6 +108,11 @@ public class View extends JFrame implements IView { return playerPanel; } + @Override + public IGameListPanel getGameListPanel() { + return gameListPanel; + } + @Override public IEvent getMenuNewGameEvent() { return menuNewGameEvent; @@ -146,7 +153,9 @@ public class View extends JFrame implements IView { showScorePanel(false); showSettingsPanel(false); showLoginPanel(false); - getHandPanel().setStones(Collections.> emptyList()); + showGameListPanel(false); + getHandPanel().setStones( + Collections.> emptyList()); getTablePanel().setStoneSets( Collections.> emptyList()); setSelectedStones(Collections. emptyList()); @@ -249,6 +258,12 @@ public class View extends JFrame implements IView { layeredPane.setLayer(loginPanel, JLayeredPane.POPUP_LAYER); layeredPane.add(loginPanel); + gameListPanel = new GameListPanel(); + gameListPanel.setVisible(false); + + layeredPane.setLayer(gameListPanel, JLayeredPane.POPUP_LAYER); + layeredPane.add(gameListPanel); + scorePanel = new ScorePanel(); scorePanel.setVisible(false); layeredPane.setLayer(scorePanel, JLayeredPane.POPUP_LAYER); @@ -291,8 +306,8 @@ public class View extends JFrame implements IView { mainLayer.add(table); playerPanel = new PlayerPanel(); - playerPanel.setBorder(new MatteBorder(PLAYER_PANEL_BORDER_WIDTH, 0, 0, 0, - Color.BLACK)); + playerPanel.setBorder(new MatteBorder(PLAYER_PANEL_BORDER_WIDTH, 0, 0, + 0, Color.BLACK)); mainLayer.add(playerPanel); startTurnPanel = new StartTurnPanel(); @@ -340,6 +355,7 @@ public class View extends JFrame implements IView { settingsPanel.setBounds(width / 4, height / 4, width / 2, height / 2); scorePanel.setBounds(width / 8, height / 4, width * 3 / 4, height / 2); loginPanel.setBounds(width / 3, height / 3, width / 3, height / 3); + gameListPanel.setBounds(width / 4, height / 4, width / 2, height / 2); } @Override @@ -362,6 +378,11 @@ public class View extends JFrame implements IView { loginPanel.setVisible(show); } + @Override + public void showGameListPanel(boolean show) { + gameListPanel.setVisible(show); + } + @Override public void showScorePanel(boolean show) { scorePanel.setVisible(show); @@ -406,24 +427,24 @@ public class View extends JFrame implements IView { @SuppressWarnings("unchecked") private List> createDecorationStones() { - Pair stoneJ = new Pair(new Stone(-'J', - StoneColor.BLACK), new Position(2.5f, 0)); - Pair stoneR = new Pair(new Stone(-'R', - StoneColor.ORANGE), new Position(3.5f, 0)); - Pair stoneu1 = new Pair(new Stone(-'u', - StoneColor.BLUE), new Position(4.5f, 0)); - Pair stonem1 = new Pair(new Stone(-'m', - StoneColor.RED), new Position(5.5f, 0)); - Pair stonem2 = new Pair(new Stone(-'m', - StoneColor.GREEN), new Position(6.5f, 0)); - Pair stonei = new Pair(new Stone(-'i', - StoneColor.VIOLET), new Position(7.5f, 0)); - Pair stonek = new Pair(new Stone(-'k', - StoneColor.AQUA), new Position(8.5f, 0)); - Pair stoneu2 = new Pair(new Stone(-'u', - StoneColor.GRAY), new Position(9.5f, 0)); - Pair stoneb = new Pair(new Stone(-'b', - StoneColor.BLACK), new Position(10.5f, 0)); + Pair stoneJ = new Pair(new Stone( + -'J', StoneColor.BLACK), new Position(2.5f, 0)); + Pair stoneR = new Pair(new Stone( + -'R', StoneColor.ORANGE), new Position(3.5f, 0)); + Pair stoneu1 = new Pair(new Stone( + -'u', StoneColor.BLUE), new Position(4.5f, 0)); + Pair stonem1 = new Pair(new Stone( + -'m', StoneColor.RED), new Position(5.5f, 0)); + Pair stonem2 = new Pair(new Stone( + -'m', StoneColor.GREEN), new Position(6.5f, 0)); + Pair stonei = new Pair(new Stone( + -'i', StoneColor.VIOLET), new Position(7.5f, 0)); + Pair stonek = new Pair(new Stone( + -'k', StoneColor.AQUA), new Position(8.5f, 0)); + Pair stoneu2 = new Pair(new Stone( + -'u', StoneColor.GRAY), new Position(9.5f, 0)); + Pair stoneb = new Pair(new Stone( + -'b', StoneColor.BLACK), new Position(10.5f, 0)); Pair stone1 = new Pair(new Stone( StoneColor.RED), new Position(2, 1)); @@ -438,9 +459,9 @@ public class View extends JFrame implements IView { Pair stone6 = new Pair(new Stone( StoneColor.BLACK), new Position(11, 1)); - return Arrays - .asList(stoneJ, stoneR, stoneu1, stonem1, stonem2, stonei, stonek, - stoneu2, stoneb, stone1, stone2, stone3, stone4, stone5, stone6); + return Arrays.asList(stoneJ, stoneR, stoneu1, stonem1, stonem2, stonei, + stonek, stoneu2, stoneb, stone1, stone2, stone3, stone4, + stone5, stone6); } @Override @@ -457,7 +478,8 @@ public class View extends JFrame implements IView { && type != BottomPanelType.WIN_PANEL && type != null); if (type == BottomPanelType.START_GAME_PANEL) { - table.setStoneSets(Collections.> emptyList()); + table.setStoneSets(Collections + .> emptyList()); playerPanel.getHandPanel().setStones(createDecorationStones()); } -- cgit v1.2.3