Bug 562581 - Make "create module-info.java file" an option on the Module
Dependencies page, and off by default

Change-Id: Ibcaae2b981e3509f31b4aa1977292adae7920bf2
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/179483
Tested-by: JDT Bot <jdt-bot@eclipse.org>
diff --git a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
index a77cb54..69581a9 100644
--- a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.ui; singleton:=true
-Bundle-Version: 3.22.200.qualifier
+Bundle-Version: 3.23.0.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.ui.JavaPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.ui/pom.xml b/org.eclipse.jdt.ui/pom.xml
index 4c8f62e..6801900 100644
--- a/org.eclipse.jdt.ui/pom.xml
+++ b/org.eclipse.jdt.ui/pom.xml
@@ -18,7 +18,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui</artifactId>
-  <version>3.22.200-SNAPSHOT</version>
+  <version>3.23.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <code.ignoredWarnings>-warn:-deprecation,unavoidableGenericProblems</code.ignoredWarnings>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
index 7f6db77..045b9ce 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
@@ -253,6 +253,8 @@
 	public static String NewJavaProjectWizardPageOne_Message_invalidDirectory;
 	public static String NewJavaProjectWizardPageOne_Message_projectAlreadyExists;
 	public static String NewJavaProjectWizardPageOne_UnknownDefaultJRE_name;
+	public static String NewJavaProjectWizardPageOne_Module_group;
+	public static String NewJavaProjectWizardPageOne_Create_ModuleInfoFile_name;
 	public static String NewJavaProjectWizardPageTwo_error_remove_message;
 	public static String NewJavaProjectWizardPageTwo_error_remove_title;
 	public static String NewJavaProjectWizardPageTwo_problem_backup;
@@ -340,7 +342,6 @@
 	public static String SourceContainerWorkbookPage_folders_edit_button;
 	public static String SourceContainerWorkbookPage_folders_toggle_button;
 	public static String SourceContainerWorkbookPage_folders_check;
-	public static String SourceContainerWorkbookPage_create_moduleinfo_check;
 	public static String SourceContainerWorkbookPage_ExistingSourceFolderDialog_new_title;
 	public static String SourceContainerWorkbookPage_ChangeOutputLocationDialog_title;
 	public static String SourceContainerWorkbookPage_ChangeOutputLocationDialog_project_and_output_message;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
index 93fe9c1..73620c5 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
@@ -340,8 +340,6 @@
 
 SourceContainerWorkbookPage_folders_check=Allow output folders for sour&ce folders
 
-SourceContainerWorkbookPage_create_moduleinfo_check=Create &module-info.java file
-
 SourceContainerWorkbookPage_ExistingSourceFolderDialog_new_title=Source Folder Selection
 
 SourceContainerWorkbookPage_ChangeOutputLocationDialog_title=Source Folder Added
@@ -1136,6 +1134,8 @@
 NewJavaProjectWizardPageOne_page_title=Create a Java Project
 NewJavaProjectWizardPageOne_page_description=Create a Java project in the workspace or in an external location.
 NewJavaProjectWizardPageOne_NoJREFound_link=The default JRE could be detected. To add a JRE manually go to the <a href="JRE">JREs preference page</a>.
+NewJavaProjectWizardPageOne_Module_group=Module
+NewJavaProjectWizardPageOne_Create_ModuleInfoFile_name=Create &module-info.java file
 
 
 NewJavaProjectWizardPageTwo_error_title=New Java Project
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathsBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathsBlock.java
index a395c81..f1f1574 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathsBlock.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/BuildPathsBlock.java
@@ -1139,8 +1139,4 @@
 	public void setFocus() {
 		fSourceContainerPage.setFocus();
     }
-
-	public BuildPathBasePage getSourceContainerPage() {
-		return fSourceContainerPage;
-	}
 }
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/newsourcepage/NewSourceContainerWorkbookPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/newsourcepage/NewSourceContainerWorkbookPage.java
index 891b415..11aa787 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/newsourcepage/NewSourceContainerWorkbookPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/newsourcepage/NewSourceContainerWorkbookPage.java
@@ -30,7 +30,6 @@
 import org.eclipse.core.runtime.Path;
 
 import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
 
 import org.eclipse.jface.action.ToolBarManager;
 import org.eclipse.jface.layout.PixelConverter;
@@ -51,7 +50,6 @@
 import org.eclipse.jdt.internal.corext.buildpath.BuildpathDelta;
 import org.eclipse.jdt.internal.corext.buildpath.ClasspathModifier;
 import org.eclipse.jdt.internal.corext.buildpath.IBuildpathModifierListener;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.preferences.ScrolledPageContent;
@@ -76,9 +74,6 @@
     private HintTextGroup fHintTextGroup;
     private DialogPackageExplorer fPackageExplorer;
     private SelectionButtonDialogField fUseFolderOutputs;
