From 4a0aacf104a2a4cbc26af198b4abbeecefab6bb9 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 28 Dec 2013 19:35:03 +0400 Subject: [PATCH] gui: fix inner classes opening --- .../src/main/java/jadx/api/JavaClass.java | 11 ++++++- .../src/main/java/jadx/gui/MainWindow.java | 9 +++--- .../main/java/jadx/gui/treemodel/JClass.java | 32 ++++++++++++------- .../main/java/jadx/gui/treemodel/JField.java | 13 ++++++-- .../main/java/jadx/gui/treemodel/JMethod.java | 11 +++++-- .../main/java/jadx/gui/treemodel/JNode.java | 7 ++++ 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index c6526e648..26e70133b 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -6,6 +6,7 @@ import jadx.core.dex.info.AccessInfo; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.MethodNode; +import jadx.core.utils.exceptions.JadxRuntimeException; import java.util.ArrayList; import java.util.Collections; @@ -27,14 +28,22 @@ public final class JavaClass { } public void decompile() { + if (decompiler == null) { + throw new JadxRuntimeException("Can't decompile inner class"); + } decompiler.processClass(cls); + load(); + } + private void load() { int inClsCount = cls.getInnerClasses().size(); if (inClsCount != 0) { List list = new ArrayList(inClsCount); for (ClassNode inner : cls.getInnerClasses()) { if (!inner.getAttributes().contains(AttributeFlag.DONT_GENERATE)) { - list.add(new JavaClass(decompiler, inner)); + JavaClass javaClass = new JavaClass(null, inner); + javaClass.load(); + list.add(javaClass); } } this.innerClasses = Collections.unmodifiableList(list); diff --git a/jadx-gui/src/main/java/jadx/gui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/MainWindow.java index 17a7c2dfd..e518afad0 100644 --- a/jadx-gui/src/main/java/jadx/gui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/MainWindow.java @@ -149,10 +149,9 @@ public class MainWindow extends JFrame { Object obj = tree.getLastSelectedPathComponent(); if (obj instanceof JNode) { JNode node = (JNode) obj; - if (node.getJParent() != null) { - showCode(node.getJParent(), node.getLine()); - } else if (node.getClass() == JClass.class) { - showCode((JClass) node, node.getLine()); + JClass cls = node.getRootClass(); + if (cls != null) { + showCode(cls, node.getLine()); } } } @@ -392,7 +391,7 @@ public class MainWindow extends JFrame { Object node = path.getLastPathComponent(); if (node instanceof JClass) { JClass cls = (JClass) node; - cls.load(); + cls.getRootClass().load(); } } diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java index 6a10e1a89..98e25a519 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -22,11 +22,19 @@ public class JClass extends JNode { private static final ImageIcon ICON_ANNOTATION = Utils.openIcon("annotation_obj"); private final JavaClass cls; - private JClass jParrent; + private final JClass jParent; private boolean loaded; public JClass(JavaClass cls) { this.cls = cls; + this.jParent = null; + this.loaded = false; + } + + public JClass(JavaClass cls, JClass parent) { + this.cls = cls; + this.jParent = parent; + this.loaded = true; } public JavaClass getCls() { @@ -47,18 +55,16 @@ public class JClass extends JNode { if (!loaded) { add(new TextNode(NLS.str("tree.loading"))); } else { - JClass currentParent = jParrent == null ? this : jParrent; for (JavaClass javaClass : cls.getInnerClasses()) { - JClass child = new JClass(javaClass); - child.setJParent(currentParent); - child.updateChilds(); + JClass child = new JClass(javaClass, this); add(child); + child.updateChilds(); } for (JavaField f : cls.getFields()) { - add(new JField(f, currentParent)); + add(new JField(f, this)); } for (JavaMethod m : cls.getMethods()) { - add(new JMethod(m, currentParent)); + add(new JMethod(m, this)); } } } @@ -88,13 +94,17 @@ public class JClass extends JNode { } } - public void setJParent(JClass parent) { - this.jParrent = parent; + @Override + public JClass getJParent() { + return jParent; } @Override - public JClass getJParent() { - return jParrent; + public JClass getRootClass() { + if (jParent == null) { + return this; + } + return jParent.getRootClass(); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java index 74504e7ef..49ba522c0 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java @@ -36,6 +36,11 @@ public class JField extends JNode { return jParent; } + @Override + public JClass getRootClass() { + return jParent.getRootClass(); + } + @Override public int getLine() { return field.getDecompiledLine(); @@ -45,8 +50,12 @@ public class JField extends JNode { public Icon getIcon() { AccessInfo af = field.getAccessFlags(); OverlayIcon icon = Utils.makeIcon(af, ICON_FLD_PUB, ICON_FLD_PRI, ICON_FLD_PRO, ICON_FLD_DEF); - if (af.isTransient()) icon.add(ICON_TRANSIENT); - if (af.isVolatile()) icon.add(ICON_VOLATILE); + if (af.isTransient()) { + icon.add(ICON_TRANSIENT); + } + if (af.isVolatile()) { + icon.add(ICON_VOLATILE); + } return icon; } diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java index 2d97416bf..2d678321c 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java @@ -22,11 +22,11 @@ public class JMethod extends JNode { private static final ImageIcon ICON_SYNC = Utils.openIcon("synch_co"); private final JavaMethod mth; - private final JClass jparent; + private final JClass jParent; public JMethod(JavaMethod javaMethod, JClass jClass) { this.mth = javaMethod; - this.jparent = jClass; + this.jParent = jClass; } @Override @@ -35,7 +35,12 @@ public class JMethod extends JNode { @Override public JClass getJParent() { - return jparent; + return jParent; + } + + @Override + public JClass getRootClass() { + return jParent.getRootClass(); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java index 24b6738a2..741dde867 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java @@ -7,6 +7,13 @@ public abstract class JNode extends DefaultMutableTreeNode { public abstract JClass getJParent(); + /** + * Return top level JClass or self if already at top. + */ + public JClass getRootClass() { + return null; + } + public abstract int getLine(); public abstract void updateChilds();