Bug 578603 - [Designer, Java] JDT project creation should disable module_info generation

- Avoid redundant code project creation (separate function for maven)
- Disable generation of module-info.java
- Use a dialog to propose changing the project layout, if it is not configured for
	separate source folders

Change-Id: I651bae7657c9a5af39f4cfa01869182f17a45471
Signed-off-by: Ansgar Radermacher <ansgar.radermacher@cea.fr>
diff --git a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaNamedProjectWizard.java b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaNamedProjectWizard.java
index 0babda7..a4254a8 100644
--- a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaNamedProjectWizard.java
+++ b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaNamedProjectWizard.java
@@ -14,4 +14,9 @@
 	public JavaNamedProjectWizard(String projectName) {
 		this.setProjectName(projectName);
 	}
+	
+	public void checkDialogSettings() {
+		Object tst = getDialogSettings();
+		System.err.println(tst);
+	}
 }
diff --git a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaProjectSupport.java b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaProjectSupport.java
index 66c66b8..002a779 100644
--- a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaProjectSupport.java
+++ b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/JavaProjectSupport.java
@@ -11,9 +11,15 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jdt.ui.actions.OpenNewJavaProjectWizardAction;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.wizards.JavaProjectWizard;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.PreferenceConstants;
 import org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageOne;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizard;
 import org.eclipse.papyrus.designer.languages.common.extensionpoints.AbstractSettings;
