98 lines
2.9 KiB
Java
98 lines
2.9 KiB
Java
package envoy.client.ui;
|
|
|
|
import java.awt.*;
|
|
import java.awt.TrayIcon.MessageType;
|
|
|
|
import javafx.application.Platform;
|
|
import javafx.stage.Stage;
|
|
|
|
import envoy.client.event.MessageCreationEvent;
|
|
import envoy.data.Message;
|
|
import envoy.event.EventBus;
|
|
|
|
/**
|
|
* Project: <strong>envoy-client</strong><br>
|
|
* File: <strong>StatusTrayIcon.java</strong><br>
|
|
* Created: <strong>3 Dec 2019</strong><br>
|
|
*
|
|
* @author Kai S. K. Engelbart
|
|
* @since Envoy Client v0.2-alpha
|
|
*/
|
|
public class StatusTrayIcon {
|
|
|
|
/**
|
|
* The {@link TrayIcon} provided by the System Tray API for controlling the
|
|
* system tray. This includes displaying the icon, but also creating
|
|
* notifications when new messages are received.
|
|
*/
|
|
private final TrayIcon trayIcon;
|
|
|
|
/**
|
|
* A received {@link Message} is only displayed as a system tray notification if
|
|
* this variable is set to {@code true}.
|
|
*/
|
|
private boolean displayMessages = false;
|
|
|
|
/**
|
|
* @return {@code true} if the status tray icon is supported on this platform
|
|
* @since Envoy Client v0.2-beta
|
|
*/
|
|
public static boolean isSupported() { return SystemTray.isSupported(); }
|
|
|
|
/**
|
|
* Creates a {@link StatusTrayIcon} with the Envoy logo, a tool tip and a pop-up
|
|
* menu.
|
|
*
|
|
* @param stage the stage whose focus determines if message
|
|
* notifications are displayed
|
|
* @since Envoy Client v0.2-beta
|
|
*/
|
|
public StatusTrayIcon(Stage stage) {
|
|
trayIcon = new TrayIcon(IconUtil.loadAWTCompatible("/icons/envoy_logo.png"), "Envoy");
|
|
trayIcon.setImageAutoSize(true);
|
|
trayIcon.setToolTip("You are notified if you have unread messages.");
|
|
|
|
final PopupMenu popup = new PopupMenu();
|
|
|
|
final MenuItem exitMenuItem = new MenuItem("Exit");
|
|
exitMenuItem.addActionListener(evt -> { Platform.exit(); System.exit(0); });
|
|
popup.add(exitMenuItem);
|
|
|
|
trayIcon.setPopupMenu(popup);
|
|
|
|
// Only display messages if the stage is not focused
|
|
stage.focusedProperty().addListener((ov, onHidden, onShown) -> displayMessages = !ov.getValue());
|
|
|
|
// Show the window if the user clicks on the icon
|
|
trayIcon.addActionListener(evt -> Platform.runLater(() -> { stage.setIconified(false); stage.toFront(); stage.requestFocus(); }));
|
|
|
|
// Start processing message events
|
|
EventBus.getInstance().register(MessageCreationEvent.class, evt -> {
|
|
if (displayMessages) trayIcon
|
|
.displayMessage(
|
|
evt.get().hasAttachment() ? "New " + evt.get().getAttachment().getType().toString().toLowerCase() + " message received"
|
|
: "New message received",
|
|
evt.get().getText(),
|
|
MessageType.INFO);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Makes the icon appear in the system tray.
|
|
*
|
|
* @since Envoy Client v0.2-alpha
|
|
*/
|
|
public void show() {
|
|
try {
|
|
SystemTray.getSystemTray().add(trayIcon);
|
|
} catch (AWTException e) {}
|
|
}
|
|
|
|
/**
|
|
* Removes the icon from the system tray.
|
|
*
|
|
* @since Envoy Client v0.2-beta
|
|
*/
|
|
public void hide() { SystemTray.getSystemTray().remove(trayIcon); }
|
|
}
|