From 571b5590acbc375bd9c1241fd996a3f4de1a7f6c Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 21 Jul 2013 19:03:13 +0400 Subject: [PATCH] gui: add icons to classes tree --- NOTICE | 5 ++ .../src/main/java/jadx/api/Decompiler.java | 12 +-- .../java/jadx/core/utils/files/InputFile.java | 4 +- jadx-gui/src/main/java/jadx/gui/JadxGUI.java | 5 +- .../src/main/java/jadx/gui/JadxWrapper.java | 7 +- .../src/main/java/jadx/gui/MainWindow.java | 85 +++++++++--------- jadx-gui/src/main/java/jadx/gui/Utils.java | 18 ++++ .../src/main/java/jadx/gui/model/JClass.java | 21 ----- .../main/java/jadx/gui/treemodel/JClass.java | 30 +++++++ .../main/java/jadx/gui/treemodel/JNode.java | 7 ++ .../java/jadx/gui/treemodel/JPackage.java | 37 ++++++++ .../main/java/jadx/gui/treemodel/JRoot.java | 36 ++++++++ .../resources/icons-16/annotation_obj.png | Bin 0 -> 481 bytes .../resources/icons-16/application-exit.png | Bin 931 -> 0 bytes .../resources/icons-16/class_default_obj.png | Bin 0 -> 812 bytes .../src/main/resources/icons-16/class_obj.png | Bin 0 -> 774 bytes .../src/main/resources/icons-16/cross.png | Bin 0 -> 655 bytes .../resources/icons-16/document-open-5.png | Bin 1109 -> 0 bytes .../src/main/resources/icons-16/enum_obj.png | Bin 0 -> 513 bytes .../src/main/resources/icons-16/folder.png | Bin 0 -> 537 bytes .../icons-16/innerclass_private_obj.png | Bin 0 -> 797 bytes .../icons-16/innerclass_protected_obj.png | Bin 0 -> 804 bytes .../src/main/resources/icons-16/int_obj.png | Bin 0 -> 745 bytes .../resources/icons-16/java_model_obj.png | Bin 0 -> 319 bytes .../src/main/resources/icons-16/jcu_obj.png | Bin 0 -> 738 bytes .../main/resources/icons-16/jsearch_obj.png | Bin 0 -> 760 bytes .../main/resources/icons-16/library_obj.png | Bin 0 -> 461 bytes .../main/resources/icons-16/methdef_obj.png | Bin 0 -> 290 bytes .../main/resources/icons-16/methpri_obj.png | Bin 0 -> 292 bytes .../main/resources/icons-16/methpro_obj.png | Bin 0 -> 299 bytes .../main/resources/icons-16/methpub_obj.png | Bin 0 -> 325 bytes .../main/resources/icons-16/package_obj.png | Bin 0 -> 345 bytes .../src/main/resources/icons-16/wrench.png | Bin 0 -> 610 bytes 33 files changed, 197 insertions(+), 70 deletions(-) create mode 100644 jadx-gui/src/main/java/jadx/gui/Utils.java delete mode 100644 jadx-gui/src/main/java/jadx/gui/model/JClass.java create mode 100644 jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java create mode 100644 jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java create mode 100644 jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java create mode 100644 jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java create mode 100644 jadx-gui/src/main/resources/icons-16/annotation_obj.png delete mode 100644 jadx-gui/src/main/resources/icons-16/application-exit.png create mode 100644 jadx-gui/src/main/resources/icons-16/class_default_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/class_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/cross.png delete mode 100644 jadx-gui/src/main/resources/icons-16/document-open-5.png create mode 100644 jadx-gui/src/main/resources/icons-16/enum_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/folder.png create mode 100644 jadx-gui/src/main/resources/icons-16/innerclass_private_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/innerclass_protected_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/int_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/java_model_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/jcu_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/jsearch_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/library_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/methdef_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/methpri_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/methpro_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/methpub_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/package_obj.png create mode 100644 jadx-gui/src/main/resources/icons-16/wrench.png diff --git a/NOTICE b/NOTICE index 97d890911..6fc624ea0 100644 --- a/NOTICE +++ b/NOTICE @@ -104,3 +104,8 @@ under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. ******************************************************************************* + +GUI icons copied from several places: + - Eclipse Project (JDT UI) - licensed under EPL v1.0 (http://www.eclipse.org/legal/epl-v10.html) + - famfamfam silk icon set (http://www.famfamfam.com/lab/icons/silk/) - licensed under Creative Commons Attribution 2.5 License (http://creativecommons.org/licenses/by/2.5/) + diff --git a/jadx-core/src/main/java/jadx/api/Decompiler.java b/jadx-core/src/main/java/jadx/api/Decompiler.java index 986ab0f79..61fc29d1b 100644 --- a/jadx-core/src/main/java/jadx/api/Decompiler.java +++ b/jadx-core/src/main/java/jadx/api/Decompiler.java @@ -56,11 +56,7 @@ public final class Decompiler { } public void loadFile(File file) throws IOException, DecodeException { - List files = args.getInput(); - files.clear(); - files.add(file); - - loadInput(); + setInput(file); parseDex(); } @@ -119,11 +115,17 @@ public final class Decompiler { } private void loadInput() throws IOException, DecodeException { + inputFiles.clear(); for (File file : args.getInput()) { inputFiles.add(new InputFile(file)); } } + private void setInput(File file) throws IOException, DecodeException { + inputFiles.clear(); + inputFiles.add(new InputFile(file)); + } + private void parseDex() throws DecodeException { ClassInfo.clearCache(); ErrorsCounter.reset(); diff --git a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java index 0f35f94d2..e46e1bcf2 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java @@ -23,6 +23,9 @@ public class InputFile { public InputFile(File file) throws IOException, DecodeException { this.file = file; + if (!file.exists()) { + throw new IOException("File not found: " + file.getAbsolutePath()); + } String fileName = file.getName(); @@ -81,5 +84,4 @@ public class InputFile { public String toString() { return file.toString(); } - } diff --git a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java index b7c401a80..2533c6ba6 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java @@ -2,7 +2,8 @@ package jadx.gui; import jadx.cli.JadxArgs; -import javax.swing.*; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +26,7 @@ public class JadxGUI { MainWindow mainWindow = new MainWindow(jadxArgs); mainWindow.setVisible(true); - if(!jadxArgs.getInput().isEmpty()) { + if (!jadxArgs.getInput().isEmpty()) { mainWindow.openFile(jadxArgs.getInput().get(0)); } } diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index 82af2864f..7f5f4c2b9 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -1,7 +1,7 @@ package jadx.gui; -import jadx.api.IJadxArgs; import jadx.api.Decompiler; +import jadx.api.IJadxArgs; import jadx.api.JavaClass; import jadx.api.JavaPackage; import jadx.core.utils.exceptions.DecodeException; @@ -12,12 +12,14 @@ import java.util.List; public class JadxWrapper { private final Decompiler decompiler; + private File openFile; public JadxWrapper(IJadxArgs jadxArgs) { this.decompiler = new Decompiler(jadxArgs); } public void openFile(File file) { + this.openFile = file; try { this.decompiler.loadFile(file); } catch (IOException e) { @@ -35,4 +37,7 @@ public class JadxWrapper { return decompiler.getPackages(); } + public File getOpenFile() { + return openFile; + } } diff --git a/jadx-gui/src/main/java/jadx/gui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/MainWindow.java index 61bb664e0..dd16bf19f 100644 --- a/jadx-gui/src/main/java/jadx/gui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/MainWindow.java @@ -1,25 +1,35 @@ package jadx.gui; import jadx.api.JavaClass; -import jadx.api.JavaPackage; import jadx.cli.JadxArgs; -import jadx.gui.model.JClass; -import jadx.core.utils.exceptions.JadxRuntimeException; +import jadx.gui.treemodel.JClass; +import jadx.gui.treemodel.JNode; +import jadx.gui.treemodel.JRoot; -import javax.swing.*; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.MutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; -import java.net.URL; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; @@ -35,8 +45,8 @@ public class MainWindow extends JFrame { private final JadxWrapper wrapper; private JPanel mainPanel; - private DefaultMutableTreeNode treeRoot; private JTree tree; + private DefaultTreeModel treeModel; private RSyntaxTextArea textArea; public MainWindow(JadxArgs jadxArgs) { @@ -52,7 +62,7 @@ public class MainWindow extends JFrame { JMenu file = new JMenu("File"); file.setMnemonic(KeyEvent.VK_F); - JMenuItem exit = new JMenuItem("Exit", openIcon("application-exit")); + JMenuItem exit = new JMenuItem("Exit", Utils.openIcon("cross")); exit.setMnemonic(KeyEvent.VK_E); exit.setToolTipText("Exit application"); exit.addActionListener(new ActionListener() { @@ -61,7 +71,7 @@ public class MainWindow extends JFrame { } }); - JMenuItem open = new JMenuItem("Open", openIcon("document-open-5")); + JMenuItem open = new JMenuItem("Open", Utils.openIcon("folder")); open.setMnemonic(KeyEvent.VK_E); open.setToolTipText("Open file"); open.addActionListener(new ActionListener() { @@ -92,54 +102,49 @@ public class MainWindow extends JFrame { } private void initTree() { - treeRoot.removeAllChildren(); - for (JavaPackage pkg : wrapper.getPackages()) { - MutableTreeNode child = new DefaultMutableTreeNode(pkg); - int i = 0; - for (JavaClass javaClass : pkg.getClasses()) { - MutableTreeNode cls = new DefaultMutableTreeNode(new JClass(javaClass)); - child.insert(cls, i++); - } - treeRoot.add(child); - } + JRoot treeRoot = new JRoot(wrapper); + treeModel.setRoot(treeRoot); + treeModel.reload(); tree.expandRow(0); } - private ImageIcon openIcon(String name) { - String iconPath = "/icons-16/" + name + ".png"; - URL resource = getClass().getResource(iconPath); - if (resource == null) { - throw new JadxRuntimeException("Icon not found: " + iconPath); - } - return new ImageIcon(resource); - } - private void initUI() { mainPanel = new JPanel(new BorderLayout()); JSplitPane splitPane = new JSplitPane(); mainPanel.add(splitPane); - treeRoot = new DefaultMutableTreeNode("Please open file"); - tree = new JTree(treeRoot); + DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode("Please open file"); + treeModel = new DefaultTreeModel(treeRoot); + tree = new JTree(treeModel); // tree.setRootVisible(false); // tree.setBackground(BACKGROUND); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { - Object node = tree.getLastSelectedPathComponent(); - if (node instanceof DefaultMutableTreeNode) { - Object obj = ((DefaultMutableTreeNode) node).getUserObject(); - if (obj instanceof JClass) { - JavaClass jc = ((JClass) obj).getCls(); - String code = jc.getCode(); - textArea.setText(code); - textArea.setCaretPosition(0); - } + Object obj = tree.getLastSelectedPathComponent(); + if (obj instanceof JClass) { + JavaClass jc = ((JClass) obj).getCls(); + String code = jc.getCode(); + textArea.setText(code); + textArea.setCaretPosition(0); } } }); + tree.setCellRenderer(new DefaultTreeCellRenderer() { + @Override + public Component getTreeCellRendererComponent(JTree tree, + Object value, boolean selected, boolean expanded, + boolean isLeaf, int row, boolean focused) { + Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); + if (value instanceof JNode) { + setIcon(((JNode) value).getIcon()); + } + return c; + } + }); + JScrollPane treeScrollPane = new JScrollPane(tree); splitPane.setLeftComponent(treeScrollPane); diff --git a/jadx-gui/src/main/java/jadx/gui/Utils.java b/jadx-gui/src/main/java/jadx/gui/Utils.java new file mode 100644 index 000000000..f23c80101 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/Utils.java @@ -0,0 +1,18 @@ +package jadx.gui; + +import jadx.core.utils.exceptions.JadxRuntimeException; + +import javax.swing.ImageIcon; +import java.net.URL; + +public class Utils { + + public static ImageIcon openIcon(String name) { + String iconPath = "/icons-16/" + name + ".png"; + URL resource = Utils.class.getResource(iconPath); + if (resource == null) { + throw new JadxRuntimeException("Icon not found: " + iconPath); + } + return new ImageIcon(resource); + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/model/JClass.java b/jadx-gui/src/main/java/jadx/gui/model/JClass.java deleted file mode 100644 index 39a0adf7f..000000000 --- a/jadx-gui/src/main/java/jadx/gui/model/JClass.java +++ /dev/null @@ -1,21 +0,0 @@ -package jadx.gui.model; - -import jadx.api.JavaClass; - -public class JClass { - - private final JavaClass cls; - - public JClass(JavaClass cls) { - this.cls = cls; - } - - public JavaClass getCls() { - return cls; - } - - @Override - public String toString() { - return cls.getShortName(); - } -} diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java new file mode 100644 index 000000000..252b15b40 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -0,0 +1,30 @@ +package jadx.gui.treemodel; + +import jadx.api.JavaClass; +import jadx.gui.Utils; + +import javax.swing.Icon; +import javax.swing.tree.DefaultMutableTreeNode; + +public class JClass extends DefaultMutableTreeNode implements JNode { + + private final JavaClass cls; + + public JClass(JavaClass cls) { + this.cls = cls; + } + + public JavaClass getCls() { + return cls; + } + + @Override + public Icon getIcon() { + return Utils.openIcon("class_obj"); + } + + @Override + public String toString() { + return cls.getShortName(); + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java new file mode 100644 index 000000000..b05409ed3 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java @@ -0,0 +1,7 @@ +package jadx.gui.treemodel; + +import javax.swing.Icon; + +public interface JNode { + Icon getIcon(); +} diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java new file mode 100644 index 000000000..029c947e2 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java @@ -0,0 +1,37 @@ +package jadx.gui.treemodel; + +import jadx.api.JavaClass; +import jadx.api.JavaPackage; +import jadx.gui.Utils; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.tree.DefaultMutableTreeNode; + +public class JPackage extends DefaultMutableTreeNode implements JNode { + private static final ImageIcon PACKAGE_ICON = Utils.openIcon("package_obj"); + + private final JavaPackage pkg; + + public JPackage(JavaPackage pkg) { + this.pkg = pkg; + + for (JavaClass javaClass : pkg.getClasses()) { + add(new JClass(javaClass)); + } + } + + public JavaPackage getPkg() { + return pkg; + } + + @Override + public Icon getIcon() { + return PACKAGE_ICON; + } + + @Override + public String toString() { + return pkg.getName(); + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java new file mode 100644 index 000000000..dfc755e91 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java @@ -0,0 +1,36 @@ +package jadx.gui.treemodel; + +import jadx.api.JavaPackage; +import jadx.gui.JadxWrapper; +import jadx.gui.Utils; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.tree.DefaultMutableTreeNode; +import java.io.File; + +public class JRoot extends DefaultMutableTreeNode implements JNode { + + private static final ImageIcon ROOT_ICON = Utils.openIcon("java_model_obj"); + + private final JadxWrapper wrapper; + + public JRoot(JadxWrapper wrapper) { + this.wrapper = wrapper; + + for (JavaPackage pkg : wrapper.getPackages()) { + add(new JPackage(pkg)); + } + } + + @Override + public Icon getIcon() { + return ROOT_ICON; + } + + @Override + public String toString() { + File file = wrapper.getOpenFile(); + return file != null ? file.getName() : "File not open"; + } +} diff --git a/jadx-gui/src/main/resources/icons-16/annotation_obj.png b/jadx-gui/src/main/resources/icons-16/annotation_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b272b2ee1a8574c247ea19b64bec0d78d7ba9e GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*U0JxF4ZZOgG7% zWtKbJJa@KB`9jxsv9YaPo@2Rl8RoID6#M?Nit9 z=TBZyKYvsI<`c7bpPRYu`1aG+-+leL_u}nOKYoAx_2=`?-`AeMyz%1I({Eos|Niy= z|9_yh)CJWC9_zT|{U040URYf$yT~eL1RJAnnmRZY+=ib(~v8yWEK6w|%*Zn+M|AQ&-i8Mn_3hOzb PqZmA0{an^LB{Ts5i!;Tr literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/application-exit.png b/jadx-gui/src/main/resources/icons-16/application-exit.png deleted file mode 100644 index fc8ab3008468a8297b2b0a9e8b43690955ff9365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE!)l?6A%7zXe;;g{c@`q6t3NL zzCM>Hj72+vwQ29~tY@DtD(83>U!S>7tZcjOlAWe3E1zx1o#@6O|8!43pEER_mR3{N_344dwv|hlDTVa2seO8P$U#}P z_UL?{^h-8#<}NER_P%h%D^*v1-Tm(ms>{taT7yi4$6CLVbt^1x< zy7%kF$LWo~zU{2>bZ4%O>ApO1!`0ZA4%xEo0ln8OXG+!G6zh-ItiG3UFZRb#!H?p4 zkAAU6@Vkiu(}rq^YeY#(Vo9o1a#1RfVlXl=G|)9L)ip8+F)+6>wy*-S4a}?z41_lA z{fD9b88S*r3as??!FFYqr6%X+=H}-W>*W`v z>*qj}6zeBd>J}&J8|xY9C%#!92sA+wWI}L$T1k0gQ7S`udAVL@UUqSEVnHfM^WdhX(n8-BJv6Oj>G6eo={w>g%t4{F;L+_p#G zd(-Cdg@w86TGn0KZQSJR)*lx&yP#}cN8RQLjaw(3cyQtDqbt{6-c>2H)2neaZuGWn z3y7Upn7pWb*_lnZUftKNanY-F)vt9kr~}G+dQVF5nh;mMuDxbcPt(>3dv6`R@$#-w zgS%Oamvy_peP>YL-dVGcEwk(Jx9bS7YY%Yi3lEx>l)b#Ff8VUbcTYZg|1@k?O4!Vl zJvR=8OizrPlXdIW-De+PeEIn`Xjpf zzPLW`*up!n?xruw%3W4azOJHSb3^sUs>*fc?K@fu#A zkI!0geD>}e+YjB@f9&4j4Hs7b2LoW(k_skXk!A<#$u9}=3x*g%FOuP3SlLye)r?8r z?k@En`wO1}Ih+L^k;OpT1B~5HX4?T7r#xL8LnJOIpI~NUHLVS0Hf0qs?q}?H8seOk zl;ouHbOBRQTBl{?%}B|OUPTFvtXF?*i4pMVogBiz>CwLI`Li^&(4xhQnwB~+P1@zR^W3eds9ROf%(N0j#oBi2O)D#NJ0^9_NP)35+JApcx%=uE zdBMcW2@NYJxi1jEAe0}bmZrGDI%VqHzsyZchazv>WKqDIXD z)w=4}x*5~~Wj(zoC3sDUD__@s<-II^rKMk6e5H>3%Y-URAoUGO7H}AP|C}etK_{@}unJIB|vTnV) z`|RV3plNX*zkfyDnDJ(E9t{}?$lF=I)7;)3*qd1>>GExhyUZu+9E z++_vj>na*HH&kz|s$5szzN58qbM3?T4<_#G*?eiko|`-O-P%3>_^buTXYanT{m`BL z$L<~8aAEa-FaU-RJ%L}GaRbo4=#n76V2A@~K{CwwwPO#^8pb4Vcb9sP{e@3~9L@rd z$YLPv0mg18v+aP49iA?ZArhC9JD8aA96jqa9rFZ?yBIrm{*bk`v5}G7xqvBV(>}q( zhlz^wY+@1^^XlF&@DSkmlJta)bAvUjyIb2Yc9&m2EjSxlB6MSvV&~4Cd-v`gnFvRw zo=3ALMlDiOS|n8DRg)n4>C(hoTv}R(*qE{sM4e78n>Mjcs%zr6UsgN{jFNK7(#8u^ zpOvZEBt$Q=s0>}ZCU@=Ho|zU4^`43ZU%z@eRQz#^rES;j-kGg4nIDRaI7Bco1nzOr U(O$8_ALs`LPgg&ebxsLQ0HbVFVE_OC literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/cross.png b/jadx-gui/src/main/resources/icons-16/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#}b@(E4+OP4TST(*3{(uK}eE=TPhLpr*w7WJ;_VA9wiqUqvj#3Gb*T=Cn_oV@pW z``ZqsPhQ|*vggveWtH=0#_~E(G~f|D{_*P6sZ(!H^*XAobj;HJJHvy&b@l2zhkXUx z9%gNg%4OK#C~zk>I=Whhg>n0}CPOxcgvmbH9EvWhuU7FT1e-|pF8^Bfx6$xe=Gw@e zG2hw`D{j)U)@5M$v9CXCYgf=pmgF84C604HI}FvfT>D_dpE*mZOGzR*?Lo*P%l05H zCyp;wd-tYo=3F?%N=fNb)aIzQZ5mPuHge1fGd}U~BuqXP#jN@CLBjvv#~0^`E1mx= zCn%ZRbACsEetT_1`tloFY%QKYnAaW=_2&PJH~U`e_CCEc^|aFIP05-|Kec}N9m#q8 znNZ6E3t6TEG7RhjjH|Yl{5`jK=ht`Vcj$hyd9Us{Nnc+-USdP#8Qr)RX6B15s0vlGgq{-M)#%olnC-kg8fDZHW2p=4EYVj+u#yFpo!k=NWgJd^pIG^cvZJTl+zz2dq%4etfllokY^e8Xun z`&9A)jg#fyteayErFw&=KEL?wy4J8JOrAm|Gbb$ns6jgJ}S%w1VgYYA`g=H89dOG6*p;wlXra zGBkx~V6%>CMA49&pOTqY3DsbzYh)H;Xl`X{0<;98K|Ox998iN1$Von#$*Fn8sSFt< zB?VUc`l)$(<(b);1*s{SiF)}(>G~j^en4qbPG)j^N`7u)W}f}uSLb2YL2M%6A*cOM zqktMDLDmK5r9)Ra9Z S)?Nde!rld0vUj{8HBiW$p{h zJr|ALumV0h_>LZJ=tyk|4ie zpk9&ygZwN%MWANJByV>Yd%I+VQXq%3z$3C4NPB>>+sSM@AY-nli(`ny<<|b!d`$*C zZtPkHAIvVik_bNNd-U|K@AXzMn+*SbQt_QN*)0C_pN7@fZ>}o4Qe`&ftO>)5BYlVb z&htANOShc9CDy5~(s#s9v-QWT-;0BIJC{xn`lz%tC&5!`rb}Ri<x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWYh3hdUG;0-4C;Wgp5BuZye7nzuWP^Y@~%;XyIG5u zb-TZPXVC0p%j`P*?K%SN+5_DB!h@zIWiPMl-#2T?>9vRNo_zHFY1pik)#o?wxp63D zdScw1tXr?{22G3m`2ADDg3OvtEtTsUm!DY^IWsY1Nq*vj^n`h7^NuaN^XhK;qO9Cy z1?B518a6jnZ>*|ZSKhv(wQ+Op!}kv+?(5lnX~UkIJNMn%J^%Qu1;=OazOnt#o&Cq| z9o}$Z_4CQyC!K9hy4#(!v-&ov?|DMP*P5EQ&CUP802pXA0Jvw=n@l?3?(L+qj< z$siCmX%)~m#w2fdmwJ!=g-?MT&H|6fVj%4S#%?FG?SPCEo-U3d5|@)bSeO(GSq)ta z6$OkZGIp>Yk-2mCuIvt$1x!p@b`KXOE<7lAh$(?l(Qy3%76FbAPlT8_KUlJuL?oVugj`r|@o zWJS#`sM|cDaqFbn$5w8+vj6O(D=KAndNppwjoy}R0sd1{W9JnnFDloqanY-F)vt9k zsB`n4l;AZXE_ix+?uxqdb?rA^-Zg4)w{G{h?+lu-e~w*8fL(ilTVHt4w506iRsH*B zO*^!3$?3I+@1A`0{%P2(lsz{Ng-lP3o0E0x)!m?JaUZ{b3Yi|4upqN$Q%mK##^q<$ zM9xgiSdyQ(AU$DT+Pq^6@4UL3yR4vmT}8v@hU$$~mFvpeceFNcu6_9a!Nh$%n=ftH zb93juTf65UpS9rl?ACq& zO(_ZT3x?Q2Q<6cgC)XBeA7hfYyGy;t{=%m~4rhT!WHFHT0Ash4*>*t2Sx*{ydYLn|oIB#zLkyMt=M5+1;C0cIQn3qn;i6cNKwx&FK%A zI5$L9sHj%%+@WS^9mUbaGUMyoNo#aVEC`;iAyNpU&{RwRK{ru^uDGp#yb|O*2|rZlt6%K6&vXC4|v{fx+aJ UTeE#!0?3yPp00i_>zopr08tcrvH$=8 literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/int_obj.png b/jadx-gui/src/main/resources/icons-16/int_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..31caf5a7114c386e9c1a9c6af2ac0fd2ee9203bd GIT binary patch literal 745 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR^pTd2n>^z3UfW7Q}7H zk6l-ku(2?HLviB9(v*!AXJ9es9 zm+a}R+TT{OySsLOSIxe@hJy>Io>{l_(#{RH&K!FZ=eIC3a?QG>SN?+m&}%~uczu4P z4|KFkNswPK#1|Bi4275ag@EQUCV9KN)O+kNd%QQTfirty7dy(08#15mYBv-${ws8Gnp?@W)zh5fO5RPm y?6*#T>e&g;e_ohkzg#@?e)*q+->1v}>o(tLXQX;oeWeu8^$eb_elF{r5}E)GekA(< literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/java_model_obj.png b/jadx-gui/src/main/resources/icons-16/java_model_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..3918c215fb5624cc9cc71d2d176f2675c3232a56 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*YfROurCTo?Jo{kdf$P4- zODr{yZRerOkN$t!uxpyyzBwA3dX@e^?ECkyZ+V@}nijc#=X3u5{|_{S zAlUw_)f%Wsq$J2M7^npuF!=jF7X->PCV9KN$g}ba>;-Z-3p^r=fwTu0yPeFo12Q5! zT^vIsF87{y6gwcm;~Ln);dSxv`>m54`z5~iKI*gkEHm@1pG1ArLlKMTA{7iDUVFBv z2&~zf=;-3bbmFCK1)uN^3s%eL{5vk)iv6~<^ju`Q#NO`<|10hNyO=+^MPB;@&<+Mq LS3j3^P6$5{{8vu@3$X+efa$A z>-XP3fBm`t;>W|6KOVpS`Q-JF=WlPK>KYaQ1{pX)=KYl-W_2coIA8$VWdjIA3+fP5UC+vCl?#IgyKRY{#TTGTTn=EKDo!?|SryhvRrq!4~IMKhU%V2$n z;hJ`%m955CHf3DdlzD4!&DBkr|Ns97`g(AJ`=R@G0bS->666;QbSKpS!{sc&2B5)= zN#5=*^&a~Rp8`3Y1s;*bK-vS0-A-oP0U3)tT^vIsF2|mDDb^Su(fUw$;zyO`0n500 zPfV$trupuF)tsl@TPwcbs+arnhx;OXV7!I;y}Ql)F${;?1rB;mOFbUq|L`r>hQ!F$ zriBvO4YG>5Ts+R(7^+3i2d-Ffj4>gqf2(H7?4!yDd<06ksv_qz>zEwhNE!D zdoO2X&04>djX~LOQ?BQ#qNR2RSe_ROCF^u0Gwgr8%hu}rXU4iJ#>e$Q_lbZ literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/jsearch_obj.png b/jadx-gui/src/main/resources/icons-16/jsearch_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..c34b05813eada75f15e6f24f270799612db48e8c GIT binary patch literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR>d2UGwDOclTsCw;v#@#hZLlPe33ugJf@xBlLx{V&&tzupwPwl99?jI`w)G2ia*`LNV_(}bj- zw>RE7zi(b`*xcH%iTQs0dA<|!{U#R$OfCupx&R1(9v_6@OEsT)Qr5?E3iIVx)9Yuf%yQOPWo$F~Z`J13iHi~f z++J88?vP8+>5@2N_}S^a)nS)O1|E~StB%jAHdt{z%W0>bg{0g4C<_*!ok~+uZthv6 zFYC1M_Mb~<@7}bnyZtPs$^V&%#@1Zx+5AT)^E>_Ba4GtD36Ik{d(Gmvwcaj=Yz(e% rxu*T}Q*6z3+wa?D_PNXdn^VW&Vqq96G2ufW&nHfuER zl;}Px(0__`>Sfjj551`g6+3D^oY44iK;gv>g%1ZbUTlzfut4C!41pUH1TJ(4+~^Rv z&>(Q4Lg2%V9TzGDu5@`{?()91uyAjN$-yG~Z4oLPJw-Nnh-~l_`Tzev&_Y^(MQW0F zfaWTf1o;I6Z6N>{(lnc=0hKc*dAqyV+a(*60y&%o9+AaB+5?Q;PG;Ky8RecXjv*44 zThE^sYBJz)xcGp(MnTXwNl@|Z|9X|&jgKENy-z7si)4AD9>M4s$uzH!v!#%A&5fM$ z-_DUOlV9sH)o^J~H=8R{+_KhXggTe~DWM4f#Mh>; literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/methdef_obj.png b/jadx-gui/src/main/resources/icons-16/methdef_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..a4131b9ba8d0d96217e1ec6431866c65731b4164 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*Ye?fZ$MW?-ZM%ZocFCnI zR!(1HS-!!tVuL`;9HF?mqVe;@66Q-LFOW%DB$K*GCS{>a>O#5H#Y!1V)v}kX=PdvK z|3AKg)5dlFr(S+0_F(<)<#B^a7u?G*I3qN@3DD)tSg(+^)f6PgAm3`|aF8lI5V z`Q#h((KqI6S;GlQt>=@wPdeM2bhkTcXZ3AT-}8iouQfGqo16dt{}0qnBxqc5wh^dQ zs3gcQ7^o2yFg)77UkE76nB?v5BG1YzuouYTEbxdd2GSm2>~=ES4#=?gba4!kxV-h8 zB^QGN59`Gp$8_D^*GCF=^G|CE-j|gTchP=@y2Hd+Mw7tMOor2jF54K)tu7ic%rBRl d;Mc#LyWk0b^C1bIr$D0^JYD@<);T3K0RXKNUHSk3 literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/methpro_obj.png b/jadx-gui/src/main/resources/icons-16/methpro_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4c0d7853c1b6980cde9e8f8a46770b3192959e GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*>;F$1{=b~~|JB6plU4W4 z(bzphefLcD|IcQuYnR{LtF)7B|(0{K=l}aLHlOyE1&|#ByV>Yc~)M5y+96Ufk$L9koEv$x0Bg+ zK!&rYi(`ny<+P^f#mw3`gjI0jEwKbLh*2~7awsAp~f literal 0 HcmV?d00001 diff --git a/jadx-gui/src/main/resources/icons-16/methpub_obj.png b/jadx-gui/src/main/resources/icons-16/methpub_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..30041952863fbb9fbbe0e9cc3e9e1c3dfd9b7aad GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*D|3SfYon)ZPnh1+1m`(9 zzKe@f*0mOH>&@TTRl0qG{qzL;8S!4TQ^S@Q#IGtzT2)ZEv8-@oY0LhWroBxq`&yc| z)_3e|?AX!RxubE$u?f@ncC0=>bM^TdTQ1H0|NlSGlKe^g{{boak|4iepa>qoa8|Mm z+hKJO$xC^VF0*z(7t7-(Fny^yI?*O@>FC zjc)Iscd$zL`py~qOSKM`YhT|neS5CP?n13|tGibwC{GTRUze=9G)8Gbq~fATrQ-{l z3T?#a6+~3}JN*CuA7~^d;J!5P7En~OB*-rqs0J%wU^L;{4phXL^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vp