2018-01-31 15:03:53 +00:00
package the.bytecode.club.bytecodeviewer.gui ;
2021-07-04 10:23:14 +00:00
import java.awt.* ;
2018-01-31 15:03:53 +00:00
import java.io.File ;
import java.util.ArrayList ;
2021-06-26 01:13:46 +00:00
import java.util.HashMap ;
2021-07-04 09:25:16 +00:00
import java.util.List ;
2021-06-26 01:13:46 +00:00
import java.util.Map ;
import javax.swing.* ;
2021-06-21 14:55:18 +00:00
2018-01-31 15:03:53 +00:00
import org.objectweb.asm.tree.ClassNode ;
2021-06-26 04:10:32 +00:00
import the.bytecode.club.bytecodeviewer.* ;
2021-06-26 18:10:55 +00:00
import the.bytecode.club.bytecodeviewer.gui.components.* ;
2021-06-21 23:37:55 +00:00
import the.bytecode.club.bytecodeviewer.gui.plugins.MaliciousCodeScannerOptions ;
import the.bytecode.club.bytecodeviewer.gui.plugins.ReplaceStringsOptions ;
2021-06-22 18:05:25 +00:00
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceListPane ;
2021-06-26 01:13:46 +00:00
import the.bytecode.club.bytecodeviewer.gui.resourcesearch.SearchBoxPane ;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.DecompilerSelectionPane ;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.WorkPaneMainComponent ;
2021-07-13 10:37:28 +00:00
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer ;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ResourceViewer ;
2021-06-26 01:13:46 +00:00
import the.bytecode.club.bytecodeviewer.gui.theme.LAFTheme ;
import the.bytecode.club.bytecodeviewer.gui.theme.RSTATheme ;
2018-01-31 15:03:53 +00:00
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameClasses ;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameFields ;
import the.bytecode.club.bytecodeviewer.obfuscators.rename.RenameMethods ;
import the.bytecode.club.bytecodeviewer.plugin.PluginManager ;
2021-07-01 21:54:10 +00:00
import the.bytecode.club.bytecodeviewer.plugin.PluginTemplate ;
2021-06-28 04:27:18 +00:00
import the.bytecode.club.bytecodeviewer.plugin.preinstalled.* ;
2021-07-11 12:33:18 +00:00
import the.bytecode.club.bytecodeviewer.resources.ExternalResources ;
2021-07-11 09:14:42 +00:00
import the.bytecode.club.bytecodeviewer.resources.ResourceContainer ;
2021-07-13 10:37:28 +00:00
import the.bytecode.club.bytecodeviewer.resources.IconResources ;
2021-06-27 20:41:38 +00:00
import the.bytecode.club.bytecodeviewer.resources.exporting.Export ;
2021-06-29 09:41:08 +00:00
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJCheckBoxMenuItem ;
2021-06-30 22:19:54 +00:00
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJRadioButtonMenuItem ;
2021-06-21 14:55:18 +00:00
import the.bytecode.club.bytecodeviewer.util.* ;
2021-06-26 15:10:02 +00:00
import the.bytecode.club.bytecodeviewer.resources.ResourceDecompiling ;
2021-06-29 09:41:08 +00:00
import the.bytecode.club.bytecodeviewer.translation.Language ;
import the.bytecode.club.bytecodeviewer.translation.Translation ;
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJMenu ;
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJMenuItem ;
2021-06-21 14:55:18 +00:00
2021-06-21 09:45:31 +00:00
import static the.bytecode.club.bytecodeviewer.Constants.* ;
2018-01-31 15:03:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bytecode Viewer ( BCV ) - Java & Android Reverse Engineering Suite *
* Copyright ( C ) 2014 Kalen ' Konloch ' Kinloch - http : //bytecodeviewer.com *
* *
* This program is free software : you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation , either version 3 of the License , or *
* ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program . If not , see < http : //www.gnu.org/licenses/>. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
2019-04-17 06:45:15 +00:00
* The main file for the GUI
2018-01-31 15:03:53 +00:00
*
2018-01-31 15:41:24 +00:00
* @author Konloch
2018-01-31 15:03:53 +00:00
* /
2021-06-26 12:15:53 +00:00
public class MainViewerGUI extends JFrame
{
2021-06-21 20:19:46 +00:00
public boolean isMaximized ;
2021-07-04 09:25:16 +00:00
public final List < JMenuItem > waitIcons = new ArrayList < > ( ) ;
2021-06-21 23:37:55 +00:00
//main UI components
private static final ArrayList < VisibleComponent > uiComponents = new ArrayList < > ( ) ;
2021-06-26 01:13:46 +00:00
public final WorkPaneMainComponent workPane = new WorkPaneMainComponent ( ) ;
2021-06-21 23:37:55 +00:00
public final ResourceListPane resourcePane = new ResourceListPane ( ) ;
public final SearchBoxPane searchBoxPane = new SearchBoxPane ( ) ;
2021-06-21 22:45:00 +00:00
public JSplitPane splitPane1 ;
public JSplitPane splitPane2 ;
2021-06-21 11:42:12 +00:00
2021-06-21 14:55:18 +00:00
//the root menu bar
public final JMenuBar rootMenu = new JMenuBar ( ) ;
//all of the files main menu components
2021-06-29 09:41:08 +00:00
public final JMenu fileMainMenu = new TranslatedJMenu ( " File " , Translation . FILE ) ;
public final JMenuItem addResource = new TranslatedJMenuItem ( " Add... " , Translation . ADD ) ;
public final JMenuItem newWorkSpace = new TranslatedJMenuItem ( " New Workspace " , Translation . NEW_WORKSPACE ) ;
public final JMenuItem reloadResources = new TranslatedJMenuItem ( " Reload Resources " , Translation . RELOAD_RESOURCES ) ;
public final JMenuItem runButton = new TranslatedJMenuItem ( " Run " , Translation . RUN ) ;
public final JMenuItem compileButton = new TranslatedJMenuItem ( " Compile " , Translation . COMPILE ) ;
public final JMenuItem saveAsRunnableJar = new TranslatedJMenuItem ( " Save As Runnable Jar.. " , Translation . SAVE_AS_RUNNABLE_JAR ) ;
public final JMenuItem saveAsDex = new TranslatedJMenuItem ( " Save As DEX.. " , Translation . SAVE_AS_DEX ) ;
public final JMenuItem saveAsAPK = new TranslatedJMenuItem ( " Save As APK.. " , Translation . SAVE_AS_APK ) ;
public final JMenuItem saveAsZip = new TranslatedJMenuItem ( " Save As Zip.. " , Translation . SAVE_AS_ZIP ) ;
public final JMenuItem decompileSaveOpened = new TranslatedJMenuItem ( " Decompile & Save Opened Class.. " , Translation . DECOMPILE_SAVE_OPENED_CLASSES ) ;
public final JMenuItem decompileSaveAll = new TranslatedJMenuItem ( " Decompile & Save All Classes.. " , Translation . DECOMPILE_SAVE_ALL_CLASSES ) ;
public final JMenu recentFilesSecondaryMenu = new TranslatedJMenu ( " Recent Files " , Translation . RECENT_FILES ) ;
public final JMenuItem about = new TranslatedJMenuItem ( " About " , Translation . ABOUT ) ;
public final JMenuItem exit = new TranslatedJMenuItem ( " Exit " , Translation . EXIT ) ;
2021-06-21 14:55:18 +00:00
//all of the view main menu components
2021-06-29 09:41:08 +00:00
public final JMenu viewMainMenu = new TranslatedJMenu ( " View " , Translation . VIEW ) ;
2021-06-26 01:13:46 +00:00
public final DecompilerSelectionPane viewPane1 = new DecompilerSelectionPane ( 1 ) ;
public final DecompilerSelectionPane viewPane2 = new DecompilerSelectionPane ( 2 ) ;
public final DecompilerSelectionPane viewPane3 = new DecompilerSelectionPane ( 3 ) ;
2021-06-21 14:55:18 +00:00
2021-06-21 19:39:46 +00:00
//all of the plugins main menu components
2021-06-29 09:41:08 +00:00
public final JMenu pluginsMainMenu = new TranslatedJMenu ( " Plugins " , Translation . PLUGINS ) ;
public final JMenuItem openExternalPlugin = new TranslatedJMenuItem ( " Open Plugin... " , Translation . OPEN_PLUGIN ) ;
public final JMenu recentPluginsSecondaryMenu = new TranslatedJMenu ( " Recent Plugins " , Translation . RECENT_PLUGINS ) ;
2021-07-01 21:54:10 +00:00
public final JMenuItem newJavaPlugin = new TranslatedJMenuItem ( " New Java Plugin... " , Translation . NEW_JAVA_PLUGIN ) ;
public final JMenuItem newJavascriptPlugin = new TranslatedJMenuItem ( " New Javascript Plugin... " , Translation . NEW_JAVASCRIPT_PLUGIN ) ;
2021-06-29 09:41:08 +00:00
public final JMenuItem codeSequenceDiagram = new TranslatedJMenuItem ( " Code Sequence Diagram " , Translation . CODE_SEQUENCE_DIAGRAM ) ;
public final JMenuItem maliciousCodeScanner = new TranslatedJMenuItem ( " Malicious Code Scanner " , Translation . MALICIOUS_CODE_SCANNER ) ;
public final JMenuItem showAllStrings = new TranslatedJMenuItem ( " Show All Strings " , Translation . SHOW_ALL_STRINGS ) ;
public final JMenuItem showMainMethods = new TranslatedJMenuItem ( " Show Main Methods " , Translation . SHOW_MAIN_METHODS ) ;
public final JMenuItem replaceStrings = new TranslatedJMenuItem ( " Replace Strings " , Translation . REPLACE_STRINGS ) ;
public final JMenuItem stackFramesRemover = new TranslatedJMenuItem ( " StackFrames Remover " , Translation . STACK_FRAMES_REMOVER ) ;
public final JMenuItem ZKMStringDecrypter = new TranslatedJMenuItem ( " ZKM String Decrypter " , Translation . ZKM_STRING_DECRYPTER ) ;
public final JMenuItem allatoriStringDecrypter = new TranslatedJMenuItem ( " Allatori String Decrypter " , Translation . ALLATORI_STRING_DECRYPTER ) ;
public final JMenuItem zStringArrayDecrypter = new TranslatedJMenuItem ( " ZStringArray Decrypter " , Translation . ZSTRINGARRAY_DECRYPTER ) ;
2021-07-11 12:33:18 +00:00
public final JMenuItem viewAPKAndroidPermissions = new JMenuItem ( " View Android Permissions " ) ;
public final JMenuItem viewManifest = new JMenuItem ( " View Manifest " ) ;
2021-07-13 10:37:28 +00:00
public final JMenuItem changeClassFileVersions = new JMenuItem ( " Change ClassFile Versions " ) ;
2021-06-21 19:39:46 +00:00
2021-06-21 20:19:46 +00:00
//all of the settings main menu components
public final ButtonGroup apkConversionGroup = new ButtonGroup ( ) ;
public final JRadioButtonMenuItem apkConversionDex = new JRadioButtonMenuItem ( " Dex2Jar " ) ;
public final JRadioButtonMenuItem apkConversionEnjarify = new JRadioButtonMenuItem ( " Enjarify " ) ;
2021-06-29 09:41:08 +00:00
public final JMenu rstaTheme = new TranslatedJMenu ( " Text Area Theme " , Translation . TEXT_AREA_THEME ) ;
public final JMenu lafTheme = new TranslatedJMenu ( " Window Theme " , Translation . WINDOW_THEME ) ;
public final JMenu language = new TranslatedJMenu ( " Language " , Translation . LANGUAGE ) ;
public final JMenu fontSize = new TranslatedJMenu ( " Font Size " , Translation . FONT_SIZE ) ;
2021-06-21 22:45:00 +00:00
public final JSpinner fontSpinner = new JSpinner ( ) ;
2021-06-26 01:13:46 +00:00
public final Map < RSTATheme , JRadioButtonMenuItem > rstaThemes = new HashMap < > ( ) ;
public final Map < LAFTheme , JRadioButtonMenuItem > lafThemes = new HashMap < > ( ) ;
2021-06-29 09:41:08 +00:00
public final Map < Language , JRadioButtonMenuItem > languages = new HashMap < > ( ) ;
//BCV settings
public final JCheckBoxMenuItem refreshOnChange = new TranslatedJCheckBoxMenuItem ( " Refresh On View Change " , Translation . REFRESH_ON_VIEW_CHANGE ) ;
private final JCheckBoxMenuItem deleteForeignOutdatedLibs = new TranslatedJCheckBoxMenuItem ( " Delete Foreign/Outdated Libs " , Translation . DELETE_UNKNOWN_LIBS ) ;
public final JMenu settingsMainMenu = new TranslatedJMenu ( " Settings " , Translation . SETTINGS ) ;
public final JMenu visualSettings = new TranslatedJMenu ( " Visual Settings " , Translation . VISUAL_SETTINGS ) ;
public final JMenu apkConversion = new TranslatedJMenu ( " APK Conversion " , Translation . APK_CONVERSION ) ;
public final JMenu bytecodeDecompilerSettingsSecondaryMenu = new TranslatedJMenu ( " Bytecode Decompiler " , Translation . BYTECODE_DECOMPILER ) ;
public final JCheckBoxMenuItem updateCheck = new TranslatedJCheckBoxMenuItem ( " Update Check " , Translation . UPDATE_CHECK ) ;
public final JMenuItem setPython2 = new TranslatedJMenuItem ( " Set Python 2.7 Executable " , Translation . SET_PYTHON_27_EXECUTABLE ) ;
public final JMenuItem setPython3 = new TranslatedJMenuItem ( " Set Python 3.X Executable " , Translation . SET_PYTHON_30_EXECUTABLE ) ;
public final JMenuItem setJRERT = new TranslatedJMenuItem ( " Set JRE RT Library " , Translation . SET_JRE_RT_LIBRARY ) ;
public final JMenuItem setJavac = new TranslatedJMenuItem ( " Set Javac Executable " , Translation . SET_JAVAC_EXECUTABLE ) ;
public final JMenuItem setOptionalLibrary = new TranslatedJMenuItem ( " Set Optional Library Folder " , Translation . SET_OPTIONAL_LIBRARY_FOLDER ) ;
public final JCheckBoxMenuItem compileOnSave = new TranslatedJCheckBoxMenuItem ( " Compile On Save " , Translation . COMPILE_ON_SAVE ) ;
public final JCheckBoxMenuItem showFileInTabTitle = new TranslatedJCheckBoxMenuItem ( " Show File In Tab Title " , Translation . SHOW_TAB_FILE_IN_TAB_TITLE ) ;
public final JCheckBoxMenuItem simplifyNameInTabTitle = new TranslatedJCheckBoxMenuItem ( " Simplify Name In Tab Title " , Translation . SIMPLIFY_NAME_IN_TAB_TITLE ) ;
public final JCheckBoxMenuItem forcePureAsciiAsText = new TranslatedJCheckBoxMenuItem ( " Force Pure Ascii As Text " , Translation . FORCE_PURE_ASCII_AS_TEXT ) ;
public final JCheckBoxMenuItem autoCompileOnRefresh = new TranslatedJCheckBoxMenuItem ( " Compile On Refresh " , Translation . COMPILE_ON_REFRESH ) ;
public final JCheckBoxMenuItem decodeAPKResources = new TranslatedJCheckBoxMenuItem ( " Decode APK Resources " , Translation . DECODE_APK_RESOURCES ) ;
public final JCheckBoxMenuItem synchronizedViewing = new TranslatedJCheckBoxMenuItem ( " Synchronized Viewing " , Translation . SYNCHRONIZED_VIEWING ) ;
public final JCheckBoxMenuItem showClassMethods = new TranslatedJCheckBoxMenuItem ( " Show Class Methods " , Translation . SHOW_CLASS_METHODS ) ;
2021-06-26 12:15:53 +00:00
2021-06-21 22:45:00 +00:00
//CFIDE settings
2021-06-29 09:41:08 +00:00
public final JCheckBoxMenuItem appendBracketsToLabels = new TranslatedJCheckBoxMenuItem ( " Append Brackets To Labels " , Translation . APPEND_BRACKETS_TO_LABEL ) ;
public JCheckBoxMenuItem debugHelpers = new TranslatedJCheckBoxMenuItem ( " Debug Helpers " , Translation . DEBUG_HELPERS ) ;
2021-06-26 12:15:53 +00:00
2021-06-21 22:45:00 +00:00
//FernFlower settings
2021-07-07 09:00:14 +00:00
public final JMenu fernFlowerSettingsSecondaryMenu = new TranslatedJMenu ( " FernFlower " , Translation . FERNFLOWER ) ;
2018-01-31 15:41:24 +00:00
public JCheckBoxMenuItem rbr = new JCheckBoxMenuItem ( " Hide bridge methods " ) ;
2019-04-17 06:45:15 +00:00
public JCheckBoxMenuItem rsy = new JCheckBoxMenuItem ( " Hide synthetic class members " ) ;
public JCheckBoxMenuItem din = new JCheckBoxMenuItem ( " Decompile inner classes " ) ;
public JCheckBoxMenuItem dc4 = new JCheckBoxMenuItem ( " Collapse 1.4 class references " ) ;
2018-01-31 15:41:24 +00:00
public JCheckBoxMenuItem das = new JCheckBoxMenuItem ( " Decompile assertions " ) ;
2019-04-17 06:45:15 +00:00
public JCheckBoxMenuItem hes = new JCheckBoxMenuItem ( " Hide empty super invocation " ) ;
public JCheckBoxMenuItem hdc = new JCheckBoxMenuItem ( " Hide empty default constructor " ) ;
public JCheckBoxMenuItem dgs = new JCheckBoxMenuItem ( " Decompile generic signatures " ) ;
public JCheckBoxMenuItem ner = new JCheckBoxMenuItem ( " Assume return not throwing exceptions " ) ;
public JCheckBoxMenuItem den = new JCheckBoxMenuItem ( " Decompile enumerations " ) ;
public JCheckBoxMenuItem rgn = new JCheckBoxMenuItem ( " Remove getClass() invocation " ) ;
public JCheckBoxMenuItem bto = new JCheckBoxMenuItem ( " Interpret int 1 as boolean true " ) ;
public JCheckBoxMenuItem nns = new JCheckBoxMenuItem ( " Allow for not set synthetic attribute " ) ;
public JCheckBoxMenuItem uto = new JCheckBoxMenuItem ( " Consider nameless types as java.lang.Object " ) ;
public JCheckBoxMenuItem udv = new JCheckBoxMenuItem ( " Reconstruct variable names from debug info " ) ;
public JCheckBoxMenuItem rer = new JCheckBoxMenuItem ( " Remove empty exception ranges " ) ;
public JCheckBoxMenuItem fdi = new JCheckBoxMenuItem ( " Deinline finally structures " ) ;
public JCheckBoxMenuItem asc = new JCheckBoxMenuItem ( " Allow only ASCII characters in strings " ) ;
2020-07-17 20:25:37 +00:00
public JCheckBoxMenuItem ren = new JCheckBoxMenuItem ( " Rename ambiguous classes and class elements " ) ;
2021-06-26 12:15:53 +00:00
2021-06-21 22:45:00 +00:00
//Proycon
2021-07-07 09:00:14 +00:00
public final JMenu procyonSettingsSecondaryMenu = new TranslatedJMenu ( " Procyon " , Translation . PROCYON ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem alwaysGenerateExceptionVars = new JCheckBoxMenuItem ( " Always Generate Exception Variable For Catch Blocks " ) ;
public final JCheckBoxMenuItem excludeNestedTypes = new JCheckBoxMenuItem ( " Exclude Nested Types " ) ;
public final JCheckBoxMenuItem showDebugLineNumbers = new JCheckBoxMenuItem ( " Show Debug Line Numbers " ) ;
public final JCheckBoxMenuItem includeLineNumbersInBytecode = new JCheckBoxMenuItem ( " Include Line Numbers In Bytecode " ) ;
public final JCheckBoxMenuItem includeErrorDiagnostics = new JCheckBoxMenuItem ( " Include Error Diagnostics " ) ;
public final JCheckBoxMenuItem showSyntheticMembers = new JCheckBoxMenuItem ( " Show Synthetic Members " ) ;
public final JCheckBoxMenuItem simplifyMemberReferences = new JCheckBoxMenuItem ( " Simplify Member References " ) ;
public final JCheckBoxMenuItem mergeVariables = new JCheckBoxMenuItem ( " Merge Variables " ) ;
public final JCheckBoxMenuItem forceExplicitTypeArguments = new JCheckBoxMenuItem ( " Force Explicit Type Arguments " ) ;
public final JCheckBoxMenuItem forceExplicitImports = new JCheckBoxMenuItem ( " Force Explicit Imports " ) ;
2021-06-21 23:37:55 +00:00
public final JCheckBoxMenuItem flattenSwitchBlocks = new JCheckBoxMenuItem ( " Flatten Switch Blocks " ) ;
public final JCheckBoxMenuItem retainPointlessSwitches = new JCheckBoxMenuItem ( " Retain Pointless Switches " ) ;
public final JCheckBoxMenuItem retainRedunantCasts = new JCheckBoxMenuItem ( " Retain Redundant Casts " ) ;
public final JCheckBoxMenuItem unicodeOutputEnabled = new JCheckBoxMenuItem ( " Unicode Output Enabled " ) ;
2021-06-26 12:15:53 +00:00
2021-06-21 22:45:00 +00:00
//CFR
2021-07-07 09:00:14 +00:00
public final JMenu cfrSettingsSecondaryMenu = new TranslatedJMenu ( " CFR " , Translation . CFR ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem decodeEnumSwitch = new JCheckBoxMenuItem ( " Decode Enum Switch " ) ;
public final JCheckBoxMenuItem sugarEnums = new JCheckBoxMenuItem ( " SugarEnums " ) ;
public final JCheckBoxMenuItem decodeStringSwitch = new JCheckBoxMenuItem ( " Decode String Switch " ) ;
2019-04-17 06:45:15 +00:00
public final JCheckBoxMenuItem arrayiter = new JCheckBoxMenuItem ( " Arrayiter " ) ;
public final JCheckBoxMenuItem collectioniter = new JCheckBoxMenuItem ( " Collectioniter " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem innerClasses = new JCheckBoxMenuItem ( " Inner Classes " ) ;
public final JCheckBoxMenuItem removeBoilerPlate = new JCheckBoxMenuItem ( " Remove Boiler Plate " ) ;
public final JCheckBoxMenuItem removeInnerClassSynthetics = new JCheckBoxMenuItem ( " Remove Inner Class Synthetics " ) ;
public final JCheckBoxMenuItem decodeLambdas = new JCheckBoxMenuItem ( " Decode Lambdas " ) ;
public final JCheckBoxMenuItem hideBridgeMethods = new JCheckBoxMenuItem ( " Hide Bridge Methods " ) ;
public final JCheckBoxMenuItem liftConstructorInit = new JCheckBoxMenuItem ( " Lift Constructor Init " ) ;
public final JCheckBoxMenuItem removeDeadMethods = new JCheckBoxMenuItem ( " Remove Dead Methods " ) ;
public final JCheckBoxMenuItem removeBadGenerics = new JCheckBoxMenuItem ( " Remove Bad Generics " ) ;
public final JCheckBoxMenuItem sugarAsserts = new JCheckBoxMenuItem ( " Sugar Asserts " ) ;
public final JCheckBoxMenuItem sugarBoxing = new JCheckBoxMenuItem ( " Sugar Boxing " ) ;
public final JCheckBoxMenuItem showVersion = new JCheckBoxMenuItem ( " Show Version " ) ;
public final JCheckBoxMenuItem decodeFinally = new JCheckBoxMenuItem ( " Decode Finally " ) ;
public final JCheckBoxMenuItem tidyMonitors = new JCheckBoxMenuItem ( " Tidy Monitors " ) ;
2018-01-31 15:41:24 +00:00
public final JCheckBoxMenuItem lenient = new JCheckBoxMenuItem ( " Lenient " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem dumpClassPath = new JCheckBoxMenuItem ( " Dump Classpath " ) ;
2018-01-31 15:41:24 +00:00
public final JCheckBoxMenuItem comments = new JCheckBoxMenuItem ( " Comments " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem forceTopSort = new JCheckBoxMenuItem ( " Force Top Sort " ) ;
public final JCheckBoxMenuItem forceTopSortAggress = new JCheckBoxMenuItem ( " Force Top Sort Aggress " ) ;
2021-06-21 23:37:55 +00:00
public final JCheckBoxMenuItem forceExceptionPrune = new JCheckBoxMenuItem ( " Force Exception Prune " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem stringBuffer = new JCheckBoxMenuItem ( " String Buffer " ) ;
public final JCheckBoxMenuItem stringBuilder = new JCheckBoxMenuItem ( " String Builder " ) ;
2018-01-31 15:41:24 +00:00
public final JCheckBoxMenuItem silent = new JCheckBoxMenuItem ( " Silent " ) ;
public final JCheckBoxMenuItem recover = new JCheckBoxMenuItem ( " Recover " ) ;
public final JCheckBoxMenuItem eclipse = new JCheckBoxMenuItem ( " Eclipse " ) ;
public final JCheckBoxMenuItem override = new JCheckBoxMenuItem ( " Override " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem showInferrable = new JCheckBoxMenuItem ( " Show Inferrable " ) ;
2018-01-31 15:41:24 +00:00
public final JCheckBoxMenuItem aexagg = new JCheckBoxMenuItem ( " Aexagg " ) ;
2021-06-21 22:45:00 +00:00
public final JCheckBoxMenuItem forceCondPropagate = new JCheckBoxMenuItem ( " Force Cond Propagate " ) ;
public final JCheckBoxMenuItem hideUTF = new JCheckBoxMenuItem ( " Hide UTF " ) ;
public final JCheckBoxMenuItem hideLongStrings = new JCheckBoxMenuItem ( " Hide Long Strings " ) ;
public final JCheckBoxMenuItem commentMonitor = new JCheckBoxMenuItem ( " Comment Monitors " ) ;
public final JCheckBoxMenuItem allowCorrecting = new JCheckBoxMenuItem ( " Allow Correcting " ) ;
public final JCheckBoxMenuItem labelledBlocks = new JCheckBoxMenuItem ( " Labelled Blocks " ) ;
public final JCheckBoxMenuItem j14ClassOBJ = new JCheckBoxMenuItem ( " J14ClassOBJ " ) ;
public final JCheckBoxMenuItem hideLangImports = new JCheckBoxMenuItem ( " Hide Lang Imports " ) ;
public final JCheckBoxMenuItem recoveryTypeClash = new JCheckBoxMenuItem ( " Recover Type Clash " ) ;
public final JCheckBoxMenuItem recoveryTypehInts = new JCheckBoxMenuItem ( " Recover Type Hints " ) ;
public final JCheckBoxMenuItem forceTurningIFs = new JCheckBoxMenuItem ( " Force Returning IFs " ) ;
public final JCheckBoxMenuItem forLoopAGGCapture = new JCheckBoxMenuItem ( " For Loop AGG Capture " ) ;
2021-06-26 12:15:53 +00:00
2021-06-21 23:37:55 +00:00
//obfuscation
2021-06-21 22:45:00 +00:00
public final JMenu obfuscate = new JMenu ( " Obfuscate " ) ;
public final JMenuItem renameFields = new JMenuItem ( " Rename Fields " ) ;
public final JMenuItem renameMethods = new JMenuItem ( " Rename Methods " ) ;
public final JMenuItem moveAllClassesIntoRoot = new JMenuItem ( " Move All Classes Into Root Package " ) ;
public final JMenuItem controlFlow = new JMenuItem ( " Control Flow " ) ;
public final JMenuItem junkCode = new JMenuItem ( " Junk Code " ) ;
2018-01-31 15:41:24 +00:00
public final ButtonGroup obfuscatorGroup = new ButtonGroup ( ) ;
2019-04-17 06:45:15 +00:00
public final JRadioButtonMenuItem strongObf = new JRadioButtonMenuItem ( " Strong Obfuscation " ) ;
public final JRadioButtonMenuItem lightObf = new JRadioButtonMenuItem ( " Light Obfuscation " ) ;
2021-06-21 22:45:00 +00:00
public final JMenuItem renameClasses = new JMenuItem ( " Rename Classes " ) ;
2018-01-31 15:41:24 +00:00
2021-06-21 14:55:18 +00:00
public MainViewerGUI ( )
{
2021-07-13 10:37:28 +00:00
setIconImages ( IconResources . iconList ) ;
2021-07-08 00:52:25 +00:00
setSize ( new Dimension ( 800 , 488 ) ) ;
2021-06-21 22:45:00 +00:00
2019-04-25 21:27:35 +00:00
setDefaultCloseOperation ( JFrame . DO_NOTHING_ON_CLOSE ) ;
2021-06-21 22:45:00 +00:00
KeyboardFocusManager . getCurrentKeyboardFocusManager ( ) . addKeyEventDispatcher ( new KeyEventDispatch ( ) ) ;
addWindowStateListener ( new WindowStateChangeAdapter ( this ) ) ;
addWindowListener ( new WindowClosingAdapter ( ) ) ;
2018-01-31 15:41:24 +00:00
2021-06-21 14:55:18 +00:00
buildMenuBar ( ) ;
2021-06-21 22:45:00 +00:00
buildFileMenu ( ) ;
buildViewMenu ( ) ;
buildSettingsMenu ( ) ;
buildPluginMenu ( ) ;
buildObfuscateMenu ( ) ;
defaultSettings ( ) ;
2021-06-21 20:19:46 +00:00
2021-06-21 22:45:00 +00:00
setTitle ( " Bytecode Viewer " + VERSION + " - https://bytecodeviewer.com | https://the.bytecode.club - @Konloch " ) ;
2018-01-31 15:41:24 +00:00
2021-06-21 11:13:11 +00:00
getContentPane ( ) . setLayout ( new BoxLayout ( getContentPane ( ) , BoxLayout . X_AXIS ) ) ;
2018-01-31 15:41:24 +00:00
2021-06-21 22:45:00 +00:00
resourcePane . setMinimumSize ( new Dimension ( 200 , 50 ) ) ;
2021-06-21 23:37:55 +00:00
resourcePane . setPreferredSize ( new Dimension ( 200 , 50 ) ) ;
resourcePane . setMaximumSize ( new Dimension ( 200 , 2147483647 ) ) ;
2021-06-21 22:45:00 +00:00
searchBoxPane . setPreferredSize ( new Dimension ( 200 , 50 ) ) ;
searchBoxPane . setMinimumSize ( new Dimension ( 200 , 50 ) ) ;
searchBoxPane . setMaximumSize ( new Dimension ( 200 , 2147483647 ) ) ;
2021-06-21 23:37:55 +00:00
2021-06-21 22:45:00 +00:00
splitPane1 = new JSplitPane ( JSplitPane . VERTICAL_SPLIT , resourcePane , searchBoxPane ) ;
splitPane2 = new JSplitPane ( JSplitPane . HORIZONTAL_SPLIT , splitPane1 , workPane ) ;
getContentPane ( ) . add ( splitPane2 ) ;
splitPane2 . setResizeWeight ( 0 . 05 ) ;
splitPane1 . setResizeWeight ( 0 . 5 ) ;
2021-06-21 23:37:55 +00:00
2021-06-21 22:45:00 +00:00
uiComponents . add ( resourcePane ) ;
uiComponents . add ( searchBoxPane ) ;
uiComponents . add ( workPane ) ;
2019-04-17 06:45:15 +00:00
2021-07-11 08:44:37 +00:00
viewPane1 . setDefault ( ) ;
viewPane2 . setDefault ( ) ;
viewPane3 . setDefault ( ) ;
2018-01-31 15:41:24 +00:00
this . setLocationRelativeTo ( null ) ;
}
2021-06-21 14:55:18 +00:00
public void buildMenuBar ( )
{
setJMenuBar ( rootMenu ) ;
}
2021-06-21 22:45:00 +00:00
public void buildFileMenu ( )
2021-06-21 14:55:18 +00:00
{
2021-06-21 22:45:00 +00:00
rootMenu . add ( fileMainMenu ) ;
2021-06-21 14:55:18 +00:00
fileMainMenu . add ( addResource ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
fileMainMenu . add ( newWorkSpace ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
fileMainMenu . add ( reloadResources ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
fileMainMenu . add ( runButton ) ;
fileMainMenu . add ( compileButton ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
fileMainMenu . add ( saveAsRunnableJar ) ;
//fileMainMenuBar.add(mntmSaveAsAPK);
fileMainMenu . add ( saveAsDex ) ;
fileMainMenu . add ( saveAsZip ) ;
fileMainMenu . add ( decompileSaveOpened ) ;
fileMainMenu . add ( decompileSaveAll ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
fileMainMenu . add ( recentFilesSecondaryMenu ) ;
fileMainMenu . add ( new JSeparator ( ) ) ;
2021-06-21 22:45:00 +00:00
fileMainMenu . add ( about ) ;
fileMainMenu . add ( exit ) ;
2021-06-21 14:55:18 +00:00
saveAsZip . setActionCommand ( " " ) ;
addResource . addActionListener ( e - > selectFile ( ) ) ;
2021-07-06 22:57:42 +00:00
newWorkSpace . addActionListener ( e - > BytecodeViewer . resetWorkspace ( true ) ) ;
2021-06-21 14:55:18 +00:00
reloadResources . addActionListener ( arg0 - > reloadResources ( ) ) ;
runButton . addActionListener ( e - > runResources ( ) ) ;
compileButton . addActionListener ( arg0 - > compileOnNewThread ( ) ) ;
2021-06-27 20:41:38 +00:00
saveAsRunnableJar . addActionListener ( e - > Export . RUNNABLE_JAR . getExporter ( ) . promptForExport ( ) ) ;
saveAsAPK . addActionListener ( arg0 - > Export . APK . getExporter ( ) . promptForExport ( ) ) ;
saveAsDex . addActionListener ( arg0 - > Export . DEX . getExporter ( ) . promptForExport ( ) ) ;
saveAsZip . addActionListener ( arg0 - > Export . ZIP . getExporter ( ) . promptForExport ( ) ) ;
2021-06-21 14:55:18 +00:00
decompileSaveAll . addActionListener ( arg0 - > ResourceDecompiling . decompileSaveAll ( ) ) ;
decompileSaveOpened . addActionListener ( arg0 - > ResourceDecompiling . decompileSaveOpenedOnly ( ) ) ;
2021-07-07 09:00:14 +00:00
about . addActionListener ( arg0 - > new AboutWindow ( ) . setVisible ( true ) ) ;
2021-06-21 22:45:00 +00:00
exit . addActionListener ( arg0 - > askBeforeExiting ( ) ) ;
2021-06-21 14:55:18 +00:00
}
2021-06-21 22:45:00 +00:00
public void buildViewMenu ( )
2021-06-21 14:55:18 +00:00
{
2021-06-21 22:45:00 +00:00
rootMenu . add ( viewMainMenu ) ;
2021-06-26 01:13:46 +00:00
viewMainMenu . add ( visualSettings ) ;
2021-07-11 08:44:37 +00:00
viewMainMenu . add ( viewPane1 . getMenu ( ) ) ;
viewMainMenu . add ( viewPane2 . getMenu ( ) ) ;
viewMainMenu . add ( viewPane3 . getMenu ( ) ) ;
2021-06-21 14:55:18 +00:00
}
2021-06-21 19:39:46 +00:00
2021-06-21 22:45:00 +00:00
public void buildSettingsMenu ( )
2021-06-21 20:19:46 +00:00
{
rootMenu . add ( settingsMainMenu ) ;
2021-06-26 01:13:46 +00:00
//settingsMainMenu.add(visualSettings);
//settingsMainMenu.add(new JSeparator());
2021-06-21 20:19:46 +00:00
settingsMainMenu . add ( compileOnSave ) ;
settingsMainMenu . add ( autoCompileOnRefresh ) ;
settingsMainMenu . add ( refreshOnChange ) ;
settingsMainMenu . add ( new JSeparator ( ) ) ;
settingsMainMenu . add ( decodeAPKResources ) ;
2021-06-21 22:45:00 +00:00
settingsMainMenu . add ( apkConversion ) ;
apkConversion . add ( apkConversionDex ) ;
apkConversion . add ( apkConversionEnjarify ) ;
apkConversionGroup . add ( apkConversionDex ) ;
apkConversionGroup . add ( apkConversionEnjarify ) ;
apkConversionGroup . setSelected ( apkConversionDex . getModel ( ) , true ) ;
2021-06-21 20:19:46 +00:00
settingsMainMenu . add ( new JSeparator ( ) ) ;
2021-06-21 22:45:00 +00:00
settingsMainMenu . add ( updateCheck ) ;
2021-06-21 20:19:46 +00:00
settingsMainMenu . add ( forcePureAsciiAsText ) ;
settingsMainMenu . add ( new JSeparator ( ) ) ;
2021-06-21 22:45:00 +00:00
settingsMainMenu . add ( setPython2 ) ;
settingsMainMenu . add ( setPython3 ) ;
settingsMainMenu . add ( setJRERT ) ;
settingsMainMenu . add ( setOptionalLibrary ) ;
settingsMainMenu . add ( setJavac ) ;
2021-06-21 20:19:46 +00:00
settingsMainMenu . add ( new JSeparator ( ) ) ;
2021-07-07 09:00:14 +00:00
fontSpinner . setPreferredSize ( new Dimension ( 60 , 24 ) ) ;
fontSpinner . setMinimumSize ( new Dimension ( 60 , 24 ) ) ;
2021-06-21 22:45:00 +00:00
fontSpinner . setModel ( new SpinnerNumberModel ( 12 , 1 , null , 1 ) ) ;
fontSize . add ( fontSpinner ) ;
2021-06-26 01:13:46 +00:00
ButtonGroup rstaGroup = new ButtonGroup ( ) ;
for ( RSTATheme t : RSTATheme . values ( ) )
{
2021-06-30 22:19:54 +00:00
JRadioButtonMenuItem item = new TranslatedJRadioButtonMenuItem ( t . getReadableName ( ) , t . getTranslation ( ) ) ;
2021-06-26 01:13:46 +00:00
if ( Configuration . rstaTheme . equals ( t ) )
item . setSelected ( true ) ;
rstaGroup . add ( item ) ;
item . addActionListener ( e - >
{
Configuration . rstaTheme = t ;
item . setSelected ( true ) ;
2021-07-01 09:06:12 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-07-13 10:37:28 +00:00
updateTabTheme ( ) ;
2021-06-26 01:13:46 +00:00
} ) ;
rstaThemes . put ( t , item ) ;
rstaTheme . add ( item ) ;
}
ButtonGroup lafGroup = new ButtonGroup ( ) ;
for ( LAFTheme theme : LAFTheme . values ( ) )
{
2021-06-30 22:19:54 +00:00
JRadioButtonMenuItem item = new TranslatedJRadioButtonMenuItem ( theme . getReadableName ( ) , theme . getTranslation ( ) ) ;
2021-06-26 01:13:46 +00:00
if ( Configuration . lafTheme . equals ( theme ) )
item . setSelected ( true ) ;
lafGroup . add ( item ) ;
item . addActionListener ( e - >
{
Configuration . lafTheme = theme ;
Configuration . rstaTheme = theme . getRSTATheme ( ) ;
rstaThemes . get ( Configuration . rstaTheme ) . setSelected ( true ) ;
item . setSelected ( true ) ;
2021-07-01 09:06:12 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-06-29 00:47:32 +00:00
try
{
theme . setLAF ( ) ;
2021-07-13 10:37:28 +00:00
updateTabTheme ( ) ;
2021-06-29 00:47:32 +00:00
}
catch ( Exception ex )
{
ex . printStackTrace ( ) ;
}
2021-06-26 01:13:46 +00:00
} ) ;
lafThemes . put ( theme , item ) ;
lafTheme . add ( item ) ;
}
2021-06-29 09:41:08 +00:00
ButtonGroup languageGroup = new ButtonGroup ( ) ;
for ( Language l : Language . values ( ) )
{
JRadioButtonMenuItem item = new JRadioButtonMenuItem ( l . getReadableName ( ) ) ;
if ( Configuration . language . equals ( l ) )
item . setSelected ( true ) ;
languageGroup . add ( item ) ;
item . addActionListener ( e - >
{
2021-07-01 09:06:12 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-06-29 09:41:08 +00:00
MiscUtils . setLanguage ( l ) ;
} ) ;
languages . put ( l , item ) ;
language . add ( item ) ;
}
2021-06-26 01:13:46 +00:00
visualSettings . add ( lafTheme ) ;
visualSettings . add ( rstaTheme ) ;
2021-06-29 09:41:08 +00:00
visualSettings . add ( language ) ;
2021-06-21 22:45:00 +00:00
visualSettings . add ( fontSize ) ;
visualSettings . add ( showFileInTabTitle ) ;
2021-06-26 01:13:46 +00:00
visualSettings . add ( simplifyNameInTabTitle ) ;
2021-06-21 22:45:00 +00:00
visualSettings . add ( synchronizedViewing ) ;
visualSettings . add ( showClassMethods ) ;
//PROCYON SETTINGS
2021-06-22 18:05:25 +00:00
settingsMainMenu . add ( procyonSettingsSecondaryMenu ) ;
procyonSettingsSecondaryMenu . add ( alwaysGenerateExceptionVars ) ;
procyonSettingsSecondaryMenu . add ( excludeNestedTypes ) ;
procyonSettingsSecondaryMenu . add ( showDebugLineNumbers ) ;
procyonSettingsSecondaryMenu . add ( includeLineNumbersInBytecode ) ;
procyonSettingsSecondaryMenu . add ( includeErrorDiagnostics ) ;
procyonSettingsSecondaryMenu . add ( showSyntheticMembers ) ;
procyonSettingsSecondaryMenu . add ( simplifyMemberReferences ) ;
procyonSettingsSecondaryMenu . add ( mergeVariables ) ;
procyonSettingsSecondaryMenu . add ( forceExplicitTypeArguments ) ;
procyonSettingsSecondaryMenu . add ( forceExplicitImports ) ;
procyonSettingsSecondaryMenu . add ( flattenSwitchBlocks ) ;
procyonSettingsSecondaryMenu . add ( retainPointlessSwitches ) ;
procyonSettingsSecondaryMenu . add ( retainRedunantCasts ) ;
procyonSettingsSecondaryMenu . add ( unicodeOutputEnabled ) ;
2021-06-21 22:45:00 +00:00
//CFR SETTINGS
settingsMainMenu . add ( cfrSettingsSecondaryMenu ) ;
cfrSettingsSecondaryMenu . add ( decodeEnumSwitch ) ;
cfrSettingsSecondaryMenu . add ( sugarEnums ) ;
cfrSettingsSecondaryMenu . add ( decodeStringSwitch ) ;
cfrSettingsSecondaryMenu . add ( arrayiter ) ;
cfrSettingsSecondaryMenu . add ( collectioniter ) ;
cfrSettingsSecondaryMenu . add ( innerClasses ) ;
cfrSettingsSecondaryMenu . add ( removeBoilerPlate ) ;
cfrSettingsSecondaryMenu . add ( removeInnerClassSynthetics ) ;
cfrSettingsSecondaryMenu . add ( decodeLambdas ) ;
cfrSettingsSecondaryMenu . add ( hideBridgeMethods ) ;
cfrSettingsSecondaryMenu . add ( liftConstructorInit ) ;
cfrSettingsSecondaryMenu . add ( removeDeadMethods ) ;
cfrSettingsSecondaryMenu . add ( removeBadGenerics ) ;
cfrSettingsSecondaryMenu . add ( sugarAsserts ) ;
cfrSettingsSecondaryMenu . add ( sugarBoxing ) ;
cfrSettingsSecondaryMenu . add ( showVersion ) ;
cfrSettingsSecondaryMenu . add ( decodeFinally ) ;
cfrSettingsSecondaryMenu . add ( tidyMonitors ) ;
cfrSettingsSecondaryMenu . add ( lenient ) ;
cfrSettingsSecondaryMenu . add ( dumpClassPath ) ;
cfrSettingsSecondaryMenu . add ( comments ) ;
cfrSettingsSecondaryMenu . add ( forceTopSort ) ;
cfrSettingsSecondaryMenu . add ( forceTopSortAggress ) ;
cfrSettingsSecondaryMenu . add ( forceExceptionPrune ) ;
cfrSettingsSecondaryMenu . add ( stringBuffer ) ;
cfrSettingsSecondaryMenu . add ( stringBuilder ) ;
cfrSettingsSecondaryMenu . add ( silent ) ;
cfrSettingsSecondaryMenu . add ( recover ) ;
cfrSettingsSecondaryMenu . add ( eclipse ) ;
cfrSettingsSecondaryMenu . add ( override ) ;
cfrSettingsSecondaryMenu . add ( showInferrable ) ;
cfrSettingsSecondaryMenu . add ( aexagg ) ;
cfrSettingsSecondaryMenu . add ( forceCondPropagate ) ;
cfrSettingsSecondaryMenu . add ( hideUTF ) ;
cfrSettingsSecondaryMenu . add ( hideLongStrings ) ;
cfrSettingsSecondaryMenu . add ( commentMonitor ) ;
cfrSettingsSecondaryMenu . add ( allowCorrecting ) ;
cfrSettingsSecondaryMenu . add ( labelledBlocks ) ;
cfrSettingsSecondaryMenu . add ( j14ClassOBJ ) ;
cfrSettingsSecondaryMenu . add ( hideLangImports ) ;
cfrSettingsSecondaryMenu . add ( recoveryTypeClash ) ;
cfrSettingsSecondaryMenu . add ( recoveryTypehInts ) ;
cfrSettingsSecondaryMenu . add ( forceTurningIFs ) ;
cfrSettingsSecondaryMenu . add ( forLoopAGGCapture ) ;
//FERNFLOWER SETTINGS
settingsMainMenu . add ( fernFlowerSettingsSecondaryMenu ) ;
fernFlowerSettingsSecondaryMenu . add ( dc4 ) ;
fernFlowerSettingsSecondaryMenu . add ( nns ) ;
fernFlowerSettingsSecondaryMenu . add ( ner ) ;
fernFlowerSettingsSecondaryMenu . add ( bto ) ;
fernFlowerSettingsSecondaryMenu . add ( rgn ) ;
fernFlowerSettingsSecondaryMenu . add ( rer ) ;
fernFlowerSettingsSecondaryMenu . add ( rbr ) ;
fernFlowerSettingsSecondaryMenu . add ( rsy ) ;
fernFlowerSettingsSecondaryMenu . add ( hes ) ;
fernFlowerSettingsSecondaryMenu . add ( hdc ) ;
fernFlowerSettingsSecondaryMenu . add ( din ) ;
fernFlowerSettingsSecondaryMenu . add ( das ) ;
fernFlowerSettingsSecondaryMenu . add ( dgs ) ;
fernFlowerSettingsSecondaryMenu . add ( den ) ;
fernFlowerSettingsSecondaryMenu . add ( uto ) ;
fernFlowerSettingsSecondaryMenu . add ( udv ) ;
fernFlowerSettingsSecondaryMenu . add ( fdi ) ;
fernFlowerSettingsSecondaryMenu . add ( asc ) ;
fernFlowerSettingsSecondaryMenu . add ( ren ) ;
//CFIDE SETTINGS
settingsMainMenu . add ( bytecodeDecompilerSettingsSecondaryMenu ) ;
bytecodeDecompilerSettingsSecondaryMenu . add ( debugHelpers ) ;
bytecodeDecompilerSettingsSecondaryMenu . add ( appendBracketsToLabels ) ;
deleteForeignOutdatedLibs . addActionListener ( arg0 - > showForeignLibraryWarning ( ) ) ;
2021-07-01 09:06:12 +00:00
forcePureAsciiAsText . addActionListener ( arg0 - > SettingsSerializer . saveSettingsAsync ( ) ) ;
2021-07-11 12:33:18 +00:00
setPython2 . addActionListener ( arg0 - > ExternalResources . getSingleton ( ) . selectPython2 ( ) ) ;
setJRERT . addActionListener ( arg0 - > ExternalResources . getSingleton ( ) . selectJRERTLibrary ( ) ) ;
setPython3 . addActionListener ( arg0 - > ExternalResources . getSingleton ( ) . selectPython3 ( ) ) ;
setOptionalLibrary . addActionListener ( arg0 - > ExternalResources . getSingleton ( ) . selectOptionalLibraryFolder ( ) ) ;
setJavac . addActionListener ( arg0 - > ExternalResources . getSingleton ( ) . selectJavac ( ) ) ;
2021-06-21 22:45:00 +00:00
showFileInTabTitle . addActionListener ( arg0 - > {
Configuration . displayParentInTab = BytecodeViewer . viewer . showFileInTabTitle . isSelected ( ) ;
2021-07-01 09:06:12 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-06-26 12:26:12 +00:00
BytecodeViewer . refreshAllTabTitles ( ) ;
2021-06-21 22:45:00 +00:00
} ) ;
2021-06-26 01:13:46 +00:00
simplifyNameInTabTitle . addActionListener ( arg0 - > {
Configuration . simplifiedTabNames = BytecodeViewer . viewer . simplifyNameInTabTitle . isSelected ( ) ;
2021-07-01 09:06:12 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-06-26 12:26:12 +00:00
BytecodeViewer . refreshAllTabTitles ( ) ;
2021-06-26 01:13:46 +00:00
} ) ;
2021-06-21 20:19:46 +00:00
}
2021-06-21 22:45:00 +00:00
public void buildPluginMenu ( )
2021-06-21 19:39:46 +00:00
{
rootMenu . add ( pluginsMainMenu ) ;
pluginsMainMenu . add ( openExternalPlugin ) ;
pluginsMainMenu . add ( new JSeparator ( ) ) ;
pluginsMainMenu . add ( recentPluginsSecondaryMenu ) ;
pluginsMainMenu . add ( new JSeparator ( ) ) ;
2021-07-01 21:54:10 +00:00
pluginsMainMenu . add ( newJavaPlugin ) ;
pluginsMainMenu . add ( newJavascriptPlugin ) ;
2021-07-11 12:33:18 +00:00
pluginsMainMenu . add ( new JSeparator ( ) ) ; //android specific plugins first
pluginsMainMenu . add ( viewAPKAndroidPermissions ) ;
2021-07-01 21:54:10 +00:00
pluginsMainMenu . add ( new JSeparator ( ) ) ;
2021-07-11 12:33:18 +00:00
pluginsMainMenu . add ( viewManifest ) ;
2021-06-21 19:39:46 +00:00
pluginsMainMenu . add ( codeSequenceDiagram ) ;
pluginsMainMenu . add ( maliciousCodeScanner ) ;
pluginsMainMenu . add ( showMainMethods ) ;
pluginsMainMenu . add ( showAllStrings ) ;
pluginsMainMenu . add ( replaceStrings ) ;
pluginsMainMenu . add ( stackFramesRemover ) ;
2021-07-13 10:37:28 +00:00
pluginsMainMenu . add ( changeClassFileVersions ) ;
2021-06-29 16:33:23 +00:00
2021-07-11 12:33:18 +00:00
//allatori is disabled since they are just placeholders
//ZKM and ZStringArray decrypter are disabled until deobfuscation has been extended
2021-06-21 19:39:46 +00:00
//mnNewMenu_1.add(mntmNewMenuItem_2);
//mnNewMenu_1.add(mntmStartZkmString);
2021-07-11 12:33:18 +00:00
//pluginsMainMenu.add(zStringArrayDecrypter);
2021-06-21 20:19:46 +00:00
openExternalPlugin . addActionListener ( arg0 - > openExternalPlugin ( ) ) ;
2021-07-01 21:54:10 +00:00
newJavaPlugin . addActionListener ( arg0 - > PluginTemplate . JAVA . openEditorExceptionHandled ( ) ) ;
newJavascriptPlugin . addActionListener ( arg0 - > PluginTemplate . JAVASCRIPT . openEditorExceptionHandled ( ) ) ;
2021-06-21 20:19:46 +00:00
codeSequenceDiagram . addActionListener ( arg0 - > CodeSequenceDiagram . open ( ) ) ;
2021-06-28 07:41:33 +00:00
maliciousCodeScanner . addActionListener ( e - > MaliciousCodeScannerOptions . open ( ) ) ;
2021-06-21 20:19:46 +00:00
showMainMethods . addActionListener ( e - > PluginManager . runPlugin ( new ShowMainMethods ( ) ) ) ;
showAllStrings . addActionListener ( e - > PluginManager . runPlugin ( new ShowAllStrings ( ) ) ) ;
replaceStrings . addActionListener ( arg0 - > ReplaceStringsOptions . open ( ) ) ;
stackFramesRemover . addActionListener ( e - > PluginManager . runPlugin ( new StackFramesRemover ( ) ) ) ;
2021-06-28 04:31:24 +00:00
allatoriStringDecrypter . addActionListener ( e - > PluginManager . runPlugin ( new AllatoriStringDecrypter . AllatoriStringDecrypterOptions ( ) ) ) ;
2021-06-21 20:19:46 +00:00
ZKMStringDecrypter . addActionListener ( e - > PluginManager . runPlugin ( new ZKMStringDecrypter ( ) ) ) ;
zStringArrayDecrypter . addActionListener ( arg0 - > PluginManager . runPlugin ( new ZStringArrayDecrypter ( ) ) ) ;
2021-07-11 12:33:18 +00:00
viewAPKAndroidPermissions . addActionListener ( arg0 - > PluginManager . runPlugin ( new ViewAPKAndroidPermissions ( ) ) ) ;
viewManifest . addActionListener ( arg0 - > PluginManager . runPlugin ( new ViewManifest ( ) ) ) ;
2021-07-13 10:37:28 +00:00
changeClassFileVersions . addActionListener ( arg0 - > PluginManager . runPlugin ( new ChangeClassFileVersions ( ) ) ) ;
2021-06-21 19:39:46 +00:00
}
2021-06-21 22:45:00 +00:00
public void buildObfuscateMenu ( )
{
//hide obfuscation menu since it's currently not being used
obfuscate . setVisible ( false ) ;
rootMenu . add ( obfuscate ) ;
obfuscate . add ( strongObf ) ;
obfuscate . add ( lightObf ) ;
obfuscate . add ( new JSeparator ( ) ) ;
obfuscate . add ( moveAllClassesIntoRoot ) ;
obfuscate . add ( renameFields ) ;
obfuscate . add ( renameMethods ) ;
obfuscate . add ( renameClasses ) ;
obfuscate . add ( controlFlow ) ;
obfuscate . add ( junkCode ) ;
obfuscatorGroup . add ( strongObf ) ;
obfuscatorGroup . add ( lightObf ) ;
obfuscatorGroup . setSelected ( strongObf . getModel ( ) , true ) ;
renameFields . addActionListener ( arg0 - > RenameFields . open ( ) ) ;
renameClasses . addActionListener ( arg0 - > RenameClasses . open ( ) ) ;
renameMethods . addActionListener ( arg0 - > RenameMethods . open ( ) ) ;
}
public void defaultSettings ( )
{
compileOnSave . setSelected ( false ) ;
2021-07-05 02:07:34 +00:00
autoCompileOnRefresh . setSelected ( true ) ;
2021-06-21 22:45:00 +00:00
decodeAPKResources . setSelected ( true ) ;
updateCheck . setSelected ( true ) ;
forcePureAsciiAsText . setSelected ( true ) ;
showSyntheticMembers . setSelected ( true ) ;
showFileInTabTitle . setSelected ( false ) ;
showClassMethods . setSelected ( false ) ;
2021-06-26 03:33:06 +00:00
simplifyNameInTabTitle . setEnabled ( true ) ;
2021-06-21 22:45:00 +00:00
moveAllClassesIntoRoot . setEnabled ( false ) ;
controlFlow . setEnabled ( false ) ;
junkCode . setEnabled ( false ) ;
// cfr
decodeEnumSwitch . setSelected ( true ) ;
sugarEnums . setSelected ( true ) ;
decodeStringSwitch . setSelected ( true ) ;
arrayiter . setSelected ( true ) ;
collectioniter . setSelected ( true ) ;
innerClasses . setSelected ( true ) ;
removeBoilerPlate . setSelected ( true ) ;
removeInnerClassSynthetics . setSelected ( true ) ;
decodeLambdas . setSelected ( true ) ;
hideBridgeMethods . setSelected ( true ) ;
liftConstructorInit . setSelected ( true ) ;
removeDeadMethods . setSelected ( true ) ;
removeBadGenerics . setSelected ( true ) ;
sugarAsserts . setSelected ( true ) ;
sugarBoxing . setSelected ( true ) ;
showVersion . setSelected ( true ) ;
decodeFinally . setSelected ( true ) ;
tidyMonitors . setSelected ( true ) ;
lenient . setSelected ( false ) ;
dumpClassPath . setSelected ( false ) ;
comments . setSelected ( true ) ;
forceTopSort . setSelected ( true ) ;
forceTopSortAggress . setSelected ( true ) ;
forceExceptionPrune . setSelected ( true ) ;
stringBuffer . setSelected ( false ) ;
stringBuilder . setSelected ( true ) ;
silent . setSelected ( true ) ;
recover . setSelected ( true ) ;
eclipse . setSelected ( true ) ;
override . setSelected ( true ) ;
showInferrable . setSelected ( true ) ;
aexagg . setSelected ( true ) ;
forceCondPropagate . setSelected ( true ) ;
hideUTF . setSelected ( true ) ;
hideLongStrings . setSelected ( false ) ;
commentMonitor . setSelected ( false ) ;
allowCorrecting . setSelected ( true ) ;
labelledBlocks . setSelected ( true ) ;
j14ClassOBJ . setSelected ( false ) ;
hideLangImports . setSelected ( true ) ;
recoveryTypeClash . setSelected ( true ) ;
recoveryTypehInts . setSelected ( true ) ;
forceTurningIFs . setSelected ( true ) ;
forLoopAGGCapture . setSelected ( true ) ;
// fernflower
rbr . setSelected ( true ) ;
rsy . setSelected ( false ) ;
din . setSelected ( true ) ;
das . setSelected ( true ) ;
dgs . setSelected ( false ) ;
den . setSelected ( true ) ;
uto . setSelected ( true ) ;
udv . setSelected ( true ) ;
fdi . setSelected ( true ) ;
asc . setSelected ( false ) ;
ren . setSelected ( false ) ;
dc4 . setSelected ( true ) ;
nns . setSelected ( true ) ;
ner . setSelected ( true ) ;
bto . setSelected ( true ) ;
rgn . setSelected ( true ) ;
rer . setSelected ( true ) ;
hes . setSelected ( true ) ;
hdc . setSelected ( true ) ;
//CFIDE
debugHelpers . setSelected ( true ) ;
appendBracketsToLabels . setSelected ( true ) ;
}
2021-06-26 12:15:53 +00:00
public void calledAfterLoad ( ) {
deleteForeignOutdatedLibs . setSelected ( Configuration . deleteForeignLibraries ) ;
}
2021-06-29 18:31:38 +00:00
public synchronized void clearBusyStatus ( )
{
2021-07-01 09:06:12 +00:00
SwingUtilities . invokeLater ( ( ) - >
2021-06-29 18:31:38 +00:00
{
2021-07-04 09:25:16 +00:00
int length = waitIcons . size ( ) ;
for ( int i = 0 ; i < length ; i + + )
updateBusyStatus ( false ) ;
2021-07-01 09:06:12 +00:00
} ) ;
2021-06-29 18:31:38 +00:00
}
2021-06-26 12:15:53 +00:00
public synchronized void updateBusyStatus ( final boolean busy ) {
2021-07-04 09:25:16 +00:00
SwingUtilities . invokeLater ( ( ) - >
{
if ( busy )
{
2021-07-04 10:23:14 +00:00
JMenuItem waitIcon = new WaitBusyIcon ( ) ;
2021-07-04 09:25:16 +00:00
rootMenu . add ( waitIcon ) ;
waitIcons . add ( waitIcon ) ;
}
else
{
if ( waitIcons . isEmpty ( ) )
return ;
JMenuItem waitIcon = waitIcons . get ( 0 ) ;
waitIcons . remove ( 0 ) ;
rootMenu . remove ( waitIcon ) ;
2021-07-07 10:39:29 +00:00
//re-enable the Refresh Button incase it gets stuck
if ( waitIcons . isEmpty ( ) & & ! workPane . refreshClass . isEnabled ( ) )
workPane . refreshClass . setEnabled ( true ) ;
2021-06-26 12:15:53 +00:00
}
2021-07-04 09:25:16 +00:00
rootMenu . updateUI ( ) ;
2021-06-26 12:15:53 +00:00
} ) ;
}
2018-01-31 15:41:24 +00:00
2021-07-11 08:44:37 +00:00
public void openClassFile ( final ResourceContainer container , final String name , final ClassNode cn ) {
2021-06-26 12:15:53 +00:00
workPane . addClassResource ( container , name , cn ) ;
2018-01-31 15:41:24 +00:00
}
2021-07-11 08:44:37 +00:00
public void openFile ( final ResourceContainer container , final String name , byte [ ] content ) {
2021-06-26 12:15:53 +00:00
workPane . addFileResource ( container , name , content ) ;
2018-01-31 15:41:24 +00:00
}
2021-06-21 14:55:18 +00:00
2021-06-26 04:10:32 +00:00
public void compileOnNewThread ( )
2021-06-21 14:55:18 +00:00
{
2021-07-05 03:37:01 +00:00
Thread t = new Thread ( ( ) - > BytecodeViewer . compile ( true , true ) , " Compile " ) ;
2021-06-26 04:10:32 +00:00
t . start ( ) ;
}
2021-06-21 14:55:18 +00:00
2021-06-26 04:10:32 +00:00
public void runResources ( )
{
2021-07-07 02:46:12 +00:00
if ( BytecodeViewer . promptIfNoLoadedClasses ( ) )
2021-06-26 04:10:32 +00:00
return ;
2021-06-21 14:55:18 +00:00
2021-06-26 04:10:32 +00:00
new RunOptions ( ) . setVisible ( true ) ;
2021-06-21 14:55:18 +00:00
}
public void reloadResources ( )
{
2021-06-26 18:10:55 +00:00
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue ( " Bytecode Viewer - Reload Resources " ,
" Are you sure you wish to reload the resources? " ,
new String [ ] { " Yes " , " No " } ) ;
if ( dialogue . promptChoice ( ) = = 0 )
{
2021-06-21 14:55:18 +00:00
LazyNameUtil . reset ( ) ;
ArrayList < File > reopen = new ArrayList < > ( ) ;
2021-07-11 12:33:18 +00:00
for ( ResourceContainer container : BytecodeViewer . resourceContainers ) {
2021-06-21 14:55:18 +00:00
File newFile = new File ( container . file . getParent ( ) + fs + container . name ) ;
if ( ! container . file . getAbsolutePath ( ) . equals ( newFile . getAbsolutePath ( ) ) & &
( container . file . getAbsolutePath ( ) . endsWith ( " .apk " ) | | container . file . getAbsolutePath ( ) . endsWith ( " .dex " ) ) ) //APKs & dex get renamed
{
container . file . renameTo ( newFile ) ;
container . file = newFile ;
}
reopen . add ( container . file ) ;
}
2021-07-11 12:33:18 +00:00
BytecodeViewer . resourceContainers . clear ( ) ;
2021-06-21 14:55:18 +00:00
for ( File f : reopen ) {
BytecodeViewer . openFiles ( new File [ ] { f } , false ) ;
}
//refresh panes
}
}
2021-06-26 04:10:32 +00:00
public void selectFile ( )
2021-06-21 14:55:18 +00:00
{
2021-07-01 23:08:56 +00:00
final File file = DialogueUtils . fileChooser ( " Select File or Folder to open in BCV " ,
2021-06-26 04:10:32 +00:00
" APKs, DEX, Class Files or Zip/Jar/War Archives " ,
Constants . SUPPORTED_FILE_EXTENSIONS ) ;
2021-07-01 23:08:56 +00:00
if ( file = = null )
return ;
2021-06-21 14:55:18 +00:00
2021-07-06 22:57:42 +00:00
BytecodeViewer . updateBusyStatus ( true ) ;
2021-07-01 23:08:56 +00:00
BytecodeViewer . openFiles ( new File [ ] { file } , true ) ;
2021-07-06 22:57:42 +00:00
BytecodeViewer . updateBusyStatus ( false ) ;
2021-06-21 22:45:00 +00:00
}
2021-06-21 14:55:18 +00:00
2021-06-21 20:19:46 +00:00
public void openExternalPlugin ( )
{
2021-07-01 23:08:56 +00:00
final File file = DialogueUtils . fileChooser ( " Select External Plugin " ,
2021-06-26 04:10:32 +00:00
" External Plugin " ,
2021-07-01 23:08:56 +00:00
PluginManager . fileFilter ( ) ,
2021-06-26 04:10:32 +00:00
" everything " ) ;
2021-07-01 23:08:56 +00:00
if ( file = = null )
return ;
2021-07-06 22:57:42 +00:00
BytecodeViewer . updateBusyStatus ( true ) ;
2021-07-01 23:08:56 +00:00
BytecodeViewer . startPlugin ( file ) ;
2021-07-06 22:57:42 +00:00
BytecodeViewer . updateBusyStatus ( false ) ;
2021-07-01 23:08:56 +00:00
SettingsSerializer . saveSettingsAsync ( ) ;
2021-06-21 20:19:46 +00:00
}
2021-06-21 14:55:18 +00:00
public void askBeforeExiting ( )
{
2021-06-26 18:10:55 +00:00
MultipleChoiceDialogue dialogue = new MultipleChoiceDialogue ( " Bytecode Viewer - Exit " ,
" Are you sure you want to exit? " ,
new String [ ] { " Yes " , " No " } ) ;
2021-06-21 14:55:18 +00:00
2021-06-26 18:10:55 +00:00
if ( dialogue . promptChoice ( ) = = 0 )
2021-06-26 04:10:32 +00:00
{
2021-06-21 14:55:18 +00:00
Configuration . canExit = true ;
System . exit ( 0 ) ;
}
}
2021-06-26 04:10:32 +00:00
public void showForeignLibraryWarning ( )
{
if ( ! deleteForeignOutdatedLibs . isSelected ( ) )
{
BytecodeViewer . showMessage ( " WARNING: With this being toggled off outdated libraries will NOT be "
+ " removed. It's also a security issue. ONLY TURN IT OFF IF YOU KNOW WHAT YOU'RE DOING. " ) ;
}
Configuration . deleteForeignLibraries = deleteForeignOutdatedLibs . isSelected ( ) ;
}
2021-06-26 12:15:53 +00:00
2021-07-13 10:37:28 +00:00
public void updateTabTheme ( )
{
try
{
for ( Component viewerComponent : BytecodeViewer . viewer . workPane . tabs . getComponents ( ) )
{
if ( ! ( viewerComponent instanceof ResourceViewer ) )
continue ;
ResourceViewer viewerResource = ( ResourceViewer ) viewerComponent ;
if ( ! ( viewerResource instanceof ClassViewer ) )
continue ;
ClassViewer viewerClass = ( ClassViewer ) viewerResource ;
Configuration . rstaTheme . apply ( viewerClass . resourceViewPanel1 . textArea ) ;
Configuration . rstaTheme . apply ( viewerClass . resourceViewPanel2 . textArea ) ;
Configuration . rstaTheme . apply ( viewerClass . resourceViewPanel3 . textArea ) ;
}
SwingUtilities . updateComponentTreeUI ( BytecodeViewer . viewer ) ;
}
catch ( Exception ex )
{
ex . printStackTrace ( ) ;
}
}
2021-06-26 12:15:53 +00:00
public static final long serialVersionUID = 1851409230530948543L ;
2021-06-21 23:37:55 +00:00
}