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

lkishalmi 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 e7545a9284 Better Gradle Project Creation Wizard
e7545a9284 is described below

commit e7545a928426991d6120f4609266c1b2f6f2c023
Author: Laszlo Kishalmi <laszlo.kisha...@gmail.com>
AuthorDate: Wed Apr 10 19:37:33 2024 -0700

    Better Gradle Project Creation Wizard
---
 extide/gradle/manifest.mf                          |   1 +
 extide/gradle/nbproject/project.properties         |   3 +-
 .../execute/EscapeProcessingOutputStream.java      |   2 +-
 .../gradle/execute/GradlePlainEscapeProcessor.java |  67 +---
 .../modules/gradle/newproject/Bundle.properties    |  10 +
 .../modules/gradle/newproject/GradleInitPanel.java |  69 ++++
 .../gradle/newproject/GradleInitPanelVisual.form   | 236 +++++++++++++
 .../gradle/newproject/GradleInitPanelVisual.java   | 384 +++++++++++++++++++++
 .../gradle/newproject/NewProjectSettings.java      |  76 ++++
 .../gradle/output/GradleProcessorFactory.java      | 132 ++++---
 .../spi/newproject/BaseGradleWizardIterator.java   |   7 +-
 .../gradle/spi/newproject/GradleInitWizard.java    | 231 +++++++++++++
 .../gradle/spi/newproject/TemplateOperation.java   |  45 ++-
 .../gradle/output/GradleProcessorFactoryTest.java  |  52 +--
 java/gradle.java/nbproject/project.xml             |   2 +-
 .../newproject/SimpleApplicationProjectWizard.java |  83 -----
 .../newproject/SimpleLibraryProjectWizard.java     |  57 ---
 .../modules/gradle/java/newproject/Wizards.java    |  78 +++++
 18 files changed, 1254 insertions(+), 281 deletions(-)

diff --git a/extide/gradle/manifest.mf b/extide/gradle/manifest.mf
index 4588b852e9..396a65a814 100644
--- a/extide/gradle/manifest.mf
+++ b/extide/gradle/manifest.mf
@@ -3,4 +3,5 @@ AutoUpdate-Show-In-Client: true
 OpenIDE-Module: org.netbeans.modules.gradle/2
 OpenIDE-Module-Layer: org/netbeans/modules/gradle/layer.xml
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/gradle/Bundle.properties
+OpenIDE-Module-Java-Dependencies: Java > 17
 OpenIDE-Module-Specification-Version: 2.40
diff --git a/extide/gradle/nbproject/project.properties 
b/extide/gradle/nbproject/project.properties
index 54dab6898e..8666db6808 100644
--- a/extide/gradle/nbproject/project.properties
+++ b/extide/gradle/nbproject/project.properties
@@ -17,7 +17,8 @@
 
 
file.reference.netbeans-gradle-tooling.jar=release/modules/gradle/netbeans-gradle-tooling.jar
 is.autoload=true
-javac.source=1.8
+javac.source=17
+javac.target=17
 javac.compilerargs=-Xlint -Xlint:-serial
 javadoc.arch=${basedir}/arch.xml
 javadoc.apichanges=${basedir}/apichanges.xml
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
index b6deb583b2..98e60c67cb 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
@@ -32,7 +32,7 @@ import org.openide.util.RequestProcessor;
  *
  * @author Laszlo Kishalmi
  */
