You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/07/12 01:36:18 UTC
[groovy] 03/03: GROOVY-10686: Add tooltips for Object/AST browser to display contents for narrow columns (column size tweaking and allow (meta)method browsing)
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 46111a29c8e73465d56a07785117c4b0e3665b5b
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Jul 12 11:36:04 2022 +1000
GROOVY-10686: Add tooltips for Object/AST browser to display contents for narrow columns (column size tweaking and allow (meta)method browsing)
---
src/main/java/groovy/inspect/Inspector.java | 34 +++++++++++
.../groovy/groovy/console/ui/ObjectBrowser.groovy | 69 +++++++++++++++-------
2 files changed, 81 insertions(+), 22 deletions(-)
diff --git a/src/main/java/groovy/inspect/Inspector.java b/src/main/java/groovy/inspect/Inspector.java
index b435c25a37..9e1d02b39d 100644
--- a/src/main/java/groovy/inspect/Inspector.java
+++ b/src/main/java/groovy/inspect/Inspector.java
@@ -133,6 +133,25 @@ public class Inspector {
return result;
}
+ /**
+ * Get info about usual Java instance and class Methods as well as Constructors.
+ */
+ public Tuple2[] getMethodsWithInfo() {
+ Method[] methods = getClassUnderInspection().getMethods();
+ Constructor[] ctors = getClassUnderInspection().getConstructors();
+ Tuple2[] result = new Tuple2[methods.length + ctors.length];
+ int resultIndex = 0;
+ for (; resultIndex < methods.length; resultIndex++) {
+ Method method = methods[resultIndex];
+ result[resultIndex] = Tuple2.tuple(method, methodInfo(method));
+ }
+ for (int i = 0; i < ctors.length; i++, resultIndex++) {
+ Constructor ctor = ctors[i];
+ result[resultIndex] = Tuple2.tuple(ctor, methodInfo(ctor));
+ }
+ return result;
+ }
+
/**
* Get info about instance and class Methods that are dynamically added through Groovy.
*
@@ -150,6 +169,21 @@ public class Inspector {
return result;
}
+ /**
+ * Get info about instance and class Methods that are dynamically added through Groovy.
+ */
+ public Tuple2[] getMetaMethodsWithInfo() {
+ MetaClass metaClass = InvokerHelper.getMetaClass(objectUnderInspection);
+ List<MetaMethod> metaMethods = metaClass.getMetaMethods();
+ Tuple2[] result = new Tuple2[metaMethods.size()];
+ int i = 0;
+ for (Iterator<MetaMethod> iter = metaMethods.iterator(); iter.hasNext(); i++) {
+ MetaMethod metaMethod = (MetaMethod) iter.next();
+ result[i] = Tuple2.tuple(metaMethod, methodInfo(metaMethod));
+ }
+ return result;
+ }
+
/**
* Get info about usual Java public fields incl. constants.
*
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
index df3d210d33..116ba15de6 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
@@ -100,10 +100,15 @@ class ObjectBrowser {
closureColumn(header: 'Raw Value', read: { it[0] })
}
}
- arrayTable.columnModel.getColumn(2).with {
- minWidth = 0
- maxWidth = 0
- width = 0
+ arrayTable.columnModel.with {
+ getColumn(2).with {
+ minWidth = 0
+ maxWidth = 0
+ width = 0
+ preferredWidth = 0
+ }
+ getColumn(0).preferredWidth = 50
+ getColumn(1).preferredWidth = 400
}
arrayTable.addMouseListener(makeClickAdapter(arrayTable, 2) { row ->
path + "[${arrayTable.model.getValueAt(row, 0)}]"
@@ -118,10 +123,15 @@ class ObjectBrowser {
closureColumn(header: 'Raw Value', read: { it[0] })
}
}
- collectionTable.columnModel.getColumn(2).with {
- minWidth = 0
- maxWidth = 0
- width = 0
+ collectionTable.columnModel.with {
+ getColumn(2).with {
+ minWidth = 0
+ maxWidth = 0
+ width = 0
+ preferredWidth = 0
+ }
+ getColumn(0).preferredWidth = 50
+ getColumn(1).preferredWidth = 400
}
collectionTable.addMouseListener(makeClickAdapter(collectionTable, 2) { row ->
path + "[${collectionTable.model.getValueAt(row, 0)}]"
@@ -138,10 +148,16 @@ class ObjectBrowser {
}
}
ToolTipManager.sharedInstance().registerComponent(mapTable)
- mapTable.columnModel.getColumn(3).with {
- minWidth = 0
- maxWidth = 0
- width = 0
+ mapTable.columnModel.with {
+ getColumn(3).with {
+ minWidth = 0
+ maxWidth = 0
+ width = 0
+ preferredWidth = 0
+ }
+ getColumn(0).preferredWidth = 50
+ getColumn(1).preferredWidth = 200
+ getColumn(2).preferredWidth = 400
}
mapTable.addMouseListener(makeClickAdapter(mapTable, 2) { row ->
path + "[${mapTable.model.getValueAt(row, 1)}]"
@@ -171,19 +187,28 @@ class ObjectBrowser {
})
}
scrollPane(name: ' (Meta) Methods ') {
- methodTable = table(selectionMode: SINGLE_SELECTION) {
- def data = Inspector.sort(inspector.methods.toList())
- data.addAll(Inspector.sort(inspector.metaMethods.toList()))
+ methodTable = table(new CellValueToolTipJTable(), selectionMode: SINGLE_SELECTION) {
+ def data = Inspector.sort(inspector.methodsWithInfo.toList(), comparator)
+ data.addAll(Inspector.sort(inspector.metaMethodsWithInfo.toList(), comparator))
tableModel(list: data) {
- closureColumn(header: 'Name', read: { it[MEMBER_NAME_IDX] })
- closureColumn(header: 'Params', read: { it[MEMBER_PARAMS_IDX] })
- closureColumn(header: 'Type', read: { it[MEMBER_TYPE_IDX] })
- closureColumn(header: 'Origin', read: { it[MEMBER_ORIGIN_IDX] })
- closureColumn(header: 'Modifier', read: { it[MEMBER_MODIFIER_IDX] })
- closureColumn(header: 'Declarer', read: { it[MEMBER_DECLARER_IDX] })
- closureColumn(header: 'Exceptions', read: { it[MEMBER_EXCEPTIONS_IDX] })
+ closureColumn(header: 'Name', read: { it.v2[MEMBER_NAME_IDX] })
+ closureColumn(header: 'Params', read: { it.v2[MEMBER_PARAMS_IDX] })
+ closureColumn(header: 'Type', read: { it.v2[MEMBER_TYPE_IDX] })
+ closureColumn(header: 'Origin', read: { it.v2[MEMBER_ORIGIN_IDX] })
+ closureColumn(header: 'Modifier', read: { it.v2[MEMBER_MODIFIER_IDX] })
+ closureColumn(header: 'Declarer', read: { it.v2[MEMBER_DECLARER_IDX] })
+ closureColumn(header: 'Exceptions', read: { it.v2[MEMBER_EXCEPTIONS_IDX] })
+ closureColumn(header: 'Raw Value', read: { it.v1 })
}
}
+ methodTable.columnModel.getColumn(7).with {
+ minWidth = 0
+ maxWidth = 0
+ width = 0
+ }
+ methodTable.addMouseListener(makeClickAdapter(methodTable, 7) { row ->
+ path + (path.size() == 0 ? '' : ".method['") + "${methodTable.model.getValueAt(row, 0)}']"
+ })
}
}
panel(name: 'Path',