Projects STRLCPY jadx Commits 1a9cb832
🤬
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java
    skipped 72 lines
    73 73   
    74 74   private boolean showHeapUsageBar = false;
    75 75   private boolean alwaysSelectOpened = false;
     76 + private boolean useAlternativeFileDialog = false;
    76 77   
    77 78   private Map<String, WindowLocation> windowPos = new HashMap<>();
    78 79   private int mainWindowExtendedState = JFrame.NORMAL;
    skipped 187 lines
    266 267   public void setAlwaysSelectOpened(boolean alwaysSelectOpened) {
    267 268   this.alwaysSelectOpened = alwaysSelectOpened;
    268 269   partialSync(settings -> settings.alwaysSelectOpened = alwaysSelectOpened);
     270 + }
     271 + 
     272 + public boolean isUseAlternativeFileDialog() {
     273 + return useAlternativeFileDialog;
     274 + }
     275 + 
     276 + public void setUseAlternativeFileDialog(boolean useAlternativeFileDialog) {
     277 + this.useAlternativeFileDialog = useAlternativeFileDialog;
    269 278   }
    270 279   
    271 280   public String getExcludedPackages() {
    skipped 496 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java
    skipped 642 lines
    643 643   jumpOnDoubleClick.setSelected(settings.isJumpOnDoubleClick());
    644 644   jumpOnDoubleClick.addItemListener(e -> settings.setJumpOnDoubleClick(e.getStateChange() == ItemEvent.SELECTED));
    645 645   
     646 + JCheckBox useAltFileDialog = new JCheckBox();
     647 + useAltFileDialog.setSelected(settings.isUseAlternativeFileDialog());
     648 + useAltFileDialog.addItemListener(e -> settings.setUseAlternativeFileDialog(e.getStateChange() == ItemEvent.SELECTED));
     649 + 
    646 650   JCheckBox update = new JCheckBox();
    647 651   update.setSelected(settings.isCheckForUpdates());
    648 652   update.addItemListener(e -> settings.setCheckForUpdates(e.getStateChange() == ItemEvent.SELECTED));
    skipped 16 lines
    665 669   group.addRow(NLS.str("preferences.language"), languageCbx);
    666 670   group.addRow(NLS.str("preferences.lineNumbersMode"), lineNumbersMode);
    667 671   group.addRow(NLS.str("preferences.jumpOnDoubleClick"), jumpOnDoubleClick);
     672 + group.addRow(NLS.str("preferences.useAlternativeFileDialog"), useAltFileDialog);
    668 673   group.addRow(NLS.str("preferences.check_for_updates"), update);
    669 674   group.addRow(NLS.str("preferences.cfg"), cfg);
    670 675   group.addRow(NLS.str("preferences.raw_cfg"), rawCfg);
    skipped 120 lines
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java
    skipped 115 lines
    116 116  import jadx.gui.ui.codearea.EditorViewState;
    117 117  import jadx.gui.ui.dialog.ADBDialog;
    118 118  import jadx.gui.ui.dialog.AboutDialog;
    119  -import jadx.gui.ui.dialog.FileDialog;
    120 119  import jadx.gui.ui.dialog.LogViewerDialog;
    121 120  import jadx.gui.ui.dialog.RenameDialog;
    122 121  import jadx.gui.ui.dialog.SearchDialog;
     122 +import jadx.gui.ui.filedialog.FileDialogWrapper;
     123 +import jadx.gui.ui.filedialog.FileOpenMode;
    123 124  import jadx.gui.ui.panel.ContentPanel;
    124 125  import jadx.gui.ui.panel.IssuesPanel;
    125 126  import jadx.gui.ui.panel.JDebuggerPanel;
    skipped 167 lines
    293 294   }
    294 295   
    295 296   public void openFileDialog() {
    296  - showOpenDialog(FileDialog.OpenMode.OPEN);
     297 + showOpenDialog(FileOpenMode.OPEN);
    297 298   }
    298 299   
    299 300   public void openProjectDialog() {
    300  - showOpenDialog(FileDialog.OpenMode.OPEN_PROJECT);
     301 + showOpenDialog(FileOpenMode.OPEN_PROJECT);
    301 302   }
    302 303   
    303  - private void showOpenDialog(FileDialog.OpenMode mode) {
     304 + private void showOpenDialog(FileOpenMode mode) {
    304 305   saveAll();
    305 306   if (!ensureProjectIsSaved()) {
    306 307   return;
    307 308   }
    308  - FileDialog fileDialog = new FileDialog(this, mode);
     309 + FileDialogWrapper fileDialog = new FileDialogWrapper(this, mode);
    309 310   List<Path> openPaths = fileDialog.show();
    310 311   if (!openPaths.isEmpty()) {
    311 312   settings.setLastOpenFilePath(fileDialog.getCurrentDir());
    skipped 2 lines
    314 315   }
    315 316   
    316 317   public void addFiles() {
    317  - FileDialog fileDialog = new FileDialog(this, FileDialog.OpenMode.ADD);
     318 + FileDialogWrapper fileDialog = new FileDialogWrapper(this, FileOpenMode.ADD);
    318 319   List<Path> addPaths = fileDialog.show();
    319 320   if (!addPaths.isEmpty()) {
    320 321   addFiles(addPaths);
    skipped 25 lines
    346 347   }
    347 348   
    348 349   private void saveProjectAs() {
    349  - FileDialog fileDialog = new FileDialog(this, FileDialog.OpenMode.SAVE_PROJECT);
     350 + FileDialogWrapper fileDialog = new FileDialogWrapper(this, FileOpenMode.SAVE_PROJECT);
    350 351   if (project.getFilePaths().size() == 1) {
    351 352   // If there is only one file loaded we suggest saving the jadx project file next to the loaded file
    352 353   Path projectPath = getProjectPathForFile(this.project.getFilePaths().get(0));
    skipped 24 lines
    377 378   }
    378 379   
    379 380   private void exportMappings(MappingFormat mappingFormat) {
    380  - FileDialog fileDialog = new FileDialog(this, FileDialog.OpenMode.CUSTOM_SAVE);
     381 + FileDialogWrapper fileDialog = new FileDialogWrapper(this, FileOpenMode.CUSTOM_SAVE);
    381 382   fileDialog.setTitle(NLS.str("file.export_mappings_as"));
    382 383   Path workingDir = project.getWorkingDir();
    383 384   Path baseDir = workingDir != null ? workingDir : settings.getLastSaveFilePath();
    skipped 275 lines
    659 660   }
    660 661   
    661 662   private void saveAll(boolean export) {
    662  - FileDialog fileDialog = new FileDialog(this, FileDialog.OpenMode.EXPORT);
     663 + FileDialogWrapper fileDialog = new FileDialogWrapper(this, FileOpenMode.EXPORT);
    663 664   List<Path> saveDirs = fileDialog.show();
    664 665   if (saveDirs.isEmpty()) {
    665 666   return;
    skipped 967 lines
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/dialog/FileDialog.java
    1  -package jadx.gui.ui.dialog;
    2  - 
    3  -import java.awt.Component;
    4  -import java.awt.HeadlessException;
    5  -import java.awt.event.WindowAdapter;
    6  -import java.awt.event.WindowEvent;
    7  -import java.io.File;
    8  -import java.nio.file.Path;
    9  -import java.util.ArrayList;
    10  -import java.util.Arrays;
    11  -import java.util.Collections;
    12  -import java.util.List;
    13  - 
    14  -import javax.swing.JDialog;
    15  -import javax.swing.JFileChooser;
    16  -import javax.swing.JOptionPane;
    17  -import javax.swing.filechooser.FileNameExtensionFilter;
    18  - 
    19  -import org.jetbrains.annotations.Nullable;
    20  - 
    21  -import jadx.api.plugins.utils.CommonFileUtils;
    22  -import jadx.core.utils.Utils;
    23  -import jadx.core.utils.files.FileUtils;
    24  -import jadx.gui.settings.JadxProject;
    25  -import jadx.gui.ui.MainWindow;
    26  -import jadx.gui.utils.NLS;
    27  - 
    28  -public class FileDialog {
    29  - 
    30  - public enum OpenMode {
    31  - OPEN,
    32  - OPEN_PROJECT,
    33  - ADD,
    34  - SAVE_PROJECT,
    35  - EXPORT,
    36  - CUSTOM_SAVE,
    37  - CUSTOM_OPEN
    38  - }
    39  - 
    40  - private final MainWindow mainWindow;
    41  - 
    42  - private boolean isOpen;
    43  - private String title;
    44  - private List<String> fileExtList;
    45  - private int selectionMode = JFileChooser.FILES_AND_DIRECTORIES;
    46  - private @Nullable Path currentDir;
    47  - private @Nullable Path selectedFile;
    48  - 
    49  - public FileDialog(MainWindow mainWindow, OpenMode mode) {
    50  - this.mainWindow = mainWindow;
    51  - initForMode(mode);
    52  - }
    53  - 
    54  - public void setTitle(String title) {
    55  - this.title = title;
    56  - }
    57  - 
    58  - public void setFileExtList(List<String> fileExtList) {
    59  - this.fileExtList = fileExtList;
    60  - }
    61  - 
    62  - public void setSelectionMode(int selectionMode) {
    63  - this.selectionMode = selectionMode;
    64  - }
    65  - 
    66  - public void setSelectedFile(Path path) {
    67  - this.selectedFile = path;
    68  - }
    69  - 
    70  - public void setCurrentDir(Path currentDir) {
    71  - this.currentDir = currentDir;
    72  - }
    73  - 
    74  - public List<Path> show() {
    75  - FileChooser fileChooser = buildFileChooser();
    76  - int ret = isOpen ? fileChooser.showOpenDialog(mainWindow) : fileChooser.showSaveDialog(mainWindow);
    77  - if (ret != JFileChooser.APPROVE_OPTION) {
    78  - return Collections.emptyList();
    79  - }
    80  - currentDir = fileChooser.getCurrentDirectory().toPath();
    81  - File[] selectedFiles = fileChooser.getSelectedFiles();
    82  - if (selectedFiles.length != 0) {
    83  - return FileUtils.toPaths(selectedFiles);
    84  - }
    85  - File chosenFile = fileChooser.getSelectedFile();
    86  - if (chosenFile != null) {
    87  - return Collections.singletonList(chosenFile.toPath());
    88  - }
    89  - return Collections.emptyList();
    90  - }
    91  - 
    92  - public Path getCurrentDir() {
    93  - return currentDir;
    94  - }
    95  - 
    96  - private void initForMode(OpenMode mode) {
    97  - switch (mode) {
    98  - case OPEN:
    99  - case OPEN_PROJECT:
    100  - case ADD:
    101  - if (mode == OpenMode.OPEN_PROJECT) {
    102  - fileExtList = Collections.singletonList(JadxProject.PROJECT_EXTENSION);
    103  - title = NLS.str("file.open_title");
    104  - } else {
    105  - fileExtList = new ArrayList<>(Arrays.asList("apk", "dex", "jar", "class", "smali", "zip", "xapk", "aar", "arsc"));
    106  - if (mode == OpenMode.OPEN) {
    107  - fileExtList.addAll(Arrays.asList(JadxProject.PROJECT_EXTENSION, "aab"));
    108  - title = NLS.str("file.open_title");
    109  - } else {
    110  - title = NLS.str("file.add_files_action");
    111  - }
    112  - }
    113  - selectionMode = JFileChooser.FILES_AND_DIRECTORIES;
    114  - currentDir = mainWindow.getSettings().getLastOpenFilePath();
    115  - isOpen = true;
    116  - break;
    117  - 
    118  - case SAVE_PROJECT:
    119  - title = NLS.str("file.save_project");
    120  - fileExtList = Collections.singletonList(JadxProject.PROJECT_EXTENSION);
    121  - selectionMode = JFileChooser.FILES_ONLY;
    122  - currentDir = mainWindow.getSettings().getLastSaveFilePath();
    123  - isOpen = false;
    124  - break;
    125  - 
    126  - case EXPORT:
    127  - title = NLS.str("file.save_all_msg");
    128  - fileExtList = Collections.emptyList();
    129  - selectionMode = JFileChooser.DIRECTORIES_ONLY;
    130  - currentDir = mainWindow.getSettings().getLastSaveFilePath();
    131  - isOpen = false;
    132  - break;
    133  - 
    134  - case CUSTOM_SAVE:
    135  - isOpen = false;
    136  - break;
    137  - 
    138  - case CUSTOM_OPEN:
    139  - isOpen = true;
    140  - break;
    141  - }
    142  - }
    143  - 
    144  - private FileChooser buildFileChooser() {
    145  - FileChooser fileChooser = new FileChooser(currentDir);
    146  - fileChooser.setToolTipText(title);
    147  - fileChooser.setFileSelectionMode(selectionMode);
    148  - fileChooser.setMultiSelectionEnabled(isOpen);
    149  - fileChooser.setAcceptAllFileFilterUsed(true);
    150  - if (Utils.notEmpty(fileExtList)) {
    151  - String description = NLS.str("file_dialog.supported_files") + ": (" + Utils.listToString(fileExtList) + ')';
    152  - fileChooser.setFileFilter(new FileNameExtensionFilter(description, fileExtList.toArray(new String[0])));
    153  - }
    154  - if (selectedFile != null) {
    155  - fileChooser.setSelectedFile(selectedFile.toFile());
    156  - }
    157  - return fileChooser;
    158  - }
    159  - 
    160  - private class FileChooser extends JFileChooser {
    161  - 
    162  - public FileChooser(@Nullable Path currentDirectory) {
    163  - super(currentDirectory == null ? CommonFileUtils.CWD : currentDirectory.toFile());
    164  - }
    165  - 
    166  - @Override
    167  - protected JDialog createDialog(Component parent) throws HeadlessException {
    168  - JDialog dialog = super.createDialog(parent);
    169  - dialog.setTitle(title);
    170  - dialog.setLocationRelativeTo(null);
    171  - mainWindow.getSettings().loadWindowPos(dialog);
    172  - dialog.addWindowListener(new WindowAdapter() {
    173  - @Override
    174  - public void windowClosed(WindowEvent e) {
    175  - mainWindow.getSettings().saveWindowPos(dialog);
    176  - super.windowClosed(e);
    177  - }
    178  - });
    179  - return dialog;
    180  - }
    181  - 
    182  - @Override
    183  - public void approveSelection() {
    184  - if (selectionMode == FILES_AND_DIRECTORIES) {
    185  - File currentFile = getSelectedFile();
    186  - if (currentFile.isDirectory()) {
    187  - int option = JOptionPane.showConfirmDialog(
    188  - mainWindow,
    189  - NLS.str("file_dialog.load_dir_confirm") + "\n " + currentFile,
    190  - NLS.str("file_dialog.load_dir_title"),
    191  - JOptionPane.YES_NO_OPTION);
    192  - if (option != JOptionPane.YES_OPTION) {
    193  - this.setCurrentDirectory(currentFile);
    194  - this.updateUI();
    195  - return;
    196  - }
    197  - }
    198  - }
    199  - super.approveSelection();
    200  - }
    201  - }
    202  -}
    203  - 
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileChooser.java
     1 +package jadx.gui.ui.filedialog;
     2 + 
     3 +import java.awt.Component;
     4 +import java.awt.HeadlessException;
     5 +import java.awt.event.WindowAdapter;
     6 +import java.awt.event.WindowEvent;
     7 +import java.io.File;
     8 +import java.nio.file.Path;
     9 +import java.util.Collections;
     10 +import java.util.List;
     11 + 
     12 +import javax.swing.JDialog;
     13 +import javax.swing.JFileChooser;
     14 +import javax.swing.JOptionPane;
     15 +import javax.swing.filechooser.FileNameExtensionFilter;
     16 + 
     17 +import jadx.api.plugins.utils.CommonFileUtils;
     18 +import jadx.core.utils.Utils;
     19 +import jadx.core.utils.files.FileUtils;
     20 +import jadx.gui.ui.MainWindow;
     21 +import jadx.gui.utils.NLS;
     22 + 
     23 +class CustomFileChooser extends JFileChooser {
     24 + 
     25 + private final FileDialogWrapper data;
     26 + 
     27 + public CustomFileChooser(FileDialogWrapper data) {
     28 + super(data.getCurrentDir() == null ? CommonFileUtils.CWD : data.getCurrentDir().toFile());
     29 + this.data = data;
     30 + }
     31 + 
     32 + public List<Path> showDialog() {
     33 + setToolTipText(data.getTitle());
     34 + setFileSelectionMode(data.getSelectionMode());
     35 + setMultiSelectionEnabled(data.isOpen());
     36 + setAcceptAllFileFilterUsed(true);
     37 + List<String> fileExtList = data.getFileExtList();
     38 + if (Utils.notEmpty(fileExtList)) {
     39 + String description = NLS.str("file_dialog.supported_files") + ": (" + Utils.listToString(fileExtList) + ')';
     40 + setFileFilter(new FileNameExtensionFilter(description, fileExtList.toArray(new String[0])));
     41 + }
     42 + if (data.getSelectedFile() != null) {
     43 + setSelectedFile(data.getSelectedFile().toFile());
     44 + }
     45 + MainWindow mainWindow = data.getMainWindow();
     46 + int ret = data.isOpen() ? showOpenDialog(mainWindow) : showSaveDialog(mainWindow);
     47 + if (ret != JFileChooser.APPROVE_OPTION) {
     48 + return Collections.emptyList();
     49 + }
     50 + data.setCurrentDir(getCurrentDirectory().toPath());
     51 + File[] selectedFiles = getSelectedFiles();
     52 + if (selectedFiles.length != 0) {
     53 + return FileUtils.toPaths(selectedFiles);
     54 + }
     55 + File chosenFile = getSelectedFile();
     56 + if (chosenFile != null) {
     57 + return Collections.singletonList(chosenFile.toPath());
     58 + }
     59 + return Collections.emptyList();
     60 + }
     61 + 
     62 + @Override
     63 + protected JDialog createDialog(Component parent) throws HeadlessException {
     64 + JDialog dialog = super.createDialog(parent);
     65 + dialog.setTitle(data.getTitle());
     66 + dialog.setLocationRelativeTo(null);
     67 + data.getMainWindow().getSettings().loadWindowPos(dialog);
     68 + dialog.addWindowListener(new WindowAdapter() {
     69 + @Override
     70 + public void windowClosed(WindowEvent e) {
     71 + data.getMainWindow().getSettings().saveWindowPos(dialog);
     72 + super.windowClosed(e);
     73 + }
     74 + });
     75 + return dialog;
     76 + }
     77 + 
     78 + @Override
     79 + public void approveSelection() {
     80 + if (data.getSelectionMode() == FILES_AND_DIRECTORIES) {
     81 + File currentFile = getSelectedFile();
     82 + if (currentFile.isDirectory()) {
     83 + int option = JOptionPane.showConfirmDialog(
     84 + data.getMainWindow(),
     85 + NLS.str("file_dialog.load_dir_confirm") + "\n " + currentFile,
     86 + NLS.str("file_dialog.load_dir_title"),
     87 + JOptionPane.YES_NO_OPTION);
     88 + if (option != JOptionPane.YES_OPTION) {
     89 + this.setCurrentDirectory(currentFile);
     90 + this.updateUI();
     91 + return;
     92 + }
     93 + }
     94 + }
     95 + super.approveSelection();
     96 + }
     97 +}
     98 + 
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/filedialog/CustomFileDialog.java
     1 +package jadx.gui.ui.filedialog;
     2 + 
     3 +import java.awt.FileDialog;
     4 +import java.io.File;
     5 +import java.nio.file.Path;
     6 +import java.nio.file.Paths;
     7 +import java.util.Collections;
     8 +import java.util.List;
     9 + 
     10 +import jadx.core.utils.ListUtils;
     11 +import jadx.core.utils.Utils;
     12 +import jadx.core.utils.files.FileUtils;
     13 + 
     14 +class CustomFileDialog {
     15 + 
     16 + private final FileDialogWrapper data;
     17 + 
     18 + public CustomFileDialog(FileDialogWrapper data) {
     19 + this.data = data;
     20 + }
     21 + 
     22 + public List<Path> showDialog() {
     23 + FileDialog fileDialog = new FileDialog(data.getMainWindow(), data.getTitle());
     24 + fileDialog.setMode(data.isOpen() ? FileDialog.LOAD : FileDialog.SAVE);
     25 + fileDialog.setMultipleMode(true);
     26 + List<String> fileExtList = data.getFileExtList();
     27 + if (Utils.notEmpty(fileExtList)) {
     28 + fileDialog.setFilenameFilter((dir, name) -> ListUtils.anyMatch(fileExtList, name::endsWith));
     29 + }
     30 + if (data.getSelectedFile() != null) {
     31 + fileDialog.setFile(data.getSelectedFile().toAbsolutePath().toString());
     32 + }
     33 + if (data.getCurrentDir() != null) {
     34 + fileDialog.setDirectory(data.getCurrentDir().toAbsolutePath().toString());
     35 + }
     36 + fileDialog.setVisible(true);
     37 + File[] selectedFiles = fileDialog.getFiles();
     38 + if (!Utils.isEmpty(selectedFiles)) {
     39 + data.setCurrentDir(Paths.get(fileDialog.getDirectory()));
     40 + return FileUtils.toPaths(selectedFiles);
     41 + }
     42 + if (fileDialog.getFile() != null) {
     43 + return Collections.singletonList(Paths.get(fileDialog.getFile()));
     44 + }
     45 + return Collections.emptyList();
     46 + }
     47 +}
     48 + 
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileDialogWrapper.java
     1 +package jadx.gui.ui.filedialog;
     2 + 
     3 +import java.nio.file.Path;
     4 +import java.util.ArrayList;
     5 +import java.util.Arrays;
     6 +import java.util.Collections;
     7 +import java.util.List;
     8 + 
     9 +import javax.swing.JFileChooser;
     10 + 
     11 +import org.jetbrains.annotations.Nullable;
     12 + 
     13 +import jadx.gui.settings.JadxProject;
     14 +import jadx.gui.ui.MainWindow;
     15 +import jadx.gui.utils.NLS;
     16 + 
     17 +public class FileDialogWrapper {
     18 + 
     19 + private final MainWindow mainWindow;
     20 + 
     21 + private boolean isOpen;
     22 + private String title;
     23 + private List<String> fileExtList;
     24 + private int selectionMode = JFileChooser.FILES_AND_DIRECTORIES;
     25 + private @Nullable Path currentDir;
     26 + private @Nullable Path selectedFile;
     27 + 
     28 + public FileDialogWrapper(MainWindow mainWindow, FileOpenMode mode) {
     29 + this.mainWindow = mainWindow;
     30 + initForMode(mode);
     31 + }
     32 + 
     33 + public void setTitle(String title) {
     34 + this.title = title;
     35 + }
     36 + 
     37 + public void setFileExtList(List<String> fileExtList) {
     38 + this.fileExtList = fileExtList;
     39 + }
     40 + 
     41 + public void setSelectionMode(int selectionMode) {
     42 + this.selectionMode = selectionMode;
     43 + }
     44 + 
     45 + public void setSelectedFile(Path path) {
     46 + this.selectedFile = path;
     47 + }
     48 + 
     49 + public void setCurrentDir(Path currentDir) {
     50 + this.currentDir = currentDir;
     51 + }
     52 + 
     53 + public List<Path> show() {
     54 + if (mainWindow.getSettings().isUseAlternativeFileDialog()) {
     55 + return new CustomFileDialog(this).showDialog();
     56 + } else {
     57 + return new CustomFileChooser(this).showDialog();
     58 + }
     59 + }
     60 + 
     61 + private void initForMode(FileOpenMode mode) {
     62 + switch (mode) {
     63 + case OPEN:
     64 + case OPEN_PROJECT:
     65 + case ADD:
     66 + if (mode == FileOpenMode.OPEN_PROJECT) {
     67 + fileExtList = Collections.singletonList(JadxProject.PROJECT_EXTENSION);
     68 + title = NLS.str("file.open_title");
     69 + } else {
     70 + fileExtList = new ArrayList<>(Arrays.asList("apk", "dex", "jar", "class", "smali", "zip", "xapk", "aar", "arsc"));
     71 + if (mode == FileOpenMode.OPEN) {
     72 + fileExtList.addAll(Arrays.asList(JadxProject.PROJECT_EXTENSION, "aab"));
     73 + title = NLS.str("file.open_title");
     74 + } else {
     75 + title = NLS.str("file.add_files_action");
     76 + }
     77 + }
     78 + selectionMode = JFileChooser.FILES_AND_DIRECTORIES;
     79 + currentDir = mainWindow.getSettings().getLastOpenFilePath();
     80 + isOpen = true;
     81 + break;
     82 + 
     83 + case SAVE_PROJECT:
     84 + title = NLS.str("file.save_project");
     85 + fileExtList = Collections.singletonList(JadxProject.PROJECT_EXTENSION);
     86 + selectionMode = JFileChooser.FILES_ONLY;
     87 + currentDir = mainWindow.getSettings().getLastSaveFilePath();
     88 + isOpen = false;
     89 + break;
     90 + 
     91 + case EXPORT:
     92 + title = NLS.str("file.save_all_msg");
     93 + fileExtList = Collections.emptyList();
     94 + selectionMode = JFileChooser.DIRECTORIES_ONLY;
     95 + currentDir = mainWindow.getSettings().getLastSaveFilePath();
     96 + isOpen = false;
     97 + break;
     98 + 
     99 + case CUSTOM_SAVE:
     100 + isOpen = false;
     101 + currentDir = mainWindow.getSettings().getLastSaveFilePath();
     102 + break;
     103 + 
     104 + case CUSTOM_OPEN:
     105 + isOpen = true;
     106 + currentDir = mainWindow.getSettings().getLastOpenFilePath();
     107 + break;
     108 + }
     109 + }
     110 + 
     111 + public Path getCurrentDir() {
     112 + return currentDir;
     113 + }
     114 + 
     115 + public MainWindow getMainWindow() {
     116 + return mainWindow;
     117 + }
     118 + 
     119 + public boolean isOpen() {
     120 + return isOpen;
     121 + }
     122 + 
     123 + public String getTitle() {
     124 + return title;
     125 + }
     126 + 
     127 + public List<String> getFileExtList() {
     128 + return fileExtList;
     129 + }
     130 + 
     131 + public int getSelectionMode() {
     132 + return selectionMode;
     133 + }
     134 + 
     135 + public Path getSelectedFile() {
     136 + return selectedFile;
     137 + }
     138 +}
     139 + 
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileOpenMode.java
     1 +package jadx.gui.ui.filedialog;
     2 + 
     3 +public enum FileOpenMode {
     4 + OPEN,
     5 + OPEN_PROJECT,
     6 + ADD,
     7 + SAVE_PROJECT,
     8 + EXPORT,
     9 + CUSTOM_SAVE,
     10 + CUSTOM_OPEN
     11 +}
     12 + 
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_de_DE.properties
    skipped 143 lines
    144 144  preferences.language=Sprache
    145 145  preferences.lineNumbersMode=Editor Zeilennummern-Modus
    146 146  preferences.jumpOnDoubleClick=Sprung bei Doppelklick aktivieren
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=Nach Updates beim Start suchen
    148 149  preferences.useDx=dx/d8 zur Konvertierung von Java Bytecode verwenden
    149 150  preferences.decompilationMode=Dekompilierungsmodus
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_en_US.properties
    skipped 143 lines
    144 144  preferences.language=Language
    145 145  preferences.lineNumbersMode=Editor line numbers mode
    146 146  preferences.jumpOnDoubleClick=Enable jump on double click
     147 +preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=Check for updates on startup
    148 149  preferences.useDx=Use dx/d8 to convert java bytecode
    149 150  preferences.decompilationMode=Decompilation mode
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_es_ES.properties
    skipped 143 lines
    144 144  preferences.language=Idioma
    145 145  #preferences.lineNumbersMode=Editor line numbers mode
    146 146  #preferences.jumpOnDoubleClick=Enable jump on double click
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=Buscar actualizaciones al iniciar
    148 149  #preferences.useDx=Use dx/d8 to convert java bytecode
    149 150  #preferences.decompilationMode=Decompilation mode
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties
    skipped 143 lines
    144 144  preferences.language=언어
    145 145  preferences.lineNumbersMode=편집기 줄 번호 모드
    146 146  preferences.jumpOnDoubleClick=더블 클릭 시 점프 활성화
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=시작시 업데이트 확인
    148 149  preferences.useDx=dx/d8을 사용하여 Java 바이트 코드 변환
    149 150  preferences.decompilationMode=디컴파일 모드
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties
    skipped 143 lines
    144 144  preferences.language=Idioma
    145 145  preferences.lineNumbersMode=Modo do contador de linhas do editor
    146 146  preferences.jumpOnDoubleClick=Ativar salto no duplo clique
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=Verificar por atualizações ao inicializar
    148 149  preferences.useDx=Usar dx/d8 para converter bytecode Java
    149 150  preferences.decompilationMode=Modo de descompilação
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties
    skipped 143 lines
    144 144  preferences.language=语言
    145 145  preferences.lineNumbersMode=编辑器行号模式
    146 146  preferences.jumpOnDoubleClick=启用双击跳转
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=启动时检查更新
    148 149  preferences.useDx=使用 dx/d8 来转换java字节码
    149 150  preferences.decompilationMode=反编译模式
    skipped 194 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties
    skipped 143 lines
    144 144  preferences.language=語言
    145 145  preferences.lineNumbersMode=編輯器行號模式
    146 146  preferences.jumpOnDoubleClick=啟用點擊兩下時跳躍
     147 +#preferences.useAlternativeFileDialog=Use alternative file dialog
    147 148  preferences.check_for_updates=啟動時檢查更新
    148 149  preferences.useDx=使用 dx/d8 來轉換 Java 位元組碼
    149 150  preferences.decompilationMode=反編譯模式
    skipped 194 lines
Please wait...
Page is in error, reload to recover