CustomFileChooser.java 3.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package jadx.gui.ui.filedialog;

import java.awt.Component;
import java.awt.HeadlessException;
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 javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
15
import javax.swing.UIManager;
16 17 18 19 20 21 22 23 24 25
import javax.swing.filechooser.FileNameExtensionFilter;

import jadx.api.plugins.utils.CommonFileUtils;
import jadx.core.utils.Utils;
import jadx.core.utils.files.FileUtils;
import jadx.gui.ui.MainWindow;
import jadx.gui.utils.NLS;

class CustomFileChooser extends JFileChooser {

26 27 28 29 30
	static {
		// disable left shortcut panel, can crush in "Win32ShellFolderManager2.getNetwork()" or similar call
		UIManager.put("FileChooser.noPlacesBar", Boolean.TRUE);
	}

31 32 33 34
	private final FileDialogWrapper data;

	public CustomFileChooser(FileDialogWrapper data) {
		super(data.getCurrentDir() == null ? CommonFileUtils.CWD : data.getCurrentDir().toFile());
35
		putClientProperty("FileChooser.useShellFolder", Boolean.FALSE);
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
		this.data = data;
	}

	public List<Path> showDialog() {
		setToolTipText(data.getTitle());
		setFileSelectionMode(data.getSelectionMode());
		setMultiSelectionEnabled(data.isOpen());
		setAcceptAllFileFilterUsed(true);
		List<String> 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])));
		}
		if (data.getSelectedFile() != null) {
			setSelectedFile(data.getSelectedFile().toFile());
		}
		MainWindow mainWindow = data.getMainWindow();
		int ret = data.isOpen() ? showOpenDialog(mainWindow) : showSaveDialog(mainWindow);
		if (ret != JFileChooser.APPROVE_OPTION) {
			return Collections.emptyList();
		}
		data.setCurrentDir(getCurrentDirectory().toPath());
		File[] selectedFiles = getSelectedFiles();
		if (selectedFiles.length != 0) {
			return FileUtils.toPaths(selectedFiles);
		}
		File chosenFile = getSelectedFile();
		if (chosenFile != null) {
			return Collections.singletonList(chosenFile.toPath());
		}
		return Collections.emptyList();
	}

	@Override
	protected JDialog createDialog(Component parent) throws HeadlessException {
		JDialog dialog = super.createDialog(parent);
		dialog.setTitle(data.getTitle());
		dialog.setLocationRelativeTo(null);
		data.getMainWindow().getSettings().loadWindowPos(dialog);
		dialog.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosed(WindowEvent e) {
				data.getMainWindow().getSettings().saveWindowPos(dialog);
				super.windowClosed(e);
			}
		});
		return dialog;
	}

	@Override
	public void approveSelection() {
		if (data.getSelectionMode() == FILES_AND_DIRECTORIES) {
			File currentFile = getSelectedFile();
			if (currentFile.isDirectory()) {
				int option = JOptionPane.showConfirmDialog(
						data.getMainWindow(),
						NLS.str("file_dialog.load_dir_confirm") + "\n " + currentFile,
						NLS.str("file_dialog.load_dir_title"),
						JOptionPane.YES_NO_OPTION);
				if (option != JOptionPane.YES_OPTION) {
					this.setCurrentDirectory(currentFile);
					this.updateUI();
					return;
				}
			}
		}
		super.approveSelection();
	}
}