This is an automated email from the ASF dual-hosted git repository.

mbien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 231e2275e0 Provide Lambda expression option in Listener generation 
style.
     new 8b268263d8 Merge pull request #6150 from 
kamilkrzywanski/lambdaListeners
231e2275e0 is described below

commit 231e2275e07ef6b2e9ecf8e00cd8c02d921fdda8
Author: Kamil Krzywanski <kamilkrzywansk...@gmail.com>
AuthorDate: Tue Jul 4 17:28:34 2023 +0200

    Provide Lambda expression option in Listener generation style.
    
    Co-authored-by: Michael Bien <mbie...@gmail.com>
---
 .../org/netbeans/modules/form/Bundle.properties    |   2 +
 .../modules/form/FormEditorCustomizer.java         |   2 +-
 .../netbeans/modules/form/JavaCodeGenerator.java   | 164 ++++++++++++++-------
 3 files changed, 110 insertions(+), 58 deletions(-)

diff --git a/java/form/src/org/netbeans/modules/form/Bundle.properties 
b/java/form/src/org/netbeans/modules/form/Bundle.properties
index 57914ece61..7dca6e0f7a 100644
--- a/java/form/src/org/netbeans/modules/form/Bundle.properties
+++ b/java/form/src/org/netbeans/modules/form/Bundle.properties
@@ -458,6 +458,7 @@ FMT_MSG_EmptyString=Empty string
 # PARTIAL do not translate TODO
 MSG_EventHandlerBody=// TODO add your handling code here:\n
 
+CTL_LISTENER_LAMBDAS=Lambdas or Anonymous Inner Classes
 CTL_LISTENER_ANONYMOUS_CLASSES=Anonymous Inner Classes
 CTL_LISTENER_CEDL_INNERCLASS=One Inner Class
 CTL_LISTENER_CEDL_MAINCLASS=Main Class
@@ -731,6 +732,7 @@ Public_Modifier=public
 Default_Modifier=<default>
 Protected_Modifier=protected
 Private_Modifier=private
+Lambdas=Lambdas or Anonymous Inner Classes
 Anonymous=Anonymous Inner Classes
 InnerClass=One Inner Class
 MainClass=Main Class
diff --git a/java/form/src/org/netbeans/modules/form/FormEditorCustomizer.java 
b/java/form/src/org/netbeans/modules/form/FormEditorCustomizer.java
index 1c48e4533c..b655a22e36 100644
--- a/java/form/src/org/netbeans/modules/form/FormEditorCustomizer.java
+++ b/java/form/src/org/netbeans/modules/form/FormEditorCustomizer.java
@@ -27,7 +27,6 @@ import java.beans.PropertyEditor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Modifier;
 import java.util.HashSet;
-import java.util.MissingResourceException;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -94,6 +93,7 @@ public final class FormEditorCustomizer extends JPanel 
implements  ActionListene
         cbListenerStyle.addItem(loc("Anonymous")); // NOI18N
         cbListenerStyle.addItem(loc("InnerClass")); // NOI18N
         cbListenerStyle.addItem(loc("MainClass")); // NOI18N
+        cbListenerStyle.addItem(loc("Lambdas")); // NOI18N
         cbAutoI18n.addItem(loc("CTL_AUTO_RESOURCE_DEFAULT")); // NOI18N
         cbAutoI18n.addItem(loc("CTL_AUTO_RESOURCE_ON")); // NOI18N
         cbAutoI18n.addItem(loc("CTL_AUTO_RESOURCE_OFF")); // NOI18N
