2.9.8
							
								
								
									
										
											BIN
										
									
								
								src/resources/android.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/bat.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 507 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/c#.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 700 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/c++.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 621 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/config.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 402 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/decoded.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 570 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/file.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 294 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/folder.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 537 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/image.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 606 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/jar.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 660 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/java.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 639 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/package.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 345 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/sh.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 525 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/text.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 618 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/resources/zip.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 386 B  | 
| 
						 | 
				
			
			@ -26,6 +26,7 @@ import the.bytecode.club.bytecodeviewer.api.ExceptionUI;
 | 
			
		|||
 */
 | 
			
		||||
public class Boot {
 | 
			
		||||
 | 
			
		||||
	/*flags*/
 | 
			
		||||
	public static boolean globalstop = false;
 | 
			
		||||
	public static boolean completedboot = false;
 | 
			
		||||
	public static boolean downloading = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,12 +98,17 @@ import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
 | 
			
		|||
 * 07/19/2015 - Fixed enjarify.
 | 
			
		||||
 * 07/20/2015 - Bibl sexified the boot loading time.
 | 
			
		||||
 * 07/20/2015 - Decode APK Resources is selected by default.
 | 
			
		||||
 * 07/20/2015 - Made the security manager slightly safer, can still be targeted but not as obvious now.
 | 
			
		||||
 * 07/20/2015 - Made the security manager slightly safer, it can still be targeted but not as obviously now.
 | 
			
		||||
 * 07/20/2015 - Added CLI to the boot page.
 | 
			
		||||
 * 07/21/2015 - Added support for offline mode incase you cannot connect to github for some reason. (kicks in after 7 seconds)
 | 
			
		||||
 * 07/21/2015 - Added fatjar option back, incase anyone wants a 100% portable version.
 | 
			
		||||
 * 07/21/2015 - Added support for offline mode in case you cannot connect to github for some reason. (kicks in after 7 seconds)
 | 
			
		||||
 * 07/21/2015 - Added fatjar option back, in case anyone wants a 100% portable version.
 | 
			
		||||
 * 07/21/2015 - Made it so it now shows the decompiler it's using - http://i.imgur.com/yMEzXwv.png.
 | 
			
		||||
 * 07/21/2015 - Rewrote the file system, it now shows the path of the jar it's got loaded.
 | 
			
		||||
 * 07/21/2015 - Now it shows if the decompiler is in editable mode or not.
 | 
			
		||||
 * 07/21/2015 - Fixed Enjarify bug from new security manager.
 | 
			
		||||
 * 07/22/2015 - Fixed a typo (Thanks affffsdsd)
 | 
			
		||||
 * 07/22/2015 - Finally added icons to the File Navigator, credits to http://famfamfam.com/lab/icons/silk/ for the icons.
 | 
			
		||||
 * 07/22/2015 - JD-GUI is now the default decompiler for GUI.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Konloch
 | 
			
		||||
 * 
 | 
			
