1 package net.sourceforge.simplegamenet.framework.gui;
2
3 import java.awt.*;
4 import java.io.IOException;
5 import java.net.InetAddress;
6 import javax.swing.*;
7 import javax.swing.text.BadLocationException;
8 import javax.swing.text.SimpleAttributeSet;
9 import javax.swing.text.StyleConstants;
10 import javax.swing.text.StyledDocument;
11 import net.sourceforge.simplegamenet.framework.model.ChatMessage;
12 import net.sourceforge.simplegamenet.framework.model.ClientEngineImpl;
13 import net.sourceforge.simplegamenet.framework.transport.ClientConnectionData;
14 import net.sourceforge.simplegamenet.framework.transport.ClientLoginHandler;
15 import net.sourceforge.simplegamenet.framework.transport.RemovePlayerType;
16 import net.sourceforge.simplegamenet.specs.gui.GameSettingsPanel;
17 import net.sourceforge.simplegamenet.specs.gui.PlayerSettingsPanel;
18 import net.sourceforge.simplegamenet.specs.gui.UtilityPanelFactory;
19 import net.sourceforge.simplegamenet.specs.model.GameFactory;
20 import net.sourceforge.simplegamenet.specs.to.GameSettings;
21 import net.sourceforge.simplegamenet.specs.to.PlayerSettings;
22 import net.sourceforge.simplegamenet.specs.to.PlayerSettingsMap;
23
24 public class ClientGUIFacade implements UtilityPanelFactory {
25
26 protected SimpleGameNetFrame simpleGameNetFrame;
27
28 protected StatusTabPanel statusTabPanel;
29 protected ChatTabPanel chatTabPanel;
30 protected GameTabPanel gameTabPanel;
31 protected GameSettingsTabPanel gameSettingsTabPanel;
32
33 protected StyledDocument chatLogDocument;
34 protected JTextArea logTextArea;
35
36 private boolean clientIsHost;
37
38 private ClientEngineImpl clientEngineImpl = null;
39
40 public ClientGUIFacade(SimpleGameNetFrame simpleGameNetFrame, StatusTabPanel statusTabPanel,
41 ChatTabPanel chatTabPanel, GameTabPanel gameTabPanel,
42 GameSettingsTabPanel gameSettingsTabPanel,
43 JTextArea logTextArea, boolean clientIsHost) {
44 this.simpleGameNetFrame = simpleGameNetFrame;
45 this.statusTabPanel = statusTabPanel;
46 this.chatTabPanel = chatTabPanel;
47 this.gameTabPanel = gameTabPanel;
48 this.gameSettingsTabPanel = gameSettingsTabPanel;
49 this.chatLogDocument = chatTabPanel.getChatLogDocument();
50 this.logTextArea = logTextArea;
51 this.clientIsHost = clientIsHost;
52 }
53
54 public GameFactory joinGame(ConnectionConfig connectionConfig)
55 throws IOException {
56 ClientLoginHandler clientLoginHandler = new ClientLoginHandler();
57 InetAddress hostInetAddress = InetAddress.getByName(connectionConfig.getHostAddress());
58 ClientConnectionData clientConnectionData = clientLoginHandler.connect(hostInetAddress,
59 connectionConfig.getPort(), connectionConfig.getNickname());
60 clientEngineImpl = new ClientEngineImpl(this, clientConnectionData);
61 PlayerSettingsMap playerSettingsMap = clientEngineImpl.getPlayerSettingsMap();
62 statusTabPanel.gameJoined(hostInetAddress, connectionConfig.getPort(),
63 clientConnectionData.getGameFactory(), playerSettingsMap, clientIsHost);
64 GameSettingsPanel gameSettingsPanel = clientConnectionData.getLoginData().getGameSettings()
65 .createGameSettingsPanel();
66 gameSettingsTabPanel.gameJoined(this, gameSettingsPanel, clientIsHost);
67 PlayerSettings playerSettings = playerSettingsMap.getPlayerSettings(
68 clientConnectionData.getLoginData().getPlayerID());
69 chatTabPanel.gameJoined(this, playerSettings.createPlayerSettingsPanel(),
70 playerSettingsMap, clientIsHost);
71
72
73 gameTabPanel.gameJoined(clientEngineImpl.getGamePlayerClient().createGamePanel(this));
74 addChatMessage("Joined " + clientConnectionData.getGameFactory().getName() + ".", 4);
75 if (!clientIsHost) {
76 logTextArea.append("Joined " + clientConnectionData.getGameFactory().getName()
77 + " server at "
78 + hostInetAddress.getHostAddress() + " on port "
79 + connectionConfig.getPort() + "\n");
80 }
81 return clientConnectionData.getGameFactory();
82 }
83
84 public void receiveChatMessage(int type, String message) {
85 switch (type) {
86 case ChatMessage.SYSTEM_MESSAGE:
87 addChatMessage("*** " + message, 0);
88 break;
89 case ChatMessage.GAME_MESSAGE:
90 addChatMessage("*** " + message, 1);
91 break;
92 }
93 }
94
95 public void receiveChatMessage(int type, String message, String nickname) {
96 switch (type) {
97 case ChatMessage.PLAYER_MESSAGE:
98 addChatMessage("<" + nickname + "> " + message, 2);
99 break;
100 case ChatMessage.PLAYER_EMOTE:
101 addChatMessage(nickname + " " + message, 3);
102 break;
103 }
104 }
105
106 public void sendChatMessage(int type, String message) throws IllegalStateException {
107 clientEngineImpl.sendChatMessage(type, message);
108 }
109
110 public void changeGameSettings(GameSettingsPanel gameSettingsPanel)
111 throws IllegalStateException, IllegalArgumentException {
112 clientEngineImpl.changeGameSettings(clientEngineImpl.getGameSettings()
113 .createChangedGameSettings(gameSettingsPanel));
114 }
115
116 public void gameSettingsUpdated(GameSettings outdatedGameSettings,
117 GameSettings updatedGameSettings) {
118 GameSettingsPanel updatedGameSettingsPanel
119 = updatedGameSettings.createGameSettingsPanel();
120 updatedGameSettingsPanel.setEnabled(clientIsHost);
121 gameSettingsTabPanel.gameSettingsUpdated(updatedGameSettingsPanel);
122 addChatMessage("Game settings updated.", 5);
123 if (!clientIsHost) {
124 logTextArea.append("Game settings updated.\n");
125 }
126 }
127
128 public void playerAdded(PlayerSettingsMap playerSettingsMap, PlayerSettings playerSettings) {
129 if (!clientIsHost) {
130 statusTabPanel.playerSettingsUpdated(playerSettingsMap);
131 }
132
133
134 addChatMessage(playerSettings.getNickname() + " has joined.", 6);
135 if (!clientIsHost) {
136 logTextArea.append("New player added: " + playerSettings.getNickname() + "\n");
137 }
138 }
139
140 public void changePlayerSettings(PlayerSettingsPanel playerSettingsPanel)
141 throws IllegalStateException, IllegalArgumentException {
142 clientEngineImpl.changePlayerSettings(clientEngineImpl.getPlayerSettingsMap()
143 .getPlayerSettings(clientEngineImpl.getPlayerID())
144 .createChangedPlayerSettings(playerSettingsPanel));
145 }
146
147 public void playerSettingsUpdated(PlayerSettingsMap playerSettingsMap,
148 PlayerSettings outdatedPlayerSettings,
149 PlayerSettings updatedPlayerSettings) {
150 if (!clientIsHost) {
151 statusTabPanel.playerSettingsUpdated(playerSettingsMap);
152 }
153 chatTabPanel.playerSettingsUpdated(updatedPlayerSettings,
154 clientEngineImpl.getPlayerID().equals(updatedPlayerSettings.getPlayerID()));
155
156
157 if (!outdatedPlayerSettings.getNickname()
158 .equals(updatedPlayerSettings.getNickname())) {
159 addChatMessage(outdatedPlayerSettings.getNickname() + " is now known as "
160 + updatedPlayerSettings.getNickname() + ".", 6);
161 if (!clientIsHost) {
162 logTextArea.append("Player settings of "
163 + updatedPlayerSettings.getNickname()
164 + "(formerly know as "
165 + outdatedPlayerSettings.getNickname()
166 + ") updated.\n");
167 }
168 } else {
169 if (!clientIsHost) {
170 logTextArea.append("Player settings of "
171 + outdatedPlayerSettings.getNickname()
172 + " updated.\n");
173 }
174 }
175 }
176
177 public void removePlayer(PlayerSettingsMap playerSettingsMap, PlayerSettings playerSettings,
178 int removePlayerType) {
179 if (!clientIsHost) {
180 statusTabPanel.playerSettingsUpdated(playerSettingsMap);
181 }
182
183
184 switch (removePlayerType) {
185 case RemovePlayerType.LEFT:
186 addChatMessage(playerSettings.getNickname() + " has left.", 6);
187 if (!clientIsHost) {
188 logTextArea.append("Player left: " + playerSettings.getNickname() + "\n");
189 }
190 break;
191 case RemovePlayerType.PROTOCOL_VIOLATION_LEFT:
192 addChatMessage(playerSettings.getNickname() + " has left because of a "
193 + "protocol violation.", 6);
194 if (!clientIsHost) {
195 logTextArea.append("Player left due to server protocol violation: "
196 + playerSettings.getNickname() + "\n");
197 }
198 break;
199 case RemovePlayerType.KICKED:
200 addChatMessage(playerSettings.getNickname() + " has been kicked.", 6);
201 if (!clientIsHost) {
202 logTextArea.append("Player kicked: " + playerSettings.getNickname() + "\n");
203 }
204 break;
205 case RemovePlayerType.BANNED:
206 addChatMessage(playerSettings.getNickname() + " has been banned.", 6);
207 if (!clientIsHost) {
208 logTextArea.append("Player banned: " + playerSettings.getNickname() + "\n");
209 }
210 break;
211 case RemovePlayerType.DISCONNECTED:
212 addChatMessage(playerSettings.getNickname() + " has disconnected.", 6);
213 if (!clientIsHost) {
214 logTextArea.append("Player disconnected: " + playerSettings.getNickname()
215 + "\n");
216 }
217 break;
218 case RemovePlayerType.PROTOCOL_VIOLATION_KICKED:
219 addChatMessage(playerSettings.getNickname() + " has been kicked because of a "
220 + "protocol violation.", 6);
221 if (!clientIsHost) {
222 logTextArea.append("Protocol violating player kicked: "
223 + playerSettings.getNickname() + "\n");
224 }
225 break;
226 }
227 }
228
229 public void startGame() throws IllegalStateException {
230 clientEngineImpl.startGame();
231 }
232
233 public void gameStarted() {
234 chatTabPanel.gameStarted(clientIsHost);
235
236
237 addChatMessage("Game started.", 7);
238 if (!clientIsHost) {
239 logTextArea.append("Game started.\n");
240 }
241 }
242
243 public void abortGame() throws IllegalStateException {
244 clientEngineImpl.abortGame();
245 }
246
247 public void gameStopping() {
248 chatTabPanel.gameEnding(clientIsHost);
249 if (!clientIsHost) {
250 logTextArea.append("Game stopping...\n");
251 }
252 }
253
254 public void gameAborting() {
255 chatTabPanel.gameEnding(clientIsHost);
256 if (!clientIsHost) {
257 logTextArea.append("Game aborting...\n");
258 }
259 }
260
261 public void gameEnded() {
262 chatTabPanel.gameEnded(clientIsHost);
263 addChatMessage("Game ended.", 7);
264 if (!clientIsHost) {
265 logTextArea.append("Game ended.\n");
266 }
267 }
268
269 public void leaveServer() {
270 clientEngineImpl.leaveServer();
271 }
272
273 public void joinedGameQuit(int removePlayerType) {
274 gameTabPanel.joinedGameQuit();
275 chatTabPanel.joinedGameQuit();
276 gameSettingsTabPanel.joinedGameQuit();
277 if (!clientIsHost) {
278 statusTabPanel.joinedGameQuit();
279 }
280 switch (removePlayerType) {
281 case RemovePlayerType.LEFT:
282 addChatMessage("You left the server.", 4);
283 if (!clientIsHost) {
284 logTextArea.append("Left server.\n");
285 }
286 break;
287 case RemovePlayerType.PROTOCOL_VIOLATION_LEFT:
288 addChatMessage("You left the server because of a protocol violation.", 4);
289 if (!clientIsHost) {
290 logTextArea.append("Left protocol violating server.\n");
291 }
292 break;
293 case RemovePlayerType.KICKED:
294 addChatMessage("You where kicked from the server.", 4);
295 if (!clientIsHost) {
296 logTextArea.append("Kicked from server.\n");
297 }
298 break;
299 case RemovePlayerType.BANNED:
300 addChatMessage("You where banned from the server.", 4);
301 if (!clientIsHost) {
302 logTextArea.append("Banned from server.\n");
303 }
304 break;
305 case RemovePlayerType.DISCONNECTED:
306 addChatMessage("You where disconnected from the server.", 4);
307 if (!clientIsHost) {
308 logTextArea.append("Disconnected from server.\n");
309 }
310 break;
311 case RemovePlayerType.PROTOCOL_VIOLATION_KICKED:
312 addChatMessage("You kicked from the server because of a protocol violation.", 4);
313 if (!clientIsHost) {
314 logTextArea.append("Kicked from server due to client protocol violation.\n");
315 }
316 break;
317 case RemovePlayerType.HOSTING_STOPPED:
318 addChatMessage("The server has closed.", 4);
319 if (!clientIsHost) {
320 logTextArea.append("Server closed.\n");
321 }
322 break;
323 }
324 simpleGameNetFrame.disconnected();
325 }
326
327 private void addChatMessage(String message, int styleIndex) {
328 SimpleAttributeSet simpleAttributeSet = new SimpleAttributeSet();
329 StyleConstants.setFontFamily(simpleAttributeSet, "Monospaced");
330 switch (styleIndex) {
331 case 0:
332 StyleConstants.setForeground(simpleAttributeSet, Color.BLUE);
333 break;
334 case 1:
335 StyleConstants.setForeground(simpleAttributeSet, Color.BLUE);
336 break;
337 case 2:
338 StyleConstants.setForeground(simpleAttributeSet, Color.BLACK);
339 break;
340 case 3:
341 StyleConstants.setForeground(simpleAttributeSet, Color.MAGENTA);
342 break;
343 case 4:
344 StyleConstants.setForeground(simpleAttributeSet, Color.BLUE);
345 break;
346 case 5:
347 StyleConstants.setForeground(simpleAttributeSet, new Color(0, 0x80, 0));
348 break;
349 case 6:
350 StyleConstants.setForeground(simpleAttributeSet, new Color(0, 0x80, 0));
351 break;
352 case 7:
353 StyleConstants.setForeground(simpleAttributeSet, Color.RED);
354 break;
355 }
356 try {
357 chatLogDocument.insertString(chatLogDocument.getLength(), message + "\n",
358 simpleAttributeSet);
359 } catch (BadLocationException exception) {
360 exception.printStackTrace();
361 }
362 }
363
364 public JPanel createChatClientPanel() {
365 ChatClientPanel chatClientPanel = new ChatClientPanel(chatLogDocument);
366 chatClientPanel.gameJoined(this);
367 return chatClientPanel;
368 }
369
370 }