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);
+ }
+
+}