diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index c939db65f..875024899 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -33,13 +33,12 @@ import com.seibel.distanthorizons.core.config.types.enums.*; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhSectionPos; +import com.seibel.distanthorizons.core.util.NativeDialogUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLogger; -import org.lwjgl.util.tinyfd.TinyFileDialogs; -import java.awt.*; import java.io.File; import java.util.*; import java.util.List; @@ -1248,23 +1247,17 @@ public class Config .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently .build(); - public static ConfigUIButton uiButtonTest = new ConfigUIButton(() -> + public static ConfigUIButton uiButtonTest = new ConfigUIButton(() -> { // running on a separate thread is necessary to prevent locking - new Thread(() -> - { - if (!GraphicsEnvironment.isHeadless()) - { - LOGGER.info("Attempting to show tinyfd message box..."); - boolean buttonPress = TinyFileDialogs.tinyfd_messageBox("Button pressed!", "UITester dialog", "ok", "info", false); - LOGGER.info("dialog returned with ["+(buttonPress ? "TRUE" : "FALSE")+"]"); - } - else - { - LOGGER.info("button pressed!"); - } - }).start(); + new Thread(() -> onButtonPressed()).start(); }); + public static void onButtonPressed() + { + LOGGER.info("Attempting to show tinyfd message box..."); + boolean buttonPress = NativeDialogUtil.showDialog("Button pressed!", "UITester dialog", "ok", "info"); + LOGGER.info("dialog returned with ["+(buttonPress ? "TRUE" : "FALSE")+"]"); + } public static ConfigCategory categoryTest = new ConfigCategory.Builder().set(CategoryTest.class).build(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/JarMain.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/JarMain.java index 982d0b073..c2769b373 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/JarMain.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/JarMain.java @@ -23,6 +23,7 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO; import com.seibel.distanthorizons.core.sql.repo.FullDataSourceV2Repo; +import com.seibel.distanthorizons.core.util.NativeDialogUtil; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.jar.gui.BaseJFrame; import com.seibel.distanthorizons.core.jar.gui.cusomJObject.JBox; @@ -31,7 +32,6 @@ import com.seibel.distanthorizons.core.jar.installer.WebDownloader; import org.apache.logging.log4j.LogManager; import com.seibel.distanthorizons.core.logging.DhLogger; import org.apache.logging.log4j.core.LoggerContext; -import org.lwjgl.util.tinyfd.TinyFileDialogs; import javax.swing.*; import java.awt.*; @@ -441,7 +441,7 @@ public class JarMain installMod.addActionListener(e -> { if (minecraftDirPop.getSelectedFile() == null) { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, "Please select your install directory", "ok", "warning", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, "Please select your install directory", "ok", "warning"); return; } @@ -455,11 +455,11 @@ public class JarMain ModInfo.NAME + "-" + ModrinthGetter.releaseNames.get(downloadID.get()) + ".jar" ).toFile()); - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, "Installation done. \nYou can now close the installer", "ok", "info", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, "Installation done. \nYou can now close the installer", "ok", "info"); } catch (Exception f) { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, "Download failed. Check your internet connection \nStacktrace: " + f.getMessage(), "error", "info", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, "Download failed. Check your internet connection \nStacktrace: " + f.getMessage(), "error", "info"); } }); frame.add(installMod); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java index e56a08f5a..96b3bf205 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java @@ -29,12 +29,12 @@ import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter; import com.seibel.distanthorizons.core.jar.installer.WebDownloader; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; +import com.seibel.distanthorizons.core.util.NativeDialogUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.coreapi.util.StringUtil; import com.seibel.distanthorizons.coreapi.util.jar.DeleteOnUnlock; import com.seibel.distanthorizons.core.logging.DhLogger; -import org.lwjgl.util.tinyfd.TinyFileDialogs; import javax.swing.*; import java.awt.*; @@ -258,14 +258,13 @@ public class SelfUpdater deleteOldJarOnJvmShutdown = true; - // TODO one of these messages contains something TinyFd doesn't like, find it and fix it - String successMessage = "Distant Horizons successfully updated. It will apply on game's relaunch"; + String successMessage = "Distant Horizons successfully updated. It will apply on game`s relaunch"; LOGGER.info(successMessage); new Thread(() -> { try { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, successMessage, "ok", "info", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, successMessage, "ok", "info"); } catch (Exception ignore) { } }).start(); @@ -288,7 +287,7 @@ public class SelfUpdater LOGGER.error(failMessage, e); try { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, failMessage, "ok", "error", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, failMessage, "ok", "error"); } catch (Exception ignore) { } @@ -386,7 +385,7 @@ public class SelfUpdater { try { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, successMessage, "ok", "info", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, successMessage, "ok", "info"); } catch (Exception ignore) { } }).start(); @@ -424,7 +423,7 @@ public class SelfUpdater LOGGER.error(failMessage, e); try { - TinyFileDialogs.tinyfd_messageBox(ModInfo.READABLE_NAME, failMessage, "ok", "error", false); + NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, failMessage, "ok", "error"); } catch (Exception ignore) { } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/NativeDialogUtil.java b/core/src/main/java/com/seibel/distanthorizons/core/util/NativeDialogUtil.java new file mode 100644 index 000000000..d29db9e09 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/NativeDialogUtil.java @@ -0,0 +1,30 @@ +package com.seibel.distanthorizons.core.util; + +import org.lwjgl.util.tinyfd.TinyFileDialogs; + +/** + * Should be used instead of the direct call to {@link TinyFileDialogs} + * so we can run additional validation and/or string cleanup. + * Otherwise, we may get error messages back. + * + * @see TinyFileDialogs + */ +public class NativeDialogUtil +{ + /** + * @param dialogType the dialog type. One of:
"ok""okcancel""yesno""yesnocancel"
+ * @param iconType the icon type. One of:
"info""warning""error""question"
+ */ + public static boolean showDialog(String title, String message, String dialogType, String iconType) + { + // Tinyfd doesn't support the following characters, attempting to display them will cause the message + // to be replaced with an error message + String unsafeCharsRegex = "['\"`]"; + + title = title.replaceAll(unsafeCharsRegex, "`"); + message = message.replaceAll(unsafeCharsRegex, "`"); + + return TinyFileDialogs.tinyfd_messageBox(title, message, dialogType, iconType, false); + } + +}