From 9e02f6b2b8d501c976970b16e57fdde6f3c8c722 Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 20 Feb 2022 11:21:13 +0000 Subject: [PATCH 1/9] fix: Wraps alert display in Platform.runlater() --- .../javafx/scenebuilder/app/SceneBuilderApp.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java index 7c285949b..11b935694 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java @@ -991,11 +991,13 @@ private void checkUpdates(DocumentWindowController source) { dialog.showAndWait(); }); } else { - SBAlert alert = new SBAlert(Alert.AlertType.INFORMATION, getFrontDocumentWindow().getStage()); - alert.setTitle(I18N.getString("check_for_updates.alert.up_to_date.title")); - alert.setHeaderText(I18N.getString("check_for_updates.alert.headertext")); - alert.setContentText(I18N.getString("check_for_updates.alert.up_to_date.message")); - alert.showAndWait(); + Platform.runLater(()->{ + SBAlert alert = new SBAlert(Alert.AlertType.INFORMATION, getFrontDocumentWindow().getStage()); + alert.setTitle(I18N.getString("check_for_updates.alert.up_to_date.title")); + alert.setHeaderText(I18N.getString("check_for_updates.alert.headertext")); + alert.setContentText(I18N.getString("check_for_updates.alert.up_to_date.message")); + alert.showAndWait(); + }); } } catch (NumberFormatException ex) { Platform.runLater(() -> showVersionNumberFormatError(source)); From a2a94e7cbb759dbbd7c5ac833cd529ff23e63e51 Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 20 Feb 2022 16:15:07 +0000 Subject: [PATCH 2/9] fix: Adds an icon that reflects the available update status to the help menu --- .../app/menubar/MenuBarController.java | 33 ++++++++++++++++++ .../scenebuilder/app/menubar/check_icon.png | Bin 0 -> 2082 bytes .../app/menubar/download_icon.png | Bin 0 -> 1987 bytes .../scenebuilder/app/menubar/warn_icon.png | Bin 0 -> 1025 bytes 4 files changed, 33 insertions(+) create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon.png create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/download_icon.png create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon.png diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java index 938c540a7..e27d8e5c9 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java @@ -40,6 +40,7 @@ import com.oracle.javafx.scenebuilder.app.i18n.I18N; import com.oracle.javafx.scenebuilder.app.preferences.PreferencesController; import com.oracle.javafx.scenebuilder.app.preferences.PreferencesRecordGlobal; +import com.oracle.javafx.scenebuilder.app.util.AppSettings; import com.oracle.javafx.scenebuilder.kit.editor.EditorController; import com.oracle.javafx.scenebuilder.kit.editor.EditorController.ControlAction; import com.oracle.javafx.scenebuilder.kit.editor.EditorController.EditAction; @@ -56,6 +57,7 @@ import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collections; @@ -81,6 +83,8 @@ import javafx.scene.control.RadioMenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.effect.Effect; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.input.KeyCharacterCombination; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; @@ -1171,6 +1175,35 @@ public String getTitle() { insertMenu.setOnMenuValidation(onCustomPartOfInsertMenuValidationHandler); windowMenu.setOnMenuValidation(onWindowMenuValidationHandler); + + // Add icon that reflects the update status to the checkUpdate menu item. + AppSettings.getLatestVersion(latestVersion -> { + if (latestVersion != null) { + try ( + // Icons by Font Awesome (https://fontawesome.com/license/free) under CC BY 4.0 License + InputStream downloadStream = MenuBarController.class.getResourceAsStream("download_icon.png"); + InputStream checkStream = MenuBarController.class.getResourceAsStream("check_icon.png"); + InputStream warnStream = MenuBarController.class.getResourceAsStream("warn_icon.png"); + ) { + Image icon; + try { + if (AppSettings.isCurrentVersionLowerThan(latestVersion)) { + icon = new Image(downloadStream); + } else { + icon = new Image(checkStream); + } + } catch (NumberFormatException ex) { + icon = new Image(warnStream); + } + ImageView iconView = new ImageView(icon); + iconView.setFitHeight(16); + iconView.setFitWidth(16); + checkUpdatesMenuItem.setGraphic(iconView); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + }); } private void addSwatchGraphic(RadioMenuItem swatchMenuItem) { diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon.png b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..88d4c27ec7906a24eb2694bf3f0d2ce39be15da3 GIT binary patch literal 2082 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 literal 0 HcmV?d00001 From 9ce3afb86e17565b4bd47d1f1050b830d103a9eb Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sat, 26 Feb 2022 12:12:35 +0000 Subject: [PATCH 3/9] Improves UX with better menu item text --- .../scenebuilder/app/SceneBuilderApp.java | 5 ++- .../app/menubar/MenuBarController.java | 42 +++++++----------- .../scenebuilder/app/util/AppSettings.java | 13 +++++- .../app/i18n/SceneBuilderApp.properties | 5 ++- .../scenebuilder/app/menubar/check_icon.png | Bin 2082 -> 6455 bytes .../app/menubar/check_icon@2x.png | Bin 0 -> 2082 bytes .../app/menubar/download_icon.png | Bin 1987 -> 6627 bytes .../app/menubar/download_icon@2x.png | Bin 0 -> 1987 bytes .../scenebuilder/app/menubar/warn_icon.png | Bin 1025 -> 5598 bytes .../scenebuilder/app/menubar/warn_icon@2x.png | Bin 0 -> 1025 bytes 10 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon@2x.png create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/download_icon@2x.png create mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon@2x.png diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java index 11b935694..6d1fa1819 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java @@ -225,7 +225,6 @@ public boolean canPerformControlAction(ApplicationControlAction a, DocumentWindo switch (a) { case ABOUT: case REGISTER: - case CHECK_UPDATES: case NEW_FILE: case NEW_TEMPLATE: case OPEN_FILE: @@ -235,6 +234,10 @@ public boolean canPerformControlAction(ApplicationControlAction a, DocumentWindo result = true; break; + case CHECK_UPDATES: + result = AppSettings.isUpdateAvailable(); + break; + case CLOSE_FRONT_WINDOW: result = windowList.isEmpty() == false; break; diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java index e27d8e5c9..f66912c5c 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java @@ -68,6 +68,7 @@ import java.util.TreeMap; import java.util.TreeSet; +import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; import javafx.event.ActionEvent; @@ -1176,33 +1177,22 @@ public String getTitle() { windowMenu.setOnMenuValidation(onWindowMenuValidationHandler); - // Add icon that reflects the update status to the checkUpdate menu item. + // Modify the Check Updates menu item if there is an update available. + // Icons by Font Awesome (https://fontawesome.com/license/free) under CC BY 4.0 License AppSettings.getLatestVersion(latestVersion -> { - if (latestVersion != null) { - try ( - // Icons by Font Awesome (https://fontawesome.com/license/free) under CC BY 4.0 License - InputStream downloadStream = MenuBarController.class.getResourceAsStream("download_icon.png"); - InputStream checkStream = MenuBarController.class.getResourceAsStream("check_icon.png"); - InputStream warnStream = MenuBarController.class.getResourceAsStream("warn_icon.png"); - ) { - Image icon; - try { - if (AppSettings.isCurrentVersionLowerThan(latestVersion)) { - icon = new Image(downloadStream); - } else { - icon = new Image(checkStream); - } - } catch (NumberFormatException ex) { - icon = new Image(warnStream); - } - ImageView iconView = new ImageView(icon); - iconView.setFitHeight(16); - iconView.setFitWidth(16); - checkUpdatesMenuItem.setGraphic(iconView); - } catch (IOException ex) { - ex.printStackTrace(); - } - } + var updateAvailable = AppSettings.isUpdateAvailable(); + Image icon = new Image(MenuBarController.class + .getResource(updateAvailable ? "download_icon.png" : "check_icon.png") + .toExternalForm()); + ImageView iconView = new ImageView(icon); + + Platform.runLater(() -> { + checkUpdatesMenuItem.setGraphic(iconView); + checkUpdatesMenuItem.disableProperty().setValue(!updateAvailable); + checkUpdatesMenuItem.setText(updateAvailable + ? I18N.getString("menu.title.check.updates.available") + : I18N.getString("menu.title.check.updates.ok")); + }); }); } diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java index c22ec3f74..3c1219e67 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java @@ -64,9 +64,9 @@ public class AppSettings { private static String sceneBuilderVersion; private static String latestVersion; - private static String latestVersionText; private static String latestVersionAnnouncementURL; + private static boolean isUpdateAvailable = false; private static final JsonReaderFactory readerFactory = Json.createReaderFactory(null); @@ -114,6 +114,10 @@ public static boolean isCurrentVersionLowerThan(String version) { return false; } + public static boolean isUpdateAvailable() { + return isUpdateAvailable; + } + public static void getLatestVersion(Consumer consumer) { if (latestVersion == null) { @@ -136,6 +140,13 @@ public static void getLatestVersion(Consumer consumer) { ex.printStackTrace(); } latestVersion = onlineVersionNumber; + + try { + isUpdateAvailable = isCurrentVersionLowerThan(latestVersion); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + consumer.accept(latestVersion); }, "GetLatestVersion").start(); } else { diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties index ead6e4fbc..5b6196ba3 100644 --- a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties +++ b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties @@ -191,7 +191,10 @@ menu.title.no.window = No Window # Help menu items menu.title.scene.builder.help = Scene Builder Help menu.title.show.welcome = Show Welcome Page -menu.title.check.updates = Check for Update... +menu.title.check.updates = Checking for updates... +menu.title.check.updates.available = Update available +menu.title.check.updates.ok = All up-to-date! + menu.title.about = About Scene Builder menu.title.register = Register... menu.title.help.javafx=JavaFX diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon.png b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon.png index 88d4c27ec7906a24eb2694bf3f0d2ce39be15da3..4b08e4566ce3b869e0ca6acaec19e2e1ea94ce03 100644 GIT binary patch literal 6455 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 O!rEJJw<@>T6Z;<@X{=HJ delta 1930 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 O-^bJ6quOmn+J6CHrKglR)V zP)S2WAaHVTW@&6?001bFeUUv#!$2IxUsFZV76&_sIAo{}VnI~IQL9jd3ZawC1vP*5 zGSjS%aX`~;GnI&one3|A^$GzIgfWUs^dz`Jel9gw>qIfPhFm z%M8;d-XNadv<=St#1U4MRpN8vF_SJx{K$31<2TL)mj#{~G1IAe;s~)=Xk(>~S<%#p zr--Afrc=I<@mS@&#aSy?S@WL!g`t0(zOu}9nnOrn5lfIDLO~TJlwl)At4@lA6z#`- z{DZDvB9}t05*RraP=N;7^@IPx?{2O9 zddpv_12dnb*IHWi2^X~5U-u^w)?C%FlHFB3`6j2bzfAjV@h>AAKVIril5i3EIfFMG! z2!aR(>;i(Ng{_r>g&-DUBWN!+2i6Kfi;zGN#NxCP5x>Z(;9c%6$?hAAU6Iq%QYWdWxS85@AE4>&h+)3F5bX$U|S;F~2tudn4dT-?rAOMnl3{_PVB zupZLD=8zO@05lD#yhu;m5`c|Bmn#JN#T1~U`gR);dQ*VksUDGn+zdEX>4Tx04R}tkv&MmKpe$iQ$^7h2Rn#3WT*~eK~%(1t5Adrp;l;qmz@OiF^XQ9S;m|sCE+{1?h)YYU5sb>pZjx!)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5TM_TK(I)9mjDOEq$rUnwe+00006VoOIv0I&cB00o~Vg%1D#010qNS#tmY z4c7nw4c7reD4Tcy000McNliru<^mKCIWBN~2HyYx0scuuK~z}7y_Y>`6j2bzfAjV@ zh>AAKVIril5i3EIfFMG!2!aR(>;i(Ng{_r>g&-DUBWN!+2i6Kfi;zGN#NxCP5x>Z( z;9c%6$?hAAU6Iq)(zFI#8#kbf1US?XDRu74efwhq#saKm0jCZb8-T74I5%?Bu>|mG2tXC!nI9@4<(kQ8hHG!3Y{NKe}mfQ>+xD+Kz*6riK}b{i3TQ-I&8 z9+86F3`_yCz!wg34cMlj4L{0!TeP-d~v(nHZWU@YO1T zs@%ZtBkAkrd15viEPAstdr1B|z=8$n%9Hnc4Zra+(28vaEN{`=c?bh^>N) zXPx`&@L#!{O_CiaL~fat;jGB{Dd&PEbzEc)*kuCHfW~(3>=hBw4>-7dPUK`AYKy8bKf`@sIX2KwuKTbUhxy@c00000NkvXXu0mjf!*JGW literal 0 HcmV?d00001 From 2b94b2f3add1f8a881172d519d94601b2d28dc67 Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sat, 26 Feb 2022 13:04:25 +0000 Subject: [PATCH 4/9] Removing hi-res icons as they mess up the menu on Mac --- .../scenebuilder/app/menubar/check_icon@2x.png | Bin 2082 -> 0 bytes .../app/menubar/download_icon@2x.png | Bin 1987 -> 0 bytes .../scenebuilder/app/menubar/warn_icon@2x.png | Bin 1025 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon@2x.png delete mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/download_icon@2x.png delete mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon@2x.png diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon@2x.png b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/check_icon@2x.png deleted file mode 100644 index 88d4c27ec7906a24eb2694bf3f0d2ce39be15da3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2082 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 From 4d14d8ad0ab97f29ddda0be1eac53cdf40e4ec58 Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 27 Feb 2022 13:40:55 +0000 Subject: [PATCH 5/9] Removes unused icon. --- .../scenebuilder/app/menubar/warn_icon.png | Bin 5598 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon.png diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon.png b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/warn_icon.png deleted file mode 100644 index 7e253464cc4db9ea039c83ac42decebc86d4a551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5598 zcmeHKc{o&U8y`xRP|8w5W2lfZi!ocqF2pb~*;>!coMAAFnaK>wnl^=$uPjNSLMf?C zi}t*frBO<&N}-KH^(y5%Gws*+{?m1R?|;p8oipb=_kI8F`~Kbc^E~I-K=b#~(K6P8 z!C*Q*-X4L_|769bF#)>I92x^)Ftw-zdZ;)MkiZ2(KARH*!o~3d5DrQ?Y#2;>=U_>BnK-ke8aJX|(eqPYh+myJy=do+yZc{pklRumFpiKOljC)Jh z>Ze_Plb+?e7Om)fe>}*B>v8IA*eI z_MnGQc6EE4`{!denI8fy=20Ayj$ZBbGyZt#Ga?yh8r{0XGfsuR&b}hrrfO}RntSu^ z4p_L$E)}OTtKNKp&FPaD3oU$r*!lv5pR@0$eF-_OM`wXTJL{36m z(qNV5Q>=0}H*eAKuo-_PrS-AQMP;yfhRczu9t&AdNw{Sjjusq=*rD^%n@zjmo1?+a zWvzc&v~J8}-|O8kFV7oT{aRiX;H0i;_xEHsZF}n;D|vn&b3G=?4^y>2=#Xn^4rS7{%Dr)@=j3OxN7_*ZNjLAg{~>*$>L)cFSZZqboA|S@U6Iweo%SdxVuBG zMf`Xld-A5u7FK5a#tR~g3&LjgN^J-ZwHx#didEVJT8yceOG;i`O1f6Q^U=XRdVjXq zUQX$2I9pYe-(FvFFXaBRikm%H`gX=VtvMC;lfoSb3c`k#ygak5=lr!%+Y^?AJ$Mp< zoVNFHfh?yfe)QV=69_7Ou z%i@l?hKFY~rK)LHzh7Xg`C!}o#Oe8Oqefq}uj+DflgT5w&&FBBh7xYa9h)d0A7Yr= z=`}2UsBNWvN0(2|DL&KNG`izjaNMEFaaph0Qe4BI%JdAjtjabT&8>TUcpZ@#I@u}6 zHgNgSilj?VrpAs)Lo+f%LJTnt7U+o(BW{MVHOk74~auW*f*7*)a!fo?vH}3TF+T;6i zZ6th)={lBm-L0oJdeJQL(c2fzs7H5&>8?W#N;As_Omh97YsqIuHeJ3M)VIC*(@lp$ zD$U>Ed`*pdg=hQUjkbeRy?g3AiJFIkpB?;fYiG?*d{4)3g`o}HR4Xr%olaB5f3zJl0yOV2YMy;s#Dql|&1@<+I%$LT``Sq&$b&H)PJ4TGHG3HS5y zJ_a6b#fxe~&F|f98Z)YB(cf9|YT4PMqgR)nd0q0>WkX2VEz}#nAE%gbkzY{m_3Qn$oew911cJI+68M@6>hl*x!%)oSX_ zhE=+DttZJct+a>g>r1z8-IKZP@3Ups5Dn?wNvBV}mnEueY}N{Dsm8c;*jnsdpLzRU z8s;otoA*==8p~Z_(iFajOt-Y_IENO4FrL*V{=0 zQ`d$01g>w};H7gC{>I`KxV?*LWNIj7cQ%&wZn$`fQIq~ump#jURadgd7J#Ed^^srG@rK%G#;SPa*WgO@JN7=;B`X^Yzyz`AU zDK>QPteK;ek|fcFvm5T0(MbWuPB^++@F%`e$+-3Y| zxkU+ohD^qb9yAl27^m&{EZ3ZryK67a3N{ciOeK|!8TN&V5~E*r534lNLYihgd^mZU zb>O>`f1OI-S^p_}y^3VF0q21A#1MPyLR6jD4&$RzoFam`kkw_>s7KOzkAq}J`o+k#RNS??-0r3UH z0~9fZ9D$g_=fM@20E53$OhF(ZIs99ETmhB(9iAup$^yg(N(u;27&|nI%SHWcArgDW zK_FiP`bP^99r~C+1%e{}N+A>Uj01UMi=QD_%{Dg;HoxUF<{kRPRwW)-aibiQ9J#I`2CBc(~GuSMzcM=6Wog){s09YfqS% z?-R8r)Z1$Dtclj$zTU^3w7T4#QjbiX)zZ-Frg7QrhD>;3MAXLIU2(TLe@WZ(({G1g ztS%lhR&i*K%4E+=XIsE_<@Cp&jknz?NhqBRPy4V&bk&`WanbEE7}%F;moibsCP(u| z@!90A0dqdeZ4ayuClVW?lf~;`T-nVE#4Zb%8**?NVi)`quZ93^f{X@No$*! zFM3_dK2)x!epMQF$BD+H*y%Tzbod2`!JqdV?dHZ~97T88u0@`&S4Z zrcLtHRqZdy*Vnb)>Qr5Bq3SF*Qq?}U_59}Zbi}NP_TZp9tH*ae`=pZ0+~k^F>@}<) O-^bJ6quOmn+J6CHrK Date: Sun, 27 Feb 2022 14:18:58 +0000 Subject: [PATCH 6/9] Sets the OK image and message by default and only updates the menu item when there is an available update. --- .../app/menubar/MenuBarController.java | 25 +++++++++---------- .../app/i18n/SceneBuilderApp.properties | 1 - .../scenebuilder/app/menubar/MenuBar.fxml | 13 +++++++++- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java index f66912c5c..5961a4a10 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java @@ -1180,19 +1180,18 @@ public String getTitle() { // Modify the Check Updates menu item if there is an update available. // Icons by Font Awesome (https://fontawesome.com/license/free) under CC BY 4.0 License AppSettings.getLatestVersion(latestVersion -> { - var updateAvailable = AppSettings.isUpdateAvailable(); - Image icon = new Image(MenuBarController.class - .getResource(updateAvailable ? "download_icon.png" : "check_icon.png") - .toExternalForm()); - ImageView iconView = new ImageView(icon); - - Platform.runLater(() -> { - checkUpdatesMenuItem.setGraphic(iconView); - checkUpdatesMenuItem.disableProperty().setValue(!updateAvailable); - checkUpdatesMenuItem.setText(updateAvailable - ? I18N.getString("menu.title.check.updates.available") - : I18N.getString("menu.title.check.updates.ok")); - }); + if (AppSettings.isUpdateAvailable()) { + Image icon = new Image(MenuBarController.class + .getResource("download_icon.png") + .toExternalForm()); + ImageView iconView = new ImageView(icon); + + Platform.runLater(() -> { + checkUpdatesMenuItem.setGraphic(iconView); + checkUpdatesMenuItem.disableProperty().setValue(false); + checkUpdatesMenuItem.setText(I18N.getString("menu.title.check.updates.available")); + }); + } }); } diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties index 5b6196ba3..dbf36ddfb 100644 --- a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties +++ b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties @@ -191,7 +191,6 @@ menu.title.no.window = No Window # Help menu items menu.title.scene.builder.help = Scene Builder Help menu.title.show.welcome = Show Welcome Page -menu.title.check.updates = Checking for updates... menu.title.check.updates.available = Update available menu.title.check.updates.ok = All up-to-date! diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml index ad2b92255..5c8c45cfb 100644 --- a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml +++ b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml @@ -41,6 +41,9 @@ + + + @@ -313,7 +316,15 @@ - + + + + + + + + + From d3202ec045d3cab7ed77a6ac44b75a4424fb6640 Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 27 Feb 2022 18:50:03 +0000 Subject: [PATCH 7/9] Removes unused import. --- .../javafx/scenebuilder/app/menubar/MenuBarController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java index 5961a4a10..7be9b38b8 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java @@ -57,7 +57,6 @@ import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collections; From aed8b86515c9f021e6ebdd3d9f326aa793699eba Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 8 May 2022 07:00:01 +0100 Subject: [PATCH 8/9] Replaces stack trace outputs with log messages. --- .../scenebuilder/app/util/AppSettings.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java b/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java index 3c1219e67..52cfd28bc 100644 --- a/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java +++ b/app/src/main/java/com/oracle/javafx/scenebuilder/app/util/AppSettings.java @@ -50,6 +50,8 @@ import java.net.URL; import java.util.Properties; import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.Logger; public class AppSettings { public static final String APP_ICON_16 = SceneBuilderApp.class.getResource("SceneBuilderLogo_16.png").toString(); @@ -82,7 +84,7 @@ private static void initSceneBuiderVersion() { sceneBuilderVersion = sbProps.getProperty("build.version", "UNSET"); } } catch (IOException ex) { - ex.printStackTrace(); + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed to load \"about.propertties\" resource.", ex); } } @@ -128,8 +130,8 @@ public static void getLatestVersion(Consumer consumer) { URL url = null; try { url = new URL(LATEST_VERSION_CHECK_URL); - } catch (MalformedURLException e) { - e.printStackTrace(); + } catch (MalformedURLException ex) { + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed to parse latest version check URL.", ex); } try (InputStream inputStream = url.openStream()) { @@ -137,14 +139,14 @@ public static void getLatestVersion(Consumer consumer) { onlineVersionNumber = prop.getProperty(LATEST_VERSION_NUMBER_PROPERTY); } catch (IOException ex) { - ex.printStackTrace(); + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed retrieve latest version information.", ex); } latestVersion = onlineVersionNumber; try { isUpdateAvailable = isCurrentVersionLowerThan(latestVersion); - } catch (NumberFormatException e) { - e.printStackTrace(); + } catch (NumberFormatException ex) { + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed to load parse latest version number.", ex); } consumer.accept(latestVersion); @@ -170,11 +172,11 @@ private static void updateLatestVersionInfo() { JsonObject announcementObject = object.getJsonObject("announcement"); latestVersionText = announcementObject.getString("text"); latestVersionAnnouncementURL = announcementObject.getString("url"); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException ex) { + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed to retrieve or decode latest version information.", ex); } - } catch (MalformedURLException e) { - e.printStackTrace(); + } catch (MalformedURLException ex) { + Logger.getLogger(AppSettings.class.getName()).log(Level.SEVERE, "Failed to parse latest version information URL", ex); } } From 91c5919c69f261e920925f83745c258861c8a01b Mon Sep 17 00:00:00 2001 From: Paul Court Date: Sun, 8 May 2022 07:18:24 +0100 Subject: [PATCH 9/9] Alternate menu item label when there are no updates. --- .../javafx/scenebuilder/app/i18n/SceneBuilderApp.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties index 7a75127a9..52e0b1794 100644 --- a/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties +++ b/app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties @@ -192,7 +192,7 @@ menu.title.no.window = No Window menu.title.scene.builder.help = Scene Builder Help menu.title.show.welcome = Show Welcome Page menu.title.check.updates.available = Update available -menu.title.check.updates.ok = All up-to-date! +menu.title.check.updates.ok = No updates available menu.title.about = About Scene Builder menu.title.register = Register...