mirror of https://github.com/qortal/qortal
catbref
5 years ago
9 changed files with 277 additions and 0 deletions
@ -0,0 +1,71 @@
|
||||
package org.qora.gui; |
||||
|
||||
import java.awt.GraphicsEnvironment; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
import javax.imageio.ImageIO; |
||||
|
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
public class GUI { |
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(GUI.class); |
||||
private static GUI instance; |
||||
|
||||
private boolean isHeadless; |
||||
private SplashFrame splash = null; |
||||
private SysTray sysTray = null; |
||||
|
||||
private GUI() { |
||||
this.isHeadless = GraphicsEnvironment.isHeadless(); |
||||
|
||||
if (!this.isHeadless) |
||||
showSplash(); |
||||
} |
||||
|
||||
private void showSplash() { |
||||
LOGGER.trace("Splash"); |
||||
this.splash = SplashFrame.getInstance(); |
||||
} |
||||
|
||||
protected static BufferedImage loadImage(String resourceName) { |
||||
try (InputStream in = ClassLoader.getSystemResourceAsStream("images/" + resourceName)) { |
||||
return ImageIO.read(in); |
||||
} catch (IOException e) { |
||||
LOGGER.warn(String.format("Couldn't locate image resource \"images/%s\"", resourceName)); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public static GUI getInstance() { |
||||
if (instance == null) |
||||
instance = new GUI(); |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
public void notifyRunning() { |
||||
if (this.isHeadless) |
||||
return; |
||||
|
||||
this.splash.dispose(); |
||||
this.splash = null; |
||||
|
||||
this.sysTray = SysTray.getInstance(); |
||||
} |
||||
|
||||
public void shutdown() { |
||||
if (this.isHeadless) |
||||
return; |
||||
|
||||
if (this.splash != null) |
||||
this.splash.dispose(); |
||||
|
||||
if (this.sysTray != null) |
||||
this.sysTray.dispose(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,79 @@
|
||||
package org.qora.gui; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Image; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
|
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
public class SplashFrame { |
||||
|
||||
protected static final Logger LOGGER = LogManager.getLogger(SplashFrame.class); |
||||
|
||||
private static SplashFrame instance; |
||||
private JDialog splashDialog; |
||||
|
||||
@SuppressWarnings("serial") |
||||
public static class SplashPanel extends JPanel { |
||||
private BufferedImage image; |
||||
|
||||
public SplashPanel() { |
||||
image = GUI.loadImage("splash.png"); |
||||
this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); |
||||
this.setLayout(new BorderLayout()); |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
g.drawImage(image, 0, 0, null); |
||||
} |
||||
} |
||||
|
||||
private SplashFrame() { |
||||
this.splashDialog = new JDialog(); |
||||
|
||||
List<Image> icons = new ArrayList<Image>(); |
||||
icons.add(GUI.loadImage("icons/icon16.png")); |
||||
icons.add(GUI.loadImage("icons/icon32.png")); |
||||
icons.add(GUI.loadImage("icons/icon64.png")); |
||||
icons.add(GUI.loadImage("icons/icon128.png")); |
||||
this.splashDialog.setIconImages(icons); |
||||
|
||||
this.splashDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); |
||||
this.splashDialog.setTitle("qora-core"); |
||||
this.splashDialog.setContentPane(new SplashPanel()); |
||||
|
||||
this.splashDialog.setUndecorated(true); |
||||
this.splashDialog.setModal(false); |
||||
this.splashDialog.pack(); |
||||
this.splashDialog.setLocationRelativeTo(null); |
||||
this.splashDialog.toFront(); |
||||
this.splashDialog.setVisible(true); |
||||
this.splashDialog.repaint(); |
||||
} |
||||
|
||||
public static SplashFrame getInstance() { |
||||
if (instance == null) |
||||
instance = new SplashFrame(); |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
public void setVisible(boolean b) { |
||||
this.splashDialog.setVisible(b); |
||||
} |
||||
|
||||
public void dispose() { |
||||
this.splashDialog.dispose(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,120 @@
|
||||
package org.qora.gui; |
||||
|
||||
import java.awt.AWTException; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.MenuItem; |
||||
import java.awt.PopupMenu; |
||||
import java.awt.SystemTray; |
||||
import java.awt.TrayIcon; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
import javax.imageio.ImageIO; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingWorker; |
||||
|
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
import org.qora.controller.Controller; |
||||
|
||||
public class SysTray { |
||||
|
||||
protected static final Logger LOGGER = LogManager.getLogger(SplashFrame.class); |
||||
|
||||
private static SysTray instance; |
||||
private TrayIcon trayIcon = null; |
||||
private PopupMenu popupMenu = null; |
||||
|
||||
@SuppressWarnings("serial") |
||||
public static class SplashPanel extends JPanel { |
||||
private BufferedImage image; |
||||
|
||||
public SplashPanel() { |
||||
try (InputStream in = ClassLoader.getSystemResourceAsStream("images/splash.png")) { |
||||
image = ImageIO.read(in); |
||||
this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); |
||||
this.setLayout(new BorderLayout()); |
||||
} catch (IOException ex) { |
||||
LOGGER.error(ex); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
g.drawImage(image, 0, 0, null); |
||||
} |
||||
} |
||||
|
||||
private SysTray() { |
||||
if (!SystemTray.isSupported()) |
||||
return; |
||||
|
||||
this.popupMenu = createPopupMenu(); |
||||
|
||||
this.trayIcon = new TrayIcon(GUI.loadImage("icons/icon32.png"), "qora-core", popupMenu); |
||||
|
||||
this.trayIcon.setImageAutoSize(true); |
||||
|
||||
try { |
||||
SystemTray.getSystemTray().add(this.trayIcon); |
||||
} catch (AWTException e) { |
||||
this.trayIcon = null; |
||||
} |
||||
} |
||||
|
||||
class ClosingWorker extends SwingWorker<Void, Void> { |
||||
@Override |
||||
protected Void doInBackground() { |
||||
Controller.getInstance().shutdown(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
System.exit(0); |
||||
} |
||||
} |
||||
|
||||
private PopupMenu createPopupMenu() { |
||||
PopupMenu menu = new PopupMenu(); |
||||
|
||||
MenuItem exit = new MenuItem("Exit"); |
||||
exit.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
new ClosingWorker().execute(); |
||||
} |
||||
}); |
||||
menu.add(exit); |
||||
|
||||
return menu; |
||||
} |
||||
|
||||
public static SysTray getInstance() { |
||||
if (instance == null) |
||||
instance = new SysTray(); |
||||
|
||||
return instance; |
||||
} |
||||
|
||||
public void showMessage(String caption, String text, TrayIcon.MessageType messagetype) { |
||||
if (trayIcon != null) |
||||
trayIcon.displayMessage(caption, text, messagetype); |
||||
} |
||||
|
||||
public void setToolTipText(String text) { |
||||
if (trayIcon != null) |
||||
this.trayIcon.setToolTip(text); |
||||
} |
||||
|
||||
public void dispose() { |
||||
if (trayIcon != null) |
||||
SystemTray.getSystemTray().remove(this.trayIcon); |
||||
} |
||||
|
||||
} |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 17 KiB |
Loading…
Reference in new issue