-    private SelectionButtonDialogField fCreateModuleInfoFileButton;
-    private boolean fCreateModuleInfoFile;
-    private String fCompilerCompliance;
     private final StringDialogField fOutputLocationField;
 	private DialogPackageExplorerActionGroup fActionGroup;
 
@@ -111,11 +106,6 @@
         fUseFolderOutputs.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_folders_check);
 
 
-		fCreateModuleInfoFileButton= new SelectionButtonDialogField(SWT.CHECK);
-		fCreateModuleInfoFileButton.setSelection(true);
-		fCreateModuleInfoFile= true;
-		fCreateModuleInfoFileButton.setLabelText(NewWizardMessages.SourceContainerWorkbookPage_create_moduleinfo_check);
-
 		fPackageExplorer= new DialogPackageExplorer();
 		fHintTextGroup= new HintTextGroup();
      }
@@ -159,22 +149,7 @@
 		fUseFolderOutputs.setSelection(useFolderOutputs);
     }
 
-	public void setCompilerCompliance(String compilerCompliance) {
-		if (compilerCompliance != null) {
-			fCompilerCompliance= compilerCompliance;
-			try {
-				setCreateModuleInfoFile(false);
-			} catch (JavaModelException e) {
-				//do nothing
-			}
-		}
-	}
-
-	public boolean isCreateModuleInfoFile() {
-		return fCreateModuleInfoFile;
-	}
-
-    public void dispose() {
+	public void dispose() {
     	if (fActionGroup != null) {
     		fActionGroup.removeBuildpathModifierListener(this);
     		fActionGroup= null;
@@ -235,12 +210,7 @@
         excomposite.setClient(fHintTextGroup.createControl(excomposite));
         fUseFolderOutputs.doFillIntoGrid(body, 1);
 
-		fCreateModuleInfoFileButton.doFillIntoGrid(body, 1);
-
-		fCreateModuleInfoFileButton.setDialogFieldListener(field -> fCreateModuleInfoFile= fCreateModuleInfoFileButton.isSelected());
-
-
-        fActionGroup= new DialogPackageExplorerActionGroup(fHintTextGroup, fContext, fPackageExplorer, this);
+		fActionGroup= new DialogPackageExplorerActionGroup(fHintTextGroup, fContext, fPackageExplorer, this);
 		fActionGroup.addBuildpathModifierListener(this);
 
 
@@ -414,46 +384,11 @@
 
         try {
 	        fOutputLocationField.setText(fJavaProject.getOutputLocation().makeRelative().toString());
-			setCreateModuleInfoFile(true);
         } catch (JavaModelException e) {
 	        JavaPlugin.log(e);
         }
     }
 
-	private void setCreateModuleInfoFile(boolean buildpathChanged) throws JavaModelException {
-		boolean selection= fCreateModuleInfoFileButton.isSelected();
-		boolean enabled= fCreateModuleInfoFileButton.isEnabled();
-		boolean setEnabled= true;
-		boolean setSelection= true;
-		if (JavaModelUtil.is9OrHigher(fCompilerCompliance)) {
-			IPackageFragmentRoot[] packageFragmentRoots= fJavaProject.getPackageFragmentRoots();
-			List<IPackageFragmentRoot> packageFragmentRootsAsList= new ArrayList<>(Arrays.asList(packageFragmentRoots));
-			for (IPackageFragmentRoot packageFragmentRoot : packageFragmentRoots) {
-				IResource res= packageFragmentRoot.getCorrespondingResource();
-				if (res == null || res.getType() != IResource.FOLDER || packageFragmentRoot.getKind() != IPackageFragmentRoot.K_SOURCE) {
-					packageFragmentRootsAsList.remove(packageFragmentRoot);
-				}
-			}
-
-			if (packageFragmentRootsAsList.isEmpty()) {
-				setSelection= false;
-				setEnabled= false;
-			} else {
-				if (buildpathChanged) {
-					setSelection= true;
-					setEnabled= true;
-				} else {
-					setSelection= !enabled ? true : selection;
-				}
-			}
-		} else {
-			setEnabled= false;
-			setSelection= false;
-		}
-		fCreateModuleInfoFileButton.setEnabled(setEnabled);
-		fCreateModuleInfoFileButton.setSelection(setSelection);
-	}
-
 	public void commitDefaultOutputFolder() {
 		if (!fBuildPathsBlock.isOKStatus())
 			return;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/JavaCapabilityConfigurationPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/JavaCapabilityConfigurationPage.java
index 788d768..31c14b1 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/JavaCapabilityConfigurationPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/JavaCapabilityConfigurationPage.java
@@ -87,8 +87,7 @@
         setDescription(NewWizardMessages.JavaCapabilityConfigurationPage_description);
 	}
 
-	/* not to be used externally*/
-    BuildPathsBlock getBuildPathsBlock() {
+	private BuildPathsBlock getBuildPathsBlock() {
         if (fBuildPathsBlock == null) {
             IStatusChangeListener listener= this::updateStatus;
             fBuildPathsBlock= new BuildPathsBlock(new BusyIndicatorRunnableContext(), listener, 0, useNewSourcePage(), null);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java
index 79149a2..0f877c2 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java
@@ -670,6 +670,7 @@
 			}
 			updateEnableState();
 			fDetectGroup.handlePossibleJVMChange();
+			fModuleGroup.handlePossibleJVMChange();
 			if (field == fJRECombo) {
 				if (fUseProjectJRE.isSelected()) {
 					storeSelectionValue(fJRECombo, LAST_SELECTED_JRE_SETTINGS_KEY);
@@ -800,6 +801,70 @@
 		}
 	}
 
+	private final class ModuleGroup implements IDialogFieldListener{
+
+		private final String LAST_SELECTED_CREATE_MODULEINFO_SETTINGS_KEY= JavaUI.ID_PLUGIN + ".last.selected.create.moduleinfo"; //$NON-NLS-1$
+		private final SelectionButtonDialogField fCreateModuleInfo;
+		private boolean savePreference;
+
+		public ModuleGroup() {
+			fCreateModuleInfo= new SelectionButtonDialogField(SWT.CHECK);
+			fCreateModuleInfo.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_Create_ModuleInfoFile_name);
+			fCreateModuleInfo.setDialogFieldListener(this);
+			fCreateModuleInfo.setEnabled(false);
+			savePreference= false;
+		}
+
+		public String getCompliance() {
+			String compilerCompliance= fJREGroup.getSelectedCompilerCompliance();
+			if (compilerCompliance == null) {
+				compilerCompliance= JavaModelUtil.getCompilerCompliance((IVMInstall2) JavaRuntime.getDefaultVMInstall(), JavaCore.VERSION_1_4);
+			}
+			return compilerCompliance;
+		}
+
+		public Control createControl(Composite composite) {
+			Group moduleGroup= new Group(composite, SWT.NONE);
+			moduleGroup.setFont(composite.getFont());
+			moduleGroup.setText(NewWizardMessages.NewJavaProjectWizardPageOne_Module_group);
+			moduleGroup.setLayout(new GridLayout(1, false));
+
+			fCreateModuleInfo.doFillIntoGrid(moduleGroup, 1);
+			return moduleGroup;
+		}
+
+		public void handlePossibleJVMChange() {
+			boolean enable= false;
+			boolean oldValEnabled= fCreateModuleInfo.isEnabled();
+			String compliance= getCompliance();
+			if (compliance != null && JavaModelUtil.is9OrHigher(compliance)) {
+				enable= true;
+			}
+			fCreateModuleInfo.setEnabled(enable);
+			savePreference= false;
+			if (!enable) {
+				fCreateModuleInfo.setSelection(false);
+			} else if(oldValEnabled != enable) {
+				String setting=JavaPlugin.getDefault().getDialogSettings().get(LAST_SELECTED_CREATE_MODULEINFO_SETTINGS_KEY);
+				fCreateModuleInfo.setSelection((setting == null) ? true : Boolean.parseBoolean(setting));
+			}
+			savePreference= true;
+		}
+
+		public boolean getCreateModuleInfoFile() {
+			return fCreateModuleInfo.isSelected();
+		}
+
+
+		@Override
+		public void dialogFieldChanged(DialogField field) {
+			// TODO Auto-generated method stub
+			if (field == fCreateModuleInfo && savePreference) {
+				JavaPlugin.getDefault().getDialogSettings().put(LAST_SELECTED_CREATE_MODULEINFO_SETTINGS_KEY, fCreateModuleInfo.isSelected());
+			}
+		}
+	}
+
 	/**
 	 * Show a warning when the project location contains files.
 	 */
@@ -1073,6 +1138,7 @@
 	private final DetectGroup fDetectGroup;
 	private final Validator fValidator;
 	private final WorkingSetGroup fWorkingSetGroup;
+	private final ModuleGroup fModuleGroup;
 
 	/**
 	 * Creates a new {@link NewJavaProjectWizardPageOne}.
@@ -1089,6 +1155,7 @@
 		fLayoutGroup= new LayoutGroup();
 		fWorkingSetGroup= new WorkingSetGroup();
 		fDetectGroup= new DetectGroup();
+		fModuleGroup= new ModuleGroup();
 
 		// establish connections
 		fNameGroup.addObserver(fLocationGroup);
@@ -1153,6 +1220,9 @@
 		Control workingSetControl= createWorkingSetControl(composite);
 		workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
+		Control moduleControl= createModuleControl(composite);
+		moduleControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
 		Control infoControl= createInfoControl(composite);
 		infoControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
@@ -1230,6 +1300,17 @@
 	}
 
 	/**
+	 * Creates the controls for the module section.
+	 *
+	 * @param composite the parent composite
+	 * @return the created control
+	 * @since 3.23
+	 */
+	protected Control createModuleControl(Composite composite) {
+		return fModuleGroup.createControl(composite);
+	}
+
+	/**
 	 * Gets a project name for the new project.
 	 *
 	 * @return the new project resource handle
@@ -1285,6 +1366,16 @@
 	}
 
 	/**
+	 * Returns if the module-info creation dialog needs to be shown or not.
+	 *
+	 * @return 'create module-info.java file' has been checked or not.
+	 * @since 3.23
+	 */
+	public boolean getCreateModuleInfoFile() {
+		return fModuleGroup.getCreateModuleInfoFile();
+	}
+
+	/**
 	 * Returns the default class path entries to be added on new projects. By default this is the JRE
 	 * container as selected by the user.
 	 *
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageTwo.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageTwo.java
index 4983e18..e16120e 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageTwo.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageTwo.java
@@ -61,12 +61,8 @@
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 import org.eclipse.jdt.internal.corext.util.Messages;
 
-import org.eclipse.jdt.launching.IVMInstall2;
-import org.eclipse.jdt.launching.JavaRuntime;
-
 import org.eclipse.jdt.ui.JavaUI;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
@@ -76,9 +72,6 @@
 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
 import org.eclipse.jdt.internal.ui.wizards.ClassPathDetector;
 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
-import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage;
-import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathsBlock;
-import org.eclipse.jdt.internal.ui.wizards.buildpaths.newsourcepage.NewSourceContainerWorkbookPage;
 
 /**
  * The second page of the New Java project wizard. It allows to configure the build path and output location.
@@ -147,13 +140,6 @@
 		if (isShownFirstTime) {
 			setFocus();
 		}
-		if (visible) {
-			String compilerCompliance= fFirstPage.getCompilerCompliance();
-			if (compilerCompliance == null) {
-				compilerCompliance= JavaModelUtil.getCompilerCompliance((IVMInstall2) JavaRuntime.getDefaultVMInstall(), JavaCore.VERSION_1_4);
-			}
-			setCompilerCompliance(compilerCompliance);
-		}
 	}
 
 
@@ -566,42 +552,14 @@
 		super.dispose();
 	}
 
-	private void setCompilerCompliance(String compilerCompliance) {
-		BuildPathsBlock buildPathsBlock= getBuildPathsBlock();
-		if (buildPathsBlock != null) {
-			BuildPathBasePage sourceContainerPage= buildPathsBlock.getSourceContainerPage();
-			if (sourceContainerPage instanceof NewSourceContainerWorkbookPage) {
-				((NewSourceContainerWorkbookPage) sourceContainerPage).setCompilerCompliance(compilerCompliance);
-			}
-		}
-	}
-
 	private void createJavaProjectModuleInfoFile() {
-		String compilerCompliance= fFirstPage.getCompilerCompliance();
-		if (compilerCompliance == null) {
-			compilerCompliance= JavaModelUtil.getCompilerCompliance((IVMInstall2) JavaRuntime.getDefaultVMInstall(), JavaCore.VERSION_1_4);
+		boolean createModuleInfoFile= fFirstPage.getCreateModuleInfoFile();
+		if (createModuleInfoFile) {
+			Display.getDefault().asyncExec(() -> {
+				CreateModuleInfoAction action= new CreateModuleInfoAction();
+				action.selectionChanged(null, new StructuredSelection(getJavaProject()));
+				action.run(null);
+			});
 		}
-		if (compilerCompliance!= null && JavaModelUtil.is9OrHigher(compilerCompliance)) {
-			boolean createModuleInfoFile= isCreateModuleInfoFile();
-			if (createModuleInfoFile) {
-				Display.getDefault().asyncExec(() -> {
-					CreateModuleInfoAction action= new CreateModuleInfoAction();
-					action.selectionChanged(null, new StructuredSelection(getJavaProject()));
-					action.run(null);
-				});
-
-			}
-		}
-	}
-
-	boolean isCreateModuleInfoFile() {
-		BuildPathsBlock buildPathsBlock= getBuildPathsBlock();
-		if (buildPathsBlock != null) {
-			BuildPathBasePage sourceContainerPage= buildPathsBlock.getSourceContainerPage();
-			if (sourceContainerPage instanceof NewSourceContainerWorkbookPage) {
-				return ((NewSourceContainerWorkbookPage) sourceContainerPage).isCreateModuleInfoFile();
-			}
-		}
-		return false;
 	}
 }