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 <[email protected]>
AuthorDate: Tue Jul 4 17:28:34 2023 +0200
Provide Lambda expression option in Listener generation style.
Co-authored-by: Michael Bien <[email protected]>
---
.../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: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists