From 57be191814cd16d155a59b85d3554c99b3e469ce Mon Sep 17 00:00:00 2001 From: catbref Date: Mon, 13 May 2019 21:07:05 +0100 Subject: [PATCH] Splash startup & sys tray --- .../java/org/qora/controller/Controller.java | 7 + src/main/java/org/qora/gui/GUI.java | 71 +++++++++++ src/main/java/org/qora/gui/SplashFrame.java | 79 ++++++++++++ src/main/java/org/qora/gui/SysTray.java | 120 ++++++++++++++++++ src/main/resources/images/icons/icon128.png | Bin 0 -> 4325 bytes src/main/resources/images/icons/icon16.png | Bin 0 -> 673 bytes src/main/resources/images/icons/icon32.png | Bin 0 -> 1192 bytes src/main/resources/images/icons/icon64.png | Bin 0 -> 2274 bytes src/main/resources/images/splash.png | Bin 0 -> 17530 bytes 9 files changed, 277 insertions(+) create mode 100644 src/main/java/org/qora/gui/GUI.java create mode 100644 src/main/java/org/qora/gui/SplashFrame.java create mode 100644 src/main/java/org/qora/gui/SysTray.java create mode 100644 src/main/resources/images/icons/icon128.png create mode 100644 src/main/resources/images/icons/icon16.png create mode 100644 src/main/resources/images/icons/icon32.png create mode 100644 src/main/resources/images/icons/icon64.png create mode 100755 src/main/resources/images/splash.png diff --git a/src/main/java/org/qora/controller/Controller.java b/src/main/java/org/qora/controller/Controller.java index 6e0ea878..bff2d6a1 100644 --- a/src/main/java/org/qora/controller/Controller.java +++ b/src/main/java/org/qora/controller/Controller.java @@ -24,6 +24,7 @@ import org.qora.data.block.BlockData; import org.qora.data.network.BlockSummaryData; import org.qora.data.network.PeerData; import org.qora.data.transaction.TransactionData; +import org.qora.gui.GUI; import org.qora.network.Network; import org.qora.network.Peer; import org.qora.network.message.BlockMessage; @@ -142,6 +143,9 @@ public class Controller extends Thread { public static void main(String args[]) { LOGGER.info("Starting up..."); + // Potential GUI startup with splash screen, etc. + GUI.getInstance(); + Security.insertProviderAt(new BouncyCastleProvider(), 0); Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); @@ -202,6 +206,9 @@ public class Controller extends Thread { // Auto-update service LOGGER.info("Starting auto-update"); AutoUpdate.getInstance().start(); + + // If GUI is enabled, we're no longer starting up but actually running now + GUI.getInstance().notifyRunning(); } // Main thread diff --git a/src/main/java/org/qora/gui/GUI.java b/src/main/java/org/qora/gui/GUI.java new file mode 100644 index 00000000..baedd941 --- /dev/null +++ b/src/main/java/org/qora/gui/GUI.java @@ -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(); + } + +} diff --git a/src/main/java/org/qora/gui/SplashFrame.java b/src/main/java/org/qora/gui/SplashFrame.java new file mode 100644 index 00000000..ac6f5769 --- /dev/null +++ b/src/main/java/org/qora/gui/SplashFrame.java @@ -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 icons = new ArrayList(); + 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(); + } + +} diff --git a/src/main/java/org/qora/gui/SysTray.java b/src/main/java/org/qora/gui/SysTray.java new file mode 100644 index 00000000..4e6ba453 --- /dev/null +++ b/src/main/java/org/qora/gui/SysTray.java @@ -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 { + @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); + } + +} diff --git a/src/main/resources/images/icons/icon128.png b/src/main/resources/images/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccbd152cf32bf212cee6aa90b64d7f10d600d2d GIT binary patch literal 4325 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 TO5m^100000NkvXXu0mjf{<#_H literal 0 HcmV?d00001 diff --git a/src/main/resources/images/icons/icon16.png b/src/main/resources/images/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..8a87ae779d930055fa3dd2aa04393d091039c166 GIT binary patch literal 673 zcmV;S0$%-zP)8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10v<_3K~y-6g_BQ6RACgwfA@P&OB?zpg<$T4lpqwsjA~;>5J)Y0 zuN)l=3nWN#7qp0J5kae%j1-9|9MpNxqFRIzK@mkIM2lJsE+QhRg#IBqZ|1u#nip`&y!+1XmtN8 z$YXH$ZVyUr_$$2gdtq@9p-Dwt1NyN*a#VJ#WFS^mV7xj~HR-I9!@y^S590SsBtVAp z@m^@IYEKaOIRG!7s;>LK`Xx%UpuR;~1ulRD^WT2NP1ap9V)X`K^Fwurn@M?V>s$NTPx#1ZP1_K>z@;j|==^1poj532;bRa{vGVjsO4wjseVSw@Ls202p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y1Q|(0K~z{r#aCTu6jvBcsM6L4?L&o9m8e)- zX-O#sAu+~?QYghDv9mL?iI9ry&Su>||MDP$s31OzrFqfT%uF<`l9@5K)Y1rwZxzI9 zODl*E;$Mg&(PYifc)r=YI&=3nncal;z+rdx`@VDT-0$8yvsJF^{;v#;O;Ka16g4st z)%a0XjX&}E2z0@rNYuEE&+`$**dJ-pS5;NH)vRp#kW{k{#=pW~f*FS4P1LkWQqOBl zrhGI;Ms*h{JyZZ!_0D*|mAK);uQi+@>s`dKewnm`Ls?QbXRO9l>fGxsE&5y>P`~pY^w7grG5+QQL~NmUrdbxWjC}}n zUovZ7Xlv_#1N(kHX5vP`Lq542GhkZ&AARg&nq|VRhVk*hATo|cFDK0{`a zBD57aV;}WXUeYAM-5ueK`u6SXpG5<~_sfA;*4{%klJxxo^nZ~jK!DlBQgcQ{PqH*2 zXlik{r~O9pjNL`8i0yFR#`Rym*aQ~o7FPNSSfPzV^8!bwT9CP1&zl&;MW2zYrR{?h zOXSWj#r0iZY%Gy=HhP7AOtKgm^;7iH!qQ6+>*$#W@vA-~&`DD)k+Ev={jo3htUcXZ z?-dq74;~mjC^Zf+FDXVZW@IZ)u?Bi0qNgcp-z5z#=PZEuZJ*J2JnMW#vG%mJ7S|)b z*g$NX^8v+PLQ%R_lL==UhT|AiiZqfr`$LEi`i%1NwBx;+qb(6!-(vAWY8(9?09v6! zu%bbrwv{yK1cbpb$Ohp&j;EZDJ%ccyBa-b^k7#Qctx&m8EL zoE91kdcf=8ATz{&0rMILdJb*dt*T}%D+veDfA;^5Zq*BSFV*8=O*O>;0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGXDF6TiDFMAMd368)02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y2vbQ!K~#8N3jg0|C#VCRTqP#k@yrf}wS_Gq_i5Nu!F-k;H zLGlvLPZM~ zdelXQ9_=&m7w}K;G}r(h1^0uy3O$i3*v^6NGo!p(A1dbjg4e5cb9uD@0@?(!ARBYw zZ{QN##9M z+>ymAuObO;gM!hOz1&`Hr9@zB@i@9#5P7BpNoqZy;t~irDF|vCD%v);d-bg(Ex*9s z?t-VTNrkj6@h~DDl9?YU%BtR|2t$=rfFtPksIRqa*VvvUw;V=!BDeD_EUDCaR4YqL z7GF%#a|aLJqa86<=4+RAic&d*LdqO$F(N6< z4&z`Af>zKcucYEFft=G9H{=D}oIOHWc6lJH=`)Ob!s(b$NVbf-743aYP;R1Pvj$uI zpbL&btNB4vewK_Zr()A1*Xb<;??7|zPsQbop+mQHM3)Jn>{_v|EZD%71TPp8F6RYNfIR@nR7a_J3Nhw$s1T6ae36QCG}@S zwC<;=C^Ovd%6njB@986(Q!#l5Zo=j0X5UJ6q~|wOj2U+OK9b#hDx%fEmg1=UfT$%C zN^=2Q<>8{8?W^ti>htM<@qH-juNU;BB_7yfDxw*9`eS6qX&6V&xQmKt6JWluK%y%h zkD4AD#>uF}Fb#8@YqtPcQiK+^t1Qu%nr^o`oQmLubim1MCq8E}WZpnUv?(x0m?hC? z$)IDb- zTM2h`7@%#HsMU(NVQ-vs%xVb15LnC|9R@V%$7Fg_lO}RFxFA{p1N1Ew^`@j(n|IFX zg2(|3lngVQ6DZmo?t}wJj{?4+UhNOY8dLBTINP|>!&bJLY?>HHfvn~M;8)zSl~5Lr z_4Nf~$ArL>Sst53<{Tr(tmvL@Gu5T2ZfxDUE==T?G0qz^@)XH0=7F*=FN zIrthu(e_I8bK?5l+|bTi0C#UBcWy=a%cBYcZ7>I(VBBA>C+QmH)oy{_!=iq$ZtU1) zmvSRy_5KorG>lYn=T=4_7@H{x+{jvANFPY%9PCL$^Kl`DophNe4YnVU?WRK9HM;U< zD#A7b;SCQ%^des5CC0yn)bc*z$|KNtc>{ z$<2o5iH$phPwliA7R*9{V+lr@dPFl9J#8}|f zuBXFhu(1;X+1VA|nMfu%AQ052Ndhpk)*p%vCUcIGXZ0TFCO=7R6J&FUii#~A$;BGB z-wArPg;YdNz)<&=EC>Vt4g{mOkvT^oT-^uf4-0llWch^5twEa#_TCKT@*x6&y$y!o z55)kC#3-;=?AyL@bO6qumf1H`e~!$pfnaJ(!DYsV#QHi1H1+M+m*xPHxV^M=Z5MLk z2!x_f;C!86XJiAq!x%D84R?`xKMzJ8WLmPfF1hA}va+h~5WHImKxB>Bw=ptIl-L=l zpY;W!kC1t4V7OQ=3ocW#&tNdQx{r#pg$a{lH$wCwa}WlW$Ci+J0ysb0WS7hnzR7w& zGM9sWgp5G4e%m6jp54e?K4A@%SNDftw%U^g!imx2c`_$7wns8uF0(c8U`bHFjvVBG z_|cM}>@beS)<+m&itK#m9tg#TL$GDv_J?9)$()0IB#F$wSz>GCu0Wu=8@b2<@tNPrSN!300!!3ODF4(k~zn?>Cvv} z?>pu8#8B+>$&)SKY_pditUpTv$ulE!NkRf>)-OqeXy(b%P)*XCYJXV220`wV*cxg5 zf|swUn|`(;5t>ITnyGK2B`lQ$VC2EFvYMo6Zb@i;FLa~V(Ms0Jn9(GOz7_twc^T zXUND_ie#EUAUQsW7V(KhaLZHC!c?vEz&0L{wO2zZ+jo-(kQ)!U-RiwmopUi_?6NBg z6?Gz}ywwnWN(dr5HvL?7A^RxO@xL9Gfqm-Ec3{y(f^J277eRfBX1oVC=Mersw+G38 wJ%DLfz^IVB|}Atfv&C@v@~FCir| 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 V{tw>n)QkWC002ovPDHLkV1hE?K~?|& literal 0 HcmV?d00001