View Javadoc

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 }