Skip to content
This repository was archived by the owner on Jan 2, 2023. It is now read-only.

Commit a8be18a

Browse files
committed
shortcut
1 parent 958bfbe commit a8be18a

File tree

1 file changed

+53
-34
lines changed

1 file changed

+53
-34
lines changed

src/main/java/cn/enaium/joe/gui/panel/file/tabbed/tab/ASMifierTablePanel.java

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import javax.swing.*;
1919
import java.awt.*;
20+
import java.awt.event.KeyAdapter;
21+
import java.awt.event.KeyEvent;
2022
import java.io.File;
2123
import java.io.PrintWriter;
2224
import java.io.StringWriter;
@@ -40,41 +42,58 @@ public ASMifierTablePanel(ClassNode classNode) {
4042
codeArea.setText(trim.substring(0, trim.lastIndexOf("\n")));
4143
codeArea.setCaretPosition(0);
4244
});
43-
add(new RTextScrollPane(codeArea));
44-
add(BorderLayout.SOUTH, new JPanel() {{
45-
add(new JButton("Save") {{
46-
addActionListener(e -> {
47-
try {
48-
StringWriter stringWriter = new StringWriter();
49-
ClassReader classReader = new ClassReader(this.getClass().getName());
50-
classReader.accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(stringWriter)), 0);
51-
ClassPool classPool = new ClassPool();
52-
classPool.appendSystemPath();
53-
classPool.importPackage("org.objectweb.asm.AnnotationVisitor");
54-
classPool.importPackage("org.objectweb.asm.Attribute");
55-
classPool.importPackage("org.objectweb.asm.ClassReader");
56-
classPool.importPackage("org.objectweb.asm.ClassWriter");
57-
classPool.importPackage("org.objectweb.asm.ConstantDynamic");
58-
classPool.importPackage("org.objectweb.asm.FieldVisitor");
59-
classPool.importPackage("org.objectweb.asm.Handle");
60-
classPool.importPackage("org.objectweb.asm.Label");
61-
classPool.importPackage("org.objectweb.asm.MethodVisitor");
62-
classPool.importPackage("org.objectweb.asm.Opcodes");
63-
classPool.importPackage("org.objectweb.asm.RecordComponentVisitor");
64-
classPool.importPackage("org.objectweb.asm.Type");
65-
classPool.importPackage("org.objectweb.asm.TypePath");
66-
CtClass ctClass = classPool.makeClass(ASMifier.class.getSimpleName());
67-
ctClass.addInterface(classPool.get("org.objectweb.asm.Opcodes"));
68-
ctClass.addMethod(CtMethod.make("public static byte[] dump() throws Exception {" + codeArea.getText() + "return classWriter.toByteArray();}", ctClass));
69-
byte[] dumps = (byte[]) new Loader(classPool).loadClass(ASMifier.class.getSimpleName()).getMethod("dump").invoke(null);
70-
ClassNode newClassNode = new ClassNode();
71-
new ClassReader(dumps).accept(newClassNode, ClassReader.EXPAND_FRAMES);
72-
JavaOctetEditor.getInstance().jar.classes.put(newClassNode.name + ".class", newClassNode);
73-
} catch (Throwable ex) {
74-
throw new RuntimeException(ex);
45+
add(new RTextScrollPane(codeArea) {{
46+
getTextArea().addKeyListener(new KeyAdapter() {
47+
48+
boolean control = false;
49+
50+
@Override
51+
public void keyPressed(KeyEvent e) {
52+
if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
53+
control = true;
54+
} else if (e.getKeyCode() == KeyEvent.VK_S) {
55+
if (control) {
56+
try {
57+
StringWriter stringWriter = new StringWriter();
58+
ClassReader classReader = new ClassReader(this.getClass().getName());
59+
classReader.accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(stringWriter)), 0);
60+
ClassPool classPool = new ClassPool();
61+
classPool.appendSystemPath();
62+
classPool.importPackage("org.objectweb.asm.AnnotationVisitor");
63+
classPool.importPackage("org.objectweb.asm.Attribute");
64+
classPool.importPackage("org.objectweb.asm.ClassReader");
65+
classPool.importPackage("org.objectweb.asm.ClassWriter");
66+
classPool.importPackage("org.objectweb.asm.ConstantDynamic");
67+
classPool.importPackage("org.objectweb.asm.FieldVisitor");
68+
classPool.importPackage("org.objectweb.asm.Handle");
69+
classPool.importPackage("org.objectweb.asm.Label");
70+
classPool.importPackage("org.objectweb.asm.MethodVisitor");
71+
classPool.importPackage("org.objectweb.asm.Opcodes");
72+
classPool.importPackage("org.objectweb.asm.RecordComponentVisitor");
73+
classPool.importPackage("org.objectweb.asm.Type");
74+
classPool.importPackage("org.objectweb.asm.TypePath");
75+
CtClass ctClass = classPool.makeClass(ASMifier.class.getSimpleName());
76+
ctClass.addInterface(classPool.get("org.objectweb.asm.Opcodes"));
77+
ctClass.addMethod(CtMethod.make("public static byte[] dump() throws Exception {" + codeArea.getText() + "return classWriter.toByteArray();}", ctClass));
78+
byte[] dumps = (byte[]) new Loader(classPool).loadClass(ASMifier.class.getSimpleName()).getMethod("dump").invoke(null);
79+
ClassNode newClassNode = new ClassNode();
80+
new ClassReader(dumps).accept(newClassNode, ClassReader.EXPAND_FRAMES);
81+
JavaOctetEditor.getInstance().jar.classes.put(newClassNode.name + ".class", newClassNode);
82+
JOptionPane.showMessageDialog(null, "Save Success");
83+
} catch (Throwable ex) {
84+
throw new RuntimeException(ex);
85+
}
86+
}
87+
}
88+
}
89+
90+
@Override
91+
public void keyReleased(KeyEvent e) {
92+
if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
93+
control = false;
7594
}
76-
});
77-
}});
95+
}
96+
});
7897
}});
7998
}
8099

0 commit comments

Comments
 (0)