		||||
| 
						 | 
				
			
			@ -214,7 +219,7 @@ public class BytecodeViewer {
 | 
			
		|||
						{
 | 
			
		||||
						  Desktop.getDesktop().browse(new URI("https://github.com/Konloch/bytecode-viewer/releases"));
 | 
			
		||||
						} else {
 | 
			
		||||
							showMessage("Cannot open the page, please manually type it.");
 | 
			
		||||
							showMessage("Cannot open the page, please manually type it."+nl+"https://github.com/Konloch/bytecode-viewer/releases");
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if(result == 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +308,7 @@ public class BytecodeViewer {
 | 
			
		|||
									    System.out.println("Download finished!");
 | 
			
		||||
										showMessage("Download successful! You can find the updated program at " + finalFile.getAbsolutePath());
 | 
			
		||||
									} catch(FileNotFoundException e) {
 | 
			
		||||
										showMessage("Unable to download, the zip file has not been uploaded yet, please try again later in an hour.");
 | 
			
		||||
										showMessage("Unable to download, the zip file has not been uploaded yet, please try again in about 10 minutes.");
 | 
			
		||||
									} catch(Exception e) {
 | 
			
		||||
										new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
 | 
			
		||||
									}
 | 
			
		||||
| 
						 | 
				
			
			@ -468,7 +473,7 @@ public class BytecodeViewer {
 | 
			
		|||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Main startup
 | 
			
		||||
	 * @param args files you want to open
 | 
			
		||||
	 * @param args files you want to open or CLI
 | 
			
		||||
	 */
 | 
			
		||||
	public static void main(String[] args) {
 | 
			
		||||
		BytecodeViewer.args = args;
 | 
			
		||||
| 
						 | 
				
			
			@ -756,11 +761,8 @@ public class BytecodeViewer {
 | 
			
		|||
										if(cafebabe.toLowerCase().equals("cafebabe")) {
 | 
			
		||||
											final ClassNode cn = JarUtils.getNode(bytes);
 | 
			
		||||
											
 | 
			
		||||
											FileContainer container = new FileContainer();
 | 
			
		||||
											
 | 
			
		||||
											container.name = fn;
 | 
			
		||||
											FileContainer container = new FileContainer(f);
 | 
			
		||||
											container.classes.add(cn);
 | 
			
		||||
											
 | 
			
		||||
											BytecodeViewer.files.add(container);
 | 
			
		||||
										} else {
 | 
			
		||||
											showMessage(fn+": Header does not start with CAFEBABE, ignoring.");
 | 
			
		||||
| 
						 | 
				
			
			@ -773,8 +775,7 @@ public class BytecodeViewer {
 | 
			
		|||
								} else if(fn.endsWith(".apk")) {
 | 
			
		||||
									try {
 | 
			
		||||
										BytecodeViewer.viewer.setIcon(true);
 | 
			
		||||
										FileContainer container = new FileContainer();
 | 
			
		||||
										container.name = fn;
 | 
			
		||||
										FileContainer container = new FileContainer(f);
 | 
			
		||||
										
 | 
			
		||||
										if(viewer.decodeAPKResources.isSelected()) {
 | 
			
		||||
											File decodedResources = new File(tempDirectory + fs + MiscUtils.randomString(32) + ".apk");
 | 
			
		||||
| 
						 | 
				
			
			@ -803,8 +804,7 @@ public class BytecodeViewer {
 | 
			
		|||
								} else if(fn.endsWith(".dex")) {
 | 
			
		||||
									try {
 | 
			
		||||
										BytecodeViewer.viewer.setIcon(true);
 | 
			
		||||
										FileContainer container = new FileContainer();
 | 
			
		||||
										container.name = fn;
 | 
			
		||||
										FileContainer container = new FileContainer(f);
 | 
			
		||||
										
 | 
			
		||||
										String name = getRandomizedName()+".jar";
 | 
			
		||||
										File output = new File(tempDirectory + fs + name);
 | 
			
		||||
| 
						 | 
				
			
			@ -828,11 +828,8 @@ public class BytecodeViewer {
 | 
			
		|||
									files.put(f.getName(), bytes);
 | 
			
		||||
 | 
			
		||||
									
 | 
			
		||||
									FileContainer container = new FileContainer();
 | 
			
		||||
 | 
			
		||||
									container.name = fn;
 | 
			
		||||
									FileContainer container = new FileContainer(f);
 | 
			
		||||
									container.files = files;
 | 
			
		||||
									
 | 
			
		||||
									BytecodeViewer.files.add(container);
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -176,16 +176,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.procyon.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -203,16 +194,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.cfr.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -230,16 +212,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.fernflower.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -257,16 +230,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.krakatau.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -285,16 +249,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.krakatauDA.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -313,16 +268,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.jdgui.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -341,16 +287,7 @@ public class CommandLineInput {
 | 
			
		|||
				} else {
 | 
			
		||||
					try {
 | 
			
		||||
						ClassNode cn = BytecodeViewer.getClassNode(target);
 | 
			
		||||
						final ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
						try {
 | 
			
		||||
							cn.accept(cw);
 | 
			
		||||
						} catch(Exception e) {
 | 
			
		||||
							e.printStackTrace();
 | 
			
		||||
							try {
 | 
			
		||||
								Thread.sleep(200);
 | 
			
		||||
								cn.accept(cw);
 | 
			
		||||
							} catch (InterruptedException e1) { }
 | 
			
		||||
						}
 | 
			
		||||
						final ClassWriter cw = accept(cn);
 | 
			
		||||
						String contents = Decompiler.smali.decompileClassNode(cn, cw.toByteArray());
 | 
			
		||||
						DiskWriter.replaceFile(output.getAbsolutePath(), contents, false);
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
| 
						 | 
				
			
			@ -367,4 +304,18 @@ public class CommandLineInput {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static ClassWriter accept(ClassNode cn) {
 | 
			
		||||
		ClassWriter cw = new ClassWriter(0);
 | 
			
		||||
		try {
 | 
			
		||||
			cn.accept(cw);
 | 
			
		||||
		} catch(Exception e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			try {
 | 
			
		||||
				Thread.sleep(200);
 | 
			
		||||
				cn.accept(cw);
 | 
			
		||||
			} catch (InterruptedException e1) { }
 | 
			
		||||
		}
 | 
			
		||||
		return cw;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
package the.bytecode.club.bytecodeviewer;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +15,12 @@ import org.objectweb.asm.tree.ClassNode;
 | 
			
		|||
 | 
			
		||||
public class FileContainer {
 | 
			
		||||
	
 | 
			
		||||
	public FileContainer(File f) {
 | 
			
		||||
		this.file = f;
 | 
			
		||||
		this.name = f.getName();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public File file;
 | 
			
		||||
	public String name;
 | 
			
		||||
	
 | 
			
		||||
	public HashMap<String, byte[]> files = new HashMap<String, byte[]>();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,8 +34,7 @@ public class JarUtils {
 | 
			
		|||
	 * @throws IOException
 | 
			
		||||
	 */
 | 
			
		||||
	public static void put(final File jarFile) throws IOException {
 | 
			
		||||
		FileContainer container = new FileContainer();
 | 
			
		||||
		container.name = jarFile.getName();
 | 
			
		||||
		FileContainer container = new FileContainer(jarFile);
 | 
			
		||||
		HashMap<String, byte[]> files = new HashMap<String, byte[]>();
 | 
			
		||||
		
 | 
			
		||||
		ZipInputStream jis = new ZipInputStream(new FileInputStream(jarFile));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,22 @@ public class Resources {
 | 
			
		|||
	public static ImageIcon prevIcon;
 | 
			
		||||
	public static ImageIcon busy;
 | 
			
		||||
	public static ImageIcon busyB64;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	public static ImageIcon bat;
 | 
			
		||||
	public static ImageIcon sh;
 | 
			
		||||
	public static ImageIcon csharp;
 | 
			
		||||
	public static ImageIcon cplusplus;
 | 
			
		||||
	public static ImageIcon config;
 | 
			
		||||
	public static ImageIcon jar;
 | 
			
		||||
	public static ImageIcon zip;
 | 
			
		||||
	public static ImageIcon packages;
 | 
			
		||||
	public static ImageIcon folder;
 | 
			
		||||
	public static ImageIcon android;
 | 
			
		||||
	public static ImageIcon file;
 | 
			
		||||
	public static ImageIcon textFile;
 | 
			
		||||
	public static ImageIcon classFile;
 | 
			
		||||
	public static ImageIcon imageFile;
 | 
			
		||||
	public static ImageIcon decoded;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	static {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +50,21 @@ public class Resources {
 | 
			
		|||
		busy = new ImageIcon(Resources.class.getClass().getResource("/resources/1.gif"));
 | 
			
		||||
		busyB64 = new ImageIcon(b642IMG("R0lGODlhEAALAPQAAP///wAAANra2tDQ0Orq6gcHBwAAAC8vL4KCgmFhYbq6uiMjI0tLS4qKimVlZb6+vicnJwUFBU9PT+bm5tjY2PT09Dk5Odzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH5BAkLAAAAIf4aQ3JlYXRlZCB3aXRoIGFqYXhsb2FkLmluZm8AIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7"));
 | 
			
		||||
 | 
			
		||||
		bat = new ImageIcon(Resources.class.getClass().getResource("/resources/bat.png"));
 | 
			
		||||
		sh = new ImageIcon(Resources.class.getClass().getResource("/resources/sh.png"));
 | 
			
		||||
		csharp = new ImageIcon(Resources.class.getClass().getResource("/resources/c#.png"));
 | 
			
		||||
		cplusplus = new ImageIcon(Resources.class.getClass().getResource("/resources/c++.png"));
 | 
			
		||||
		config = new ImageIcon(Resources.class.getClass().getResource("/resources/config.png"));
 | 
			
		||||
		jar = new ImageIcon(Resources.class.getClass().getResource("/resources/jar.png"));
 | 
			
		||||
		zip= new ImageIcon(Resources.class.getClass().getResource("/resources/zip.png"));
 | 
			
		||||
		packages = new ImageIcon(Resources.class.getClass().getResource("/resources/package.png"));
 | 
			
		||||
		folder = new ImageIcon(Resources.class.getClass().getResource("/resources/folder.png"));
 | 
			
		||||
		android = new ImageIcon(Resources.class.getClass().getResource("/resources/android.png"));
 | 
			
		||||
		file = new ImageIcon(Resources.class.getClass().getResource("/resources/file.png"));
 | 
			
		||||
		textFile = new ImageIcon(Resources.class.getClass().getResource("/resources/text.png"));
 | 
			
		||||
		classFile = new ImageIcon(Resources.class.getClass().getResource("/resources/java.png"));
 | 
			
		||||
		imageFile = new ImageIcon(Resources.class.getClass().getResource("/resources/image.png"));
 | 
			
		||||
		decoded = new ImageIcon(Resources.class.getClass().getResource("/resources/decoded.png"));
 | 
			
		||||
		
 | 
			
		||||
		iconList = new ArrayList<BufferedImage>();
 | 
			
		||||
		int size = 16;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ public class SecurityMan extends SecurityManager {
 | 
			
		|||
		if(	executedClass.equals("the.bytecode.club.bytecodeviewer.decompilers.KrakatauDecompiler") ||
 | 
			
		||||
			executedClass.equals("the.bytecode.club.bytecodeviewer.decompilers.KrakatauDisassambler") ||
 | 
			
		||||
			executedClass.equals("the.bytecode.club.bytecodeviewer.compilers.KrakatauAssembler") ||
 | 
			
		||||
			executedClass.equals("the.bytecode.club.bytecodeviewer.Enjarify") ||
 | 
			
		||||
			executedClass.equals("the.bytecode.club.bytecodeviewer.BytecodeViewer"))
 | 
			
		||||
		{
 | 
			
		||||
			blocking = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -48,11 +49,11 @@ public class SecurityMan extends SecurityManager {
 | 
			
		|||
		
 | 
			
		||||
		if(allow && !blocking) {
 | 
			
		||||
			System.out.println("Allowing exec:" + cmd);
 | 
			
		||||
		} else throw new SecurityException("BCV is awesome.");
 | 
			
		||||
		} else throw new SecurityException("BCV is awesome, blocking " + cmd);
 | 
			
		||||
    }
 | 
			
		||||
	@Override
 | 
			
		||||
    public void checkListen(int port) {
 | 
			
		||||
		throw new SecurityException("BCV is awesome.");
 | 
			
		||||
		throw new SecurityException("BCV is awesome, blocking port "+port+" from listening");
 | 
			
		||||
    }
 | 
			
		||||
	@Override
 | 
			
		||||
    public void checkPermission(Permission perm) { //expand eventually
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ import the.bytecode.club.bytecodeviewer.MiscUtils;
 | 
			
		|||
import jd.cli.printer.text.PlainTextPrinter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * JDCore Decompiler Wrapper
 | 
			
		||||
 * JD-Core Decompiler Wrapper
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Konloch
 | 
			
		||||
 * @author JD-Core developers
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -625,7 +625,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -652,7 +652,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -680,7 +680,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("FernFlower Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("FernFlower Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -709,7 +709,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -746,7 +746,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -774,7 +774,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -806,7 +806,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Disassembler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Disassembler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -834,7 +834,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel1.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -879,7 +879,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -907,7 +907,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -935,7 +935,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -962,7 +962,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -998,7 +998,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1026,7 +1026,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1084,7 +1084,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel2.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1130,7 +1130,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Procyon Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1158,7 +1158,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1186,7 +1186,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("CFR Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1213,7 +1213,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Bytecode Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1249,7 +1249,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Smali Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
						
 | 
			
		||||
| 
						 | 
				
			
			@ -1277,7 +1277,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("Krakatau Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						java3 = panelArea;
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
| 
						 | 
				
			
			@ -1335,7 +1335,7 @@ public class ClassViewer extends Viewer {
 | 
			
		|||
							@Override public void keyReleased(KeyEvent arg0) { }
 | 
			
		||||
							@Override public void keyTyped(KeyEvent arg0) { }  
 | 
			
		||||
						});
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler"));
 | 
			
		||||
						scrollPane.setColumnHeaderView(new JLabel("JD-GUI Decompiler - Editable: " + panelArea.isEditable()));
 | 
			
		||||
						panel3.add(scrollPane);
 | 
			
		||||
						java3 = panelArea;
 | 
			
		||||
						panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int)BytecodeViewer.viewer.fontSpinner.getValue()));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import java.awt.BorderLayout;
 | 
			
		|||
import java.awt.font.FontRenderContext;
 | 
			
		||||
import java.awt.geom.*;
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.Font;
 | 
			
		||||
import java.awt.Graphics;
 | 
			
		||||
import java.awt.Graphics2D;
 | 
			
		||||
| 
						 | 
				
			
			@ -16,6 +17,7 @@ import java.awt.event.KeyEvent;
 | 
			
		|||
import java.awt.event.MouseAdapter;
 | 
			
		||||
import java.awt.event.MouseEvent;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.Enumeration;
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +33,7 @@ import javax.swing.JTree;
 | 
			
		|||
import javax.swing.event.TreeSelectionEvent;
 | 
			
		||||
import javax.swing.event.TreeSelectionListener;
 | 
			
		||||
import javax.swing.tree.DefaultMutableTreeNode;
 | 
			
		||||
import javax.swing.tree.DefaultTreeCellRenderer;
 | 
			
		||||
import javax.swing.tree.MutableTreeNode;
 | 
			
		||||
import javax.swing.tree.TreeNode;
 | 
			
		||||
import javax.swing.tree.TreePath;
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +66,10 @@ public class FileNavigationPane extends VisibleComponent implements
 | 
			
		|||
		super("ClassNavigation");
 | 
			
		||||
		setTitle("Files");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		tree.setRootVisible(false);
 | 
			
		||||
		tree.setShowsRootHandles(true);
 | 
			
		||||
		
 | 
			
		||||
		this.fcn = fcn;
 | 
			
		||||
		
 | 
			
		||||
		open.addActionListener(new ActionListener() {
 | 
			
		||||
| 
						 | 
				
			
			@ -291,6 +298,8 @@ public class FileNavigationPane extends VisibleComponent implements
 | 
			
		|||
			for (FileContainer container : BytecodeViewer.files) {
 | 
			
		||||
				MyTreeNode root = new MyTreeNode(container.name);
 | 
			
		||||
				treeRoot.add(root);
 | 
			
		||||
				ImageRenderer renderer = new ImageRenderer();
 | 
			
		||||
				tree.setCellRenderer(renderer);
 | 
			
		||||
				
 | 
			
		||||
				if(!container.classes.isEmpty()) {
 | 
			
		||||
					for(ClassNode c : container.classes) {
 | 
			
		||||
| 
						 | 
				
			
			@ -508,5 +517,103 @@ public class FileNavigationPane extends VisibleComponent implements
 | 
			
		|||
		tree.repaint();
 | 
			
		||||
		tree.updateUI();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @author http://stackoverflow.com/questions/14968005
 | 
			
		||||
	 * @author Konloch
 | 
			
		||||
	 *
 | 
			
		||||
	 */
 | 
			
		||||
	public class ImageRenderer extends DefaultTreeCellRenderer {
 | 
			
		||||
 | 
			
		||||
		public Component getTreeCellRendererComponent( 
 | 
			
		||||
		         JTree tree, 
 | 
			
		||||
		         Object value, 
 | 
			
		||||
		         boolean sel, 
 | 
			
		||||
		         boolean expanded, 
 | 
			
		||||
		         boolean leaf, 
 | 
			
		||||
		         int row, 
 | 
			
		||||
		         boolean hasFocus)
 | 
			
		||||
		{ //called every time there is a pane update, I.E. whenever you expand a folder
 | 
			
		||||
 | 
			
		||||
		    Component ret = super.getTreeCellRendererComponent(tree, value,
 | 
			
		||||
		            selected, expanded, leaf, row, hasFocus);
 | 
			
		||||
		    
 | 
			
		||||
		    		if(value != null && value instanceof the.bytecode.club.bytecodeviewer.gui.FileNavigationPane.MyTreeNode) {
 | 
			
		||||
		    			the.bytecode.club.bytecodeviewer.gui.FileNavigationPane.MyTreeNode node = (the.bytecode.club.bytecodeviewer.gui.FileNavigationPane.MyTreeNode) value;
 | 
			
		||||
		    			String name = node.toString().toLowerCase();
 | 
			
		||||
		    			
 | 
			
		||||
			    		if(name.endsWith(".jar")) {
 | 
			
		||||
			    			setIcon(Resources.jar);
 | 
			
		||||
			    		} else if(name.endsWith(".zip")) {
 | 
			
		||||
			    			setIcon(Resources.zip);
 | 
			
		||||
			    		} else if(name.endsWith(".bat")) {
 | 
			
		||||
			    			setIcon(Resources.bat);
 | 
			
		||||
			    		} else if(name.endsWith(".sh")) {
 | 
			
		||||
			    			setIcon(Resources.sh);
 | 
			
		||||
			    		} else if(name.endsWith(".cs")) {
 | 
			
		||||
			    			setIcon(Resources.csharp);
 | 
			
		||||
			    		} else if(name.endsWith(".c") ||name.endsWith(".cpp") ||name.endsWith(".h")) {
 | 
			
		||||
			    			setIcon(Resources.cplusplus);
 | 
			
		||||
			    		}  else if(name.endsWith(".apk") || name.endsWith(".dex")) {
 | 
			
		||||
			    			setIcon(Resources.android);
 | 
			
		||||
			    		} else if(name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".bmp") || name.endsWith(".gif")) {
 | 
			
		||||
			    			setIcon(Resources.imageFile);
 | 
			
		||||
			    		} else if(name.endsWith(".class")) {
 | 
			
		||||
			    			setIcon(Resources.classFile);
 | 
			
		||||
			    		} else if(name.endsWith(".txt") || name.endsWith(".md")) {
 | 
			
		||||
			    			setIcon(Resources.textFile);
 | 
			
		||||
			    		} else if(name.equals("decoded resources")) {
 | 
			
		||||
			    			setIcon(Resources.decoded);
 | 
			
		||||
			    		} else if(name.endsWith(".properties") || name.endsWith(".xml") || name.endsWith(".mf") || name.endsWith(".config") || name.endsWith(".cfg")) {
 | 
			
		||||
			    			setIcon(Resources.config);
 | 
			
		||||
			    		} else if(node.getChildCount() <= 0) { //random file
 | 
			
		||||
			    			setIcon(Resources.file);
 | 
			
		||||
			    		} else { //folder
 | 
			
		||||
			    			ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();
 | 
			
		||||
			    			ArrayList<TreeNode> totalNodes = new ArrayList<TreeNode>();
 | 
			
		||||
			    			
 | 
			
		||||
			    			nodes.add(node);
 | 
			
		||||
			    			totalNodes.add(node);
 | 
			
		||||
			    			
 | 
			
		||||
			    			boolean isJava = false;
 | 
			
		||||
			    			boolean finished = false;
 | 
			
		||||
			    			
 | 
			
		||||
			    			while(!finished) { //may cause a clusterfuck with huge files
 | 
			
		||||
			    				if(nodes.isEmpty())
 | 
			
		||||
			    					finished = true;
 | 
			
		||||
			    				else {
 | 
			
		||||
			    					TreeNode treeNode = nodes.get(0);
 | 
			
		||||
				    				nodes.remove(treeNode);
 | 
			
		||||
			    					int children = treeNode.getChildCount();
 | 
			
		||||
			    					if(children >= 1)
 | 
			
		||||
					    				for(int i = 0; i < children; i++) {
 | 
			
		||||
					    					TreeNode child = treeNode.getChildAt(i);
 | 
			
		||||
					    					
 | 
			
		||||
					    					if(!totalNodes.contains(child)) {
 | 
			
		||||
					    						nodes.add(child);
 | 
			
		||||
					    						totalNodes.add(child);
 | 
			
		||||
					    					}
 | 
			
		||||
			    					
 | 
			
		||||
					    					if(child.toString().endsWith(".class"))
 | 
			
		||||
					    						isJava = true;
 | 
			
		||||
					    				}
 | 
			
		||||
				    				
 | 
			
		||||
				    				if(isJava)
 | 
			
		||||
				    					nodes.clear();
 | 
			
		||||
			    				}
 | 
			
		||||
			    			}
 | 
			
		||||
			    			
 | 
			
		||||
			    			if(isJava)
 | 
			
		||||
			    				setIcon(Resources.packages);
 | 
			
		||||
			    			else {
 | 
			
		||||
			    				setIcon(Resources.folder);
 | 
			
		||||
			    			}
 | 
			
		||||
			    		}
 | 
			
		||||
		    		}
 | 
			
		||||
		    
 | 
			
		||||
		            return ret;
 | 
			
		||||
		    }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -540,7 +540,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
 | 
			
		|||
	public final ButtonGroup panelGroup1 = new ButtonGroup();
 | 
			
		||||
	public final ButtonGroup panelGroup2 = new ButtonGroup();
 | 
			
		||||
	public final ButtonGroup panelGroup3 = new ButtonGroup();
 | 
			
		||||
	private final JMenuItem mntmSetOpitonalLibrary = new JMenuItem("Set Optionial Library Folder");
 | 
			
		||||
	private final JMenuItem mntmSetOpitonalLibrary = new JMenuItem("Set Optional Library Folder");
 | 
			
		||||
	private final JMenuItem mntmPingback = new JMenuItem("Pingback");
 | 
			
		||||
	private final JMenu mnJdgui = new JMenu("JD-GUI");
 | 
			
		||||
	public final JRadioButtonMenuItem panel3JDGUI = new JRadioButtonMenuItem("Java");
 | 
			
		||||
| 
						 | 
				
			
			@ -1936,7 +1936,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
 | 
			
		|||
 | 
			
		||||
		apkConversionGroup.add(apkConversionDex);
 | 
			
		||||
		apkConversionGroup.add(apkConversionEnjarify);
 | 
			
		||||
		apkConversionGroup.setSelected(apkConversionDex.getModel(), true);//my one true love
 | 
			
		||||
		apkConversionGroup.setSelected(apkConversionDex.getModel(), true);
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		panelGroup1.add(panel1None);
 | 
			
		||||
| 
						 | 
				
			
			@ -1980,7 +1980,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier {
 | 
			
		|||
		mnFontSize.add(fontSpinner);
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		panelGroup1.setSelected(panel1Proc.getModel(), true);//my one true love
 | 
			
		||||
		panelGroup1.setSelected(panel1JDGUI.getModel(), true);
 | 
			
		||||
		panelGroup2.setSelected(panel2Bytecode.getModel(), true);
 | 
			
		||||
		panelGroup3.setSelected(panel3None.getModel(), true);
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||