Skip to content

Commit 42ac7c5

Browse files
collapse single-child directory chains in resource tree
1 parent bce6611 commit 42ac7c5

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.nio.charset.Charset;
44
import java.nio.charset.StandardCharsets;
5+
import java.util.ArrayList;
56
import java.util.Collections;
67
import java.util.Comparator;
78
import java.util.List;
@@ -69,7 +70,7 @@ public enum JResType {
6970
}
7071

7172
private final transient String name;
72-
private final transient String shortName;
73+
private transient String shortName;
7374
private final transient JResType type;
7475
private final transient ResourceFile resFile;
7576

@@ -159,6 +160,50 @@ private static void sortResNodes(List<JResource> nodes) {
159160
}
160161
}
161162

163+
/**
164+
* Collapse single-child DIR chains into one node with a slash-joined display name (GitHub-style).
165+
*/
166+
public static void mergeMiddleDirs(JResource root) {
167+
mergeChildren(root.subNodes);
168+
}
169+
170+
public static void mergeMiddleDirs(List<JResource> roots) {
171+
mergeChildren(roots);
172+
}
173+
174+
private static void mergeChildren(List<JResource> children) {
175+
for (int i = 0; i < children.size(); i++) {
176+
JResource sub = children.get(i);
177+
JResource replaced = mergeChain(sub, new ArrayList<>());
178+
if (replaced != sub) {
179+
children.set(i, replaced);
180+
}
181+
mergeChildren(replaced.subNodes);
182+
}
183+
}
184+
185+
private static JResource mergeChain(JResource node, List<JResource> merged) {
186+
if (node.type == JResType.DIR) {
187+
List<JResource> subs = node.subNodes;
188+
if (subs.size() == 1 && subs.get(0).type == JResType.DIR) {
189+
merged.add(node);
190+
return mergeChain(subs.get(0), merged);
191+
}
192+
}
193+
if (!merged.isEmpty()) {
194+
merged.add(node);
195+
StringBuilder sb = new StringBuilder();
196+
for (int i = 0; i < merged.size(); i++) {
197+
if (i > 0) {
198+
sb.append('/');
199+
}
200+
sb.append(merged.get(i).shortName);
201+
}
202+
node.shortName = sb.toString();
203+
}
204+
return node;
205+
}
206+
162207
@Override
163208
public boolean hasContent() {
164209
return resFile != null;

jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ private JResource getHierarchyResources(List<ResourceFile> resources) {
7373
JResource leaf = new JResource(rf, rf.getDeobfName(), parts[count - 1], JResType.FILE);
7474
curRf.addSubNode(leaf);
7575
}
76+
JResource.mergeMiddleDirs(root);
7677
root.sortSubNodes();
7778
root.update();
7879
return root;

jadx-gui/src/main/java/jadx/gui/utils/res/ResTableHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class ResTableHelper {
2424
public static List<JResource> buildTree(JResource resTableRes, ResContainer resTable) {
2525
ResTableHelper resTableHelper = new ResTableHelper(resTableRes);
2626
resTableHelper.process(resTable);
27+
JResource.mergeMiddleDirs(resTableHelper.roots);
2728
return resTableHelper.roots;
2829
}
2930

0 commit comments

Comments
 (0)