diff --git a/.gitattributes b/.gitattributes
index f829fb6173f..643c9699fc5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -9735,6 +9735,7 @@ src/main/java/forge/view/package-info.java svneol=native#text/plain
src/main/java/forge/view/swing/ApplicationView.java svneol=native#text/plain
src/main/java/forge/view/swing/Main.java svneol=native#text/plain
src/main/java/forge/view/swing/OldGuiNewGame.java svneol=native#text/plain
+src/main/java/forge/view/swing/SplashFrame.java -text
src/main/java/forge/view/swing/package-info.java svneol=native#text/plain
src/main/java/net/slightlymagic/braids/LICENSE.txt svneol=native#text/plain
src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java svneol=native#text/plain
diff --git a/src/main/java/forge/CardReader.java b/src/main/java/forge/CardReader.java
index a6a70827a18..28da5df7e20 100644
--- a/src/main/java/forge/CardReader.java
+++ b/src/main/java/forge/CardReader.java
@@ -1,16 +1,12 @@
package forge;
-import com.google.code.jyield.Generator;
-import com.google.code.jyield.YieldUtils;
-import forge.card.trigger.TriggerHandler;
-import forge.error.ErrorViewer;
-import forge.gui.MultiPhaseProgressMonitorWithETA;
-import forge.properties.NewConstants;
-import net.slightlymagic.braids.util.UtilFunctions;
-import net.slightlymagic.braids.util.generator.FindNonDirectoriesSkipDotDirectoriesGenerator;
-import net.slightlymagic.braids.util.generator.GeneratorFunctions;
-
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.Locale;
@@ -20,6 +16,20 @@ import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
+import net.slightlymagic.braids.util.UtilFunctions;
+import net.slightlymagic.braids.util.generator.FindNonDirectoriesSkipDotDirectoriesGenerator;
+import net.slightlymagic.braids.util.generator.GeneratorFunctions;
+import net.slightlymagic.braids.util.progress_monitor.BraidsProgressMonitor;
+import net.slightlymagic.braids.util.progress_monitor.StderrProgressMonitor;
+
+import com.google.code.jyield.Generator;
+import com.google.code.jyield.YieldUtils;
+
+import forge.card.trigger.TriggerHandler;
+import forge.error.ErrorViewer;
+import forge.properties.NewConstants;
+import forge.view.FView;
+
/**
*
CardReader class.
@@ -165,12 +175,19 @@ public class CardReader implements Runnable, NewConstants {
protected final Card loadCardsUntilYouFind(final String cardName) {
Card result = null;
- MultiPhaseProgressMonitorWithETA monitor;
+ BraidsProgressMonitor monitor = null;
+ final FView view = Singletons.getView();
+ if (view != null) {
+ monitor = view.getCardLoadingProgressMonitor();
+ }
+
+ if (monitor == null) {
+ monitor = new StderrProgressMonitor(1, 0L);
+ }
+
if (zip != null) {
- monitor = new MultiPhaseProgressMonitorWithETA("Forge - Loading card database from zip file", 1,
- estimatedFilesRemaining, 1.0f);
-
+ monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
ZipEntry entry;
// zipEnum was initialized in the constructor.
@@ -197,8 +214,7 @@ public class CardReader implements Runnable, NewConstants {
findNonDirsIterable = YieldUtils.toIterable(findNonDirsGen);
}
- monitor = new MultiPhaseProgressMonitorWithETA("Forge - Loading card database from files", 1,
- estimatedFilesRemaining, 1.0f);
+ monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
for (File cardTxtFile : findNonDirsIterable) {
if (!cardTxtFile.getName().endsWith(".txt")) {
diff --git a/src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java b/src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java
index 2b31112c7e5..ba9d0d3b4ed 100644
--- a/src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java
+++ b/src/main/java/forge/gui/MultiPhaseProgressMonitorWithETA.java
@@ -1,9 +1,14 @@
package forge.gui;
+import java.lang.reflect.InvocationTargetException;
+
import javax.swing.JDialog;
import javax.swing.JProgressBar;
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
import forge.Gui_ProgressBarWindow;
+import net.slightlymagic.braids.util.UtilFunctions;
import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor;
/**
@@ -32,7 +37,11 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
}
/**
* Create a GUI progress monitor and open its first dialog.
- *
+ *
+ * Like all swing components, this constructor must be invoked from the
+ * swing Event Dispatching Thread. The rest of the methods of this class
+ * are exempt from this requirement.
+ *
* @param title the title to give the dialog box(es)
*
* @param numPhases the total number of phases to expect
@@ -51,108 +60,150 @@ public class MultiPhaseProgressMonitorWithETA extends BaseProgressMonitor {
long totalUnitsFirstPhase, float minUIUpdateIntervalSec,
float[] phaseWeights)
{
- super(numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec,
+ super(numPhases, totalUnitsFirstPhase, minUIUpdateIntervalSec,
phaseWeights);
-
+
+ if (!SwingUtilities.isEventDispatchThread()) {
+ throw new IllegalStateException("must be called from within an event dispatch thread");
+ }
+
this.title = title;
+
+ if (totalUnitsFirstPhase > 0 && dialog == null) {
+ throw new IllegalStateException("dialog is null");
+ }
}
-
- /**
+
+ /**
* For developer testing.
+ *
+ * @param args ignored
*/
- public static void main(String[] args) {
+ public static void main(final String[] args) {
System.out.println("Initializing...");
- MultiPhaseProgressMonitorWithETA monitor =
- new MultiPhaseProgressMonitorWithETA("Testing 2 phases", 2, 5000,
- 1.0f, null);
-
- System.out.println("Running...");
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
- for (int i = 0; i <= 5000; i++) {
- monitor.incrementUnitsCompletedThisPhase(1);
-
- System.out.print("\ri = " + i);
-
- try {
- Thread.sleep(1);
- } catch (InterruptedException ignored) {
- ;
- }
- }
- System.out.println();
-
- monitor.markCurrentPhaseAsComplete(2000);
+ final int totalUnitsFirstPhase = 5000;
+ final MultiPhaseProgressMonitorWithETA monitor =
+ new MultiPhaseProgressMonitorWithETA("Testing 2 phases", 2, totalUnitsFirstPhase, 1.0f,
+ new float[] {2, 1});
- for (int i = 0; i <= 2000; i++) {
- monitor.incrementUnitsCompletedThisPhase(1);
-
- System.out.print("\ri = " + i);
-
- try {
- Thread.sleep(1);
- } catch (InterruptedException ignored) {
- ;
- }
- }
-
- monitor.markCurrentPhaseAsComplete(0);
+ SwingWorker