diff --git a/java/form/src/org/netbeans/modules/form/JavaCodeGenerator.java 
b/java/form/src/org/netbeans/modules/form/JavaCodeGenerator.java
index 4496933c5a..e36afba067 100644
--- a/java/form/src/org/netbeans/modules/form/JavaCodeGenerator.java
+++ b/java/form/src/org/netbeans/modules/form/JavaCodeGenerator.java
@@ -84,6 +84,7 @@ class JavaCodeGenerator extends CodeGenerator {
     static final String PROP_DECLARATION_PRE = "declarationPre"; // NOI18N
     static final String PROP_DECLARATION_POST = "declarationPost"; // NOI18N
     static final String PROP_GENERATE_MNEMONICS = "generateMnemonicsCode"; // 
Mnemonics support // NOI18N
+    static final String PROP_GENERATE_LAMBDA_LISTENERS = 
"generateLambdaListeners"; // Mnemonics support // NOI18N
     static final String PROP_LISTENER_GENERATION_STYLE = 
"listenerGenerationStyle"; // NOI18N
 
     static final String AUX_VARIABLE_MODIFIER =
@@ -130,6 +131,7 @@ class JavaCodeGenerator extends CodeGenerator {
     static final int ANONYMOUS_INNERCLASSES = 0;
     static final int CEDL_INNERCLASS = 1;
     static final int CEDL_MAINCLASS = 2;
+    static final int LAMBDAS = 3;
 
     // types of code generation of layout code
     static final int LAYOUT_CODE_AUTO = 0;
@@ -2432,15 +2434,16 @@ class JavaCodeGenerator extends CodeGenerator {
                 lastEventSetDesc = eventSetDesc;
             }
 
-            if (defaultMode != ANONYMOUS_INNERCLASSES)
+            if (defaultMode != ANONYMOUS_INNERCLASSES && defaultMode != 
LAMBDAS) {
                 if (mode == defaultMode) {
                     if (!event.isInCEDL())
                         mode = ANONYMOUS_INNERCLASSES;
-                }
-                else if (event.isInCEDL())
+                } else if (event.isInCEDL()) {
                     mixedMode = true;
+                }
+            }
 
-            if (defaultMode == ANONYMOUS_INNERCLASSES || !event.isInCEDL()) {
+            if (defaultMode == ANONYMOUS_INNERCLASSES || defaultMode == 
LAMBDAS || !event.isInCEDL()) {
                 if (listenerEvents == null)
                     listenerEvents = new ArrayList<Event>();
                 listenerEvents.add(event);
@@ -2497,46 +2500,8 @@ class JavaCodeGenerator extends CodeGenerator {
 
         switch (mode) {
             case ANONYMOUS_INNERCLASSES:
-                codeWriter.write("new "); // NOI18N
-
-                // try to find adpater to use instead of full listener impl
-                Class listenerType = eventSetDesc.getListenerType();
-                Class adapterClass = BeanSupport.getAdapterForListener(
-                                                           listenerType);
-                if (adapterClass != null) { // use listener adapter class
-                    codeWriter.write(getSourceClassName(adapterClass) + "() 
{\n"); // NOI18N
-
-                    for (int i=0; i < eventList.size(); i++) {
-                        Event event = eventList.get(i);
-                        String[] paramNames = generateListenerMethodHeader(
-                                   null, event.getListenerMethod(), 
codeWriter);
-                        generateEventHandlerCalls(event, paramNames, 
codeWriter, true);
-                        codeWriter.write("}\n"); // NOI18N
-                    }
-                }
-                else { // generate full listener implementation (all methods)
-                    codeWriter.write(getSourceClassName(listenerType) + "() 
{\n"); // NOI18N
-
-                    Method[] methods = eventSetDesc.getListenerMethods();
-                    for (int i=0; i < methods.length; i++) {
-                        Method m = methods[i];
-                        Event event = null;
-                        for (int j=0; j < eventList.size(); j++) {
-                            Event e = eventList.get(j);
-                            if (m.equals(e.getListenerMethod())) {
-                                event = e;
-                                break;
-                            }
-                        }
-                        String[] paramNames =
-                            generateListenerMethodHeader(null, m, codeWriter);
-                        if (event != null)
-                            generateEventHandlerCalls(event, paramNames, 
codeWriter, true);
-                        codeWriter.write("}\n"); // NOI18N
-                    }
-                }
-
-                codeWriter.write("}"); // NOI18N
+            case LAMBDAS:
+                generateInnerClasses(codeWriter, eventSetDesc, eventList, mode 
== LAMBDAS);
                 break;
 
             case CEDL_INNERCLASS:
@@ -2554,6 +2519,84 @@ class JavaCodeGenerator extends CodeGenerator {
             generateCatchCode(exceptions, codeWriter);
     }
 
+    private void generateInnerClasses(Writer codeWriter, EventSetDescriptor 
eventSetDesc, List<Event> eventList, boolean useLambdas) throws IOException {
+
+        if (useLambdas && eventSetDesc.getListenerMethods().length == 1) {
+            generateWithReferenceOrLambda(codeWriter, eventList);
+        } else {
+            codeWriter.write("new "); // NOI18N
+            // try to find adpater to use instead of full listener impl
+            Class listenerType = eventSetDesc.getListenerType();
+            Class adapterClass = BeanSupport.getAdapterForListener(
+                    listenerType);
+            if (adapterClass != null) { // use listener adapter class
+                codeWriter.write(getSourceClassName(adapterClass) + "() {\n"); 
// NOI18N
+
+                for (int i = 0; i < eventList.size(); i++) {
+                    Event event = eventList.get(i);
+                    String[] paramNames = generateListenerMethodHeader(
+                            null, event.getListenerMethod(), codeWriter);
+                    generateEventHandlerCalls(event, paramNames, codeWriter, 
true);
+                    codeWriter.write("}\n"); // NOI18N
+                }
+            } else { // generate full listener implementation (all methods)
+                codeWriter.write(getSourceClassName(listenerType) + "() {\n"); 
// NOI18N
+
+                Method[] methods = eventSetDesc.getListenerMethods();
+                for (int i = 0; i < methods.length; i++) {
+                    Method m = methods[i];
+                    Event event = null;
+                    for (int j = 0; j < eventList.size(); j++) {
+                        Event e = eventList.get(j);
+                        if (m.equals(e.getListenerMethod())) {
+                            event = e;
+                            break;
+                        }
+                    }
+                    String[] paramNames =
+                            generateListenerMethodHeader(null, m, codeWriter);
+                    if (event != null)
+                        generateEventHandlerCalls(event, paramNames, 
codeWriter, true);
+                    codeWriter.write("}\n"); // NOI18N
+                }
+            }
+            codeWriter.write("}"); // NOI18N
+        }
+    }
+
+    private void generateWithReferenceOrLambda(Writer codeWriter, List<Event> 
eventList) throws IOException {
+        if (eventList.get(0).getEventHandlers().length == 1) {
+            codeWriter.append("this::" + 
eventList.get(0).getEventHandlers()[0]);
+        } else if (eventList.get(0).getEventHandlers().length > 1) {
+            Class[] paramTypes = 
eventList.get(0).getListenerMethod().getParameterTypes();
+            String[] paramNames = generateParamNames(paramTypes);
+            String paramsString = generateParamsString(paramNames);
+
+            codeWriter.append("(");
+            codeWriter.append(paramsString);
+            codeWriter.append(") -> { \n");
+
+            for (String event : eventList.get(0).getEventHandlers()) {
+                codeWriter.append(event);
+                codeWriter.append("(");
+                codeWriter.append(paramsString);
+                codeWriter.append(");\n");
+            }
+            codeWriter.append("}");
+        }
+    }
+
+
+    private String generateParamsString(String[] paramNames) {
+        StringBuilder params = new StringBuilder();
+        for (int i = 0; i < paramNames.length; i++) {
+            params.append(paramNames[i]);
+            if (i + 1 < paramNames.length)
+                params.append(", "); // NOI18N
+        }
+        return params.toString();
+    }
+
     private RADComponent codeVariableToRADComponent(CodeVariable var) {
         RADComponent metacomp = null;
         Iterator iter = var.getAttachedExpressions().iterator();
@@ -3375,18 +3418,7 @@ class JavaCodeGenerator extends CodeGenerator {
         throws IOException
     {
         Class[] paramTypes = originalMethod.getParameterTypes();
-        String[] paramNames;
-
-        if (paramTypes.length == 1
-            && EventObject.class.isAssignableFrom(paramTypes[0]))
-        {
-            paramNames = new String[] { EVT_VARIABLE_NAME };
-        }
-        else {
-            paramNames = new String[paramTypes.length];
-            for (int i=0; i < paramTypes.length; i++)
-                paramNames[i] = "param" + i; // NOI18N
-        }
+        String[] paramNames = generateParamNames(paramTypes);
 
         // generate the method
         writer.write(methodName != null ? "private " : "public "); // NOI18N
@@ -3419,6 +3451,21 @@ class JavaCodeGenerator extends CodeGenerator {
         return paramNames;
     }
 
+    private String[] generateParamNames(Class[] paramTypes){
+        String[] paramNames;
+        if (paramTypes.length == 1
+                && EventObject.class.isAssignableFrom(paramTypes[0]))
+        {
+            paramNames = new String[] { EVT_VARIABLE_NAME };
+        }
+        else {
+            paramNames = new String[paramTypes.length];
+            for (int i=0; i < paramTypes.length; i++)
+                paramNames[i] = "param" + i; // NOI18N
+        }
+        return paramNames;
+    }
+
     private void generateSuperListenerCall(Method method,
                                            String[] paramNames,
                                            Writer codeWriter)
@@ -4421,7 +4468,7 @@ class JavaCodeGenerator extends CodeGenerator {
     }
 
     private class ListenerGenerationStyleProperty extends 
PropertySupport.ReadWrite {
-        
+
         private ListenerGenerationStyleProperty() {
             super(PROP_LISTENER_GENERATION_STYLE,
                 Integer.class,
@@ -4618,6 +4665,9 @@ class JavaCodeGenerator extends CodeGenerator {
     {
         public ListenerGenerationStyleEditor() {
             super(new Object[] {
+                FormUtils.getBundleString("CTL_LISTENER_LAMBDAS"), // NOI18N
+                Integer.valueOf(JavaCodeGenerator.LAMBDAS),
+                "" ,// NOI18N
                 FormUtils.getBundleString("CTL_LISTENER_ANONYMOUS_CLASSES"), 
// NOI18N
                 Integer.valueOf(JavaCodeGenerator.ANONYMOUS_INNERCLASSES),
                 "", // NOI18N


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to