From b0c154881683d6d5cb25569db32037c35498facb Mon Sep 17 00:00:00 2001 From: Juuz Date: Wed, 20 Aug 2025 20:13:18 +0300 Subject: Support multiple input jars (#553) * Support multiple input jars This is needed for FabricMC/fabric-loom#1354. * Remove unnecessary null check in GuiController.reloadAll * Remove outdated TODO--- .../src/main/java/cuchaz/enigma/gui/Gui.java | 1 + .../main/java/cuchaz/enigma/gui/GuiController.java | 26 +++++++++++++--------- .../src/main/java/cuchaz/enigma/gui/Main.java | 6 ++--- .../java/cuchaz/enigma/gui/elements/MenuBar.java | 11 ++++----- 4 files changed, 26 insertions(+), 18 deletions(-) (limited to 'enigma-swing/src/main/java') diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java index 05146d4..21120b8 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java @@ -147,6 +147,7 @@ public class Gui { private void setupUi() { this.jarFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + this.jarFileChooser.setMultiSelectionEnabled(true); this.exportSourceFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); this.exportSourceFileChooser.setAcceptAllFileFilterUsed(false); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index ad10abf..ece11b0 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -23,6 +23,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.swing.JOptionPane; @@ -119,20 +120,27 @@ public class GuiController implements ClientPacketHandler { return project != null && project.getMapper().isDirty(); } - public CompletableFuture openJar(final Path jarPath) { + public CompletableFuture openJar(final List jarPaths) { this.gui.onStartOpenJar(); return ProgressDialog.runOffThread(gui.getFrame(), progress -> { - project = enigma.openJar(jarPath, new ClasspathClassProvider(), progress); + project = enigma.openJars(jarPaths, new ClasspathClassProvider(), progress); indexTreeBuilder = new IndexTreeBuilder(project.getJarIndex()); chp = new ClassHandleProvider(project, UiConfig.getDecompiler().service); SwingUtilities.invokeLater(() -> { - gui.onFinishOpenJar(jarPath.getFileName().toString()); + gui.onFinishOpenJar(getFileNames(jarPaths)); refreshClasses(); }); }); } + private static String getFileNames(List jarPaths) { + return jarPaths.stream() + .map(Path::getFileName) + .map(Object::toString) + .collect(Collectors.joining(", ")); + } + public void closeJar() { this.chp.destroy(); this.chp = null; @@ -241,17 +249,15 @@ public class GuiController implements ClientPacketHandler { } public void reloadAll() { - Path jarPath = this.project.getJarPath(); + List jarPaths = this.project.getJarPaths(); MappingFormat loadedMappingFormat = this.loadedMappingFormat; Path loadedMappingPath = this.loadedMappingPath; - if (jarPath != null) { - this.closeJar(); - CompletableFuture f = this.openJar(jarPath); + this.closeJar(); + CompletableFuture f = this.openJar(jarPaths); - if (loadedMappingFormat != null && loadedMappingPath != null) { - f.whenComplete((v, t) -> this.openMappings(loadedMappingFormat, loadedMappingPath)); - } + if (loadedMappingFormat != null && loadedMappingPath != null) { + f.whenComplete((v, t) -> this.openMappings(loadedMappingFormat, loadedMappingPath)); } } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java index 213a5fe..43b16cd 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java @@ -38,7 +38,7 @@ public class Main { public static void main(String[] args) throws IOException { OptionParser parser = new OptionParser(); - OptionSpec jar = parser.accepts("jar", "Jar file to open at startup").withRequiredArg().withValuesConvertedBy(PathConverter.INSTANCE); + OptionSpec jar = parser.accepts("jar", "Jar file to open at startup; if there are multiple jars, the order must be the same between all collab session members").withRequiredArg().withValuesConvertedBy(PathConverter.INSTANCE); OptionSpec mappings = parser.accepts("mappings", "Mappings file to open at startup").withRequiredArg().withValuesConvertedBy(PathConverter.INSTANCE); @@ -137,8 +137,8 @@ public class Main { } if (options.has(jar)) { - Path jarPath = options.valueOf(jar); - controller.openJar(jarPath).whenComplete((v, t) -> { + List jarPaths = options.valuesOf(jar); + controller.openJar(jarPaths).whenComplete((v, t) -> { if (options.has(mappings)) { Path mappingsPath = options.valueOf(mappings); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index d7054f7..78050bb 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; @@ -235,15 +236,15 @@ public class MenuBar { return; } - File file = d.getSelectedFile(); + File[] files = d.getSelectedFiles(); // checks if the file name is not empty - if (file != null) { - Path path = file.toPath(); + if (files.length >= 1) { + List paths = Arrays.stream(files).map(File::toPath).toList(); // checks if the file name corresponds to an existing file - if (Files.exists(path)) { - this.gui.getController().openJar(path); + if (paths.stream().allMatch(Files::exists)) { + this.gui.getController().openJar(paths); } UiConfig.setLastSelectedDir(d.getCurrentDirectory().getAbsolutePath()); -- cgit v1.2.3