package net.knarcraft.minecraftserverlauncher.userinterface; import net.knarcraft.minecraftserverlauncher.Main; import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; import net.knarcraft.minecraftserverlauncher.utility.CommonFunctions; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream; import static java.awt.Frame.NORMAL; /** * This class adds a tray to the GUI */ public class Tray { private SystemTray tray; private TrayIcon trayIcon; private final ServerLauncherController controller; private final ServerLauncherGUI serverLauncherGUI; private final JFrame mainFrame; /** * Instantiates a new tray * * @param mainFrame
The main frame of the GUI
* @param serverLauncherGUIThe server launcher GUI to use
*/ public Tray(JFrame mainFrame, ServerLauncherGUI serverLauncherGUI) { this.controller = Main.getController(); this.mainFrame = mainFrame; this.serverLauncherGUI = serverLauncherGUI; initializeTray(); } /** * Prepares the system tray if available */ private void initializeTray() { if (SystemTray.isSupported()) { tray = SystemTray.getSystemTray(); InputStream imageStream = CommonFunctions.getResourceAsStream("GUIIcon.png"); Image trayImage; try { trayImage = ImageIO.read(imageStream); } catch (IOException e) { trayImage = Toolkit.getDefaultToolkit().getImage("resources/GUIIcon.png"); e.printStackTrace(); } PopupMenu popup = new PopupMenu(); trayIcon = new TrayIcon(trayImage, "Minecraft Server Launcher", popup); trayIcon.setImageAutoSize(true); ActionListener exitListener = e -> { serverLauncherGUI.stopServers(); controller.saveState(); System.exit(0); }; MenuItem restoreItem = new MenuItem("Restore"); popup.add(restoreItem); restoreItem.addActionListener(e -> { mainFrame.setExtendedState(NORMAL); tray.remove(trayIcon); mainFrame.setVisible(true); }); MenuItem exitItem = new MenuItem("Exit"); exitItem.addActionListener(exitListener); popup.add(exitItem); mainFrame.addWindowStateListener(e -> { if (e.getNewState() == NORMAL) { tray.remove(trayIcon); mainFrame.setVisible(true); } }); mainFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (controller.getRunInBackground()) { try { tray.add(trayIcon); mainFrame.setVisible(false); } catch (AWTException e1) { e1.printStackTrace(); } } else { serverLauncherGUI.stopServers(); controller.saveState(); System.exit(0); } } }); trayIcon.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() >= 1 && e.getButton() == MouseEvent.BUTTON1) { mainFrame.setExtendedState(NORMAL); tray.remove(trayIcon); mainFrame.setVisible(true); } } }); } else { mainFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { controller.saveState(); serverLauncherGUI.stopServers(); System.exit(0); } }); } } /** * Hides the gui to the tray */ public void hideToTray() { mainFrame.setVisible(false); try { tray.add(trayIcon); } catch (AWTException e) { e.printStackTrace(); } } }