ChatWindow.java
上传用户:damzkj
上传日期:2022-01-07
资源大小:24k
文件大小:8k
源码类别:

P2P编程

开发平台:

Java

  1. package jxtamessenger;
  2. import java.io.DataOutput;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. import java.util.logging.Logger;
  7. import jxtamessenger.bean.OnlineMessage;
  8. import jxtamessenger.service.JxtaServerSocketService;
  9. import jxtamessenger.util.Constants;
  10. import jxtamessenger.util.MiscUtil;
  11. import jxtamessenger.util.PipeUtil;
  12. import jxtamessenger.xml.XmlCreator;
  13. import net.jxta.peergroup.PeerGroup;
  14. import net.jxta.socket.JxtaSocket;
  15. import org.apache.commons.lang.StringUtils;
  16. import org.eclipse.jface.window.Window;
  17. import org.eclipse.swt.SWT;
  18. import org.eclipse.swt.custom.SashForm;
  19. import org.eclipse.swt.events.ControlAdapter;
  20. import org.eclipse.swt.events.ControlEvent;
  21. import org.eclipse.swt.events.KeyAdapter;
  22. import org.eclipse.swt.events.KeyEvent;
  23. import org.eclipse.swt.events.MouseAdapter;
  24. import org.eclipse.swt.events.MouseEvent;
  25. import org.eclipse.swt.layout.FillLayout;
  26. import org.eclipse.swt.widgets.Button;
  27. import org.eclipse.swt.widgets.Composite;
  28. import org.eclipse.swt.widgets.Control;
  29. import org.eclipse.swt.widgets.Shell;
  30. import org.eclipse.swt.widgets.Text;
  31. public class ChatWindow extends Window {
  32. private static final Logger LOG = Logger.getLogger(ChatWindow.class.getName());
  33. private JxtaSocket socket;
  34. private OnlineMessage msg;
  35. private PeerGroup pg;
  36. private static final int BTNWIDTH = 32;
  37. private static final int BTNHEIGHT = 22;
  38. private Text up_text;
  39. public Text getUp_text() {
  40. return up_text;
  41. }
  42. private Text down_text;
  43. // public Text getDown_text() {
  44. // return down_text;
  45. // }
  46. private Button down_send;
  47. // public Button getDown_send() {
  48. // return down_send;
  49. // }
  50. public void disableInputAndSend(String userName) {
  51. down_text.setText(userName + "已离开会话");
  52. down_text.setEnabled(false);
  53. down_send.setEnabled(false);
  54. }
  55. public void enableInputAndSend() {
  56.         try {
  57.          // TODO: Terminated gracefully
  58. //     if(!socket.isClosed())
  59. //     socket.close();
  60. socket = new JxtaSocket(pg,
  61.         null, //no specific peerid
  62.         PipeUtil.findPipeAdv(pg, JxtaServerSocketService.JxtaServerSocketPipeAdvPrefix + msg.getHostName()),
  63.         60000, //general TO: 60 seconds
  64.         true); // reliable connection
  65. } catch (IOException e) {
  66. LOG.warning("JxtaSocket initialize failed!");
  67. e.printStackTrace();
  68. }
  69. down_text.setText("");
  70. down_text.setEnabled(true);
  71. down_send.setEnabled(true);
  72. }
  73. public ChatWindow(Shell parentShell, PeerGroup pg, OnlineMessage msg) {
  74. super(parentShell);
  75. this.msg = msg;
  76. this.pg = pg;
  77.         try {
  78. socket = new JxtaSocket(pg,
  79.         null, //no specific peerid
  80.         PipeUtil.findPipeAdv(pg, JxtaServerSocketService.JxtaServerSocketPipeAdvPrefix + msg.getHostName()),
  81.         60000, //general TO: 60 seconds
  82.         true); // reliable connection
  83. } catch (IOException e) {
  84. LOG.warning("JxtaSocket initialize failed!");
  85. e.printStackTrace();
  86. }
  87. }
  88. /* (non-Javadoc)
  89.  * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
  90.  */
  91. @Override
  92. protected Control createContents(Composite parent) {
  93. SashForm form = new SashForm(parent, SWT.VERTICAL);
  94. form.setLayout(new FillLayout());
  95. Composite up = new Composite(form,SWT.NONE);
  96. up.setLayout(new FillLayout());
  97. up_text = new Text(up, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.READ_ONLY | SWT.H_SCROLL);
  98. up_text.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
  99. Composite down = new Composite(form,SWT.NONE);
  100. down.setLayout(new FillLayout());
  101. down_text = new Text(down, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
  102. down_text.addControlListener(new ControlAdapter() {
  103. public void controlResized(ControlEvent e) {
  104. Text source = (Text)e.getSource();
  105. source.setSize(source.getParent().getSize().x - BTNWIDTH-8, source.getParent().getSize().y);
  106. }
  107. });
  108. down_text.setFocus();
  109. down_send = new Button(down, SWT.PUSH);
  110. down_send.setText("发送");
  111. down_send.addControlListener(new ControlAdapter() {
  112. public void controlResized(ControlEvent e) {
  113. Button source = (Button)e.getSource();
  114. source.pack();
  115. int x = source.getParent().getSize().x - BTNWIDTH - 4;
  116. int y = (source.getParent().getSize().y - BTNHEIGHT)/2;
  117. source.setLocation(x, y);
  118. }
  119. });
  120. down_text.addKeyListener(new KeyAdapter() {
  121. public void keyPressed(KeyEvent event) {
  122. // CTRL+A --- Select All
  123. if(event.stateMask == SWT.CTRL && event.keyCode == 'a') // If has better mothed?
  124. down_text.selectAll();
  125. /* // when user clicks CTRL+RETURN, then send the message, just like down_send button is clicked!
  126.  *  else if(event.stateMask == SWT.CTRL && (event.keyCode == SWT.CR || event.keyCode == SWT.LF)) {
  127. if(!StringUtils.isEmpty(down_text.getText())) {
  128. try {
  129. down_send.setEnabled(false);
  130. OutputStream out = (OutputStream) socket.getOutputStream();
  131. DataOutput dos = new DataOutputStream(out);
  132. dos.writeInt(Constants.MESSAGE_CHAT);
  133. Object[] chatMsgArr = MiscUtil.splitUTFString(XmlCreator.createChatMessage(down_text.getText()));
  134. dos.writeInt(chatMsgArr.length);
  135. for(int i=0; i<chatMsgArr.length; i++)
  136. dos.writeUTF((String)chatMsgArr[i]);
  137. up_text.append(MiscUtil.getUserName());
  138. up_text.append(":");
  139. up_text.append(down_text.getText());
  140. *//**
  141.  * @see org.eclipse.swt.widgets.Text.sendKeyEvent
  142.  *//*
  143. up_text.append("r");
  144. down_text.setText("");
  145. out.flush();
  146. down_send.setEnabled(true);
  147. } catch (IOException e) {
  148. LOG.warning("Send chat message failed.");
  149. e.printStackTrace();
  150. }
  151. }
  152. }*/
  153. }
  154. });
  155. down_send.addMouseListener(new MouseAdapter() {
  156. public void mouseUp(MouseEvent event) {
  157. if(!StringUtils.isEmpty(down_text.getText())) {
  158. try {
  159. down_send.setEnabled(false);
  160. OutputStream out = (OutputStream) socket.getOutputStream();
  161. DataOutput dos = new DataOutputStream(out);
  162. dos.writeInt(Constants.MESSAGE_CHAT);
  163. Object[] chatMsgArr = MiscUtil.splitUTFString(XmlCreator.createChatMessage(down_text.getText()));
  164. dos.writeInt(chatMsgArr.length);
  165. for(int i=0; i<chatMsgArr.length; i++)
  166. dos.writeUTF((String)chatMsgArr[i]);
  167. up_text.append(MiscUtil.getUserName());
  168. up_text.append(":");
  169. up_text.append(down_text.getText());
  170. up_text.append("rn"); // hard-code cariage return
  171. down_text.setText("");
  172. out.flush();
  173. down_send.setEnabled(true);
  174. } catch (IOException e) {
  175. // TODO: 发送失败
  176. LOG.warning("Send chat message failed.");
  177. e.printStackTrace();
  178. }
  179. }
  180. }
  181. });
  182. form.setWeights(new int[] {60,40});
  183. return parent;
  184. }
  185. /* (non-Javadoc)
  186.  * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
  187.  */
  188. @Override
  189. protected void configureShell(Shell newShell) {
  190. super.configureShell(newShell);
  191. newShell.setSize(300, 250);
  192. FillLayout layout = new FillLayout();
  193. layout.type = SWT.VERTICAL;
  194. layout.marginWidth = 4;
  195. layout.marginHeight = 4;
  196. newShell.setLayout(layout);
  197. newShell.setText("与" + msg.getUserName() + "交谈");
  198. }
  199. /* (non-Javadoc)
  200.  * @see org.eclipse.jface.window.Window#close()
  201.  */
  202. @Override
  203. public boolean close() {
  204. try {
  205. MainApplicationWindow.chatwin.remove(msg.getHostName());
  206. OutputStream out = (OutputStream) socket.getOutputStream();
  207. DataOutput dos = new DataOutputStream(out);
  208. dos.writeInt(Constants.MESSAGE_EXITWINDOW);
  209. // dos.writeUTF(MiscUtil.getHostName());
  210. // dos.writeUTF(MiscUtil.getUserName());
  211. out.flush();
  212. out.close();
  213. // TODO: Close socket gracefully!
  214. // socket.close();
  215. } catch (IOException e) {
  216. LOG.warning("JxtaSocket close failed!");
  217. e.printStackTrace();
  218. }
  219. LOG.info("super.close()");
  220. return super.close();
  221. }
  222. }