aboutsummaryrefslogtreecommitdiff
path: root/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java
diff options
context:
space:
mode:
Diffstat (limited to 'subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java')
-rw-r--r--subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java b/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java
new file mode 100644
index 00000000..32ee5230
--- /dev/null
+++ b/subsonic-booter/src/main/java/net/sourceforge/subsonic/booter/agent/SubsonicFrame.java
@@ -0,0 +1,113 @@
+package net.sourceforge.subsonic.booter.agent;
+
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import net.sourceforge.subsonic.booter.Main;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+/**
+ * Frame that is activated by the tray icon. Contains a tabbed pane
+ * with status and settings panels.
+ *
+ * @author Sindre Mehus
+ */
+public class SubsonicFrame extends JFrame {
+
+ private final SubsonicAgent subsonicAgent;
+
+ private final StatusPanel statusPanel;
+ private final SettingsPanel settingsPanel;
+ private JTabbedPane tabbedPane;
+ private JButton closeButton;
+
+ public SubsonicFrame(SubsonicAgent subsonicAgent, StatusPanel statusPanel, SettingsPanel settingsPanel) {
+ super("Subsonic Control Panel");
+ this.subsonicAgent = subsonicAgent;
+ this.statusPanel = statusPanel;
+ this.settingsPanel = settingsPanel;
+ createComponents();
+ layoutComponents();
+ addBehaviour();
+ setupIcons();
+
+ pack();
+ centerComponent();
+ }
+
+ private void setupIcons() {
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
+
+ // Window.setIconImages() was added in Java 1.6. Since Subsonic only requires 1.5, we
+ // use reflection to invoke it.
+ try {
+ Method method = Window.class.getMethod("setIconImages", java.util.List.class);
+ java.util.List<Image> images = Arrays.asList(
+ toolkit.createImage(Main.class.getResource("/images/subsonic-16.png")),
+ toolkit.createImage(Main.class.getResource("/images/subsonic-32.png")),
+ toolkit.createImage(Main.class.getResource("/images/subsonic-512.png")));
+ method.invoke(this, images);
+ } catch (Throwable x) {
+ // Fallback to old method.
+ setIconImage(toolkit.createImage(Main.class.getResource("/images/subsonic-32.png")));
+ }
+ }
+
+ public void centerComponent() {
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ setLocation(screenSize.width / 2 - getWidth() / 2,
+ screenSize.height / 2 - getHeight() / 2);
+ }
+
+ private void createComponents() {
+ tabbedPane = new JTabbedPane();
+ closeButton = new JButton("Close");
+ }
+
+ private void layoutComponents() {
+ tabbedPane.add("Status", statusPanel);
+ tabbedPane.add("Settings", settingsPanel);
+
+ JPanel pane = (JPanel) getContentPane();
+ pane.setLayout(new BorderLayout(10, 10));
+ pane.add(tabbedPane, BorderLayout.CENTER);
+ pane.add(ButtonBarFactory.buildCloseBar(closeButton), BorderLayout.SOUTH);
+
+ pane.setBorder(Borders.TABBED_DIALOG_BORDER);
+ }
+
+ private void addBehaviour() {
+ closeButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ setVisible(false);
+ }
+ });
+ }
+
+ @Override
+ public void setVisible(boolean b) {
+ super.setVisible(b);
+ subsonicAgent.setServiceStatusPollingEnabled(b);
+ }
+
+ public void showStatusPanel() {
+ settingsPanel.readValues();
+ tabbedPane.setSelectedComponent(statusPanel);
+ pack();
+ setVisible(true);
+ toFront();
+ }
+
+ public void showSettingsPanel() {
+ settingsPanel.readValues();
+ tabbedPane.setSelectedComponent(settingsPanel);
+ pack();
+ setVisible(true);
+ toFront();
+ }
+}