Coverage Summary for Class: GameStartingPanel (it.polimi.ingsw.Client.GUI.Panels)
| Class | Class, % | Method, % | Branch, % | Line, % |
|---|---|---|---|---|
| GameStartingPanel | 0% (0/1) | 0% (0/5) | 0% (0/11) | 0% (0/104) |
1 package it.polimi.ingsw.Client.GUI.Panels; 2 3 import it.polimi.ingsw.Client.GUI.Context; 4 import it.polimi.ingsw.Client.GUI.Window; 5 import it.polimi.ingsw.Model.Enums.GameMode; 6 import it.polimi.ingsw.Network.SocketWrapper; 7 import it.polimi.ingsw.Server.Messages.Events.Requests.StartGameRequest; 8 import it.polimi.ingsw.Server.Messages.Message; 9 import it.polimi.ingsw.Server.Messages.ServerResponses.*; 10 import it.polimi.ingsw.Server.Messages.ServerResponses.SupportStructures.StatusCode; 11 12 import javax.swing.*; 13 import java.awt.*; 14 import java.io.IOException; 15 import java.util.UUID; 16 17 /** 18 * Panel that allows lobby's admin to start the game (is also possible to select gameMode) after it has been filled 19 */ 20 public class GameStartingPanel extends JPanel { 21 /** 22 * Create a new GameStartingPanel 23 * 24 * @param ctx context that will be used by GUI's game's panels 25 * @param isAdmin GameStartingPanel has been created by lobby's admin 26 * @param lobbyID Lobby's UUID 27 */ 28 public GameStartingPanel(Context ctx, boolean isAdmin, UUID lobbyID) { 29 // unwrapping context into useful variables 30 Window window = ctx.getWindow(); 31 SocketWrapper sw = ctx.getSocketWrapper(); 32 33 // labels 34 JLabel title = new JLabel("Connected to the lobby"); 35 JLabel lobbyIDlabel = new JLabel("Connected to the lobby"); 36 JLabel connectedPlayersLablel = new JLabel("Players in lobby:"); 37 JLabel gameModeLabel = new JLabel("Advanced mode:"); 38 39 // text boxes 40 JTextField lobbyIDField = new JTextField(); 41 lobbyIDField.setText(lobbyID.toString()); 42 lobbyIDField.setEditable(false); 43 44 // buttons 45 JCheckBox gameMode = new JCheckBox(); 46 gameMode.setEnabled(isAdmin); 47 gameMode.setToolTipText("Only the lobby admin can select the game mode"); 48 JButton disconnect = new JButton("Disconnect from the lobby"); 49 JButton start = new JButton("Start the game"); 50 start.setToolTipText("Only the lobby admin can start the lobby"); 51 start.setEnabled(isAdmin); // start button is enabled only for admin of the lobby 52 53 // list cell renderer 54 ListCellRenderer<String> cellRenderer = (list, nick, index, isSelected, _ignored) -> { 55 JLabel displayedText = new JLabel(); 56 displayedText.setText(nick); 57 //enable this code to let selections be shown 58 if (isSelected) { 59 displayedText.setBackground(list.getSelectionBackground()); 60 displayedText.setForeground(list.getSelectionForeground()); 61 } else { 62 displayedText.setBackground(list.getBackground()); 63 displayedText.setForeground(list.getForeground()); 64 } 65 displayedText.setOpaque(true); 66 return displayedText; 67 }; 68 69 // list of connected players 70 JList<String> connectedPlayersList = new JList<>(new String[]{}); 71 connectedPlayersList.setLayoutOrientation(JList.VERTICAL); 72 connectedPlayersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 73 connectedPlayersList.setCellRenderer(cellRenderer); 74 connectedPlayersList.setPreferredSize(new Dimension(720, 100)); 75 76 // adding all elements to the view 77 this.add(title); 78 this.add(disconnect); 79 this.add(start); 80 this.add(connectedPlayersLablel); 81 this.add(connectedPlayersList); 82 this.add(lobbyIDlabel); 83 this.add(lobbyIDField); 84 this.add(gameModeLabel); 85 this.add(gameMode); 86 87 disconnect.addActionListener(actionEvent -> { 88 try { 89 sw.close(); 90 } catch (IOException e) { 91 throw new RuntimeException(e); 92 } 93 }); 94 95 start.addActionListener(actionEvent -> { 96 try { 97 sw.sendMessage(new StartGameRequest(gameMode.isSelected() ? GameMode.ADVANCED : GameMode.SIMPLE)); 98 } catch (IOException e) { 99 throw new RuntimeException(e); 100 } 101 }); 102 103 // layout object declaration and setup 104 SpringLayout layout = new SpringLayout(); 105 106 layout.putConstraint(SpringLayout.VERTICAL_CENTER, title, 20, SpringLayout.NORTH, this); 107 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, title, 0, SpringLayout.HORIZONTAL_CENTER, this); 108 109 layout.putConstraint(SpringLayout.NORTH, lobbyIDlabel, 20, SpringLayout.SOUTH, title); 110 layout.putConstraint(SpringLayout.EAST, lobbyIDlabel, -10, SpringLayout.HORIZONTAL_CENTER, this); 111 layout.putConstraint(SpringLayout.VERTICAL_CENTER, lobbyIDField, 0, SpringLayout.VERTICAL_CENTER, lobbyIDlabel); 112 layout.putConstraint(SpringLayout.WEST, lobbyIDField, 10, SpringLayout.HORIZONTAL_CENTER, this); 113 114 layout.putConstraint(SpringLayout.NORTH, connectedPlayersLablel, 20, SpringLayout.SOUTH, lobbyIDField); 115 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, connectedPlayersLablel, 0, SpringLayout.HORIZONTAL_CENTER, this); 116 layout.putConstraint(SpringLayout.NORTH, connectedPlayersList, 20, SpringLayout.SOUTH, connectedPlayersLablel); 117 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, connectedPlayersList, 0, SpringLayout.HORIZONTAL_CENTER, this); 118 119 layout.putConstraint(SpringLayout.NORTH, gameModeLabel, 20, SpringLayout.SOUTH, connectedPlayersList); 120 layout.putConstraint(SpringLayout.EAST, gameModeLabel, -10, SpringLayout.HORIZONTAL_CENTER, this); 121 layout.putConstraint(SpringLayout.VERTICAL_CENTER, gameMode, 0, SpringLayout.VERTICAL_CENTER, gameModeLabel); 122 layout.putConstraint(SpringLayout.WEST, gameMode, 10, SpringLayout.HORIZONTAL_CENTER, this); 123 layout.putConstraint(SpringLayout.NORTH, start, 20, SpringLayout.SOUTH, gameMode); 124 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, start, 0, SpringLayout.HORIZONTAL_CENTER, this); 125 layout.putConstraint(SpringLayout.NORTH, disconnect, 20, SpringLayout.SOUTH, start); 126 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, disconnect, 0, SpringLayout.HORIZONTAL_CENTER, this); 127 128 // apply layout 129 this.setLayout(layout); 130 131 // start socket listener task 132 new Thread(() -> { 133 while (true) { 134 try { 135 Message input = sw.awaitMessage(); 136 switch (input) { 137 case LobbyClosed ignored -> { 138 JOptionPane.showMessageDialog(null, "Lobby was closed by the server.\n" + 139 "Client is disconnecting from the server.", "Lobby closed", JOptionPane.INFORMATION_MESSAGE); 140 sw.close(); 141 window.changeView(new StartPanel(ctx)); 142 } 143 case ClientConnected clientConnected -> { 144 synchronized (connectedPlayersList) { 145 connectedPlayersList.setListData(clientConnected.getPlayers().toArray(String[]::new)); 146 } 147 } 148 case ClientDisconnected clientDisconnected -> { 149 synchronized (connectedPlayersList) { 150 connectedPlayersList.setListData(clientDisconnected.getPlayers().toArray(String[]::new)); 151 } 152 } 153 case GameInit gameInit -> { 154 if (gameInit.getStatusCode() == StatusCode.Fail) { 155 JOptionPane.showMessageDialog(null, gameInit.getErrorMessage(), "Error", JOptionPane.INFORMATION_MESSAGE); 156 } 157 } 158 case GameStarted ignored -> { 159 window.changeView(new GameInProgressPanel(ctx)); 160 return; 161 } 162 default -> throw new IllegalStateException("Unexpected value: " + input.getClass()); 163 } 164 } catch (Exception e) { 165 JOptionPane.showMessageDialog(null, "Disconnected from server", "Error", JOptionPane.INFORMATION_MESSAGE); 166 try { 167 sw.close(); 168 } catch (IOException ex) { 169 throw new RuntimeException(ex); 170 } 171 window.changeView(new StartPanel(ctx)); 172 return; 173 } 174 } 175 }).start(); 176 } 177 }