package pctelelog.ui; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Tray; import org.eclipse.swt.widgets.TrayItem; public class TrayIcon { private final Display m_mainDisplay; private final MainWindow m_mainWindow; private final TrayItem m_item; private final Image m_logo; private Menu m_trayMenu = null; public TrayIcon(Display display, MainWindow window) { if(display == null) { throw new NullPointerException("Display cannot be null."); } if(window == null) { throw new NullPointerException("Main window cannot be null."); } m_mainDisplay = display; m_mainWindow = window; // Create tray item Tray tray = display.getSystemTray(); m_item = new TrayItem(tray, SWT.NONE); m_item.setText("Droid Navi"); // Set Image m_logo = AppLogo.getLogo(AppLogo.LogoType.TRAY_ICON, display); m_item.setImage(m_logo); init(m_item); } private void init(TrayItem item) { initContextMenu(); initListeners(); } /** * Right Click Menu for the Icon */ private void initContextMenu() { m_trayMenu = new Menu(m_mainWindow.getWindowShell(), SWT.POP_UP); // Show MenuItem menu_show = new MenuItem(m_trayMenu, SWT.PUSH); menu_show.setText("Show"); menu_show.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { m_mainWindow.getWindowShell().setVisible(true); closeTray(); } }); // Options MenuItem menu_opt = new MenuItem(m_trayMenu, SWT.PUSH); menu_opt.setText("Options"); menu_opt.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { m_mainWindow.showOptions(); } }); // Exit MenuItem menu_exit = new MenuItem(m_trayMenu, SWT.PUSH); menu_exit.setText("Exit"); menu_exit.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { /* * By adding the dispose routine as an asyn task, * this increases the likelihood that Tray will dispose * first following by the shell and the app. */ m_mainDisplay.asyncExec(new Runnable() { public void run() { m_mainWindow.getWindowShell().dispose(); } }); closeTray(); } }); } /** * Set up Menu listener and dbl-click show * */ private void initListeners() { // Menu Listener m_item.addMenuDetectListener(new MenuDetectListener() { public void menuDetected(MenuDetectEvent e) { m_trayMenu.setVisible(true); } }); // Setup Double-click show if(System.getProperty("os.name").toLowerCase().startsWith("win")) { m_item.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if((e.stateMask & SWT.MouseDoubleClick) != 0) { m_mainWindow.getWindowShell().setVisible(true); closeTray(); } } }); } } /** * Close the tray icon out and release * all resources * */ private void closeTray() { m_logo.dispose(); m_item.dispose(); m_trayMenu.dispose(); } }