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

P2P编程

开发平台:

Java

  1. package jxtamessenger;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.util.ArrayList;
  5. import java.util.Enumeration;
  6. import java.util.concurrent.ConcurrentHashMap;
  7. import java.util.concurrent.ExecutorService;
  8. import java.util.concurrent.Executors;
  9. import java.util.logging.Logger;
  10. import jxtamessenger.bean.OnlineMessage;
  11. import jxtamessenger.service.JxtaMulticastSocketService;
  12. import jxtamessenger.service.JxtaServerSocketService;
  13. import jxtamessenger.service.Service;
  14. import jxtamessenger.util.ThreadPoolUtil;
  15. import jxtamessenger.xml.XmlCreator;
  16. import net.jxta.peergroup.PeerGroup;
  17. import net.jxta.platform.NetworkManager;
  18. import net.jxta.socket.JxtaMulticastSocket;
  19. import org.eclipse.jface.action.Action;
  20. import org.eclipse.jface.action.IMenuListener;
  21. import org.eclipse.jface.action.IMenuManager;
  22. import org.eclipse.jface.action.MenuManager;
  23. import org.eclipse.jface.dialogs.MessageDialog;
  24. import org.eclipse.jface.viewers.DoubleClickEvent;
  25. import org.eclipse.jface.viewers.IDoubleClickListener;
  26. import org.eclipse.jface.viewers.ISelection;
  27. import org.eclipse.jface.viewers.IStructuredContentProvider;
  28. import org.eclipse.jface.viewers.IStructuredSelection;
  29. import org.eclipse.jface.viewers.ITableLabelProvider;
  30. import org.eclipse.jface.viewers.LabelProvider;
  31. import org.eclipse.jface.viewers.TableViewer;
  32. import org.eclipse.jface.viewers.Viewer;
  33. import org.eclipse.jface.window.ApplicationWindow;
  34. import org.eclipse.jface.window.Window;
  35. import org.eclipse.swt.SWT;
  36. import org.eclipse.swt.graphics.Image;
  37. import org.eclipse.swt.graphics.Point;
  38. import org.eclipse.swt.layout.FillLayout;
  39. import org.eclipse.swt.widgets.Composite;
  40. import org.eclipse.swt.widgets.Control;
  41. import org.eclipse.swt.widgets.Display;
  42. import org.eclipse.swt.widgets.Event;
  43. import org.eclipse.swt.widgets.Listener;
  44. import org.eclipse.swt.widgets.Menu;
  45. import org.eclipse.swt.widgets.MenuItem;
  46. import org.eclipse.swt.widgets.MessageBox;
  47. import org.eclipse.swt.widgets.Shell;
  48. import org.eclipse.swt.widgets.Tray;
  49. import org.eclipse.swt.widgets.TrayItem;
  50. import com.swtdesigner.SWTResourceManager;
  51. public class MainApplicationWindow extends ApplicationWindow {
  52. private static final Logger LOG = Logger.getLogger(MainApplicationWindow.class.getName());
  53. private TableViewer viewer;
  54. private NetworkManager manager = null;
  55. private PeerGroup pg = null;
  56. /** 保存当前用户激活的窗口对象 */
  57. @SuppressWarnings("unchecked")
  58. public static ConcurrentHashMap chatwin = new ConcurrentHashMap();
  59. /**
  60.  * The content provider class is responsible for providing objects to the
  61.  * view. It can wrap existing objects in adapters or simply return objects
  62.  * as-is. These objects may be sensitive to the current input of the view,
  63.  * or ignore it and always show the same content (like Task List, for
  64.  * example).
  65.  */
  66. class ViewContentProvider implements IStructuredContentProvider {
  67. public void inputChanged(Viewer v, Object oldInput, Object newInput) {
  68. }
  69. public void dispose() {
  70. }
  71. public Object[] getElements(Object parent) {
  72. return new String[] {};
  73. }
  74. }
  75. class ViewLabelProvider extends LabelProvider implements
  76. ITableLabelProvider {
  77. public String getColumnText(Object obj, int index) {
  78. return ((OnlineMessage)obj).getUserName();
  79. }
  80. public Image getColumnImage(Object obj, int index) {
  81. return getImage(obj);
  82. }
  83. public Image getImage(Object obj) {
  84. return SWTResourceManager.getImage(this.getClass(), "online.ico");
  85. }
  86. }
  87. /**
  88.  * Create the application window
  89.  */
  90. public MainApplicationWindow() {
  91. super(null);
  92. try {
  93.          // TODO: Currently use EDGE mode configuration
  94.          manager = new NetworkManager(NetworkManager.ConfigMode.EDGE, "JxtaMessenger");
  95.             manager.startNetwork();
  96.             
  97.             // Here directly use NetPeerGroup for simplicity
  98.             pg = manager.getNetPeerGroup();
  99. } catch (Exception e) {
  100. LOG.severe("JxtaMessenger initialize failed.");
  101.             e.printStackTrace();
  102.             System.exit(-1);
  103.         }
  104. }
  105. /**
  106.  * Create contents of the application window
  107.  * @param parent
  108.  */
  109. protected Control createContents(Composite parent) {
  110. Composite container = new Composite(parent, SWT.NONE);
  111. FillLayout layout = new FillLayout();
  112. layout.marginWidth = 3;
  113. layout.marginHeight = 3;
  114. container.setLayout(layout);
  115. viewer = new TableViewer(container, SWT.SINGLE | SWT.V_SCROLL);
  116. viewer.setContentProvider(new ViewContentProvider());
  117. viewer.setLabelProvider(new ViewLabelProvider());
  118. viewer.setInput(new ArrayList<OnlineMessage>());
  119. final Action fileAction = new Action() {
  120. @SuppressWarnings("unchecked")
  121. public void run() {
  122. ISelection selection = viewer.getSelection();
  123. OnlineMessage msg = (OnlineMessage)((IStructuredSelection)selection).getFirstElement();
  124. showMessage("Comming soon!");
  125. }
  126. };
  127. fileAction.setText("文件传输...");
  128. final Action chatAction = new Action() {
  129. @SuppressWarnings("unchecked")
  130. public void run() {
  131. ISelection selection = viewer.getSelection();
  132. OnlineMessage msg = (OnlineMessage)((IStructuredSelection)selection).getFirstElement();
  133. if(chatwin.containsKey(msg.getHostName())) {
  134. // The chat window has already existed
  135.      ChatWindow chatWindow = (ChatWindow)chatwin.get(msg.getHostName());
  136.      chatWindow.getShell().forceActive();
  137. } else {
  138. LOG.info("Chat window is opened.");
  139. Window chatWindow = new ChatWindow(viewer.getControl().getShell(), pg, msg);
  140. chatwin.put(msg.getHostName(), chatWindow);
  141. chatWindow.open();
  142. }
  143. }
  144. };
  145. chatAction.setText("交谈...");
  146. viewer.addDoubleClickListener(new IDoubleClickListener() {
  147. public void doubleClick(DoubleClickEvent event) {
  148. chatAction.run();
  149. }
  150. });
  151. final MenuManager mgr = new MenuManager("#PopupMenu");
  152. mgr.setRemoveAllWhenShown(true);
  153. mgr.addMenuListener(new IMenuListener() {
  154. public void menuAboutToShow(IMenuManager manager) {
  155. IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
  156. if (!selection.isEmpty()) {
  157. mgr.add(chatAction);
  158. mgr.add(fileAction);
  159. }
  160. }
  161. });
  162. viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl()));
  163.         // Now UI has initialized, Start service
  164.         startService();
  165.         
  166.         // Multicast online message
  167.         mcastOnlineMessage(pg);
  168. return container;
  169. }
  170. /**
  171.  * Launch the application
  172.  * @param args
  173.  */
  174. public static void main(String args[]) {
  175. try {
  176. MainApplicationWindow window = new MainApplicationWindow();
  177. window.setBlockOnOpen(true);
  178. window.open();
  179. Display.getCurrent().dispose();
  180. } catch (Exception e) {
  181. e.printStackTrace();
  182. }
  183. // TODO: Must call this so the program can terminated gracefully, why?
  184. // Some jxta none-daemon threads can not terminate, why?
  185. System.exit(0);
  186. }
  187. /**
  188.  * Configure the shell
  189.  * @param newShell
  190.  */
  191. protected void configureShell(final Shell newShell) {
  192. super.configureShell(newShell);
  193. newShell.setText("JxtaMessenger");
  194. newShell.setImage(SWTResourceManager.getImage(this.getClass(), "blue.ico"));
  195. /* TODO: System tray
  196. final Tray tray = newShell.getDisplay().getSystemTray();
  197. if (tray == null) {
  198. LOG.severe("The system tray is not available");
  199. System.exit(-1);
  200. } else {
  201. final TrayItem item = new TrayItem(tray, SWT.NONE);
  202. item.setToolTipText("JxtaMessenger");
  203. item.addListener(SWT.DefaultSelection, new Listener() {
  204. public void handleEvent(Event event) {
  205. if(!newShell.isVisible()) {
  206. newShell.setVisible(true);
  207. }
  208. if(newShell.getMinimized()) {
  209. newShell.setMinimized(false);
  210. }
  211. newShell.forceActive();
  212. }
  213. });
  214. final Menu menu = new Menu(newShell, SWT.POP_UP);
  215. // About
  216. MenuItem mi = new MenuItem(menu, SWT.PUSH);
  217. mi.setText("About...");
  218. mi.addListener(SWT.Selection, new Listener() {
  219. public void handleEvent(Event event) {
  220. int style = SWT.APPLICATION_MODAL | SWT.YES;
  221. MessageBox messageBox = new MessageBox (newShell, style);
  222. messageBox.setText ("关于本软件...");
  223. messageBox.setMessage ("email:cuizhenfu@gmail.comnmsn:cuizhf3000@hotmail.com");
  224. messageBox.open ();
  225. }
  226. });
  227. // separator
  228. mi = new MenuItem(menu, SWT.SEPARATOR);
  229. // Exit
  230. mi = new MenuItem(menu, SWT.PUSH);
  231. mi.setText("Exit");
  232. mi.addListener(SWT.Selection, new Listener() {
  233. public void handleEvent(Event event) {
  234. // 关闭应用程序
  235. close();
  236. }
  237. });
  238. menu.setDefaultItem(mi);
  239. item.addListener(SWT.MenuDetect, new Listener() {
  240. public void handleEvent(Event event) {
  241. menu.setVisible(true);
  242. }
  243. });
  244. item.setImage(SWTResourceManager.getImage(this.getClass(), "online.ico"));
  245. }*/
  246. }
  247. /**
  248.  * Return the initial size of the window
  249.  */
  250. protected Point getInitialSize() {
  251. return new Point(275, 400);
  252. }
  253. @SuppressWarnings("unchecked")
  254. public boolean close() {
  255. LOG.info("MainApplicationWindow close");
  256. if(!chatwin.isEmpty()) {
  257. Enumeration enumeration = chatwin.elements();
  258. if(enumeration.hasMoreElements()) {
  259. ChatWindow chatWindow = (ChatWindow)enumeration.nextElement();
  260. chatWindow.close();
  261. }
  262. }
  263. mcastOfflineMessage(pg);
  264. stopService();
  265. manager.stopNetwork();
  266. SWTResourceManager.dispose();
  267. return super.close();
  268. }
  269. // service array
  270. private Service[] service;
  271. private ExecutorService serviceExecutor;
  272. private void startService() {
  273. service = new Service[] {
  274. new JxtaMulticastSocketService(pg, viewer),
  275. new JxtaServerSocketService(pg, viewer)
  276. };
  277. serviceExecutor = Executors.newFixedThreadPool(service.length);
  278. for(int i=0; i<service.length; i++)
  279. serviceExecutor.execute(service[i]);
  280. }
  281. private void stopService() {
  282. for(int i=0; i<service.length; i++)
  283. service[i].shutdownAndAwaitTermination();
  284. ThreadPoolUtil.shutdownAndAwaitTermination(serviceExecutor);
  285. }
  286. /**
  287.  * Multicast online message
  288.  */
  289. private void mcastOnlineMessage(PeerGroup pg) {
  290. try {
  291. JxtaMulticastSocket mcastSocket = new JxtaMulticastSocket(pg, JxtaMulticastSocketService.getSocketAdvertisement(pg));
  292. String msg = XmlCreator.createOnlineMessage();
  293.         DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length());
  294.         mcastSocket.send(packet);
  295.         mcastSocket.close();
  296. } catch (IOException e) {
  297. LOG.warning("multicast peer node message failed");
  298. e.printStackTrace();
  299. }
  300. }
  301. /**
  302.  * Multicast offline message
  303.  */
  304. private void mcastOfflineMessage(PeerGroup pg) {
  305. try {
  306. JxtaMulticastSocket mcastSocket = new JxtaMulticastSocket(pg, JxtaMulticastSocketService.getSocketAdvertisement(pg));
  307. String msg = XmlCreator.createOfflineMessage();
  308.         DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length());
  309.         mcastSocket.send(packet);
  310.         mcastSocket.close();
  311. } catch (IOException e) {
  312. LOG.warning("multicast peer node message failed");
  313. e.printStackTrace();
  314. }
  315. }
  316. /* @Override
  317. protected void handleShellCloseEvent() {
  318. // super.handleShellCloseEvent();
  319. // TODO: Hide the main window, but child window hided too? 
  320. this.getShell().setVisible(false);
  321. }*/
  322. private void showMessage(String message) {
  323. MessageDialog.openInformation(
  324. viewer.getControl().getShell(),
  325. "JxtaMessenger",
  326. message);
  327. }
  328. }