diff options
Diffstat (limited to 'subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java')
-rw-r--r-- | subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java b/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java new file mode 100644 index 00000000..2be918e8 --- /dev/null +++ b/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java @@ -0,0 +1,125 @@ +package net.sourceforge.subsonic.booter.agent; + +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.Toolkit; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.net.URL; + +import javax.swing.AbstractAction; +import javax.swing.Action; + +import net.sourceforge.subsonic.booter.deployer.DeploymentStatus; + +/** + * Controls the Subsonic tray icon. + * + * @author Sindre Mehus + */ +public class TrayController implements SubsonicListener { + + private final SubsonicAgent subsonicAgent; + private TrayIcon trayIcon; + + private Action openAction; + private Action controlPanelAction; + private Action hideAction; + private Image startedImage; + private Image stoppedImage; + + public TrayController(SubsonicAgent subsonicAgent) { + this.subsonicAgent = subsonicAgent; + try { + createActions(); + createComponents(); + addBehaviour(); + installComponents(); + subsonicAgent.addListener(this); + } catch (Throwable x) { + System.err.println("Disabling tray support."); + } + } + + public void showMessage() { + trayIcon.displayMessage("Subsonic", "Subsonic is now running. Click this balloon to get started.", + TrayIcon.MessageType.INFO); + } + + private void createActions() { + openAction = new AbstractAction("Open Subsonic in Browser") { + public void actionPerformed(ActionEvent e) { + subsonicAgent.openBrowser(); + } + }; + + controlPanelAction = new AbstractAction("Subsonic Control Panel") { + public void actionPerformed(ActionEvent e) { + subsonicAgent.showStatusPanel(); + } + }; + + + hideAction = new AbstractAction("Hide Tray Icon") { + public void actionPerformed(ActionEvent e) { + subsonicAgent.exit(); + } + }; + } + + private void createComponents() { + startedImage = createImage("/images/subsonic-started-16.png"); + stoppedImage = createImage("/images/subsonic-stopped-16.png"); + + PopupMenu menu = new PopupMenu(); + menu.add(createMenuItem(openAction)); + menu.add(createMenuItem(controlPanelAction)); + menu.addSeparator(); + menu.add(createMenuItem(hideAction)); + + trayIcon = new TrayIcon(stoppedImage, "Subsonic Music Streamer", menu); + } + + private Image createImage(String resourceName) { + URL url = getClass().getResource(resourceName); + return Toolkit.getDefaultToolkit().createImage(url); + } + + private MenuItem createMenuItem(Action action) { + MenuItem menuItem = new MenuItem((String) action.getValue(Action.NAME)); + menuItem.addActionListener(action); + return menuItem; + } + + private void addBehaviour() { + trayIcon.addActionListener(controlPanelAction); + } + + private void installComponents() throws Throwable { + SystemTray.getSystemTray().add(trayIcon); + } + + public void uninstallComponents() { + try { + SystemTray.getSystemTray().remove(trayIcon); + } catch (Throwable x) { + System.err.println("Disabling tray support."); + } + } + + private void setTrayImage(Image image) { + if (trayIcon.getImage() != image) { + trayIcon.setImage(image); + } + } + + public void notifyDeploymentStatus(DeploymentStatus deploymentStatus) { + setTrayImage(deploymentStatus == null ? stoppedImage : startedImage); + } + + public void notifyServiceStatus(String serviceStatus) { + // Nothing here, but could potentially change tray icon and menu. + } +} |