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