diff --git a/src/com/sheepit/client/standalone/GuiSwing.java b/src/com/sheepit/client/standalone/GuiSwing.java index 0cedf6b..22437f3 100644 --- a/src/com/sheepit/client/standalone/GuiSwing.java +++ b/src/com/sheepit/client/standalone/GuiSwing.java @@ -19,12 +19,19 @@ package com.sheepit.client.standalone; -import java.awt.Color; +import java.awt.AWTException; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +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.awt.event.ActionListener; import java.net.URL; -import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; @@ -45,9 +52,12 @@ public class GuiSwing extends JFrame implements Gui { WORKING, SETTINGS } + private static final SystemTray TRAY = SystemTray.getSystemTray(); + private JPanel panel; private Working activityWorking; private Settings activitySettings; + private TrayIcon trayIcon; private int framesRendered; @@ -202,6 +212,80 @@ public class GuiSwing extends JFrame implements Gui { panel.repaint(); } + public void hideToTray() { + if (SystemTray.isSupported() == false) { + System.out.println("GuiSwing::hideToTray SystemTray not supported!"); + return; + } + + try { + trayIcon = getTrayIcon(); + TRAY.add(trayIcon); + } + catch (AWTException e) { + System.out.println("GuiSwing::hideToTray an error occured while trying to add system tray icon (exception: " + e + ")"); + return; + } + + setVisible(false); + + } + + public void restoreFromTray() { + TRAY.remove(trayIcon); + setVisible(true); + } + + public TrayIcon getTrayIcon() { + final PopupMenu trayMenu = new PopupMenu(); + + URL iconUrl = getClass().getResource("/icon.png"); + Image img = Toolkit.getDefaultToolkit().getImage(iconUrl); + final TrayIcon icon = new TrayIcon(img); + + MenuItem exit = new MenuItem("Exit"); + exit.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + trayMenu.add(exit); + + MenuItem open = new MenuItem("Open..."); + open.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + restoreFromTray(); + } + }); + trayMenu.add(open); + + MenuItem settings = new MenuItem("Settings..."); + settings.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + restoreFromTray(); + showActivity(ActivityType.SETTINGS); + } + }); + trayMenu.add(settings); + + icon.setPopupMenu(trayMenu); + icon.setImageAutoSize(true); + icon.setToolTip("SheepIt! Client"); + + icon.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + restoreFromTray(); + } + }); + + return icon; + + } + public class ThreadClient extends Thread { @Override public void run() { diff --git a/src/com/sheepit/client/standalone/swing/activity/Working.java b/src/com/sheepit/client/standalone/swing/activity/Working.java index 7974bb1..ee9bd6b 100644 --- a/src/com/sheepit/client/standalone/swing/activity/Working.java +++ b/src/com/sheepit/client/standalone/swing/activity/Working.java @@ -1,7 +1,7 @@ package com.sheepit.client.standalone.swing.activity; -import java.awt.Color; import java.awt.GridBagConstraints; +import java.awt.SystemTray; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; @@ -131,6 +131,14 @@ public class Working implements Activity { constraints.gridx = 2; parent.getContentPane().add(pauseButton, constraints); + //Add hide button if os supports it + if (SystemTray.isSupported()) { + JButton hideButton = new JButton("Hide window"); + hideButton.addActionListener(new HideAction()); + constraints.gridx = 3; + parent.getContentPane().add(hideButton, constraints); + } + parent.addPadding(1, ++currentRow, 2, 1); parent.addPadding(0, 0, 1, currentRow + 1); parent.addPadding(3, 0, 1, currentRow + 1); @@ -212,4 +220,13 @@ public class Working implements Activity { } } + class HideAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + if (parent != null) { + parent.hideToTray(); + } + } + } + }