/.metadata/.plugins/org.eclipse.core.resources/.history/81/f07c4ffc81a3001e1dff9ae635b3e1ee

https://bitbucket.org/fixpoint/connexion · #! · 160 lines · 132 code · 28 blank · 0 comment · 0 complexity · 6b633c40319c77eac0258887005081ec MD5 · raw file

  1. package info.reflectionsofmind.connexion.platform.gui.connect;
  2. import info.reflectionsofmind.connexion.platform.control.IRoot;
  3. import info.reflectionsofmind.connexion.platform.control.ServerInfo;
  4. import info.reflectionsofmind.connexion.platform.control.control.IConnectControl;
  5. import info.reflectionsofmind.connexion.platform.control.control.IJoinControl;
  6. import info.reflectionsofmind.connexion.platform.control.cts.CTSMessageCoder;
  7. import info.reflectionsofmind.connexion.platform.control.cts.message.MsgParticipationRequest;
  8. import info.reflectionsofmind.connexion.platform.control.stc.message.MsgParticipationAccepted;
  9. import info.reflectionsofmind.connexion.platform.game.IGame;
  10. import info.reflectionsofmind.connexion.platform.gui.MessagePanel;
  11. import info.reflectionsofmind.connexion.platform.gui.TransportEventLogger;
  12. import info.reflectionsofmind.connexion.platform.gui.join.JoinGameFrame;
  13. import info.reflectionsofmind.connexion.transport.ITransport;
  14. import info.reflectionsofmind.connexion.transport.ITransport.INode;
  15. import info.reflectionsofmind.connexion.util.convert.EncodingException;
  16. import java.awt.event.ActionEvent;
  17. import java.util.concurrent.Callable;
  18. import java.util.concurrent.Executors;
  19. import java.util.concurrent.Future;
  20. import javax.swing.AbstractAction;
  21. import javax.swing.JButton;
  22. import javax.swing.JComboBox;
  23. import javax.swing.JFrame;
  24. import javax.swing.JLabel;
  25. import javax.swing.JTextField;
  26. import net.miginfocom.swing.MigLayout;
  27. public class ConnectFrame extends JFrame implements IConnectControl
  28. {
  29. private final IRoot root;
  30. private final IGame game;
  31. private final JComboBox serverCombo;
  32. private final JTextField nameField;
  33. private MessagePanel messagePanel;
  34. private INode currentServer = null;
  35. public ConnectFrame(final IRoot root, final IGame game)
  36. {
  37. super("Connexion :: Connect to server");
  38. this.root = root;
  39. this.game = game;
  40. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  41. setLayout(new MigLayout("", "[][120::]12[][max][][]", "[][]"));
  42. add(new JLabel("Name:"));
  43. add(this.nameField = new JTextField("Player"), "grow");
  44. add(new JLabel("Server:"));
  45. this.serverCombo = new JComboBox(getRoot().getConfiguration().getServers().toArray());
  46. add(this.serverCombo, "grow");
  47. add(new JButton(new ConnectAction()), "grow");
  48. add(new JButton("Edit server list"), "grow, wrap");
  49. add(this.messagePanel = new MessagePanel(), "span, wrap");
  50. add(new JButton(new CloseAction()), "span, al right, wrap");
  51. pack();
  52. setSize(640, 400);
  53. setLocationRelativeTo(null);
  54. }
  55. public Future<IJoinControl> connect(final String name, final INode server)
  56. {
  57. this.currentServer = server;
  58. return Executors.newSingleThreadExecutor().submit(new Callable<IJoinControl>()
  59. {
  60. public IJoinControl call() throws Exception
  61. {
  62. final TransportEventLogger logger = new TransportEventLogger(ConnectFrame.this.messagePanel);
  63. getServer().getTransport().addListener(logger);
  64. getServer().getTransport().start();
  65. try
  66. {
  67. final String message = CTSMessageCoder.INSTANCE.encode(new MsgParticipationRequest(name));
  68. ConnectFrame.this.messagePanel.addRawLine("Sending participation request.");
  69. getServer().send(message);
  70. ConnectFrame.this.messagePanel.addRawLine("Participation request sent, waiting for response.");
  71. }
  72. catch (final EncodingException exception)
  73. {
  74. throw new RuntimeException(exception);
  75. }
  76. final WaitForParticipationAccepted listener = new WaitForParticipationAccepted();
  77. getServer().getTransport().addListener(listener);
  78. final MsgParticipationAccepted message = listener.take();
  79. getServer().getTransport().removeListener(listener);
  80. getServer().getTransport().removeListener(logger);
  81. dispose();
  82. final JoinGameFrame joinGameFrame = new JoinGameFrame( //
  83. getRoot(), getGame(), getServer(), message.getNames());
  84. joinGameFrame.setVisible(true);
  85. return joinGameFrame;
  86. }
  87. });
  88. }
  89. public IRoot getRoot()
  90. {
  91. return this.root;
  92. }
  93. public IGame getGame()
  94. {
  95. return this.game;
  96. }
  97. public INode getServer()
  98. {
  99. return this.currentServer;
  100. }
  101. private void connect()
  102. {
  103. final ServerInfo serverInfo = (ServerInfo) this.serverCombo.getSelectedItem();
  104. final ITransport transport = serverInfo.getFactory().createTransport(serverInfo.getParameters());
  105. final INode serverNode = transport.createNode(serverInfo.getAddress());
  106. connect(this.nameField.getText(), serverNode);
  107. }
  108. private final class CloseAction extends AbstractAction
  109. {
  110. public CloseAction()
  111. {
  112. super("Close");
  113. }
  114. public void actionPerformed(final ActionEvent arg0)
  115. {
  116. if (getServer() != null) getServer().getTransport().stop();
  117. dispose();
  118. getRoot().restart();
  119. }
  120. }
  121. private final class ConnectAction extends AbstractAction
  122. {
  123. private ConnectAction()
  124. {
  125. super("Connect");
  126. }
  127. public void actionPerformed(final ActionEvent e)
  128. {
  129. connect();
  130. }
  131. }
  132. }