-class EscapeProcessingOutputStream extends OutputStream {
+public class EscapeProcessingOutputStream extends OutputStream {
 
     private static final RequestProcessor RP = new 
RequestProcessor(EscapeProcessingOutputStream.class);
 
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
index 924b5ad290..ccd562fdfb 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
@@ -28,9 +28,8 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import org.netbeans.api.project.Project;
+import org.netbeans.modules.gradle.output.GradleProcessorFactory;
 import org.openide.util.Lookup;
 import org.openide.windows.IOColorPrint;
 import org.openide.windows.IOColors;
@@ -57,13 +56,20 @@ public class GradlePlainEscapeProcessor implements 
EscapeProcessor {
     public GradlePlainEscapeProcessor(InputOutput io, RunConfig cfg, boolean 
error) {
         this.io = io;
         output = new IODisplayer();
-        Project prj = cfg.getProject();
-        if (prj != null) {
-            processorsFromLookup(prj.getLookup(), cfg);
+        if (cfg != null) {
+            Project prj = cfg.getProject();
+            if (prj != null) {
+                processorsFromLookup(prj.getLookup(), cfg);
+            }
         }
         outType = error ? ERROR : OUTPUT;
-        processors.add(TASK_LINE_PROCESSOR);
-        processors.add(STATIC_STRING_PROCESSOR);
+        processors.add(GradleProcessorFactory.URL_PROCESSOR);
+        processors.add(GradleProcessorFactory.TASK_LINE_PROCESSOR);
+        processors.add(GradleProcessorFactory.STATIC_STRING_PROCESSOR);
+    }
+
+    public GradlePlainEscapeProcessor(InputOutput io, boolean error) {
+        this(io, null, error);
     }
 
     private void processorsFromLookup(Lookup lookup, RunConfig cfg) {
@@ -138,51 +144,4 @@ public class GradlePlainEscapeProcessor implements 
EscapeProcessor {
 
     }
     
-    private static final OutputProcessor TASK_LINE_PROCESSOR = new 
OutputProcessor() {
-        final Pattern TASK_LINE = Pattern.compile("> Task (:[\\w:\\-]+)( 
[\\w\\-]+)?"); //NOI18N
-        @Override
-        public boolean processLine(OutputDisplayer out, String line) {
-            Matcher m = TASK_LINE.matcher(line);
-            boolean ret = m.matches();
-            if (ret) {
-                String task = m.group(1);
-                String state = m.group(2);
-                out.print("> Task "); //NOI18N
-                out.print(task);
-                if (state != null) {
-                    OutputType type = LOG_WARNING;
-                    if (state.endsWith("EXECUTED") || 
state.endsWith("UP-TO-DATE") || state.endsWith("FROM-CACHE")) { //NOI18N
-                        type = LOG_SUCCESS;
-                    } else if (state.endsWith("FAILED")) { //NOI18N
-                        type = LOG_FAILURE;
-                    }
-                    out.print(state , null, type);
-                }
-            }
-            return ret;
-        }
-    };
-            
-    private static final OutputProcessor STATIC_STRING_PROCESSOR = new 
OutputProcessor() {
-        private static final String BUILD_FAILED_MSG = "BUILD FAILED"; //NOI18N
-        private static final String BUILD_SUCCESS_MSG = "BUILD SUCCESSFUL"; 
//NOI18N
-        private static final String COD_INCUBATION_MSG = "Configuration on 
demand is an incubating feature."; //NOI18N
-        private static final String CONFIG_CACHE_MGS = "Configuration cache "; 
//NOI18N
-        
-        @Override
-        public boolean processLine(OutputDisplayer out, String line) {
-            OutputType type = null;
-            if (line.startsWith(COD_INCUBATION_MSG) || 
line.startsWith(CONFIG_CACHE_MGS)) {
-                type = LOG_DEBUG;
-            } else if (line.startsWith(BUILD_SUCCESS_MSG)) {
-                type = LOG_SUCCESS;
-            } else if (line.startsWith(BUILD_FAILED_MSG)) {
-                type = LOG_FAILURE;
-            }
-            if (type != null) {
-                out.print(line, null, type);
-            }
-            return type != null;
-        }
-    };
 }
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
index ac9d4efe21..6d5e433c2d 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
+++ b/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
@@ -29,3 +29,13 @@ ProjectAttributesPanelVisual.btBrowse.text=Br&owse...
 SubProjectPanelVisual.lbSubProjects.text=Sub-&Projects:
 ProjectAttributesPanelVisual.cbInitWrapper.text=Initialize Gradle Wrapper
 SubProjectPanelVisual.lbSubProjectHint.text=<html>Hints:<br/>Each non-empty 
line is treaded as a sub-project to be created.<br/>\nThe format of a line 
is:<p>\n[rel/path/]<b>&lt;sub-project 
name&gt;</b>[&lt;whitespace&gt;]&lt;Description&gt;]
+GradleInitPanelVisual.btBrowse.text=Browse...
+GradleInitPanelVisual.lbLocation.text=Project Location:
+GradleInitPanelVisual.lbProjectName.text=Project Name:
+GradleInitPanelVisual.lbProjectFolder.text=Project Folder:
+GradleInitPanelVisual.lbPackageName.text=Package Name:
+GradleInitPanelVisual.lbJavaVersion.text=Java Version:
+GradleInitPanelVisual.lbTestFramework.text=Test Framework:
+GradleInitPanelVisual.cbComments.text=Generate Comments
+GradleInitPanelVisual.lbDSL.text=Gradle DSL
+GradleInitPanelVisual.btBrowse.actionCommand=BROWSE
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java
new file mode 100644
index 0000000000..9afb48242b
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.newproject;
+
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.util.HelpCtx;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class GradleInitPanel implements 
WizardDescriptor.Panel<WizardDescriptor> {
+
+    private GradleInitPanelVisual initPanel;
+
+    @Override
+    public GradleInitPanelVisual getComponent() {
+        if (initPanel == null) {
+            initPanel = new GradleInitPanelVisual();
+        }
+        return initPanel;
+    }
+
+    @Override
+    public HelpCtx getHelp() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    public void readSettings(WizardDescriptor settings) {
+        initPanel.read(settings);
+    }
+
+    @Override
+    public void storeSettings(WizardDescriptor settings) {
+        initPanel.write(settings);
+    }
+
+    @Override
+    public boolean isValid() {
+        return true;
+    }
+
+    @Override
+    public void addChangeListener(ChangeListener l) {
+    }
+
+    @Override
+    public void removeChangeListener(ChangeListener l) {
+    }
+
+}
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form
 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form
new file mode 100644
index 0000000000..649440ca4f
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+<Form version="1.5" maxVersion="1.9" 
type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" 
value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" 
type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" 
value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" 
type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" 
value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" 
value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" 
type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" 
value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" 
value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="lbPackageName" alignment="0" max="32767" 
attributes="0"/>
+                  <Component id="lbJavaVersion" max="32767" attributes="0"/>
+                  <Group type="102" attributes="0">
+                      <Group type="103" groupAlignment="0" max="-2" 
attributes="0">
+                          <Component id="lbLocation" alignment="0" max="32767" 
attributes="0"/>
+                          <Component id="lbProjectFolder" alignment="0" 
max="32767" attributes="0"/>
+                          <Component id="lbProjectName" alignment="0" 
max="32767" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                  </Group>
+                  <Component id="lbTestFramework" pref="141" max="32767" 
attributes="0"/>
+                  <Component id="lbDSL" max="32767" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="1" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="cbDSL" max="32767" attributes="0"/>
+                      <EmptySpace type="separate" max="-2" attributes="0"/>
+                      <Component id="cbComments" min="-2" max="-2" 
attributes="0"/>
+                  </Group>
+                  <Component id="cbJavaVersion" alignment="0" pref="291" 
max="32767" attributes="0"/>
+                  <Component id="tfLocation" alignment="0" max="32767" 
attributes="0"/>
+                  <Component id="tfProjectName" alignment="0" max="32767" 
attributes="0"/>
+                  <Component id="tfProjectFolder" alignment="0" max="32767" 
attributes="0"/>
+                  <Component id="tfPackageName" alignment="0" max="32767" 
attributes="0"/>
+                  <Component id="cbTestFramework" alignment="0" max="32767" 
attributes="0"/>
+              </Group>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
+              <Component id="btBrowse" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="lbProjectName" alignment="3" min="-2" 
max="-2" attributes="0"/>
+                  <Component id="tfProjectName" alignment="3" min="-2" 
max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="lbLocation" alignment="3" min="-2" max="-2" 
attributes="0"/>
+                  <Component id="tfLocation" alignment="3" min="-2" max="-2" 
attributes="0"/>
+                  <Component id="btBrowse" alignment="3" min="-2" max="-2" 
attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="lbProjectFolder" min="-2" max="-2" 
attributes="0"/>
+                  <Component id="tfProjectFolder" min="-2" max="-2" 
attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="tfPackageName" alignment="3" min="-2" 
max="-2" attributes="0"/>
+                  <Component id="lbPackageName" alignment="3" min="-2" 
max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="cbJavaVersion" alignment="3" min="-2" 
max="-2" attributes="0"/>
+                  <Component id="lbJavaVersion" alignment="3" min="-2" 
max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="cbTestFramework" alignment="3" min="-2" 
max="-2" attributes="0"/>
+                  <Component id="lbTestFramework" alignment="3" min="-2" 
max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="cbComments" alignment="3" min="-2" max="-2" 
attributes="0"/>
+                  <Component id="lbDSL" alignment="3" min="-2" max="-2" 
attributes="0"/>
+                  <Component id="cbDSL" alignment="3" min="-2" max="-2" 
attributes="0"/>
+              </Group>
+              <EmptySpace pref="54" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="lbProjectName">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="tfProjectName"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbProjectName.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tfProjectName">
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbLocation">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="tfLocation"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbLocation.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tfLocation">
+    </Component>
+    <Component class="javax.swing.JButton" name="btBrowse">
+      <Properties>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.btBrowse.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+        <Property name="actionCommand" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.btBrowse.actionCommand" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" 
listener="java.awt.event.ActionListener" 
parameters="java.awt.event.ActionEvent" handler="btBrowseActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbProjectFolder">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="tfProjectFolder"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbProjectFolder.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tfProjectFolder">
+      <Properties>
+        <Property name="editable" type="boolean" value="false"/>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbPackageName">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="tfPackageName"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbPackageName.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tfPackageName">
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbJavaVersion">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="cbJavaVersion"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbJavaVersion.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JComboBox" name="cbJavaVersion">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_TypeParameters" 
type="java.lang.String" value="&lt;Integer&gt;"/>
+      </AuxValues>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbTestFramework">
+      <Properties>
+        <Property name="labelFor" type="java.awt.Component" 
editor="org.netbeans.modules.form.ComponentChooserEditor">
+          <ComponentRef name="cbTestFramework"/>
+        </Property>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbTestFramework.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JComboBox" name="cbTestFramework">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_TypeParameters" 
type="java.lang.String" value="&lt;TestFramework&gt;"/>
+      </AuxValues>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbDSL">
+      <Properties>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.lbDSL.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JComboBox" name="cbDSL">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_TypeParameters" 
type="java.lang.String" value="&lt;GradleDSL&gt;"/>
+      </AuxValues>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="cbComments">
+      <Properties>
+        <Property name="text" type="java.lang.String" 
editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString 
bundle="org/netbeans/modules/gradle/newproject/Bundle.properties" 
key="GradleInitPanelVisual.cbComments.text" 
replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, 
&quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+  </SubComponents>
+</Form>
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java
new file mode 100644
index 0000000000..af9a859de8
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java
@@ -0,0 +1,384 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.newproject;
+
+import java.io.File;
+import java.util.List;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.Document;
+import static 
org.netbeans.modules.gradle.newproject.ProjectAttributesPanelVisual.PROP_PROJECT_NAME;
+import static 
org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_NAME;
+import static 
org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_PACKAGE_BASE;
+import static org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.*;
+import org.netbeans.spi.project.ui.support.CommonProjectActions;
+import org.netbeans.spi.project.ui.support.ProjectChooser;
+import org.openide.WizardDescriptor;
+import org.openide.filesystems.FileUtil;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class GradleInitPanelVisual extends javax.swing.JPanel {
+
+    /**
+     * Creates new form GradleInitPanelVisual
+     */
+    public GradleInitPanelVisual() {
+        initComponents();
+
+        cbDSL.setModel(new DefaultComboBoxModel<>(GradleDSL.values()));
+        tfProjectName.getDocument().addDocumentListener(fieldUpdater);
+        tfLocation.getDocument().addDocumentListener(fieldUpdater);
+        tfPackageName.getDocument().addDocumentListener(fieldUpdater);
+
+
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the 
form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated 
Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        lbProjectName = new javax.swing.JLabel();
+        tfProjectName = new javax.swing.JTextField();
+        lbLocation = new javax.swing.JLabel();
+        tfLocation = new javax.swing.JTextField();
+        btBrowse = new javax.swing.JButton();
+        lbProjectFolder = new javax.swing.JLabel();
+        tfProjectFolder = new javax.swing.JTextField();
+        lbPackageName = new javax.swing.JLabel();
+        tfPackageName = new javax.swing.JTextField();
+        lbJavaVersion = new javax.swing.JLabel();
+        cbJavaVersion = new javax.swing.JComboBox<>();
+        lbTestFramework = new javax.swing.JLabel();
+        cbTestFramework = new javax.swing.JComboBox<>();
+        lbDSL = new javax.swing.JLabel();
+        cbDSL = new javax.swing.JComboBox<>();
+        cbComments = new javax.swing.JCheckBox();
+
+        lbProjectName.setLabelFor(tfProjectName);
+        org.openide.awt.Mnemonics.setLocalizedText(lbProjectName, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbProjectName.text")); // NOI18N
+
+        lbLocation.setLabelFor(tfLocation);
+        org.openide.awt.Mnemonics.setLocalizedText(lbLocation, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbLocation.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(btBrowse, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.btBrowse.text")); // NOI18N
+        
btBrowse.setActionCommand(org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class,
 "GradleInitPanelVisual.btBrowse.actionCommand")); // NOI18N
+        btBrowse.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                btBrowseActionPerformed(evt);
+            }
+        });
+
+        lbProjectFolder.setLabelFor(tfProjectFolder);
+        org.openide.awt.Mnemonics.setLocalizedText(lbProjectFolder, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbProjectFolder.text")); // NOI18N
+
+        tfProjectFolder.setEditable(false);
+
+        lbPackageName.setLabelFor(tfPackageName);
+        org.openide.awt.Mnemonics.setLocalizedText(lbPackageName, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbPackageName.text")); // NOI18N
+
+        lbJavaVersion.setLabelFor(cbJavaVersion);
+        org.openide.awt.Mnemonics.setLocalizedText(lbJavaVersion, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbJavaVersion.text")); // NOI18N
+
+        lbTestFramework.setLabelFor(cbTestFramework);
+        org.openide.awt.Mnemonics.setLocalizedText(lbTestFramework, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbTestFramework.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(lbDSL, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.lbDSL.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(cbComments, 
org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, 
"GradleInitPanelVisual.cbComments.text")); // NOI18N
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, 
layout.createSequentialGroup()
+                .addContainerGap()
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(lbPackageName, 
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
Short.MAX_VALUE)
+                    .addComponent(lbJavaVersion, 
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
Short.MAX_VALUE)
+                    .addGroup(layout.createSequentialGroup()
+                        
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
+                            .addComponent(lbLocation, 
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
Short.MAX_VALUE)
+                            .addComponent(lbProjectFolder, 
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
Short.MAX_VALUE)
+                            .addComponent(lbProjectName, 
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
Short.MAX_VALUE))
+                        .addGap(0, 0, Short.MAX_VALUE))
+                    .addComponent(lbTestFramework, 
javax.swing.GroupLayout.DEFAULT_SIZE, 141, Short.MAX_VALUE)
+                    .addComponent(lbDSL, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(cbDSL, 0, 
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                        .addGap(18, 18, 18)
+                        .addComponent(cbComments))
+                    .addComponent(cbJavaVersion, 
javax.swing.GroupLayout.Alignment.LEADING, 0, 291, Short.MAX_VALUE)
+                    .addComponent(tfLocation, 
javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(tfProjectName, 
javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(tfProjectFolder, 
javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(tfPackageName, 
javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(cbTestFramework, 
javax.swing.GroupLayout.Alignment.LEADING, 0, 
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(btBrowse)
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lbProjectName)
+                    .addComponent(tfProjectName, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE))
+                
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lbLocation)
+                    .addComponent(tfLocation, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(btBrowse))
+                
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(lbProjectFolder)
+                    .addComponent(tfProjectFolder, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(18, 18, 18)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(tfPackageName, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(lbPackageName))
+                
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(cbJavaVersion, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(lbJavaVersion))
+                .addGap(18, 18, 18)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(cbTestFramework, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(lbTestFramework))
+                .addGap(18, 18, 18)
+                
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(cbComments)
+                    .addComponent(lbDSL)
+                    .addComponent(cbDSL, 
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, 
javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(54, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void btBrowseActionPerformed(java.awt.event.ActionEvent evt) 
{//GEN-FIRST:event_btBrowseActionPerformed
+        if ("BROWSE".equals(evt.getActionCommand())) { //NOI18N
+            JFileChooser chooser = new JFileChooser();
+            chooser.setCurrentDirectory(null);
+            chooser.setDialogTitle(Bundle.TIT_Select_Project_Location());
+            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+            String path = tfLocation.getText();
+            if (path.length() > 0) {
+                File f = new File(path);
+                if (f.exists()) {
+                    chooser.setSelectedFile(f);
+                }
+            }
+            if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) {
+                File projectDir = chooser.getSelectedFile();
+                
tfLocation.setText(FileUtil.normalizeFile(projectDir).getAbsolutePath());
+            }
+
+        }
+    }//GEN-LAST:event_btBrowseActionPerformed
+
+    void read(WizardDescriptor settings) {
+        NewProjectSettings newproject = NewProjectSettings.getDefault();
+        File loc = (File) 
settings.getProperty(CommonProjectActions.PROJECT_PARENT_FOLDER);
+        if (loc == null || loc.getParentFile() == null || 
!loc.getParentFile().isDirectory()) {
+            loc = ProjectChooser.getProjectsFolder();
+        }
+        tfLocation.setText(loc.getAbsolutePath());
+
+        String name = (String) settings.getProperty(PROP_NAME);
+
+        name = name != null ? name : firstAvailableName(loc, "gradleproject"); 
//NOI18N
+        tfProjectName.setText(name);
+
+        String packageBase = (String) settings.getProperty(PROP_PACKAGE_BASE);
+
+        if (packageBase != null) {
+            tfPackageName.setText(packageBase);
+        } else {
+            String packagePrefix = newproject.getPackagePrefix();
+            tfPackageName.setText(packagePrefix + name);
+        }
+        adjustPackageBase();
+
+        if (settings.getProperty(PROP_JAVA_VERSIONS) != null) {
+            List<Integer> javaVersions = (List<Integer>) 
settings.getProperty(PROP_JAVA_VERSIONS);
+            DefaultComboBoxModel<Integer> versionModel = new 
DefaultComboBoxModel<>(javaVersions.toArray(Integer[]::new));
+            cbJavaVersion.setModel(versionModel);
+
+            if (settings.getProperty(PROP_JAVA_VERSION) != null) {
+                
cbJavaVersion.setSelectedItem(settings.getProperty(PROP_JAVA_VERSION));
+            }
+        } else {
+            lbJavaVersion.setVisible(false);
+            cbJavaVersion.setVisible(false);
+        }
+
+        if (settings.getProperty(PROP_TEST_FRAMEWORKS) != null) {
+            List<TestFramework> testframeworks = (List<TestFramework>) 
settings.getProperty(PROP_TEST_FRAMEWORKS);
+            DefaultComboBoxModel<TestFramework> frameworkModel = new 
DefaultComboBoxModel<>(testframeworks.toArray(TestFramework[]::new));
+            cbTestFramework.setModel(frameworkModel);
+            if (settings.getProperty(PROP_TEST_FRAMEWORK) != null) {
+                
cbTestFramework.setSelectedItem(settings.getProperty(PROP_TEST_FRAMEWORK));
+            }
+        } else {
+            lbTestFramework.setVisible(false);
+            cbTestFramework.setVisible(false);
+        }
+
+        GradleDSL dsl = (GradleDSL) settings.getProperty(PROP_DSL);
+        cbDSL.setSelectedItem(dsl != null ? dsl : newproject.getGradleDSL());
+
+        Boolean comments = (Boolean) settings.getProperty(PROP_COMMENTS);
+        cbComments.setSelected(comments != null ? comments : 
newproject.getGenerateComments());
+
+        tfProjectName.selectAll();
+
+    }
+
+    void write(WizardDescriptor settings) {
+        NewProjectSettings newproject = NewProjectSettings.getDefault();
+        File projectFolder = new File(tfLocation.getText());
+        ProjectChooser.setProjectsFolder(projectFolder);
+        settings.putProperty(CommonProjectActions.PROJECT_PARENT_FOLDER,
+                projectFolder);
+        settings.putProperty(PROP_NAME, tfProjectName.getText());
+        if (tfPackageName.isVisible()) {
+            String pkg = tfPackageName.getText();
+            settings.putProperty(PROP_PACKAGE_BASE, pkg);
+            String derivedPackage = derivedPackage();
+            if (pkg.endsWith(derivedPackage)) {
+                String prefix = pkg.substring(0, pkg.length() - 
derivedPackage.length());
+                newproject.setPackagePrefix(prefix);
+            }
+        }
+
+        if (settings.getProperty(PROP_JAVA_VERSIONS) != null) {
+            settings.putProperty(PROP_JAVA_VERSION, 
cbJavaVersion.getSelectedItem());
+        }
+
+        if (settings.getProperty(PROP_TEST_FRAMEWORKS) != null) {
+            settings.putProperty(PROP_TEST_FRAMEWORK, 
cbTestFramework.getSelectedItem());
+        }
+
+        settings.putProperty(PROP_DSL, cbDSL.getSelectedItem());
+        newproject.setGradleDSL((GradleDSL) cbDSL.getSelectedItem());
+
+        settings.putProperty(PROP_COMMENTS, cbComments.isSelected());
+        newproject.setGenerateComments(cbComments.isSelected());
+    }
+
+    private static String firstAvailableName(File dir, String baseName) {
+        int index = 1;
+        String name;
+        File folder;
+        do {
+            name = baseName + String.valueOf(index++);
+            folder = new File(dir, name);
+        } while (folder.exists());
+        return name;
+    }
+
+    private void updateTextFields(DocumentEvent e) {
+        Document doc = e.getDocument();
+
+        if (tfProjectName.getDocument() == doc || tfLocation.getDocument() == 
doc) {
+            File location = new File(tfLocation.getText());
+            if (location.isDirectory()) {
+                tfProjectFolder.setText(tfLocation.getText() + File.separator 
+ tfProjectName.getText());
+            } else {
+                tfProjectFolder.setText(tfLocation.getText());
+            }
+        }
+
+        if (!packageNameChanged && (tfProjectName.getDocument() == doc)) {
+            tfPackageName.getDocument().removeDocumentListener(fieldUpdater);
+            adjustPackageBase();
+            tfPackageName.getDocument().addDocumentListener(fieldUpdater);
+        }
+
+        if (tfProjectName.getDocument() == doc) {
+            firePropertyChange(PROP_PROJECT_NAME, null, 
tfProjectName.getText());
+        }
+    }
+
+    private String derivedPackage() {
+        return tfProjectName.getText()
+                .replace('_', '.')
+                .replace('-', '.');
+    }
+    private void  adjustPackageBase() {
+        String derivedPackage = derivedPackage();
+        String pkg = tfPackageName.getText();
+        if ((packageSuffix != null) && pkg.endsWith(packageSuffix)) {
+            String newPkg = pkg.substring(0, pkg.length() - 
packageSuffix.length()) + derivedPackage;
+
+            tfPackageName.setText(newPkg);
+        }
+        packageSuffix = derivedPackage;
+    }
+
+    // Change the package name upon the project name till it's not directly 
edited
+    private boolean packageNameChanged = false;
+    private String packageSuffix;
+    private final DocumentListener fieldUpdater = new DocumentListener() {
+        @Override
+        public void insertUpdate(DocumentEvent e) {
+            updateTextFields(e);
+        }
+
+        @Override
+        public void removeUpdate(DocumentEvent e) {
+            updateTextFields(e);
+        }
+
+        @Override
+        public void changedUpdate(DocumentEvent e) {
+            updateTextFields(e);
+        }
+    };
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton btBrowse;
+    private javax.swing.JCheckBox cbComments;
+    private javax.swing.JComboBox<GradleDSL> cbDSL;
+    private javax.swing.JComboBox<Integer> cbJavaVersion;
+    private javax.swing.JComboBox<TestFramework> cbTestFramework;
+    private javax.swing.JLabel lbDSL;
+    private javax.swing.JLabel lbJavaVersion;
+    private javax.swing.JLabel lbLocation;
+    private javax.swing.JLabel lbPackageName;
+    private javax.swing.JLabel lbProjectFolder;
+    private javax.swing.JLabel lbProjectName;
+    private javax.swing.JLabel lbTestFramework;
+    private javax.swing.JTextField tfLocation;
+    private javax.swing.JTextField tfPackageName;
+    private javax.swing.JTextField tfProjectFolder;
+    private javax.swing.JTextField tfProjectName;
+    // End of variables declaration//GEN-END:variables
+}
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/newproject/NewProjectSettings.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/NewProjectSettings.java
new file mode 100644
index 0000000000..5ce0eee381
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/newproject/NewProjectSettings.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.newproject;
+
+import java.util.prefs.Preferences;
+import org.netbeans.modules.gradle.spi.newproject.GradleInitWizard;
+import org.openide.util.NbPreferences;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class NewProjectSettings {
+
+    public static final String PROP_PACKAGE_PREFIX = "packagePrefix";
+
+    private static final NewProjectSettings INSTANCE = new 
NewProjectSettings(NbPreferences.forModule(NewProjectSettings.class));
+    private final Preferences preferences;
+
+    public static NewProjectSettings getDefault() {
+        return INSTANCE;
+    }
+
+    NewProjectSettings(Preferences preferences) {
+        this.preferences = preferences;
+    }
+
+    public Preferences getPreferences() {
+        return preferences;
+    }
+
+    public void setPackagePrefix(String prefix) {
+        getPreferences().put(PROP_PACKAGE_PREFIX, prefix);
+    }
+
+    public String getPackagePrefix() {
+        return getPreferences().get(PROP_PACKAGE_PREFIX, "com.example."); 
//NOI18N
+    }
+
+    public void setGradleDSL(GradleInitWizard.GradleDSL dsl) {
+        getPreferences().put(GradleInitWizard.PROP_DSL, dsl.name());
+    }
+
+    public GradleInitWizard.GradleDSL getGradleDSL() {
+        String dsl = getPreferences().get(GradleInitWizard.PROP_DSL, 
GradleInitWizard.GradleDSL.GROOVY.name());
+        try {
+            return GradleInitWizard.GradleDSL.valueOf(dsl);
+        } catch (IllegalArgumentException ex) {
+        }
+        return GradleInitWizard.GradleDSL.GROOVY;
+    }
+
+    public void setGenerateComments(boolean b) {
+        getPreferences().putBoolean(GradleInitWizard.PROP_COMMENTS, b);
+    }
+
+    public boolean getGenerateComments() {
+        return getPreferences().getBoolean(GradleInitWizard.PROP_COMMENTS, 
true);
+    }
+}
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
index 57433620c5..7231c382bd 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
@@ -33,8 +33,6 @@ import 
org.netbeans.modules.gradle.api.output.OutputProcessorFactory;
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -43,6 +41,11 @@ import org.netbeans.modules.gradle.api.execute.RunUtils;
 import org.netbeans.spi.project.ProjectServiceProvider;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
+import org.openide.windows.IOColors;
+import static org.openide.windows.IOColors.OutputType.LOG_DEBUG;
+import static org.openide.windows.IOColors.OutputType.LOG_FAILURE;
+import static org.openide.windows.IOColors.OutputType.LOG_SUCCESS;
+import static org.openide.windows.IOColors.OutputType.LOG_WARNING;
 
 /**
  *
@@ -51,51 +54,18 @@ import org.openide.filesystems.FileUtil;
 @ProjectServiceProvider(service = OutputProcessorFactory.class, projectType = 
NbGradleProject.GRADLE_PROJECT_TYPE)
 public class GradleProcessorFactory implements OutputProcessorFactory {
 
-    private static final OutputProcessor URL_PROCESSOR = new 
URLOutputProcessor();
-    private static final OutputProcessor GRADLE_PROCESSOR = new 
GradleOutputProcessor();
-    private static final OutputProcessor JAVAC_PROCESSOR = new 
JavaCompilerProcessor();
-    private static final OutputProcessor GROOVYC_PROCESSOR = new 
GroovyCompilerProcessor();
-
-
     @Override
     public Set<? extends OutputProcessor> createOutputProcessors(RunConfig 
cfg) {
-        return new HashSet<>(Arrays.asList(
-                URL_PROCESSOR,
+        return Set.of(
                 GRADLE_PROCESSOR,
                 JAVAC_PROCESSOR,
                 GROOVYC_PROCESSOR,
                 new WarningModeAllProcessor(cfg)
-        ));
+        );
     }
 
-    static final class URLOutputProcessor implements OutputProcessor {
 
-        private static final Pattern URL_PATTERN = 
Pattern.compile("(((https?|ftp|file)://|file:/)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])");
-
-        @Override
-        public boolean processLine(OutputDisplayer out, String line) {
-            Matcher m = URL_PATTERN.matcher(line);
-            int last = 0;
-            while (m.find()) {
-                String txt = line.substring(last, m.start());
-                String lnk = line.substring(m.start(), m.end());
-                last = m.end();
-                out.print(txt);
-                try {
-                    out.print(lnk, OutputListeners.openURL(new URL(lnk)));
-                } catch(MalformedURLException ex) {
-                    out.print(lnk);
-                }
-            }
-            if (last > 0) {
-                out.print(line.substring(last));
-            }
-            return last > 0;
-        }
-
-    }
-
-    static class GradleOutputProcessor implements OutputProcessor {
+    public static final OutputProcessor GRADLE_PROCESSOR = new 
OutputProcessor() {
 
         private static final Pattern GRADLE_ERROR = Pattern.compile("(Build 
file|Script) '(.*)\\.gradle' line: ([0-9]+)");
 
@@ -118,9 +88,9 @@ public class GradleProcessorFactory implements 
OutputProcessorFactory {
             }
             return false;
         }
-    }
+    };
 
-    static class JavaCompilerProcessor implements OutputProcessor {
+    public static final OutputProcessor JAVAC_PROCESSOR = new 
OutputProcessor() {
 
         private static final Pattern JAVA_ERROR = 
Pattern.compile("(.*)\\.java\\:([0-9]+)\\: (error|warning)\\:(.*)");
 
@@ -146,10 +116,9 @@ public class GradleProcessorFactory implements 
OutputProcessorFactory {
             }
             return false;
         }
+    };
 
-    }
-
-    static class GroovyCompilerProcessor implements OutputProcessor {
+    public static final OutputProcessor GROOVYC_PROCESSOR = new 
OutputProcessor() {
 
         private static final Pattern GROOVY_ERROR = 
Pattern.compile("(.*)\\.groovy\\: ([0-9]+)\\: (.+)");
         private static final Pattern COLUMN_INFO = Pattern.compile(" @ line 
([0-9]+), column ([0-9]+)\\.$");
@@ -185,7 +154,82 @@ public class GradleProcessorFactory implements 
OutputProcessorFactory {
             return false;
         }
 
-    }
+    };
+
+    public static final OutputProcessor URL_PROCESSOR = new OutputProcessor() {
+
+        private static final Pattern URL_PATTERN = 
Pattern.compile("(((https?|ftp|file)://|file:/)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])");
+
+        @Override
+        public boolean processLine(OutputDisplayer out, String line) {
+            Matcher m = URL_PATTERN.matcher(line);
+            int last = 0;
+            while (m.find()) {
+                String txt = line.substring(last, m.start());
+                String lnk = line.substring(m.start(), m.end());
+                last = m.end();
+                out.print(txt);
+                try {
+                    out.print(lnk, OutputListeners.openURL(new URL(lnk)));
+                } catch(MalformedURLException ex) {
+                    out.print(lnk);
+                }
+            }
+            if (last > 0) {
+                out.print(line.substring(last));
+            }
+            return last > 0;
+        }
+
+    };
+
+    public static final OutputProcessor TASK_LINE_PROCESSOR = new 
OutputProcessor() {
+        final Pattern TASK_LINE = Pattern.compile("> Task (:[\\w:\\-]+)( 
[\\w\\-]+)?"); //NOI18N
+        @Override
+        public boolean processLine(OutputDisplayer out, String line) {
+            Matcher m = TASK_LINE.matcher(line);
+            boolean ret = m.matches();
+            if (ret) {
+                String task = m.group(1);
+                String state = m.group(2);
+                out.print("> Task "); //NOI18N
+                out.print(task);
+                if (state != null) {
+                    IOColors.OutputType type = LOG_WARNING;
+                    if (state.endsWith("EXECUTED") || 
state.endsWith("UP-TO-DATE") || state.endsWith("FROM-CACHE")) { //NOI18N
+                        type = LOG_SUCCESS;
+                    } else if (state.endsWith("FAILED")) { //NOI18N
+                        type = LOG_FAILURE;
+                    }
+                    out.print(state , null, type);
+                }
+            }
+            return ret;
+        }
+    };
+
+    public static final OutputProcessor STATIC_STRING_PROCESSOR = new 
OutputProcessor() {
+        private static final String BUILD_FAILED_MSG = "BUILD FAILED"; //NOI18N
+        private static final String BUILD_SUCCESS_MSG = "BUILD SUCCESSFUL"; 
//NOI18N
+        private static final String COD_INCUBATION_MSG = "Configuration on 
demand is an incubating feature."; //NOI18N
+        private static final String CONFIG_CACHE_MGS = "Configuration cache "; 
//NOI18N
+
+        @Override
+        public boolean processLine(OutputDisplayer out, String line) {
+            IOColors.OutputType type = null;
+            if (line.startsWith(COD_INCUBATION_MSG) || 
line.startsWith(CONFIG_CACHE_MGS)) {
+                type = LOG_DEBUG;
+            } else if (line.startsWith(BUILD_SUCCESS_MSG)) {
+                type = LOG_SUCCESS;
+            } else if (line.startsWith(BUILD_FAILED_MSG)) {
+                type = LOG_FAILURE;
+            }
+            if (type != null) {
+                out.print(line, null, type);
+            }
+            return type != null;
+        }
+    };
 
     static class WarningModeAllProcessor implements OutputProcessor {
 
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
index ae5674f7f7..77463c6c68 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
@@ -83,7 +83,8 @@ public abstract class BaseGradleWizardIterator implements 
WizardDescriptor.Progr
         index = 0;
         wizard.putProperty ("NewProjectWizard_Title", getTitle()); // NOI18N
 
-        data = wizard;
+        data = initData(wizard);
+
         panels = new ArrayList<>(createPanels());
         String[] steps = new String[panels.size()];
         for (int i = 0; i < panels.size(); i++) {
@@ -99,6 +100,10 @@ public abstract class BaseGradleWizardIterator implements 
WizardDescriptor.Progr
         }
     }
 
+    protected WizardDescriptor initData(WizardDescriptor data) {
+        return data;
+    }
+
     protected abstract List<? extends 
WizardDescriptor.Panel<WizardDescriptor>> createPanels();
     protected abstract String getTitle();
     protected abstract void collectOperations(final TemplateOperation ops, 
final Map<String, Object> params);
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java
new file mode 100644
index 0000000000..981278ce2b
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.spi.newproject;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import org.netbeans.modules.gradle.newproject.GradleInitPanel;
+import org.netbeans.spi.project.ui.support.CommonProjectActions;
+import org.openide.WizardDescriptor;
+import org.openide.util.NbBundle;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleInitWizard {
+
+    public static final String PROP_JAVA_VERSIONS = "javaVersions";     
//NOI18N
+    public static final String PROP_JAVA_VERSION  = "javaVersion";      
//NOI18N
+    public static final String PROP_TEST_FRAMEWORKS = "testFrameworks"; 
//NOI18N
+    public static final String PROP_TEST_FRAMEWORK = "testFramework";   
//NOI18N
+    public static final String PROP_DSL = "DSL";                        
//NOI18N
+    public static final String PROP_COMMENTS = "comments";              
//NOI18N
+
+    @NbBundle.Messages({
+        "LBL_DSL_GROOVY=Groovy",
+        "LBL_DSL_KOTLIN=Kotlin"
+    })
+    public enum GradleDSL {
+        GROOVY,
+        KOTLIN;
+
+        @Override
+        public String toString() {
+            return switch(this) {
+                case GROOVY -> Bundle.LBL_DSL_GROOVY();
+                case KOTLIN -> Bundle.LBL_DSL_KOTLIN();
+            };
+        }
+    }
+
+    @NbBundle.Messages({
+        "LBL_TFW_CPP_TEST=C++ Test",
+        "LBL_TFW_JUNIT=JUnit 4",
+        "LBL_TFW_JUNIT_5=JUnit 5",
+        "LBL_TFW_KOTLIN_TEST=Kotlin Test",
+        "LBL_TFW_SCALA_TEST=Scala Test",
+        "LBL_TFW_SPOCK=Spock",
+        "LBL_TFW_TESTNG=Test NG",
+        "LBL_TFW_XCTEST=XCode Test",
+    })
+    public enum TestFramework {
+        CPP_TEST("cpptest"),
+        JUNIT("junit"),
+        JUNIT_5("junit-jupiter"),
+        KOTLIN_TEST("kotlintest"),
+        SCALA_TEST("scalatest"),
+        SPOCK("spock"),
+        TESTNG("testng"),
+        XCTEST("xctest");
+
+        private final String id;
+
+        private TestFramework(String id) {
+            this.id = id;
+        }
+
+        public String getId() {
+            return id;
+        }
+        
+        @Override
+        public String toString() {
+            return switch(this) {
+                case CPP_TEST -> Bundle.LBL_TFW_CPP_TEST();
+                case JUNIT -> Bundle.LBL_TFW_JUNIT();
+                case JUNIT_5 -> Bundle.LBL_TFW_JUNIT_5();
+                case KOTLIN_TEST -> Bundle.LBL_TFW_KOTLIN_TEST();
+                case SCALA_TEST -> Bundle.LBL_TFW_SCALA_TEST();
+                case SPOCK -> Bundle.LBL_TFW_SPOCK();
+                case TESTNG -> Bundle.LBL_TFW_TESTNG();
+                case XCTEST -> Bundle.LBL_TFW_XCTEST();
+            };
+        }
+    }
+
+    private final String type;
+    private final String title;
+
+    private Integer preferredJavaVersion;
+    private TestFramework preferredTestFramework;
+    private List<Integer> javaVersions;
+    private List<TestFramework> testFrameworks;
+    private List<String> important = List.of();
+
+    private GradleInitWizard(String type, String title) {
+        this.type = type;
+        this.title = title;
+    }
+
+    
+    public static GradleInitWizard create(String type, String title) {
+        return new GradleInitWizard(type, title);
+    }
+
+    public GradleInitWizard withJavaVersions(List<Integer> javaVersions) {
+        this.javaVersions = javaVersions;
+        return this;
+    }
+
+    public GradleInitWizard withTestframeworks(List<TestFramework> 
testFrameworks) {
+        this.testFrameworks = testFrameworks;
+        return this;
+    }
+
+    public GradleInitWizard withPreferredJava(Integer version) {
+        this.preferredJavaVersion = version;
+        return this;
+    }
+
+    public GradleInitWizard withPreferredTestFramework(TestFramework 
framework) {
+        this.preferredTestFramework = framework;
+        return this;
+    }
+
+    public GradleInitWizard withImportantPaths(List<String> important) {
+        this.important = important;
+        return this;
+    }
+
+    public BaseGradleWizardIterator build() {
+        return new GradleInitWizardIterator(type, title, important) {
+            @Override
+            protected WizardDescriptor initData(WizardDescriptor data) {
+                if (javaVersions != null) {
+                    data.putProperty(PROP_JAVA_VERSIONS, javaVersions);
+                }
+                if (testFrameworks != null) {
+                    data.putProperty(PROP_TEST_FRAMEWORKS, testFrameworks);
+                }
+                if (preferredJavaVersion != null) {
+                    data.putProperty(PROP_JAVA_VERSION, preferredJavaVersion);
+                }
+                if (preferredTestFramework != null) {
+                    data.putProperty(PROP_TEST_FRAMEWORK, 
preferredTestFramework);
+                }
+                return data;
+            }
+        };
+    };
+
+    private static class GradleInitWizardIterator extends 
BaseGradleWizardIterator {
+        private final String type;
+        private final String title;
+
+        private final List<String> important;
+
+        private GradleInitWizardIterator(String type, String title, 
List<String> important) {
+            this.type = type;
+            this.title = title;
+            this.important = important;
+        }
+
+        @Override
+        protected void collectOperations(TemplateOperation ops, Map<String, 
Object> params) {
+            String name = (String) params.get(PROP_NAME);
+            String packageBase = (String) params.get(PROP_PACKAGE_BASE);
+            File loc = (File) 
params.get(CommonProjectActions.PROJECT_PARENT_FOLDER);
+
+            File root = new File(loc, name);
+
+            TemplateOperation.InitOperation init = ops.createGradleInit(root, 
type);
+            init.projectName(name);
+            if (packageBase != null) {
+                init.basePackage(packageBase);
+            }
+
+            GradleDSL dsl = (GradleDSL) params.get(PROP_DSL);
+            init.dsl(dsl == GradleDSL.KOTLIN ? "kotlin" : "groovy"); //NOI18N
+
+            if (params.get(PROP_JAVA_VERSION) != null) {
+                init.javaVersion(params.get(PROP_JAVA_VERSION).toString());
+            }
+
+            if (params.get(PROP_TEST_FRAMEWORK) != null) {
+                
init.testFramework(((TestFramework)params.get(PROP_TEST_FRAMEWORK)).getId());
+            }
+
+            init.comments((Boolean)params.get(PROP_COMMENTS));
+            init.add();
+
+
+            ops.addWrapperInit(root, "latest"); //NOI18N
+            List<String> open = important.stream()
+                    .map((s) -> packageBase != null ? s.replace("${package}", 
packageBase.replace('.', '/')) : s) //NOI18N
+                    .map((s) -> s.replace("${projectName}", name)) //NOI18N
+                    .toList();
+            ops.addProjectPreload(root, open);
+        }
+
+
+        @Override
+        protected List<? extends WizardDescriptor.Panel<WizardDescriptor>> 
createPanels() {
+            return List.of(new GradleInitPanel());
+        }
+
+        @Override
+        protected String getTitle() {
+            return title;
+        }
+    }
+
+
+}
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
index 68f38956a8..9697aa92c4 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
@@ -51,17 +51,22 @@ import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.gradle.tooling.BuildLauncher;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.modules.gradle.GradleProjectLoader;
 import org.netbeans.modules.gradle.ProjectTrust;
 import org.netbeans.modules.gradle.api.GradleProjects;
 import org.netbeans.modules.gradle.api.NbGradleProject.Quality;
+import org.netbeans.modules.gradle.execute.EscapeProcessingOutputStream;
+import org.netbeans.modules.gradle.execute.GradlePlainEscapeProcessor;
 import org.netbeans.modules.gradle.spi.GradleSettings;
 import org.openide.loaders.DataFolder;
 import org.openide.loaders.DataObject;
 import org.openide.util.Exceptions;
 import org.openide.util.NbBundle;
+import org.openide.windows.IOProvider;
+import org.openide.windows.InputOutput;
 
 /**
  * Steps, that a New Gradle Project Wizard can perform.
@@ -305,6 +310,7 @@ public final class TemplateOperation implements Runnable {
         public Set<FileObject> execute() {
             GradleConnector gconn = GradleConnector.newConnector();
             target.mkdirs();
+            InputOutput io = IOProvider.getDefault().getIO(projectName + " 
(init)", true);
             try (ProjectConnection pconn = 
gconn.forProjectDirectory(target).connect()) {
                 List<String> args = new ArrayList<>();
                 args.add("init");
@@ -346,14 +352,25 @@ public final class TemplateOperation implements Runnable {
                 // gradle init is non-interactive inside the IDE
                 args.add("--use-defaults");
 
+                try (
+                        var out = new EscapeProcessingOutputStream(new 
GradlePlainEscapeProcessor(io, false));
+                        var err = new EscapeProcessingOutputStream(new 
GradlePlainEscapeProcessor(io, false))
+                ) {
+                    BuildLauncher gradleInit = 
pconn.newBuild().forTasks(args.toArray(new String[0]));
+                    if (GradleSettings.getDefault().isOffline()) {
+                        gradleInit = gradleInit.withArguments("--offline");
+                    }
+                    gradleInit.setStandardOutput(out);
+                    gradleInit.setStandardError(err);
+                    gradleInit.run();
 
-                if (GradleSettings.getDefault().isOffline()) {
-                    
pconn.newBuild().withArguments("--offline").forTasks(args.toArray(new 
String[0])).run(); //NOI18N
-                } else {
-                    pconn.newBuild().forTasks(args.toArray(new 
String[0])).run();
+                } catch (IOException iox) {
                 }
             } catch (GradleConnectionException | IllegalStateException ex) {
                 Exceptions.printStackTrace(ex);
+            } finally {
+                if (io.getOut() != null) io.getOut().close();
+                if (io.getErr() != null) io.getErr().close();
             }
             gconn.disconnect();
             return Collections.singleton(FileUtil.toFileObject(target));
@@ -392,6 +409,10 @@ public final class TemplateOperation implements Runnable {
         steps.add(new PreloadProject(projectDir));
     }
 
+    public void addProjectPreload(File projectDir, List<String> important) {
+        steps.add(new PreloadProject(projectDir, important));
+    }
+
     private abstract static class BaseOperationStep implements OperationStep {
         @Override
         public final String toString() {
@@ -464,9 +485,15 @@ public final class TemplateOperation implements Runnable {
     private static final class PreloadProject extends BaseOperationStep {
 
         final File dir;
+        final List<String> importantFiles;
 
         public PreloadProject(File dir) {
+            this(dir, List.of());
+        }
+
+        public PreloadProject(File dir, List<String> importantFiles) {
             this.dir = dir;
+            this.importantFiles = importantFiles;
         }
 
         @Override
@@ -501,7 +528,15 @@ public final class TemplateOperation implements Runnable {
                                 loader.loadProject(Quality.FULL_ONLINE, null, 
true, false);
                             }
                         }
-                        return Collections.singleton(projectDir);
+                        Set<FileObject> ret = new LinkedHashSet<>();
+                        ret.add(projectDir);
+                        for (String f : importantFiles) {
+                            FileObject fo = projectDir.getFileObject(f);
+                            if (fo != null) {
+                                ret.add(fo);
+                            }
+                        }
+                        return ret;
                     }
                 } catch (IOException | IllegalArgumentException ex) {
                 }
diff --git 
a/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
 
b/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
index 50f36515df..604996f791 100644
--- 
a/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
+++ 
b/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
@@ -21,6 +21,7 @@ package org.netbeans.modules.gradle.output;
 import org.junit.Test;
 import static org.junit.Assert.*;
 import org.netbeans.modules.gradle.api.output.OutputDisplayerMock;
+import static org.netbeans.modules.gradle.output.GradleProcessorFactory.*;
 
 /**
  *
@@ -46,9 +47,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testJavaCompilerProcessor1() {
-        GradleProcessorFactory.JavaCompilerProcessor jcp = new 
GradleProcessorFactory.JavaCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(jcp.processLine(od, JAVA_COMPILE_ERROR_1));
+        assertTrue(JAVAC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         
assertEquals("/home/netbeans/NetBeansProjects/gradleproject3/common/src/main/java/gradleproject3/common/NewClass1.java:1",
 outputs[0].text);
         assertEquals(": error: class, interface, or enum expected", 
outputs[1].text);
@@ -56,9 +56,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testJavaCompilerProcessor2() {
-        GradleProcessorFactory.JavaCompilerProcessor jcp = new 
GradleProcessorFactory.JavaCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(jcp.processLine(od, JAVA_COMPILE_ERROR_2));
+        assertTrue(JAVAC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_2));
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         
assertEquals("D:\\Users\\netbeans\\NetBeansProjects\\gradleproject3\\common\\src\\main\\java\\gradleproject3\\common\\NewClass1.java:1",
 outputs[0].text);
         assertEquals(": error: class, interface, or enum expected", 
outputs[1].text);
@@ -66,23 +65,20 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testJavaCompilerProcessor3() {
-        GradleProcessorFactory.JavaCompilerProcessor jcp = new 
GradleProcessorFactory.JavaCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(jcp.processLine(od, GROOVY_COMPILE_ERROR_1));
+        assertFalse(JAVAC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_1));
     }
 
     @Test
     public void testJavaCompilerProcessor4() {
-        GradleProcessorFactory.JavaCompilerProcessor jcp = new 
GradleProcessorFactory.JavaCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(jcp.processLine(od, JAVA_8_STACKTRACE_1));
+        assertFalse(JAVAC_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
     }
 
     @Test
     public void testGroovyCompilerProcessor1() {
-        GradleProcessorFactory.GroovyCompilerProcessor gcp = new 
GradleProcessorFactory.GroovyCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(gcp.processLine(od, GROOVY_COMPILE_ERROR_1));
+        assertTrue(GROOVYC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_1));
         assertEquals(GROOVY_COMPILE_ERROR_1, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         
assertEquals("/home/netbeans/NetBeansProjects/netbeans/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NetBeansExplodedWarPlugin.groovy:
 33", outputs[0].text);
@@ -92,9 +88,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testGroovyCompilerProcessor2() {
-        GradleProcessorFactory.GroovyCompilerProcessor gcp = new 
GradleProcessorFactory.GroovyCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(gcp.processLine(od, GROOVY_COMPILE_ERROR_2));
+        assertTrue(GROOVYC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_2));
         assertEquals(GROOVY_COMPILE_ERROR_2, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         
assertEquals("/home/netbeans/NetBeansProjects/netbeans/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NetBeansExplodedWarPlugin.groovy:
 43", outputs[0].text);
@@ -104,30 +99,26 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testGroovyCompilerProcessor3() {
-        GradleProcessorFactory.GroovyCompilerProcessor gcp = new 
GradleProcessorFactory.GroovyCompilerProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(gcp.processLine(od, JAVA_COMPILE_ERROR_1));
+        assertFalse(GROOVYC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
     }
 
     @Test
     public void testURLOutputProcessor1() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(uop.processLine(od, JAVA_8_STACKTRACE_1));
+        assertFalse(URL_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
     }
 
     @Test
     public void testURLOutputProcessor2() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(uop.processLine(od, JAVA_COMPILE_ERROR_1));
+        assertFalse(URL_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
     }
 
     @Test
     public void testURLOutputProcessor3() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, URL_PATTERN_1));
+        assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_1));
         assertEquals(URL_PATTERN_1, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertEquals(3, outputs.length);
@@ -136,9 +127,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testURLOutputProcessor4() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, URL_PATTERN_2));
+        assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_2));
         assertEquals(URL_PATTERN_2, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertNotNull(outputs[1].action);
@@ -147,9 +137,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testURLOutputProcessor5() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, URL_PATTERN_3));
+        assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_3));
         assertEquals(URL_PATTERN_3, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertEquals(5, outputs.length);
@@ -160,9 +149,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testURLOutputProcessor6() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, URL_PATTERN_4));
+        assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_4));
         assertEquals(URL_PATTERN_4, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertEquals(7, outputs.length);
@@ -175,9 +163,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testURLOutputProcessor7() {
-        GradleProcessorFactory.URLOutputProcessor uop = new 
GradleProcessorFactory.URLOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, URL_PATTERN_5));
+        assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_5));
         assertEquals(URL_PATTERN_5, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertEquals(7, outputs.length);
@@ -190,9 +177,8 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testGradleOutputProcessor1() {
-        GradleProcessorFactory.GradleOutputProcessor uop = new 
GradleProcessorFactory.GradleOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertTrue(uop.processLine(od, GRADLE_SCRIPT_ERROR_1));
+        assertTrue(GRADLE_PROCESSOR.processLine(od, GRADLE_SCRIPT_ERROR_1));
         assertEquals(GRADLE_SCRIPT_ERROR_1, od.getOutput());
         OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
         assertEquals(1, outputs.length);
@@ -201,15 +187,13 @@ public class GradleProcessorFactoryTest {
 
     @Test
     public void testGradleOutputProcessor2() {
-        GradleProcessorFactory.GradleOutputProcessor uop = new 
GradleProcessorFactory.GradleOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(uop.processLine(od, JAVA_COMPILE_ERROR_1));
+        assertFalse(GRADLE_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
     }
 
     @Test
     public void testGradleOutputProcessor3() {
-        GradleProcessorFactory.GradleOutputProcessor uop = new 
GradleProcessorFactory.GradleOutputProcessor();
         OutputDisplayerMock od = new OutputDisplayerMock();
-        assertFalse(uop.processLine(od, JAVA_8_STACKTRACE_1));
+        assertFalse(GRADLE_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
     }
 }
diff --git a/java/gradle.java/nbproject/project.xml 
b/java/gradle.java/nbproject/project.xml
index 2bc5d4e31c..41feb2bad4 100644
--- a/java/gradle.java/nbproject/project.xml
+++ b/java/gradle.java/nbproject/project.xml
@@ -31,7 +31,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.28</specification-version>
+                        <specification-version>2.40</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git 
a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java
 
b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java
deleted file mode 100644
index de1889f650..0000000000
--- 
a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.netbeans.modules.gradle.java.newproject;
-
-import org.netbeans.modules.gradle.spi.newproject.TemplateOperation;
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.netbeans.api.templates.TemplateRegistration;
-import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
-import static 
org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_INIT_WRAPPER;
-import static 
org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_NAME;
-import static 
org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_PACKAGE_BASE;
-import org.netbeans.spi.project.ui.support.CommonProjectActions;
-import org.openide.WizardDescriptor;
-import org.openide.util.NbBundle.Messages;
-
-/**
- *
- * @author Laszlo Kishalmi
- */
-@TemplateRegistration(folder="Project/Gradle", position=100, 
displayName="#template.simpleAppProject", 
iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", 
description="SimpleApplicationDescription.html")
-@Messages("template.simpleAppProject=Java Application")
-public class SimpleApplicationProjectWizard extends BaseGradleWizardIterator {
-    public SimpleApplicationProjectWizard() {
-    }
-
-    @Override
-    protected List<? extends WizardDescriptor.Panel<WizardDescriptor>> 
createPanels() {
-        return Collections.singletonList(createProjectAttributesPanel(null));
-    }
-
-    @Messages("LBL_SimpleApplicationProject=Java Application with Gradle")
-    @Override
-    protected String getTitle() {
-        return Bundle.LBL_SimpleApplicationProject();
-    }
-
-    @Override
-    protected void collectOperations(TemplateOperation ops, Map<String, 
Object> params) {
-        collectOperationsForType(params, ops, "java-application", "app");
-    }
-
-    static void collectOperationsForType(Map<String, Object> params, 
TemplateOperation ops, String type, String subFolder) {
-        final String name = (String) params.get(PROP_NAME);
-        final String packageBase = (String) params.get(PROP_PACKAGE_BASE);
-        final File loc = (File) 
params.get(CommonProjectActions.PROJECT_PARENT_FOLDER);
-        final File root = new File(loc, name);
-
-        ops.createGradleInit(root, 
type).basePackage(packageBase).projectName(name).dsl("groovy").add(); // NOI18N
-
-        Boolean initWrapper = (Boolean) params.get(PROP_INIT_WRAPPER);
-        if (initWrapper == null || initWrapper) {
-            // @TODO allow configuration of wrapper version
-            ops.addWrapperInit(root, "latest"); // NOI18N
-        } else {
-            // @TODO delete wrapper added by init?
-        }
-
-        ops.addProjectPreload(root);
-        ops.addProjectPreload(new File(root, subFolder));
-
-    }
-
-}
diff --git 
a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java
 
b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java
deleted file mode 100644
index f8594e9a1c..0000000000
--- 
a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.netbeans.modules.gradle.java.newproject;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.netbeans.api.templates.TemplateRegistration;
-import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
-import org.netbeans.modules.gradle.spi.newproject.TemplateOperation;
-import org.openide.WizardDescriptor;
-import org.openide.util.NbBundle;
-
-/**
- *
- * @author Laszlo Kishalmi
- */
-@TemplateRegistration(folder="Project/Gradle", position=110, 
displayName="#template.simpleLibProject", 
iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", 
description="SimpleLibraryDescription.html")
-@NbBundle.Messages("template.simpleLibProject=Java Class Library")
-public class SimpleLibraryProjectWizard extends BaseGradleWizardIterator {
-    public SimpleLibraryProjectWizard() {
-    }
-
-    @Override
-    protected List<? extends WizardDescriptor.Panel<WizardDescriptor>> 
createPanels() {
-        return Collections.singletonList(createProjectAttributesPanel(null));
-    }
-
-    @NbBundle.Messages("LBL_SimpleLibraryProject=Java Class Library with 
Gradle")
-    @Override
-    protected String getTitle() {
-        return Bundle.LBL_SimpleLibraryProject();
-    }
-
-    @Override
-    protected void collectOperations(TemplateOperation ops, Map<String, 
Object> params) {
-        SimpleApplicationProjectWizard.collectOperationsForType(params, ops, 
"java-library", "lib");
-    }
-}
-
diff --git 
a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java 
b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java
new file mode 100644
index 0000000000..255def8bce
--- /dev/null
+++ 
b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.java.newproject;
+
+import java.util.List;
+import org.netbeans.api.templates.TemplateRegistration;
+import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
+import org.netbeans.modules.gradle.spi.newproject.GradleInitWizard;
+import 
org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.TestFramework;
+import org.openide.util.NbBundle;
+
+import static 
org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.TestFramework.*;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Wizards {
+
+    private Wizards() {};
+
+    private static final List<Integer> JAVA_VERSIONS = List.of(22, 21, 17, 11, 
8);
+    private static final List<TestFramework> JAVA_TEST_FRAMEWORKS = List.of(
+            JUNIT,
+            JUNIT_5,
+            TESTNG
+    );
+
+    @TemplateRegistration(folder="Project/Gradle", position=100, 
displayName="#template.simpleAppProject", 
iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", 
description="SimpleApplicationDescription.html")
+    @NbBundle.Messages({
+        "template.simpleAppProject=Java Application",
+        "LBL_SimpleApplicationProject=Java Application with Gradle"
+    })
+    public static BaseGradleWizardIterator createJavaApplication() {
+        return GradleInitWizard.create("java-application", 
Bundle.LBL_SimpleApplicationProject())
+                .withJavaVersions(JAVA_VERSIONS)
+                .withTestframeworks(JAVA_TEST_FRAMEWORKS)
+                .withPreferredTestFramework(JUNIT_5)
+                .withImportantPaths(List.of(
+                        "app",
+                        "app/src/main/java/${package}/App.java"
+                ))
+                .build();
+    }
+
+    @TemplateRegistration(folder="Project/Gradle", position=110, 
displayName="#template.simpleLibProject", 
iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", 
description="SimpleLibraryDescription.html")
+    @NbBundle.Messages({
+        "template.simpleLibProject=Java Class Library",
+        "LBL_SimpleLibraryProject=Java Class Library with Gradle"
+    })
+    public static BaseGradleWizardIterator createJavaLibrary() {
+        return GradleInitWizard.create("java-library", 
Bundle.LBL_SimpleApplicationProject())
+                .withJavaVersions(JAVA_VERSIONS)
+                .withTestframeworks(JAVA_TEST_FRAMEWORKS)
+                .withPreferredTestFramework(JUNIT_5)
+                .withImportantPaths(List.of(
+                        "lib",
+                        "lib/src/main/java/${package}/Library.java"
+                ))
+                .build();
+    }
+}


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