From e9f9f8f29f2504bb750ea0af11840c1aa746b476 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Wed, 19 Jun 2019 20:28:01 +0200 Subject: Only open mappings once jar is loaded --- src/main/java/cuchaz/enigma/Main.java | 21 +++++------ src/main/java/cuchaz/enigma/gui/GuiController.java | 41 +++++++++++----------- .../cuchaz/enigma/gui/dialog/ProgressDialog.java | 7 +++- 3 files changed, 37 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/main/java/cuchaz/enigma/Main.java b/src/main/java/cuchaz/enigma/Main.java index 1f2cb84f..b7789463 100644 --- a/src/main/java/cuchaz/enigma/Main.java +++ b/src/main/java/cuchaz/enigma/Main.java @@ -62,16 +62,17 @@ public class Main { if (options.has(jar)) { Path jarPath = options.valueOf(jar); - controller.openJar(jarPath); - } - - if (options.has(mappings)) { - Path mappingsPath = options.valueOf(mappings); - if (Files.isDirectory(mappingsPath)) { - controller.openMappings(MappingFormat.ENIGMA_DIRECTORY, mappingsPath); - } else { - controller.openMappings(MappingFormat.ENIGMA_FILE, mappingsPath); - } + controller.openJar(jarPath) + .whenComplete((v, t) -> { + if (options.has(mappings)) { + Path mappingsPath = options.valueOf(mappings); + if (Files.isDirectory(mappingsPath)) { + controller.openMappings(MappingFormat.ENIGMA_DIRECTORY, mappingsPath); + } else { + controller.openMappings(MappingFormat.ENIGMA_FILE, mappingsPath); + } + } + }); } } catch (OptionException e) { System.out.println("Invalid arguments: " + e.getMessage()); diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 209b5d1a..092a07ed 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -42,6 +42,7 @@ import java.nio.file.Path; import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -78,10 +79,10 @@ public class GuiController { return project != null && project.getMapper().isDirty(); } - public void openJar(final Path jarPath) { + public CompletableFuture openJar(final Path jarPath) { this.gui.onStartOpenJar(); - ProgressDialog.runOffThread(gui.getFrame(), progress -> { + return ProgressDialog.runOffThread(gui.getFrame(), progress -> { project = enigma.openJar(jarPath, progress); indexTreeBuilder = new IndexTreeBuilder(project.getJarIndex()); @@ -101,12 +102,12 @@ public class GuiController { this.gui.onCloseJar(); } - public void openMappings(MappingFormat format, Path path) { - if (project == null) return; + public CompletableFuture openMappings(MappingFormat format, Path path) { + if (project == null) return CompletableFuture.completedFuture(null); gui.setMappingsFile(path); - ProgressDialog.runOffThread(gui.getFrame(), progress -> { + return ProgressDialog.runOffThread(gui.getFrame(), progress -> { try { EntryTree mappings = format.read(path, progress); project.setMappings(mappings); @@ -122,16 +123,14 @@ public class GuiController { }); } - public void saveMappings(Path path) { - if (project == null) return; - - saveMappings(path, loadedMappingFormat); + public CompletableFuture saveMappings(Path path) { + return saveMappings(path, loadedMappingFormat); } - public void saveMappings(Path path, MappingFormat format) { - if (project == null) return; + public CompletableFuture saveMappings(Path path, MappingFormat format) { + if (project == null) return CompletableFuture.completedFuture(null); - ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { + return ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { EntryRemapper mapper = project.getMapper(); MappingDelta delta = mapper.takeMappingDelta(); @@ -158,16 +157,16 @@ public class GuiController { refreshCurrentClass(); } - public void dropMappings() { - if (project == null) return; + public CompletableFuture dropMappings() { + if (project == null) return CompletableFuture.completedFuture(null); - ProgressDialog.runOffThread(this.gui.getFrame(), progress -> project.dropMappings(progress)); + return ProgressDialog.runOffThread(this.gui.getFrame(), progress -> project.dropMappings(progress)); } - public void exportSource(final Path path) { - if (project == null) return; + public CompletableFuture exportSource(final Path path) { + if (project == null) return CompletableFuture.completedFuture(null); - ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { + return ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { EnigmaProject.JarExport jar = project.exportRemappedJar(progress); EnigmaProject.SourceExport source = jar.decompile(progress); @@ -175,10 +174,10 @@ public class GuiController { }); } - public void exportJar(final Path path) { - if (project == null) return; + public CompletableFuture exportJar(final Path path) { + if (project == null) return CompletableFuture.completedFuture(null); - ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { + return ProgressDialog.runOffThread(this.gui.getFrame(), progress -> { EnigmaProject.JarExport jar = project.exportRemappedJar(progress); jar.write(path, progress); }); diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java index c135d033..cf5c2c86 100644 --- a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java +++ b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java @@ -17,6 +17,7 @@ import cuchaz.enigma.utils.Utils; import javax.swing.*; import java.awt.*; +import java.util.concurrent.CompletableFuture; public class ProgressDialog implements ProgressListener, AutoCloseable { @@ -57,15 +58,19 @@ public class ProgressDialog implements ProgressListener, AutoCloseable { this.frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); } - public static void runOffThread(final JFrame parent, final ProgressRunnable runnable) { + public static CompletableFuture runOffThread(final JFrame parent, final ProgressRunnable runnable) { + CompletableFuture future = new CompletableFuture<>(); new Thread(() -> { try (ProgressDialog progress = new ProgressDialog(parent)) { runnable.run(progress); + future.complete(null); } catch (Exception ex) { + future.completeExceptionally(ex); throw new Error(ex); } }).start(); + return future; } @Override -- cgit v1.2.3