mirror of
https://github.com/2006-Scape/Parabot.git
synced 2026-07-06 00:37:52 +00:00
[FEATURE] Added ability to refresh inline field value
This commit is contained in:
@@ -30,169 +30,173 @@ import org.parabot.core.reflect.RefField;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class ReflectUI extends JFrame {
|
public class ReflectUI extends JFrame {
|
||||||
private static final long serialVersionUID = 98565034137367257L;
|
private static final long serialVersionUID = 98565034137367257L;
|
||||||
private DefaultMutableTreeNode root;
|
private DefaultMutableTreeNode root;
|
||||||
private DefaultTreeModel model;
|
private DefaultTreeModel model;
|
||||||
private JEditorPane basicInfoPane;
|
private JEditorPane basicInfoPane;
|
||||||
private JEditorPane selectionInfoPane;
|
private JEditorPane selectionInfoPane;
|
||||||
|
|
||||||
private Object instance;
|
private Object instance;
|
||||||
|
|
||||||
private HashMap<DefaultMutableTreeNode, RefClass> classes;
|
private HashMap<DefaultMutableTreeNode, RefClass> classes;
|
||||||
private HashMap<DefaultMutableTreeNode, RefField> fields;
|
private HashMap<DefaultMutableTreeNode, RefField> fields;
|
||||||
|
|
||||||
public ReflectUI() {
|
public ReflectUI() {
|
||||||
this.root = new DefaultMutableTreeNode("Classes");
|
this.root = new DefaultMutableTreeNode("Classes");
|
||||||
this.model = new DefaultTreeModel(root);
|
this.model = new DefaultTreeModel(root);
|
||||||
this.basicInfoPane = new JEditorPane();
|
this.basicInfoPane = new JEditorPane();
|
||||||
this.selectionInfoPane = new JEditorPane();
|
this.selectionInfoPane = new JEditorPane();
|
||||||
this.classes = new HashMap<>();
|
this.classes = new HashMap<>();
|
||||||
this.fields = new HashMap<>();
|
this.fields = new HashMap<>();
|
||||||
this.instance = Context.getInstance().getClient();
|
this.instance = Context.getInstance().getClient();
|
||||||
|
|
||||||
fillModel();
|
fillModel();
|
||||||
|
|
||||||
setTitle("Reflection explorer");
|
setTitle("Reflection explorer");
|
||||||
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
||||||
|
|
||||||
JPanel content = new JPanel();
|
JPanel content = new JPanel();
|
||||||
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
|
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
JPanel exploreContent = new JPanel();
|
JPanel exploreContent = new JPanel();
|
||||||
exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS));
|
exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS));
|
||||||
|
|
||||||
JPanel infoContent = new JPanel();
|
JPanel infoContent = new JPanel();
|
||||||
infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS));
|
infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
JTree tree = new JTree();
|
JTree tree = new JTree();
|
||||||
tree.setRootVisible(true);
|
tree.setRootVisible(true);
|
||||||
tree.setShowsRootHandles(true);
|
tree.setShowsRootHandles(true);
|
||||||
tree.setModel(model);
|
tree.setModel(model);
|
||||||
tree.addTreeSelectionListener(new TreeSelectionListener() {
|
tree.addTreeSelectionListener(new TreeSelectionListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(TreeSelectionEvent event) {
|
public void valueChanged(TreeSelectionEvent event) {
|
||||||
TreePath path = event.getPath();
|
TreePath path = event.getPath();
|
||||||
Object[] pathElements = path.getPath();
|
Object[] pathElements = path.getPath();
|
||||||
Object element = pathElements[pathElements.length-1];
|
Object element = pathElements[pathElements.length-1];
|
||||||
if(pathElements.length == 2) {
|
if(pathElements.length == 2) {
|
||||||
// class
|
// class
|
||||||
setClassInfo(classes.get(element));
|
setClassInfo(classes.get(element));
|
||||||
}
|
}
|
||||||
if(pathElements.length == 3) {
|
if(pathElements.length == 3) {
|
||||||
// field
|
// field
|
||||||
setFieldInfo(fields.get(element));
|
RefField field = fields.get(element);
|
||||||
}
|
setFieldInfo(field);
|
||||||
}
|
DefaultMutableTreeNode el = (DefaultMutableTreeNode) element;
|
||||||
|
el.setUserObject("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
|
||||||
|
|
||||||
});
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JScrollPane scrollTreePane = new JScrollPane(tree);
|
});
|
||||||
scrollTreePane.setPreferredSize(new Dimension(400, 300));
|
|
||||||
|
|
||||||
basicInfoPane.setContentType("text/html");
|
JScrollPane scrollTreePane = new JScrollPane(tree);
|
||||||
basicInfoPane.setEditable(false);
|
scrollTreePane.setPreferredSize(new Dimension(400, 300));
|
||||||
|
|
||||||
selectionInfoPane.setContentType("text/html");
|
basicInfoPane.setContentType("text/html");
|
||||||
selectionInfoPane.setEditable(false);
|
basicInfoPane.setEditable(false);
|
||||||
|
|
||||||
JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane);
|
selectionInfoPane.setContentType("text/html");
|
||||||
scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90));
|
selectionInfoPane.setEditable(false);
|
||||||
|
|
||||||
JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane);
|
JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane);
|
||||||
scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200));
|
scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90));
|
||||||
|
|
||||||
infoContent.add(scrollBasicInfoPane);
|
JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane);
|
||||||
infoContent.add(Box.createRigidArea(new Dimension(0, 10)));
|
scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200));
|
||||||
infoContent.add(scrollSelectInfoPane);
|
|
||||||
|
|
||||||
exploreContent.add(scrollTreePane);
|
infoContent.add(scrollBasicInfoPane);
|
||||||
exploreContent.add(Box.createRigidArea(new Dimension(10, 0)));
|
infoContent.add(Box.createRigidArea(new Dimension(0, 10)));
|
||||||
exploreContent.add(infoContent);
|
infoContent.add(scrollSelectInfoPane);
|
||||||
|
|
||||||
content.add(exploreContent);
|
exploreContent.add(scrollTreePane);
|
||||||
|
exploreContent.add(Box.createRigidArea(new Dimension(10, 0)));
|
||||||
|
exploreContent.add(infoContent);
|
||||||
|
|
||||||
JScrollPane contentPane = new JScrollPane(content);
|
content.add(exploreContent);
|
||||||
Dimension prefSize = content.getPreferredSize();
|
|
||||||
contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
|
|
||||||
setContentPane(contentPane);
|
|
||||||
pack();
|
|
||||||
setLocationRelativeTo(null);
|
|
||||||
setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fillModel() {
|
JScrollPane contentPane = new JScrollPane(content);
|
||||||
Context context = Context.getInstance();
|
Dimension prefSize = content.getPreferredSize();
|
||||||
ClassPath classPath = context.getClassPath();
|
contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
|
||||||
ASMClassLoader classLoader = context.getASMClassLoader();
|
setContentPane(contentPane);
|
||||||
for (String className : classPath.classNames) {
|
pack();
|
||||||
try {
|
setLocationRelativeTo(null);
|
||||||
DefaultMutableTreeNode classNode = new DefaultMutableTreeNode(
|
setVisible(true);
|
||||||
"Class: " + className);
|
}
|
||||||
DefaultMutableTreeNode fieldNode;
|
|
||||||
|
|
||||||
Class<?> clazz = classLoader.loadClass(className);
|
private void fillModel() {
|
||||||
|
Context context = Context.getInstance();
|
||||||
|
ClassPath classPath = context.getClassPath();
|
||||||
|
ASMClassLoader classLoader = context.getASMClassLoader();
|
||||||
|
for (String className : classPath.classNames) {
|
||||||
|
try {
|
||||||
|
DefaultMutableTreeNode classNode = new DefaultMutableTreeNode(
|
||||||
|
"Class: " + className);
|
||||||
|
DefaultMutableTreeNode fieldNode;
|
||||||
|
|
||||||
RefClass refClass = new RefClass(clazz);
|
Class<?> clazz = classLoader.loadClass(className);
|
||||||
if(refClass.instanceOf(this.instance)) {
|
|
||||||
refClass.setInstance(this.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (RefField field : refClass.getFields()) {
|
RefClass refClass = new RefClass(clazz);
|
||||||
fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
|
if(refClass.instanceOf(this.instance)) {
|
||||||
classNode.add(fieldNode);
|
refClass.setInstance(this.instance);
|
||||||
fields.put(fieldNode, field);
|
}
|
||||||
}
|
|
||||||
classes.put(classNode, refClass);
|
|
||||||
|
|
||||||
root.add(classNode);
|
for (RefField field : refClass.getFields()) {
|
||||||
} catch (Throwable t) {
|
fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
|
||||||
t.printStackTrace();
|
classNode.add(fieldNode);
|
||||||
}
|
fields.put(fieldNode, field);
|
||||||
}
|
}
|
||||||
}
|
classes.put(classNode, refClass);
|
||||||
|
|
||||||
private void fillBasicInfoPane() {
|
root.add(classNode);
|
||||||
Context context = Context.getInstance();
|
} catch (Throwable t) {
|
||||||
ClassPath classPath = context.getClassPath();
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
private void fillBasicInfoPane() {
|
||||||
|
Context context = Context.getInstance();
|
||||||
|
ClassPath classPath = context.getClassPath();
|
||||||
|
|
||||||
builder.append("<b>Classes: </b>").append(classPath.classNames.size()).append("<br/>");
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("<b>Using instance: </b>").append(instance.toString()).append("<br/>");
|
|
||||||
|
|
||||||
basicInfoPane.setText(builder.toString());
|
builder.append("<b>Classes: </b>").append(classPath.classNames.size()).append("<br/>");
|
||||||
}
|
builder.append("<b>Using instance: </b>").append(instance.toString()).append("<br/>");
|
||||||
|
|
||||||
private void setFieldInfo(RefField refField) {
|
basicInfoPane.setText(builder.toString());
|
||||||
StringBuilder builder = new StringBuilder();
|
}
|
||||||
RefClass refClass = refField.getOwner();
|
|
||||||
builder.append("<h1>").append(refClass.getClassName()).append(".").append(refField.getName()).append("</h1><br/>");
|
|
||||||
builder.append("<b>Class: </b>").append(refClass.getClassName()).append("<br/>");
|
|
||||||
builder.append("<b>Value: </b>").append(refField.asObject()).append("<br/>");
|
|
||||||
builder.append("<b>Type: </b>").append(refField.getASMType().getClassName()).append("<br/>");
|
|
||||||
builder.append("<b>Static: </b>").append(refField.isStatic() ? "yes" : "no").append("<br/>");
|
|
||||||
builder.append("<b>Array: </b>").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("<br/>");
|
|
||||||
selectionInfoPane.setText(builder.toString());
|
|
||||||
|
|
||||||
fillBasicInfoPane();
|
private void setFieldInfo(RefField refField) {
|
||||||
}
|
StringBuilder builder = new StringBuilder();
|
||||||
|
RefClass refClass = refField.getOwner();
|
||||||
|
builder.append("<h1>").append(refClass.getClassName()).append(".").append(refField.getName()).append("</h1><br/>");
|
||||||
|
builder.append("<b>Class: </b>").append(refClass.getClassName()).append("<br/>");
|
||||||
|
builder.append("<b>Value: </b>").append(refField.asObject()).append("<br/>");
|
||||||
|
builder.append("<b>Type: </b>").append(refField.getASMType().getClassName()).append("<br/>");
|
||||||
|
builder.append("<b>Static: </b>").append(refField.isStatic() ? "yes" : "no").append("<br/>");
|
||||||
|
builder.append("<b>Array: </b>").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("<br/>");
|
||||||
|
selectionInfoPane.setText(builder.toString());
|
||||||
|
|
||||||
private void setClassInfo(RefClass refClass) {
|
fillBasicInfoPane();
|
||||||
StringBuilder builder = new StringBuilder();
|
}
|
||||||
builder.append("<h1>").append(refClass.getClassName()).append("</h1><br/>");
|
|
||||||
if(refClass.getClassName().contains(".")) {
|
|
||||||
builder.append("<b>Package: </b>").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("<br/>");
|
|
||||||
}
|
|
||||||
builder.append("<b>Abstract: </b>").append(refClass.isAbstract() ? "yes" : "no").append("<br/>");
|
|
||||||
builder.append("<b>Interface: </b>").append(refClass.isInterface() ? "yes" : "no").append("<br/>");
|
|
||||||
builder.append("<b>Superclass: </b>").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("<br/>");
|
|
||||||
builder.append("<b>Fields: </b>").append(refClass.getFields().length).append("<br/>");
|
|
||||||
builder.append("<b>Methods: </b>").append(refClass.getMethods().length).append("<br/>");
|
|
||||||
builder.append("<b>Constructors: </b>").append(refClass.getConstructors().length).append("<br/>");
|
|
||||||
selectionInfoPane.setText(builder.toString());
|
|
||||||
|
|
||||||
fillBasicInfoPane();
|
private void setClassInfo(RefClass refClass) {
|
||||||
}
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("<h1>").append(refClass.getClassName()).append("</h1><br/>");
|
||||||
|
if(refClass.getClassName().contains(".")) {
|
||||||
|
builder.append("<b>Package: </b>").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("<br/>");
|
||||||
|
}
|
||||||
|
builder.append("<b>Abstract: </b>").append(refClass.isAbstract() ? "yes" : "no").append("<br/>");
|
||||||
|
builder.append("<b>Interface: </b>").append(refClass.isInterface() ? "yes" : "no").append("<br/>");
|
||||||
|
builder.append("<b>Superclass: </b>").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("<br/>");
|
||||||
|
builder.append("<b>Fields: </b>").append(refClass.getFields().length).append("<br/>");
|
||||||
|
builder.append("<b>Methods: </b>").append(refClass.getMethods().length).append("<br/>");
|
||||||
|
builder.append("<b>Constructors: </b>").append(refClass.getConstructors().length).append("<br/>");
|
||||||
|
selectionInfoPane.setText(builder.toString());
|
||||||
|
|
||||||
|
fillBasicInfoPane();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user