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',