diff --git a/jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileChooser.java b/jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileChooser.java index 0b7c8da49..29e915976 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileChooser.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileChooser.java @@ -13,7 +13,6 @@ import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.UIManager; -import javax.swing.filechooser.FileNameExtensionFilter; import jadx.api.plugins.utils.CommonFileUtils; import jadx.core.utils.Utils; @@ -44,7 +43,7 @@ class CustomFileChooser extends JFileChooser { List fileExtList = data.getFileExtList(); if (Utils.notEmpty(fileExtList)) { String description = NLS.str("file_dialog.supported_files") + ": (" + Utils.listToString(fileExtList) + ')'; - setFileFilter(new FileNameExtensionFilter(description, fileExtList.toArray(new String[0]))); + setFileFilter(new FileNameMultiExtensionFilter(description, fileExtList.toArray(new String[0]))); } if (data.getSelectedFile() != null) { setSelectedFile(data.getSelectedFile().toFile()); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileNameMultiExtensionFilter.java b/jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileNameMultiExtensionFilter.java new file mode 100644 index 000000000..1f5d0904d --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileNameMultiExtensionFilter.java @@ -0,0 +1,42 @@ +package jadx.gui.ui.filedialog; + +import java.io.File; + +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; + +/** + * Custom file filter for filtering files with multiple extensions. + * It overcomes the limitation of {@link FileNameExtensionFilter}, + * which treats only the last file extension split by dots as the + * file extension, and does not support multiple extensions such as + * {@code .jadx.kts}. + */ +class FileNameMultiExtensionFilter extends FileFilter { + private final FileNameExtensionFilter delegate; + private final String[] extensions; + + public FileNameMultiExtensionFilter(String description, String... extensions) { + this.delegate = new FileNameExtensionFilter(description, extensions[0]); + this.extensions = extensions; + } + + @Override + public boolean accept(File file) { + if (file.isDirectory()) { + return true; + } + String fileName = file.getName(); + for (String extension : extensions) { + if (fileName.endsWith(extension)) { + return true; + } + } + return false; + } + + @Override + public String getDescription() { + return delegate.getDescription(); + } +}