@@ -36,11 +42,19 @@
 	private MavenProject mavenProjectDetails;
 
 	/**
+	 * Key managed by JavaUI, indicates whether module info should be generated
+	 * Code may break, if String of key changes.
+	 */
+	protected String LAST_MODULE_NFO = JavaUI.ID_PLUGIN + ".last.selected.create.moduleinfo"; //$NON-NLS-1$
+
+	/**
 	 * Create a Java project. Caller should test before calling, whether the
-	 * project exists already
+	 * project exists already. The project disables the option to generate module-info.
+	 * The code proposes to change the JDT preference SRCBIN_FOLDERS_IN_NEWPROJ, if it is configured to
+	 * use project folders.
 	 *
 	 * @param projectName
-	 * @return the created project
+	 * @return the created project or null (in case of Cancel)
 	 */
 	@Override
 	public IProject createProject(String projectName) {
@@ -49,19 +63,33 @@
 		IProject project = root.getProject(projectName);
 		dialogStatus = 0;
 		try {
-			// create JDT wizard for Java
-			final NewJavaProjectWizardPageOne wiz = new JavaNamedProjectWizard(projectName);
-
-			// wiz.setWindowTitle("create project " + projectName);
-			// //$NON-NLS-1$
-			// wiz.init(wb, null);
-
+			// assure that we are running an UI thread
 			Display.getDefault().syncExec(new Runnable() {
 				@Override
 				public void run() {
-					OpenNewJavaProjectWizardAction wizDiag = new OpenNewJavaProjectWizardAction();
-					wizDiag.setConfiguredWizardPages(wiz, null);
-					wizDiag.run();
+					boolean useSrcBin = PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ);
+					if (!useSrcBin) {
+						boolean changePrefs = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Java preference", //$NON-NLS-1$
+								Messages.JavaProjectSupport_PREF_WARN);
+						if (changePrefs) {
+							PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ, true);
+						}
+					}
+
+					final JavaProjectWizard wiz = new JavaProjectWizard();
+					wiz.init(PlatformUI.getWorkbench(), null);
+
+					WizardDialog wizDiag = new WizardDialog(Display.getCurrent().getActiveShell(), wiz);
+					wizDiag.create();
+					// disable module_info generation
+					IDialogSettings ds = JavaPlugin.getDefault().getDialogSettings();
+					ds.put(LAST_MODULE_NFO, false);
+
+					final IWizardPage page = wiz.getPages()[0];
+					if (page instanceof NewJavaProjectWizardPageOne) {
+						((NewJavaProjectWizardPageOne) page).setProjectName(projectName);
+					}
+					dialogStatus = wizDiag.open();
 				}
 			});
 		} catch (Exception e) {
@@ -74,55 +102,51 @@
 		}
 		if ((project == null) || !project.exists()) {
 			throw new RuntimeException(
-					"Could not create JDT project. This might indicate that there is a problem with your JDT installation."); //$NON-NLS-1$
+					Messages.JavaProjectSupport_COULD_NOT_CREATE);
 		}
 		return project;
 	}
 
 	@Override
 	public IProject createProject(String projectName, Package modelRoot) {
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IProject project = root.getProject(projectName);
 		mavenProjectDetails = UMLUtil.getStereotypeApplication(modelRoot, MavenProject.class);
-		try {
-			if (mavenProjectDetails == null) {
-				// create JDT wizard for Java
-				final NewJavaProjectWizardPageOne wiz = new JavaNamedProjectWizard(projectName);
-				Display.getDefault().syncExec(new Runnable() {
-					@Override
-					public void run() {
-						OpenNewJavaProjectWizardAction wizDiag = new OpenNewJavaProjectWizardAction();
-						wizDiag.setConfiguredWizardPages(wiz, null);
-						wizDiag.run();
-					}
-				});
-			} else {
-				// Create Maven wizard
-				final MavenProjectWizard mavenWiz = new MavenProjectWizard();
-				mavenWiz.setWindowTitle(projectName);
-				Display.getDefault().syncExec(new Runnable() {
-					@Override
-					public void run() {
-						IWorkbench wb = PlatformUI.getWorkbench();
-						mavenWiz.init(wb, new StructuredSelection());
-						Shell shell = wb.getActiveWorkbenchWindow().getShell();
-						WizardDialog dialog = new WizardDialog(shell, mavenWiz);
-						dialog.create();
-						dialog.open();
-					}
-				});
-			}
+		if (mavenProjectDetails == null) {
+			return createProject(projectName);
+		} else {
+			return createMavenProject(projectName);
+		}
+	}
 
+	/**
+	 * Create a Maven instead of JDT project
+	 * TODO: untested
+	 * 
+	 * @param projectName
+	 *            the project name
+	 * @return the created project or null
+	 */
+	protected IProject createMavenProject(String projectName) {
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		try {
+			// Create Maven wizard
+			final MavenProjectWizard mavenWiz = new MavenProjectWizard();
+			mavenWiz.setWindowTitle(projectName);
+			Display.getDefault().syncExec(new Runnable() {
+				@Override
+				public void run() {
+					IWorkbench wb = PlatformUI.getWorkbench();
+					mavenWiz.init(wb, new StructuredSelection());
+					Shell shell = wb.getActiveWorkbenchWindow().getShell();
+					WizardDialog dialog = new WizardDialog(shell, mavenWiz);
+					dialog.create();
+					dialog.open();
+				}
+			});
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		project = root.getProject(projectName);
-		
-		/*
-		 * if ((project == null) || !project.exists()) { throw new
-		 * RuntimeException("Could not create JDT project. This might indicate that there is a problem with your JDT installation."
-		 * ); //$NON-NLS-1$ }
-		 */
+		IProject project = root.getProject(projectName);
+
 		return project;
 	}
 
@@ -130,7 +154,7 @@
 	public void setSettings(IProject project, AbstractSettings settings) {
 		if (project != null && mavenProjectDetails != null) {
 			CustomizePOMFile customizePOMFile = new CustomizePOMFile(project, mavenProjectDetails);
-			customizePOMFile.execute();	
+			customizePOMFile.execute();
 		}
 	}
 
diff --git a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/Messages.java b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/Messages.java
new file mode 100644
index 0000000..ce6f711
--- /dev/null
+++ b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/Messages.java
@@ -0,0 +1,16 @@
+package org.eclipse.papyrus.designer.languages.java.jdt.project;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = Messages.class.getPackageName() + ".messages"; //$NON-NLS-1$
+	public static String JavaProjectSupport_COULD_NOT_CREATE;
+	public static String JavaProjectSupport_PREF_WARN;
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+}
diff --git a/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/messages.properties b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/messages.properties
new file mode 100644
index 0000000..2065930
--- /dev/null
+++ b/plugins/languages/java/org.eclipse.papyrus.designer.languages.java.jdt.project/src/org/eclipse/papyrus/designer/languages/java/jdt/project/messages.properties
@@ -0,0 +1,2 @@
+JavaProjectSupport_COULD_NOT_CREATE=Could not create JDT project. This might indicate that there is a problem with your JDT installation.
+JavaProjectSupport_PREF_WARN=Your current preferences do not use separate source folders. This is not supported by the code generator. Do you want to change this preference?