package test_streamer.client.ui; import javafx.event.Event; import javafx.event.EventHandler; import javafx.event.EventType; import test_streamer.client.ClientUI; import test_streamer.client.dto.TestSuiteResult; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; /** * @author kawasima */ public class TrayNotification implements ClientUI { private static final BufferedImage IMG_RUNNING; private static final BufferedImage IMG_DISCONNECT; private static final BufferedImage IMG_STANDBY; private ConcurrentHashMap<EventType, EventHandler> handlers = new ConcurrentHashMap<>(); static { try { IMG_RUNNING = ImageIO.read(TrayNotification.class.getResource("/running.gif")); IMG_DISCONNECT = ImageIO.read(TrayNotification.class.getResource("/disconnect.gif")); IMG_STANDBY = ImageIO.read(TrayNotification.class.getResource("/standby.gif")); } catch(IOException ex) { throw new RuntimeException(ex); } } private TrayIcon icon; public TrayNotification() { SystemTray tray = SystemTray.getSystemTray(); PopupMenu menu = new PopupMenu(); MenuItem exitMenu = new MenuItem("Exit"); icon = new TrayIcon(IMG_DISCONNECT, "TestStreamer", menu); exitMenu.addActionListener(actionEvent -> System.exit(0)); menu.add(exitMenu); try { tray.add(icon); } catch(AWTException ex) { throw new RuntimeException(ex); } } @Override public void beginTest(String testName) { icon.setImage(IMG_RUNNING); icon.displayMessage("TestStreamer", "Executing test " + testName, TrayIcon.MessageType.INFO); } @Override public void endTest(TestSuiteResult result) { } @Override public void standby() { icon.setImage(IMG_STANDBY); } @Override public <T extends javafx.event.Event> void addEventHandler(EventType<T> eventType, EventHandler<? super T> handler) { handlers.putIfAbsent(eventType, handler); } @Override public void fireEvent(Event event) { Optional.ofNullable(handlers.get(event.getEventType())) .ifPresent(handler -> handler.handle(event)); } @Override public void disconnect() { icon.setImage(IMG_DISCONNECT); icon.displayMessage("TestStreamer", "Disconnected from server.", TrayIcon.MessageType.WARNING); } public void removeTrayIcon() { SystemTray.getSystemTray().remove(icon); } }