Coverage Summary for Class: LobbySelectionPanel (it.polimi.ingsw.Client.GUI.Panels)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
LobbySelectionPanel |
0%
(0/1)
|
0%
(0/6)
|
0%
(0/12)
|
0%
(0/147)
|
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.Network.SocketWrapper;
6 import it.polimi.ingsw.Server.Messages.Events.Requests.ConnectLobbyRequest;
7 import it.polimi.ingsw.Server.Messages.Events.Requests.CreateLobbyRequest;
8 import it.polimi.ingsw.Server.Messages.Message;
9 import it.polimi.ingsw.Server.Messages.ServerResponses.LobbyConnected;
10 import it.polimi.ingsw.Server.Messages.ServerResponses.SupportStructures.LobbyInfo;
11 import it.polimi.ingsw.Server.Messages.ServerResponses.SupportStructures.StatusCode;
12
13 import javax.swing.*;
14 import java.awt.*;
15 import java.io.IOException;
16 import java.util.List;
17 import java.util.UUID;
18
19 /**
20 * JTabbedPane that allows the user to create or connect to a lobby
21 */
22 public class LobbySelectionPanel extends JTabbedPane {
23 /**
24 * Create a new LobbySelectionPanel
25 *
26 * @param ctx context that will be used by GUI's game's panels
27 * @param publicLobbies list of publicLobbies available at that moment
28 */
29 public LobbySelectionPanel(Context ctx, List<LobbyInfo> publicLobbies) {
30 // unwrapping context into useful variables
31 Window window = ctx.getWindow();
32 SocketWrapper sw = ctx.getSocketWrapper();
33
34 // tabbed pane tabs
35 JPanel connectPanel = new JPanel();
36 JPanel createPanel = new JPanel();
37
38 // adding tabs to the pane
39 this.add("Connect", connectPanel);
40 this.add("Create", createPanel);
41
42 // connect tab setup
43 {
44 // labels
45 JLabel title = new JLabel("Select a lobby from the list, or input a lobby id to connect to.");
46 JLabel publicLobbiesLabel = new JLabel("These are all the public lobbies you can connect to:");
47 JLabel lobbyIDLabel = new JLabel("Connecting to:", SwingConstants.RIGHT);
48
49 // text fields
50 JTextField lobbyID = new JTextField(30);
51
52 // buttons
53 JButton connect = new JButton("Connect");
54
55 // list cell renderer
56 ListCellRenderer<LobbyInfo> cellRenderer = (list, info, index, isSelected, _ignored) -> {
57 JLabel displayedText = new JLabel();
58 displayedText.setText(
59 "ID: " + info.getID() +
60 " || Admin: " + info.getAdmin() +
61 " || Size: " + (info.getPlayers().size()) + "/" + info.getMaxPlayers());
62 if (isSelected) {
63 displayedText.setBackground(list.getSelectionBackground());
64 displayedText.setForeground(list.getSelectionForeground());
65 } else {
66 displayedText.setBackground(list.getBackground());
67 displayedText.setForeground(list.getForeground());
68 }
69 displayedText.setOpaque(true);
70 return displayedText;
71 };
72
73 // list of public lobbies
74 JList<LobbyInfo> publicLobbiesList = new JList<>(publicLobbies.toArray(LobbyInfo[]::new));
75 publicLobbiesList.setLayoutOrientation(JList.VERTICAL);
76 publicLobbiesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
77 publicLobbiesList.setCellRenderer(cellRenderer);
78
79 // wrapping the list of lobbies in a scrollable panel
80 JScrollPane scrollablePublicLobbiesList = new JScrollPane();
81 scrollablePublicLobbiesList.setViewportView(publicLobbiesList);
82 scrollablePublicLobbiesList.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
83 scrollablePublicLobbiesList.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
84 scrollablePublicLobbiesList.setPreferredSize(new Dimension(720, 100));
85
86 // adding all elements to the view
87 connectPanel.add(title);
88 connectPanel.add(publicLobbiesLabel);
89 connectPanel.add(lobbyIDLabel);
90 connectPanel.add(lobbyID);
91 connectPanel.add(connect);
92 connectPanel.add(scrollablePublicLobbiesList);
93
94 // setting correct focus
95 scrollablePublicLobbiesList.requestFocusInWindow();
96
97 // actionListeners
98 publicLobbiesList.addListSelectionListener(listSelectionEvent -> {
99 int selectedIndex = publicLobbiesList.getSelectedIndex();
100 lobbyID.setText(publicLobbies.get(selectedIndex).getID().toString());
101 });
102 lobbyID.addActionListener(actionEvent -> {
103 lobbyID.setText(lobbyID.getText().trim());
104 connect.requestFocusInWindow();
105 });
106 connect.addActionListener(actionEvent -> {
107 connect.setEnabled(false);
108 // normalize id
109 String idString = lobbyID.getText().trim();
110 lobbyID.setText(idString);
111 UUID id = UUID.fromString(idString);
112 try {
113 sw.sendMessage(new ConnectLobbyRequest(id));
114 Message response = sw.awaitMessage();
115 if (response instanceof LobbyConnected lobbyConnected) {
116 if (lobbyConnected.getStatusCode() == StatusCode.Success) {
117 //Switch to a new LobbySelectionPanel if user has been accepted by Server
118 window.changeView(new GameStartingPanel(ctx, false, lobbyConnected.getLobbyID()));
119 } else {
120 JOptionPane.showMessageDialog(null, "Try again.", "Error", JOptionPane.INFORMATION_MESSAGE);
121 connect.setEnabled(true);
122 }
123 } else {
124 throw new IllegalStateException("Unexpected value: " + response);
125 }
126 } catch (Exception e) {
127 JOptionPane.showMessageDialog(null, "Error in the connection with the server",
128 "Error", JOptionPane.INFORMATION_MESSAGE);
129 try {
130 sw.close();
131 } catch (IOException ex) {
132 throw new RuntimeException(ex);
133 }
134 window.changeView(new StartPanel(ctx));
135 }
136 });
137
138 // layout object decleration and setup
139 SpringLayout layout = new SpringLayout();
140
141 layout.putConstraint(SpringLayout.VERTICAL_CENTER, title, 20, SpringLayout.NORTH, connectPanel);
142 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, title, 0, SpringLayout.HORIZONTAL_CENTER, connectPanel);
143
144 layout.putConstraint(SpringLayout.VERTICAL_CENTER, publicLobbiesLabel, 20, SpringLayout.SOUTH, title);
145 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, publicLobbiesLabel, 0, SpringLayout.HORIZONTAL_CENTER, connectPanel);
146 layout.putConstraint(SpringLayout.NORTH, scrollablePublicLobbiesList, 20, SpringLayout.VERTICAL_CENTER, publicLobbiesLabel);
147 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, scrollablePublicLobbiesList, 0, SpringLayout.HORIZONTAL_CENTER, connectPanel);
148
149 layout.putConstraint(SpringLayout.VERTICAL_CENTER, lobbyIDLabel, 20, SpringLayout.SOUTH, scrollablePublicLobbiesList);
150 layout.putConstraint(SpringLayout.EAST, lobbyIDLabel, -10, SpringLayout.HORIZONTAL_CENTER, connectPanel);
151 layout.putConstraint(SpringLayout.VERTICAL_CENTER, lobbyID, 0, SpringLayout.VERTICAL_CENTER, lobbyIDLabel);
152 layout.putConstraint(SpringLayout.WEST, lobbyID, 10, SpringLayout.HORIZONTAL_CENTER, connectPanel);
153
154 layout.putConstraint(SpringLayout.VERTICAL_CENTER, connect, 40, SpringLayout.VERTICAL_CENTER, lobbyIDLabel);
155 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, connect, 0, SpringLayout.HORIZONTAL_CENTER, connectPanel);
156
157 // apply layout
158 connectPanel.setLayout(layout);
159 }
160
161 // create tab setup
162 {
163 // labels
164 JLabel title = new JLabel("Create a lobby");
165 JLabel openLobbyLabel = new JLabel("Public lobby:", SwingConstants.RIGHT);
166 JLabel maxPlayersLabel = new JLabel("Max Players:", SwingConstants.RIGHT);
167
168 // buttons
169 JButton create = new JButton("Create");
170 JCheckBox openLobby = new JCheckBox();
171 JRadioButton maxPlayers_2 = new JRadioButton("2");
172 maxPlayers_2.setActionCommand("2");
173 JRadioButton maxPlayers_3 = new JRadioButton("3");
174 maxPlayers_3.setActionCommand("3");
175 JRadioButton maxPlayers_4 = new JRadioButton("4");
176 maxPlayers_4.setActionCommand("4");
177
178 // radio buttons get grouped up
179 ButtonGroup maxPlayers = new ButtonGroup();
180 maxPlayers_2.setSelected(true);
181 maxPlayers.add(maxPlayers_2);
182 maxPlayers.add(maxPlayers_3);
183 maxPlayers.add(maxPlayers_4);
184
185 // adding all elements to the view
186 createPanel.add(title);
187 createPanel.add(openLobbyLabel);
188 createPanel.add(maxPlayersLabel);
189 createPanel.add(create);
190 createPanel.add(openLobby);
191 createPanel.add(maxPlayers_2);
192 createPanel.add(maxPlayers_3);
193 createPanel.add(maxPlayers_4);
194
195 create.addActionListener(actionEvent -> {
196 create.setEnabled(false);
197 // normalize id
198 try {
199 sw.sendMessage(new CreateLobbyRequest(
200 openLobby.isSelected(),
201 Integer.parseInt(maxPlayers.getSelection().getActionCommand())
202 ));
203 boolean again = true;
204 do {
205 Message response = sw.awaitMessage();
206 if (response instanceof LobbyConnected lobbyConnected) {
207 if (lobbyConnected.getStatusCode() == StatusCode.Success) {
208 //Switch to a new LobbySelectionPanel if user has been accepted by Server
209 window.changeView(new GameStartingPanel(ctx, true, lobbyConnected.getLobbyID()));
210 again = false;
211 } else {
212 JOptionPane.showMessageDialog(null, "Try again.", "Error", JOptionPane.INFORMATION_MESSAGE);
213 create.setEnabled(true);
214 }
215 } else {
216 throw new IllegalStateException("Unexpected value: " + response);
217 }
218 } while (again);
219 } catch (Exception e) {
220 JOptionPane.showMessageDialog(null, "Error in the connection with the server",
221 "Error", JOptionPane.INFORMATION_MESSAGE);
222 try {
223 sw.close();
224 } catch (IOException ex) {
225 throw new RuntimeException(ex);
226 }
227 window.changeView(new StartPanel(ctx));
228 }
229 });
230
231 // layout object decleration and setup
232 SpringLayout layout = new SpringLayout();
233
234 layout.putConstraint(SpringLayout.VERTICAL_CENTER, title, 20, SpringLayout.NORTH, createPanel);
235 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, title, 0, SpringLayout.HORIZONTAL_CENTER, createPanel);
236
237 layout.putConstraint(SpringLayout.VERTICAL_CENTER, openLobbyLabel, 20, SpringLayout.SOUTH, title);
238 layout.putConstraint(SpringLayout.EAST, openLobbyLabel, -10, SpringLayout.HORIZONTAL_CENTER, createPanel);
239 layout.putConstraint(SpringLayout.VERTICAL_CENTER, openLobby, 0, SpringLayout.VERTICAL_CENTER, openLobbyLabel);
240 layout.putConstraint(SpringLayout.WEST, openLobby, 10, SpringLayout.HORIZONTAL_CENTER, createPanel);
241
242 layout.putConstraint(SpringLayout.VERTICAL_CENTER, maxPlayersLabel, 20, SpringLayout.SOUTH, openLobbyLabel);
243 layout.putConstraint(SpringLayout.EAST, maxPlayersLabel, -10, SpringLayout.HORIZONTAL_CENTER, createPanel);
244 layout.putConstraint(SpringLayout.VERTICAL_CENTER, maxPlayers_2, 0, SpringLayout.VERTICAL_CENTER, maxPlayersLabel);
245 layout.putConstraint(SpringLayout.WEST, maxPlayers_2, 10, SpringLayout.HORIZONTAL_CENTER, createPanel);
246 layout.putConstraint(SpringLayout.VERTICAL_CENTER, maxPlayers_3, 0, SpringLayout.VERTICAL_CENTER, maxPlayersLabel);
247 layout.putConstraint(SpringLayout.WEST, maxPlayers_3, 10, SpringLayout.EAST, maxPlayers_2);
248 layout.putConstraint(SpringLayout.VERTICAL_CENTER, maxPlayers_4, 0, SpringLayout.VERTICAL_CENTER, maxPlayersLabel);
249 layout.putConstraint(SpringLayout.WEST, maxPlayers_4, 10, SpringLayout.EAST, maxPlayers_3);
250
251 layout.putConstraint(SpringLayout.VERTICAL_CENTER, create, 40, SpringLayout.VERTICAL_CENTER, maxPlayersLabel);
252 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, create, 0, SpringLayout.HORIZONTAL_CENTER, createPanel);
253
254 // apply layout
255 createPanel.setLayout(layout);
256 }
257 }
258 }