package org.limewire.ui.swing.tray; import java.awt.AWTException; import java.awt.Dimension; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.SystemTray; import java.awt.TrayIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; import javax.swing.ActionMap; import javax.swing.Icon; import javax.swing.ImageIcon; import org.jdesktop.application.Application; import org.jdesktop.application.Resource; import org.limewire.ui.swing.settings.SwingUiSettings; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import org.limewire.util.OSUtils; /** * Puts an icon and menu in the system tray. Delegates System Notifications to * an Internal BasicNotifier. */ class SystemTrayNotifier implements TrayNotifier { private final SystemTray tray; private final TrayIcon trayIcon; private final PopupMenu popupMenu; private final BasicNotifier basicNotifier; @Resource private Icon windowsIconResource16; @Resource private Icon windowsIconResource32; @Resource private Icon windowsIconResource48; @Resource private Icon linuxIconResource16; @Resource private Icon linuxIconResource24; @Resource private Icon linuxIconResource32; @Resource private Icon linuxIconResource48; public SystemTrayNotifier() { this.basicNotifier = new BasicNotifier(); if (SystemTray.isSupported()) { GuiUtils.assignResources(this); tray = SystemTray.getSystemTray(); popupMenu = buildPopupMenu(); trayIcon = buildTrayIcon("LimeWire"); } else { tray = null; trayIcon = null; popupMenu = null; } } private TrayIcon buildTrayIcon(String desc) { Icon icon = getIcon(); TrayIcon trayIcon = new TrayIcon(((ImageIcon) icon).getImage(), desc, popupMenu); // left click restores. This happens on the awt thread. trayIcon.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ActionMap map = Application.getInstance().getContext().getActionManager() .getActionMap(); map.get("restoreView").actionPerformed(e); } }); trayIcon.setImageAutoSize(true); return trayIcon; } private Icon getIcon() { Dimension iconSize = SystemTray.getSystemTray().getTrayIconSize(); if(iconSize == null || iconSize.getWidth() <= 16) { return OSUtils.isWindows() ? windowsIconResource16 : linuxIconResource16; } else if(iconSize.getWidth() <= 24) { return OSUtils.isWindows() ? windowsIconResource16 : linuxIconResource24; } else if(iconSize.getWidth() <= 32) { return OSUtils.isWindows() ? windowsIconResource32 : linuxIconResource32; } else { return OSUtils.isWindows() ? windowsIconResource48 : linuxIconResource48; } } private PopupMenu buildPopupMenu() { PopupMenu menu = new PopupMenu(); // restore MenuItem item = new MenuItem(I18n.tr("Show LimeWire")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ActionMap map = Application.getInstance().getContext().getActionManager() .getActionMap(); map.get("restoreView").actionPerformed(e); } }); menu.add(item); menu.addSeparator(); // exit after transfers item = new MenuItem(I18n.tr("Exit After Transfers")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ActionMap map = Application.getInstance().getContext().getActionManager() .getActionMap(); map.get("shutdownAfterTransfers").actionPerformed(e); } }); menu.add(item); // exit item = new MenuItem(I18n.tr("Exit")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Application.getInstance().exit(e); } }); menu.add(item); return menu; } @Override public boolean isExitEvent(EventObject event) { if (!SwingUiSettings.MINIMIZE_TO_TRAY.getValue()) { return true; } if ((event != null) && (event.getSource() instanceof MenuItem)) { // Return true on exit from system tray popup menu. MenuItem item = (MenuItem) event.getSource(); return item.getParent() == popupMenu; } else if (event instanceof ActionEvent) { // Return true on action to shutdown application. return "Shutdown".equals(((ActionEvent) event).getActionCommand()); } else { return false; } } public boolean showTrayIcon() { if (tray == null) { return false; } try { tray.add(trayIcon); } catch (AWTException e) { return false; } catch (IllegalArgumentException iae) { return false; } return true; } public boolean supportsSystemTray() { return trayIcon != null && tray != null; } public void hideTrayIcon() { if (tray != null) { tray.remove(trayIcon); } } public void showMessage(Notification notification) { basicNotifier.showMessage(notification); } public void hideMessage(Notification notification) { basicNotifier.hideMessage(notification); } public void updateUI() { basicNotifier.updateUI(); } }