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 16224e051dc..111c44a5785 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 @@ -1,19 +1,29 @@ package jadx.gui.ui.filedialog; import java.awt.Component; +import java.awt.Container; import java.awt.HeadlessException; +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.nio.file.Path; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import javax.swing.AbstractAction; +import javax.swing.Action; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.UIManager; +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; import jadx.api.plugins.utils.CommonFileUtils; import jadx.core.utils.StringUtils; @@ -55,6 +65,9 @@ public List showDialog() { if (data.getSelectedFile() != null) { setSelectedFile(data.getSelectedFile().toFile()); } + if (data.isOpen()) { + installFileListPasteAction(this); + } MainWindow mainWindow = data.getMainWindow(); int ret = data.isOpen() ? showOpenDialog(mainWindow) : showSaveDialog(mainWindow); if (ret != JFileChooser.APPROVE_OPTION) { @@ -107,4 +120,50 @@ public void approveSelection() { } super.approveSelection(); } + + private void installFileListPasteAction(Component component) { + if (component instanceof JTextComponent) { + JTextComponent textComponent = (JTextComponent) component; + Action defaultPasteAction = textComponent.getActionMap().get(DefaultEditorKit.pasteAction); + textComponent.getActionMap().put(DefaultEditorKit.pasteAction, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (!pasteFileListFromClipboard(textComponent)) { + if (defaultPasteAction != null) { + defaultPasteAction.actionPerformed(e); + } else { + textComponent.paste(); + } + } + } + }); + } + if (component instanceof Container) { + for (Component child : ((Container) component).getComponents()) { + installFileListPasteAction(child); + } + } + } + + private boolean pasteFileListFromClipboard(JTextComponent textComponent) { + try { + Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); + if (contents == null || !contents.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + return false; + } + @SuppressWarnings("unchecked") + List clipboardFiles = (List) contents.getTransferData(DataFlavor.javaFileListFlavor); + String paths = clipboardFiles.stream() + .filter(Objects::nonNull) + .map(file -> '"' + file.getAbsolutePath() + '"') + .collect(Collectors.joining(" ")); + if (paths.isEmpty()) { + return false; + } + textComponent.replaceSelection(paths); + return true; + } catch (Exception e) { + return false; + } + } }