Craig Raw
4 years ago
7 changed files with 123 additions and 1 deletions
@ -0,0 +1,95 @@ |
|||||
|
package com.sparrowwallet.sparrow.control; |
||||
|
|
||||
|
import javafx.application.Platform; |
||||
|
import javafx.stage.Stage; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
import javax.imageio.ImageIO; |
||||
|
import javax.swing.*; |
||||
|
import java.awt.*; |
||||
|
import java.awt.image.BaseMultiResolutionImage; |
||||
|
import java.io.IOException; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.List; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
public class TrayManager { |
||||
|
private static final Logger log = LoggerFactory.getLogger(TrayManager.class); |
||||
|
|
||||
|
private final SystemTray tray; |
||||
|
private final TrayIcon trayIcon; |
||||
|
private final PopupMenu popupMenu = new PopupMenu(); |
||||
|
|
||||
|
public TrayManager() { |
||||
|
if(!SystemTray.isSupported()) { |
||||
|
throw new UnsupportedOperationException("SystemTray icons are not supported by the current desktop environment."); |
||||
|
} |
||||
|
|
||||
|
tray = SystemTray.getSystemTray(); |
||||
|
|
||||
|
try { |
||||
|
List<Image> imgList = new ArrayList<>(); |
||||
|
imgList.add(ImageIO.read(getClass().getResource("/image/sparrow-white-small.png"))); |
||||
|
imgList.add(ImageIO.read(getClass().getResource("/image/sparrow-white-small@2x.png"))); |
||||
|
imgList.add(ImageIO.read(getClass().getResource("/image/sparrow-white-small@3x.png"))); |
||||
|
BaseMultiResolutionImage mrImage = new BaseMultiResolutionImage(imgList.toArray(new Image[0])); |
||||
|
|
||||
|
this.trayIcon = new TrayIcon(mrImage, "Sparrow", popupMenu); |
||||
|
|
||||
|
MenuItem miExit = new MenuItem("Quit Sparrow"); |
||||
|
miExit.addActionListener(e -> { |
||||
|
SwingUtilities.invokeLater(() -> { tray.remove(this.trayIcon); }); |
||||
|
Platform.exit(); |
||||
|
}); |
||||
|
this.popupMenu.add(miExit); |
||||
|
} catch(IOException e) { |
||||
|
log.error("Could not load system tray image", e); |
||||
|
throw new IllegalStateException(e); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void addStage(Stage stage) { |
||||
|
EventQueue.invokeLater(() -> { |
||||
|
MenuItem miStage = new MenuItem(stage.getTitle()); |
||||
|
miStage.setFont(Font.decode(null).deriveFont(Font.BOLD)); |
||||
|
miStage.addActionListener(e -> Platform.runLater(() -> { |
||||
|
stage.show(); |
||||
|
EventQueue.invokeLater(() -> { |
||||
|
popupMenu.remove(miStage); |
||||
|
|
||||
|
if(popupMenu.getItemCount() == 1) { |
||||
|
Platform.setImplicitExit(true); |
||||
|
SwingUtilities.invokeLater(() -> tray.remove(trayIcon)); |
||||
|
} |
||||
|
}); |
||||
|
})); |
||||
|
//Make sure it's always at the top
|
||||
|
this.popupMenu.insert(miStage,popupMenu.getItemCount() - 1); |
||||
|
|
||||
|
if(!isShowing()) { |
||||
|
// Keeps the JVM running even if there are no
|
||||
|
// visible JavaFX Stages, otherwise JVM would
|
||||
|
// exit and we lose the TrayIcon
|
||||
|
Platform.setImplicitExit(false); |
||||
|
|
||||
|
SwingUtilities.invokeLater(() -> { |
||||
|
try { |
||||
|
tray.add(this.trayIcon); |
||||
|
} catch(AWTException e) { |
||||
|
log.error("Unable to add system tray icon", e); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public boolean isShowing() { |
||||
|
return Arrays.stream(tray.getTrayIcons()).collect(Collectors.toList()).contains(trayIcon); |
||||
|
} |
||||
|
|
||||
|
public static boolean isSupported() { |
||||
|
return Desktop.isDesktopSupported() && SystemTray.isSupported(); |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 544 B |
After Width: | Height: | Size: 913 B |
After Width: | Height: | Size: 1.8 KiB |
Loading…
Reference in new issue