diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index a5e4be097b0..a6caef25fbb 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -43,9 +43,10 @@ public class FThreads { * @param methodName   String, part of the custom exception message. * @param mustBeEDT   boolean: true = exception if not EDT, false = exception if EDT */ - public static void checkEDT(final String methodName, final boolean mustBeEDT) { - boolean isEDT = SwingUtilities.isEventDispatchThread(); - if ( isEDT != mustBeEDT ) { + public static void assertExecutedByEdt(final boolean mustBeEDT) { + if (isEDT() != mustBeEDT ) { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + final String methodName = trace[2].getClassName() + "." + trace[2].getMethodName(); String modalOperator = mustBeEDT ? " must be" : " may not be"; throw new IllegalStateException( methodName + modalOperator + " accessed from the event dispatch thread."); } diff --git a/src/main/java/forge/control/input/InputSyncronizedBase.java b/src/main/java/forge/control/input/InputSyncronizedBase.java index 7d3f1928c51..c5af9545825 100644 --- a/src/main/java/forge/control/input/InputSyncronizedBase.java +++ b/src/main/java/forge/control/input/InputSyncronizedBase.java @@ -17,7 +17,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } public void awaitLatchRelease() { - FThreads.checkEDT("InputSyncronizedBase.awaitLatchRelease", false); + FThreads.assertExecutedByEdt(false); try{ cdlDone.await(); } catch (InterruptedException e) { diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 4b2ca17178f..dba3c591552 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -709,7 +709,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { *

*/ public final void passPriority() { - FThreads.checkEDT("PhaseHandler.passPriority", false); + FThreads.assertExecutedByEdt(false); // stop game if it's outcome is clear if (game.isGameOver()) { return; diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index 11a0651574b..2f7444bdcf4 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -102,7 +102,7 @@ public class HumanPlayer extends Player { * a {@link forge.card.spellability.SpellAbility} object. */ public final void playSpellAbility(SpellAbility sa) { - FThreads.checkEDT("Player.playSpellAbility", false); + FThreads.assertExecutedByEdt(false); sa.setActivatingPlayer(this); final Card source = sa.getSourceCard(); @@ -253,7 +253,7 @@ public class HumanPlayer extends Player { * a {@link forge.card.spellability.SpellAbility} object. */ public final void playSpellAbilityWithoutPayingManaCost(final SpellAbility sa) { - FThreads.checkEDT("GameActionPlay.playSpellAbilityWithoutPayingManaCost", false); + FThreads.assertExecutedByEdt(false); final Card source = sa.getSourceCard(); source.setSplitStateToPlayAbility(sa); diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 29b0cbef43b..1c52e4d8898 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -1580,7 +1580,7 @@ public abstract class Player extends GameEntity implements Comparable { * @return a {@link forge.CardList} object. */ public final boolean discard(final Card c, final SpellAbility sa) { - FThreads.checkEDT("Player.doDiscard", false); + FThreads.assertExecutedByEdt(false); // TODO: This line should be moved inside CostPayment somehow /*if (sa != null) { sa.addCostToHashList(c, "Discarded"); @@ -1746,7 +1746,7 @@ public abstract class Player extends GameEntity implements Comparable { * a {@link forge.Card} object. */ public final void playLand(final Card land) { - FThreads.checkEDT("Player.playSpellAbility", false); + FThreads.assertExecutedByEdt(false); if (this.canPlayLand(land)) { land.setController(this, 0); game.getAction().moveTo(this.getZone(ZoneType.Battlefield), land); diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index b469895b9be..9bc6e3ea990 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -301,7 +301,7 @@ public class MagicStack extends MyObservable { * a {@link forge.card.spellability.SpellAbility} object. */ public final void add(final SpellAbility sp) { - FThreads.checkEDT("MagicStack.add", false); + FThreads.assertExecutedByEdt(false); final ArrayList chosenTargets = sp.getAllTargetChoices(); if (sp.isManaAbility()) { // Mana Abilities go straight through diff --git a/src/main/java/forge/gui/ListChooser.java b/src/main/java/forge/gui/ListChooser.java index aa25d450207..a576157b1e3 100644 --- a/src/main/java/forge/gui/ListChooser.java +++ b/src/main/java/forge/gui/ListChooser.java @@ -42,6 +42,8 @@ import javax.swing.event.ListSelectionListener; import com.google.common.collect.Lists; +import forge.FThreads; + /** * A simple class that shows a list of choices in a dialog. Two properties * influence the behavior of a list chooser: minSelection and maxSelection. @@ -84,6 +86,7 @@ public class ListChooser { private Action ok, cancel; public ListChooser(final String title, final int minChoices, final int maxChoices, final Collection list) { + FThreads.assertExecutedByEdt(true); this.title = title; this.minChoices = minChoices; this.maxChoices = maxChoices; diff --git a/src/main/java/forge/gui/toolbox/FProgressBar.java b/src/main/java/forge/gui/toolbox/FProgressBar.java index 22015d5d7e0..29703037be9 100644 --- a/src/main/java/forge/gui/toolbox/FProgressBar.java +++ b/src/main/java/forge/gui/toolbox/FProgressBar.java @@ -37,7 +37,7 @@ public class FProgressBar extends JProgressBar { * @param s0   A description to prepend before statistics. */ public void setDescription(final String s0) { - FThreads.checkEDT("FProgressBar$setDescription", true); + FThreads.assertExecutedByEdt(true); this.desc = s0; this.setString(s0); } @@ -77,7 +77,7 @@ public class FProgressBar extends JProgressBar { /** Resets the various values required for this class. Must be called from EDT. */ public void reset() { - FThreads.checkEDT("FProgressBar$reset", true); + FThreads.assertExecutedByEdt(true); this.setIndeterminate(true); this.setValue(0); this.tempVal = 0; diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index 50c3273e930..9f015cc0db7 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -420,7 +420,7 @@ public enum FSkin { */ public static void loadLight(final String skinName) { // No need for this method to be loaded while on the EDT. - FThreads.checkEDT("FSkin$constructor", false); + FThreads.assertExecutedByEdt(false); // Non-default (preferred) skin name and dir. FSkin.preferredName = skinName.toLowerCase().replace(' ', '_'); @@ -500,7 +500,7 @@ public enum FSkin { */ public static void loadFull() { // No need for this method to be loaded while on the EDT. - FThreads.checkEDT("FSkin$load", false); + FThreads.assertExecutedByEdt(false); // Preferred skin name must be called via loadLight() method, // which does some cleanup and init work. diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index 9f381e38fc2..1c44eace1e8 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -162,7 +162,7 @@ public enum FModel { this.loadDynamicGamedata(); // Loads all cards (using progress bar). - FThreads.checkEDT("CardFactory$constructor", false); + FThreads.assertExecutedByEdt(false); final CardStorageReader reader = new CardStorageReader(NewConstants.CARD_DATA_DIR, true); try { // this fills in our map of card names to Card instances.