package de.saxsys.projectiler.tray;
import java.awt.Dimension;
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.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.stage.Stage;
public class Tray {
private static final Logger LOGGER = Logger.getLogger(Tray.class.getSimpleName());
private static final Tray INSTANCE = new Tray();
private final SystemTray tray = SystemTray.getSystemTray();
private TrayIcon trayIcon;
private PopupMenu popup;
private Stage stage;
public Tray() {
// Otherwise the Application will stop, when the window is closed.
Platform.setImplicitExit(false);
}
public static Tray getInstance() {
return INSTANCE;
}
public void initTrayForStage(final Stage stage) {
if (SystemTray.isSupported() && trayIcon == null) {
this.stage = stage;
initTrayPopup();
initTrayIcon();
addIconToTray();
} else {
LOGGER.log(Level.SEVERE, "Tray unavailable");
}
}
private void addIconToTray() {
try {
tray.add(trayIcon);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Tray unavailable - Error while adding tray icon.");
}
}
private void initTrayPopup() {
popup = new PopupMenu();
MenuItem open = new MenuItem("Öffnen");
MenuItem exit = new MenuItem("Beenden");
ActionListener exitListener = new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent arg0) {
System.exit(0);
}
};
ActionListener maximizeListener = new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent arg0) {
showStage();
}
};
popup.add(open);
popup.add(exit);
exit.addActionListener(exitListener);
open.addActionListener(maximizeListener);
}
private void initTrayIcon() {
Image image = Toolkit.getDefaultToolkit().getImage(Tray.class.getResource("/projectiler-100.png"));
Dimension trayIconSize = tray.getTrayIconSize();
image = image.getScaledInstance(trayIconSize.width, trayIconSize.height, Image.SCALE_SMOOTH);
trayIcon = new TrayIcon(image, "Projectiler", popup);
trayIcon.addMouseListener(new ShowStageOnMouseDoubleClickListener(this));
trayIcon.setImageAutoSize(true);
}
public void hideStage() {
trayIcon.displayMessage("Projectiler", "Ist weiterhin aktiv!", MessageType.INFO);
LOGGER.log(Level.INFO, "Send Projectiler to tray");
stage.hide();
}
void showStage() {
LOGGER.log(Level.INFO, "Prepare to open projectiler from tray.");
Platform.runLater(new Runnable() {
@Override
public void run() {
LOGGER.log(Level.INFO, "Projectiler reopened");
stage.show();
}
});
}
}