From bad782244fe680a9e1050d6c821c7a01819e880d Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 11 Oct 2024 16:38:46 +0400 Subject: [PATCH] GUI: added new error dialog for more use cases --- .../src/main/java/mage/client/MageFrame.java | 1 + .../mage/client/util/EDTExceptionHandler.java | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 1c6d6b01218..376f7c40bf6 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -1578,6 +1578,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { // FIRST GUI CALL (create main window with all prepared frames, dialogs, etc) try { instance = new MageFrame(); + EDTExceptionHandler.registerMainApp(instance); } catch (Throwable e) { LOGGER.fatal("Critical error on start up, app will be closed: " + e.getMessage(), e); System.exit(1); diff --git a/Mage.Client/src/main/java/mage/client/util/EDTExceptionHandler.java b/Mage.Client/src/main/java/mage/client/util/EDTExceptionHandler.java index fb7e198f0c0..00f58a4c550 100644 --- a/Mage.Client/src/main/java/mage/client/util/EDTExceptionHandler.java +++ b/Mage.Client/src/main/java/mage/client/util/EDTExceptionHandler.java @@ -1,17 +1,23 @@ - - package mage.client.util; +import mage.client.MageFrame; import org.apache.log4j.Logger; +import java.util.HashMap; +import java.util.Map; + /** + * GUI helper class - catch all app's unhandled errors * - * @author BetaSteward_at_googlemail.com + * @author BetaSteward_at_googlemail.com, JayDi85 */ public class EDTExceptionHandler implements Thread.UncaughtExceptionHandler { private static final Logger logger = Logger.getLogger(EDTExceptionHandler.class); + private static final Map foundErrors = new HashMap<>(); + private static MageFrame mainApp = null; // app to show error dialogs + @Override public void uncaughtException(Thread t, Throwable e) { handle(e); @@ -20,8 +26,18 @@ public class EDTExceptionHandler implements Thread.UncaughtExceptionHandler { public void handle(Throwable throwable) { try { logger.fatal("MAGE Client UI error", throwable); - // JOptionPane.showMessageDialog(MageFrame.getDesktop(), throwable, "MAGE Client UI error", JOptionPane.ERROR_MESSAGE); - } catch (Throwable t) {} + + // show error dialog for better users feedback about client side errors + // with some protection from dialogs spam on screen (e.g. on render/graphic errors) + String errorKey = throwable.toString(); + int foundCount = foundErrors.getOrDefault(errorKey, 0); + if (foundCount < 5 && mainApp != null) { + mainApp.showErrorDialog("CLIENT - unhandled error in GUI", throwable); + foundCount++; + } + foundErrors.put(errorKey, foundCount++); + } catch (Throwable ignore) { + } } public static void registerExceptionHandler() { @@ -29,4 +45,8 @@ public class EDTExceptionHandler implements Thread.UncaughtExceptionHandler { System.setProperty("sun.awt.exception.handler", EDTExceptionHandler.class.getName()); } + public static void registerMainApp(MageFrame app) { + mainApp = app; + } + }