aboutsummaryrefslogtreecommitdiff
path: root/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/TrayController.java
diff options
context:
space:
mode:
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.java125
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.
+ }
+}