Multiple Choice Dialogue
This commit is contained in:
parent
96bdb61438
commit
5b9693c788
4 changed files with 96 additions and 115 deletions
|
@ -17,16 +17,13 @@ import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bootloader.Boot;
|
import the.bytecode.club.bootloader.Boot;
|
||||||
import the.bytecode.club.bytecodeviewer.api.ClassNodeLoader;
|
import the.bytecode.club.bytecodeviewer.api.ClassNodeLoader;
|
||||||
import the.bytecode.club.bytecodeviewer.compilers.Compiler;
|
import the.bytecode.club.bytecodeviewer.compilers.Compiler;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.DecompilerViewComponent;
|
import the.bytecode.club.bytecodeviewer.gui.components.*;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.FileChooser;
|
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourcePanelCompileMode;
|
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.ResourcePanelCompileMode;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.TabbedPane;
|
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.TabbedPane;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer;
|
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceListPane;
|
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceListPane;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
|
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.RunOptions;
|
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourcesearch.SearchBoxPane;
|
import the.bytecode.club.bytecodeviewer.gui.resourcesearch.SearchBoxPane;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.SystemErrConsole;
|
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.WorkPaneMainComponent;
|
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.WorkPaneMainComponent;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ResourceViewer;
|
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ResourceViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.Refactorer;
|
||||||
|
@ -677,20 +674,11 @@ public class BytecodeViewer
|
||||||
file = new File(file.getAbsolutePath() + ".zip");
|
file = new File(file.getAbsolutePath() + ".zip");
|
||||||
|
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.gui.components;
|
||||||
|
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
* @since 6/26/2021
|
||||||
|
*/
|
||||||
|
public class MultipleChoiceDialogue
|
||||||
|
{
|
||||||
|
private final String title;
|
||||||
|
private final String description;
|
||||||
|
private final String[] options;
|
||||||
|
|
||||||
|
public MultipleChoiceDialogue(String title, String description, String[] options)
|
||||||
|
{
|
||||||
|
this.title = title;
|
||||||
|
this.description = description;
|
||||||
|
this.options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int promptChoice()
|
||||||
|
{
|
||||||
|
JOptionPane pane = new JOptionPane(description);
|
||||||
|
pane.setOptions(options);
|
||||||
|
JDialog dialog = pane.createDialog(BytecodeViewer.viewer, title);
|
||||||
|
dialog.setVisible(true);
|
||||||
|
Object obj = pane.getValue();
|
||||||
|
int result = -1;
|
||||||
|
for (int k = 0; k < options.length; k++)
|
||||||
|
if (options[k].equals(obj))
|
||||||
|
result = k;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ import the.bytecode.club.bytecodeviewer.Configuration;
|
||||||
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
|
||||||
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.FileChooser;
|
import the.bytecode.club.bytecodeviewer.gui.components.FileChooser;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.components.MultipleChoiceDialogue;
|
||||||
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
import the.bytecode.club.bytecodeviewer.util.JarUtils;
|
||||||
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
import the.bytecode.club.bytecodeviewer.util.MiscUtils;
|
||||||
|
|
||||||
|
@ -55,20 +56,11 @@ public class ResourceDecompiling
|
||||||
|
|
||||||
if (file.exists())
|
if (file.exists())
|
||||||
{
|
{
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
@ -231,20 +223,11 @@ public class ResourceDecompiling
|
||||||
|
|
||||||
if (new File(path).exists())
|
if (new File(path).exists())
|
||||||
{
|
{
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import the.bytecode.club.bytecodeviewer.Configuration;
|
import the.bytecode.club.bytecodeviewer.Configuration;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.ExportJar;
|
import the.bytecode.club.bytecodeviewer.gui.components.ExportJar;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.components.FileChooser;
|
import the.bytecode.club.bytecodeviewer.gui.components.FileChooser;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.components.MultipleChoiceDialogue;
|
||||||
import the.bytecode.club.bytecodeviewer.util.*;
|
import the.bytecode.club.bytecodeviewer.util.*;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
@ -29,7 +30,7 @@ public class ResourceExporting
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread t = new Thread(() ->
|
Thread exportThread = new Thread(() ->
|
||||||
{
|
{
|
||||||
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
||||||
return;
|
return;
|
||||||
|
@ -52,20 +53,11 @@ public class ResourceExporting
|
||||||
|
|
||||||
if (new File(path).exists())
|
if (new File(path).exists())
|
||||||
{
|
{
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
@ -75,7 +67,7 @@ public class ResourceExporting
|
||||||
new ExportJar(path).setVisible(true);
|
new ExportJar(path).setVisible(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
t.start();
|
exportThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveAsZip()
|
public static void saveAsZip()
|
||||||
|
@ -85,7 +77,8 @@ public class ResourceExporting
|
||||||
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
|
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Thread t = new Thread(() ->
|
|
||||||
|
Thread exportThread = new Thread(() ->
|
||||||
{
|
{
|
||||||
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
||||||
return;
|
return;
|
||||||
|
@ -105,21 +98,13 @@ public class ResourceExporting
|
||||||
if (!file.getAbsolutePath().endsWith(".zip"))
|
if (!file.getAbsolutePath().endsWith(".zip"))
|
||||||
file = new File(file.getAbsolutePath() + ".zip");
|
file = new File(file.getAbsolutePath() + ".zip");
|
||||||
|
|
||||||
if (file.exists()) {
|
if (file.exists())
|
||||||
JOptionPane pane = new JOptionPane(
|
{
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
pane.setOptions(options);
|
new String[]{"Yes", "No"});
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
@ -129,15 +114,15 @@ public class ResourceExporting
|
||||||
final File file2 = file;
|
final File file2 = file;
|
||||||
|
|
||||||
BytecodeViewer.viewer.updateBusyStatus(true);
|
BytecodeViewer.viewer.updateBusyStatus(true);
|
||||||
Thread t17 = new Thread(() -> {
|
Thread saveThread = new Thread(() ->
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(),
|
{
|
||||||
file2.getAbsolutePath());
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), file2.getAbsolutePath());
|
||||||
BytecodeViewer.viewer.updateBusyStatus(false);
|
BytecodeViewer.viewer.updateBusyStatus(false);
|
||||||
});
|
});
|
||||||
t17.start();
|
saveThread.start();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
t.start();
|
exportThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveAsDex()
|
public static void saveAsDex()
|
||||||
|
@ -172,20 +157,11 @@ public class ResourceExporting
|
||||||
final File file2 = new File(output);
|
final File file2 = new File(output);
|
||||||
if (file2.exists())
|
if (file2.exists())
|
||||||
{
|
{
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
@ -212,7 +188,8 @@ public class ResourceExporting
|
||||||
|
|
||||||
public static void saveAsAPK()
|
public static void saveAsAPK()
|
||||||
{
|
{
|
||||||
if (BytecodeViewer.getLoadedClasses().isEmpty()) {
|
if (BytecodeViewer.getLoadedClasses().isEmpty())
|
||||||
|
{
|
||||||
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
|
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -223,17 +200,21 @@ public class ResourceExporting
|
||||||
List<String> validContainersNames = new ArrayList<>();
|
List<String> validContainersNames = new ArrayList<>();
|
||||||
FileContainer container;
|
FileContainer container;
|
||||||
|
|
||||||
for (FileContainer fileContainer : containers) {
|
for (FileContainer fileContainer : containers)
|
||||||
if (fileContainer.APKToolContents != null && fileContainer.APKToolContents.exists()) {
|
{
|
||||||
|
if (fileContainer.APKToolContents != null && fileContainer.APKToolContents.exists())
|
||||||
|
{
|
||||||
validContainersNames.add(fileContainer.name);
|
validContainersNames.add(fileContainer.name);
|
||||||
validContainers.add(fileContainer);
|
validContainers.add(fileContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validContainers.isEmpty()) {
|
if (!validContainers.isEmpty())
|
||||||
|
{
|
||||||
container = validContainers.get(0);
|
container = validContainers.get(0);
|
||||||
|
|
||||||
if (validContainers.size() >= 2) {
|
if (validContainers.size() >= 2)
|
||||||
|
{
|
||||||
JOptionPane pane = new JOptionPane("Which file would you like to export as an APK?");
|
JOptionPane pane = new JOptionPane("Which file would you like to export as an APK?");
|
||||||
Object[] options = validContainersNames.toArray(new String[0]);
|
Object[] options = validContainersNames.toArray(new String[0]);
|
||||||
|
|
||||||
|
@ -257,7 +238,7 @@ public class ResourceExporting
|
||||||
|
|
||||||
final FileContainer finalContainer = container;
|
final FileContainer finalContainer = container;
|
||||||
|
|
||||||
Thread t = new Thread(() ->
|
Thread exportThread = new Thread(() ->
|
||||||
{
|
{
|
||||||
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
if (BytecodeViewer.viewer.compileOnSave.isSelected() && !BytecodeViewer.compile(false))
|
||||||
return;
|
return;
|
||||||
|
@ -281,42 +262,33 @@ public class ResourceExporting
|
||||||
final File file2 = new File(output);
|
final File file2 = new File(output);
|
||||||
if (file2.exists())
|
if (file2.exists())
|
||||||
{
|
{
|
||||||
JOptionPane pane = new JOptionPane(
|
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue("Bytecode Viewer - Overwrite File",
|
||||||
"Are you sure you wish to overwrite this existing file?");
|
"Are you sure you wish to overwrite this existing file?",
|
||||||
Object[] options = new String[]{"Yes", "No"};
|
new String[]{"Yes", "No"});
|
||||||
pane.setOptions(options);
|
|
||||||
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
|
|
||||||
"Bytecode Viewer - Overwrite File");
|
|
||||||
dialog.setVisible(true);
|
|
||||||
Object obj = pane.getValue();
|
|
||||||
int result = -1;
|
|
||||||
for (int k = 0; k < options.length; k++)
|
|
||||||
if (options[k].equals(obj))
|
|
||||||
result = k;
|
|
||||||
|
|
||||||
if (result == 0) {
|
if (dialogue.promptChoice() == 0) {
|
||||||
file.delete();
|
file.delete();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread t14 = new Thread(() ->
|
Thread saveThread = new Thread(() ->
|
||||||
{
|
{
|
||||||
BytecodeViewer.viewer.updateBusyStatus(true);
|
BytecodeViewer.viewer.updateBusyStatus(true);
|
||||||
final String input = tempDirectory + fs + MiscUtils.getRandomizedName() + ".jar";
|
final String input = tempDirectory + fs + MiscUtils.getRandomizedName() + ".jar";
|
||||||
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(), input);
|
||||||
|
|
||||||
Thread t13 = new Thread(() ->
|
Thread buildAPKThread = new Thread(() ->
|
||||||
{
|
{
|
||||||
APKTool.buildAPK(new File(input), file2, finalContainer);
|
APKTool.buildAPK(new File(input), file2, finalContainer);
|
||||||
BytecodeViewer.viewer.updateBusyStatus(false);
|
BytecodeViewer.viewer.updateBusyStatus(false);
|
||||||
});
|
});
|
||||||
t13.start();
|
buildAPKThread.start();
|
||||||
});
|
});
|
||||||
t14.start();
|
saveThread.start();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
t.start();
|
exportThread.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue