1919import cn .enaium .joe .gui .JavaOctetEditor ;
2020import cn .enaium .joe .gui .panel .file .FileDropTarget ;
2121import cn .enaium .joe .gui .panel .file .tabbed .tab .FileTabPanel ;
22- import cn .enaium .joe .gui .panel .file .tree .node .ClassTreeNode ;
23- import cn .enaium .joe .gui .panel .file .tree .node .FieldTreeNode ;
24- import cn .enaium .joe .gui .panel .file .tree .node .MethodTreeNode ;
25- import cn .enaium .joe .gui .panel .file .tree .node .PackageTreeNode ;
22+ import cn .enaium .joe .gui .panel .file .tree .node .*;
2623import cn .enaium .joe .jar .Jar ;
2724import cn .enaium .joe .util .ASyncUtil ;
25+ import javassist .ClassPool ;
26+ import javassist .CtClass ;
27+ import javassist .CtMethod ;
28+ import javassist .Loader ;
29+ import org .objectweb .asm .ClassReader ;
2830import org .objectweb .asm .tree .ClassNode ;
2931import org .objectweb .asm .tree .FieldNode ;
3032import org .objectweb .asm .tree .MethodNode ;
33+ import org .objectweb .asm .util .ASMifier ;
34+ import org .objectweb .asm .util .TraceClassVisitor ;
3135
3236import javax .swing .*;
3337import javax .swing .tree .DefaultTreeModel ;
34- import javax .swing .tree .TreePath ;
3538import java .awt .dnd .DnDConstants ;
3639import java .awt .dnd .DropTarget ;
40+ import java .awt .event .KeyAdapter ;
41+ import java .awt .event .KeyEvent ;
3742import java .io .File ;
38- import java .nio .file .Files ;
43+ import java .io .PrintWriter ;
44+ import java .io .StringWriter ;
3945import java .util .*;
4046
4147/**
4248 * @author Enaium
4349 */
4450public class FileTreePanel extends JTree {
4551
52+ private static final DefaultTreeNode classesRoot = new DefaultTreeNode ("classes" );
53+ private static final DefaultTreeNode resourceRoot = new DefaultTreeNode ("resources" );
54+
4655 public FileTreePanel () {
47- super (new PackageTreeNode ("" ));
56+ super (new DefaultTreeNode ("" ) {{
57+ add (classesRoot );
58+ add (resourceRoot );
59+ }});
60+
4861 setRootVisible (false );
4962 setShowsRootHandles (true );
5063 setCellRenderer (new FileTreeCellRenderer ());
5164 addTreeSelectionListener (e -> {
52- PackageTreeNode lastPathComponent = (PackageTreeNode ) e .getPath ().getLastPathComponent ();
65+ DefaultTreeNode lastPathComponent = (DefaultTreeNode ) e .getPath ().getLastPathComponent ();
5366 if (lastPathComponent instanceof ClassTreeNode ) {
5467 JavaOctetEditor .getInstance ().fileTabbedPanel .addTab (lastPathComponent .toString (), new FileTabPanel (((ClassTreeNode ) lastPathComponent ).classNode ));
5568 JavaOctetEditor .getInstance ().fileTabbedPanel .setSelectedIndex (JavaOctetEditor .getInstance ().fileTabbedPanel .getTabCount () - 1 );
@@ -67,66 +80,102 @@ public FileTreePanel() {
6780 public void refresh (Jar jar ) {
6881 DefaultTreeModel model = (DefaultTreeModel ) getModel ();
6982 model .reload ();
70- PackageTreeNode root = ( PackageTreeNode ) model . getRoot ();
71- root .removeAllChildren ();
83+ classesRoot . removeAllChildren ();
84+ resourceRoot .removeAllChildren ();
7285
73- Map <String , PackageTreeNode > hasMap = new HashMap <>();
86+ Map <String , DefaultTreeNode > hasMap = new HashMap <>();
7487
7588
7689 for (ClassNode classNode : jar .classes .values ()) {
7790 String [] split = classNode .name .split ("/" );
78- PackageTreeNode prev = null ;
91+ DefaultTreeNode prev = null ;
7992 StringBuilder stringBuilder = new StringBuilder ();
8093 int i = 0 ;
8194 for (String s : split ) {
8295 stringBuilder .append (s );
83- PackageTreeNode fileTreeNode = new PackageTreeNode (s );
96+ PackageTreeNode packageTreeNode = new PackageTreeNode (s );
8497
8598 if (split .length == i + 1 ) {
86- fileTreeNode = new ClassTreeNode (classNode );
99+ packageTreeNode = new ClassTreeNode (classNode );
87100 for (MethodNode methodNode : classNode .methods ) {
88- fileTreeNode .add (new MethodTreeNode (classNode , methodNode ));
101+ packageTreeNode .add (new MethodTreeNode (classNode , methodNode ));
89102 }
90103 for (FieldNode field : classNode .fields ) {
91- fileTreeNode .add (new FieldTreeNode (classNode , field ));
104+ packageTreeNode .add (new FieldTreeNode (classNode , field ));
92105 }
93106 }
94107
95108 if (prev == null ) {
96109 if (!hasMap .containsKey (stringBuilder .toString ())) {
97- root .add (fileTreeNode );
98- hasMap .put (stringBuilder .toString (), fileTreeNode );
99- prev = fileTreeNode ;
110+ classesRoot .add (packageTreeNode );
111+ hasMap .put (stringBuilder .toString (), packageTreeNode );
112+ prev = packageTreeNode ;
100113 } else {
101114 prev = hasMap .get (stringBuilder .toString ());
102115 }
103116 } else {
104117 if (!hasMap .containsKey (stringBuilder .toString ())) {
105- prev .add (fileTreeNode );
106- hasMap .put (stringBuilder .toString (), fileTreeNode );
107- prev = fileTreeNode ;
118+ prev .add (packageTreeNode );
119+ hasMap .put (stringBuilder .toString (), packageTreeNode );
120+ prev = packageTreeNode ;
108121 } else {
109122 prev = hasMap .get (stringBuilder .toString ());
110123 }
111124 }
112125 i ++;
113126 }
114127 }
115- sort (model , root );
128+ sort (model , classesRoot );
129+
130+ for (Map .Entry <String , byte []> stringEntry : jar .resources .entrySet ()) {
131+ String [] split = stringEntry .getKey ().split ("/" );
132+ DefaultTreeNode prev = null ;
133+ StringBuilder stringBuilder = new StringBuilder ();
134+ int i = 0 ;
135+ for (String s : split ) {
136+ stringBuilder .append (s );
137+ FolderTreeNode folderTreeNode = new FolderTreeNode (s );
116138
117- super .expandPath (new TreePath (root .getPath ()));
139+ if (split .length == i + 1 ) {
140+ folderTreeNode = new FileTreeNode (s , stringEntry .getValue ());
141+ }
142+
143+ if (prev == null ) {
144+ if (!hasMap .containsKey (stringBuilder .toString ())) {
145+ resourceRoot .add (folderTreeNode );
146+ hasMap .put (stringBuilder .toString (), folderTreeNode );
147+ prev = folderTreeNode ;
148+ } else {
149+ prev = hasMap .get (stringBuilder .toString ());
150+ }
151+ } else {
152+ if (!hasMap .containsKey (stringBuilder .toString ())) {
153+ prev .add (folderTreeNode );
154+ hasMap .put (stringBuilder .toString (), folderTreeNode );
155+ prev = folderTreeNode ;
156+ } else {
157+ prev = hasMap .get (stringBuilder .toString ());
158+ }
159+ }
160+ i ++;
161+ }
162+ }
163+ sort (model , resourceRoot );
118164 }
119165
120166
121- public void sort (DefaultTreeModel defaultTreeModel , PackageTreeNode fileTreeNode ) {
122- if (!fileTreeNode .isLeaf ()) {
123- fileTreeNode .getChildren ().sort ((o1 , o2 ) -> {
167+ public void sort (DefaultTreeModel defaultTreeModel , DefaultTreeNode defaultTreeNode ) {
168+ if (!defaultTreeNode .isLeaf ()) {
169+ defaultTreeNode .getChildren ().sort ((o1 , o2 ) -> {
124170 boolean class1 = o1 instanceof ClassTreeNode ;
125171 boolean class2 = o2 instanceof ClassTreeNode ;
126172
127173 boolean method1 = o1 instanceof MethodTreeNode ;
128174 boolean method2 = o2 instanceof MethodTreeNode ;
129175
176+ boolean file1 = o1 instanceof FileTreeNode ;
177+ boolean file2 = o2 instanceof FileTreeNode ;
178+
130179 if (class1 && !class2 ) {
131180 return 1 ;
132181 }
@@ -141,10 +190,17 @@ public void sort(DefaultTreeModel defaultTreeModel, PackageTreeNode fileTreeNode
141190 if (!method1 && method2 ) {
142191 return -1 ;
143192 }
193+
194+ if (file1 && !file2 ) {
195+ return 1 ;
196+ }
197+ if (!file1 && file2 ) {
198+ return -1 ;
199+ }
144200 return o1 .toString ().compareTo (o2 .toString ());
145201 });
146- for (int i = 0 ; i < defaultTreeModel .getChildCount (fileTreeNode ); i ++) {
147- PackageTreeNode child = ((PackageTreeNode ) defaultTreeModel .getChild (fileTreeNode , i ));
202+ for (int i = 0 ; i < defaultTreeModel .getChildCount (defaultTreeNode ); i ++) {
203+ DefaultTreeNode child = ((DefaultTreeNode ) defaultTreeModel .getChild (defaultTreeNode , i ));
148204 sort (defaultTreeModel , child );
149205 }
150206 }
0 commit comments