/.metadata/.plugins/org.eclipse.core.resources/.history/ef/10e88af968a3001e1d98c762f0e1eac2
#! | 204 lines | 168 code | 36 blank | 0 comment | 0 complexity | ca18eef95b9939b2272386fdac29d0a2 MD5 | raw file
1package info.reflectionsofmind.connexion.platform.gui.join;
2
3import info.reflectionsofmind.connexion.platform.control.ClientParticipant;
4import info.reflectionsofmind.connexion.platform.control.IGameControlFactory;
5import info.reflectionsofmind.connexion.platform.control.IRoot;
6import info.reflectionsofmind.connexion.platform.control.control.IGameControl;
7import info.reflectionsofmind.connexion.platform.control.control.IJoinControl;
8import info.reflectionsofmind.connexion.platform.control.cts.CTSMessageCoder;
9import info.reflectionsofmind.connexion.platform.control.cts.message.MsgDisconnectNotice;
10import info.reflectionsofmind.connexion.platform.control.stc.IServerToClientMessageDispatchTarget;
11import info.reflectionsofmind.connexion.platform.control.stc.STCMessageDispatcher;
12import info.reflectionsofmind.connexion.platform.control.stc.message.MsgChangeNotice;
13import info.reflectionsofmind.connexion.platform.control.stc.message.MsgGameStarted;
14import info.reflectionsofmind.connexion.platform.control.stc.message.MsgKickNotice;
15import info.reflectionsofmind.connexion.platform.control.stc.message.MsgParticipantConnected;
16import info.reflectionsofmind.connexion.platform.control.stc.message.MsgParticipationAccepted;
17import info.reflectionsofmind.connexion.platform.game.IGame;
18import info.reflectionsofmind.connexion.platform.game.client.IClientGameParameters;
19import info.reflectionsofmind.connexion.platform.gui.ConnexionGUI;
20import info.reflectionsofmind.connexion.platform.gui.MessagePanel;
21import info.reflectionsofmind.connexion.platform.gui.TransportEventLogger;
22import info.reflectionsofmind.connexion.transport.ITransport.INode;
23import info.reflectionsofmind.connexion.util.convert.EncodingException;
24
25import java.awt.event.ActionEvent;
26import java.awt.event.WindowAdapter;
27import java.awt.event.WindowEvent;
28import java.util.ArrayList;
29import java.util.List;
30import java.util.concurrent.Callable;
31import java.util.concurrent.Executors;
32import java.util.concurrent.Future;
33
34import javax.swing.AbstractAction;
35import javax.swing.JButton;
36import javax.swing.JFrame;
37
38import net.miginfocom.swing.MigLayout;
39
40public class JoinGameFrame extends JFrame implements IServerToClientMessageDispatchTarget, IJoinControl
41{
42 private final IGame game;
43 private final IRoot root;
44 private final INode server;
45
46 private MessagePanel messagePanel;
47 private ParticipantsPanel participantsPanel;
48 private AbstractJoinGamePanel gamePanel;
49
50 private final List<ClientParticipant> participants = new ArrayList<ClientParticipant>();
51
52 private final Callable<IGameControl> gameWaiter = new Callable<IGameControl>()
53 {
54 public IGameControl call() throws Exception
55 {
56 }
57 };
58 private final Future<IGameControl> futureGame = Executors.newSingleThreadExecutor().submit(
59 new Callable<IGameControl>()
60 {
61 public IGameControl call() throws Exception
62 {
63 }
64 }
65 );
66
67 public JoinGameFrame(final IRoot root, final IGame game, final INode server, final List<String> participantNames)
68 {
69 super("Connexion :: Join game");
70
71 this.game = game;
72
73 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
74 setLayout(new MigLayout("", "[240!, fill][max]", "[][max, fill][]"));
75
76 addWindowListener(new WindowAdapter()
77 {
78 @Override
79 public void windowClosed(final WindowEvent e)
80 {
81 disconnect();
82 }
83 });
84
85 this.root = root;
86 this.server = server;
87
88 add(this.gamePanel = ((ConnexionGUI) root).getJoinPanelFactories().get(game).createGamePanel(this), "wrap");
89 add(this.participantsPanel = new ParticipantsPanel(), "wrap");
90 add(new JButton(new DisconnectAction()), "wrap");
91 add(this.messagePanel = new MessagePanel(), "cell 1 0, spany");
92
93 for (final String name : participantNames)
94 {
95 final ClientParticipant participant = new ClientParticipant(name);
96 this.participants.add(participant);
97 this.participantsPanel.addParticipant(participant);
98 }
99
100 this.server.getTransport().addListener(new STCMessageDispatcher(this));
101 this.server.getTransport().addListener(new TransportEventLogger(this.messagePanel));
102
103 pack();
104 setSize(800, 600);
105 setLocationRelativeTo(null);
106 }
107
108 public void onKickNotice(final MsgKickNotice message, final INode sender)
109 {
110 }
111
112 public void onParticipantConnected(final MsgParticipantConnected message, final INode sender)
113 {
114 final ClientParticipant participant = new ClientParticipant(message.getName());
115 this.participants.add(participant);
116 JoinGameFrame.this.participantsPanel.addParticipant(participant);
117 }
118
119 public void onChangeNotice(final MsgChangeNotice message, final INode sender)
120 {
121 // This is processed by game control
122 }
123
124 public void onParticipationAccepted(final MsgParticipationAccepted message, final INode sender)
125 {
126 // This is processed by ConnectFrame.
127 }
128
129 public void onGameStarted(final MsgGameStarted message, final INode sender)
130 {
131 dispose();
132
133 final IGameControlFactory gameControlFactory = getRoot().getConfiguration().getGameControlFactories().get(getGame());
134 gameControlFactory.createGameControl(getGame(), getParameters(), getParticipants());
135 }
136
137 // ====================================================================================================
138 // === JOIN CONTROL IMPLEMENTATION
139 // ====================================================================================================
140
141 public INode getServer()
142 {
143 return this.server;
144 }
145
146 public IGame getGame()
147 {
148 return this.game;
149 }
150
151 public IRoot getRoot()
152 {
153 return this.root;
154 }
155
156 public List<ClientParticipant> getParticipants()
157 {
158 return this.participants;
159 }
160
161 public IClientGameParameters getParameters()
162 {
163 return this.gamePanel.getGameParameters();
164 }
165
166 public Future<IGameControl> waitForGame()
167 {
168 return null;
169 }
170
171 public void disconnect()
172 {
173 try
174 {
175 JoinGameFrame.this.server.send(CTSMessageCoder.INSTANCE.encode(new MsgDisconnectNotice()));
176 }
177 catch (final EncodingException exception)
178 {
179 throw new RuntimeException(exception);
180 }
181
182 JoinGameFrame.this.server.getTransport().stop();
183
184 getRoot().restart();
185 }
186
187 public void sendMessage(final String message)
188 {
189 throw new UnsupportedOperationException();
190 }
191
192 private final class DisconnectAction extends AbstractAction
193 {
194 public DisconnectAction()
195 {
196 super("Disconnect");
197 }
198
199 public void actionPerformed(final ActionEvent arg0)
200 {
201 disconnect();
202 }
203 }
204}