Bug 540119 - Show quickfixes for error "main-only project with test-only
dependency"

Change-Id: I731ae5433910d4d79c896b0735ea9b173d344cad
diff --git a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
index 941e468..08163ba 100644
--- a/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.debug.ui/META-INF/MANIFEST.MF
@@ -41,7 +41,7 @@
  org.eclipse.debug.ui;bundle-version="[3.13.100,4.0.0)",
  org.eclipse.jdt.debug;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.jdt.launching;bundle-version="[3.11.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.15.0,4.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.15.100,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.console;bundle-version="[3.4.0,4.0.0)",
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
index c141620..028cacc 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/launcher/JreResolutionGenerator.java
@@ -19,16 +19,25 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jdt.core.CorrectionEngine;
+import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jdt.core.IJavaModelStatusConstants;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.internal.debug.ui.jres.ExecutionEnvironmentsPreferencePage;
 import org.eclipse.jdt.internal.debug.ui.jres.JREsPreferencePage;
+import org.eclipse.jdt.internal.launching.JREContainerInitializer;
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
+import org.eclipse.jdt.internal.ui.text.java.hover.ConfigureProblemSeverityAction;
+import org.eclipse.jdt.internal.ui.text.java.hover.ConfigureProblemSeverityAction.PreferencePage;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IMarkerResolution2;
 import org.eclipse.ui.IMarkerResolutionGenerator2;
+import org.eclipse.ui.IMarkerResolutionRelevance;
 
 /**
  * Generates quick fixes for unbound JREs.
@@ -44,15 +53,32 @@
 	public IMarkerResolution[] getResolutions(IMarker marker) {
 		try {
 			if(JavaRuntime.JRE_CONTAINER_MARKER.equals(marker.getType())) {
-				return new IMarkerResolution[] {new OpenPreferencePageResolution(ExecutionEnvironmentsPreferencePage.ID,
-						new String[] {ExecutionEnvironmentsPreferencePage.ID, JREsPreferencePage.ID},
-						LauncherMessages.JreResolutionGenerator_open_ee_prefs,
-						LauncherMessages.JreResolutionGenerator_opens_ee_prefs)};
+				OpenPreferencePageResolution openPreferencePageResolution = new OpenPreferencePageResolution(ExecutionEnvironmentsPreferencePage.ID, new String[] {
+						ExecutionEnvironmentsPreferencePage.ID,
+						JREsPreferencePage.ID }, LauncherMessages.JreResolutionGenerator_open_ee_prefs, LauncherMessages.JreResolutionGenerator_opens_ee_prefs);
+				IJavaProject project = getJavaProject(marker);
+				IPath container = null;
+				for (IClasspathEntry entry : project.getRawClasspath()) {
+					if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
+						IPath path = entry.getPath();
+						if (JavaRuntime.JRE_CONTAINER.equals(path.segment(0))) {
+							container = path;
+						}
+					}
+				}
+				boolean noVM = container == null || JREContainerInitializer.resolveVM(container) == null;
+				if (noVM) {
+					return new IMarkerResolution[] { openPreferencePageResolution };
+				}
+				ConfigureSeverityResolution configureSeverityResolution = new ConfigureSeverityResolution(project, JavaRuntime.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE);
+				return new IMarkerResolution[] { openPreferencePageResolution, configureSeverityResolution };
 			} else if (JavaRuntime.JRE_COMPILER_COMPLIANCE_MARKER.equals(marker.getType())) {
 				IJavaProject project = getJavaProject(marker);
-				return new IMarkerResolution[] { new OpenPropertyPageResolution(project, JavaUI.ID_COMPILER_COMPLIANCE_PROPERTY_PAGE, new String[] {
+				OpenPropertyPageResolution openPropertyPageResolution = new OpenPropertyPageResolution(project, JavaUI.ID_COMPILER_COMPLIANCE_PROPERTY_PAGE, new String[] {
 						JavaUI.ID_COMPILER_COMPLIANCE_PROPERTY_PAGE,
-						JavaUI.ID_JAVA_BUILD_PREFERENCE_PROPERTY_PAGE }, LauncherMessages.JreResolutionGenerator_open_cc_props, LauncherMessages.JreResolutionGenerator_opens_cc_props) };
+						JavaUI.ID_JAVA_BUILD_PREFERENCE_PROPERTY_PAGE }, LauncherMessages.JreResolutionGenerator_open_cc_props, LauncherMessages.JreResolutionGenerator_opens_cc_props);
+				ConfigureSeverityResolution configureSeverityResolution = new ConfigureSeverityResolution(project, JavaRuntime.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE);
+				return new IMarkerResolution[] { openPropertyPageResolution, configureSeverityResolution };
 			}
 			int id = marker.getAttribute(IJavaModelMarker.ID, -1);
 			switch (id) {
@@ -123,4 +149,40 @@
 		} catch (CoreException ce) {}
 		return false;
 	}
+
+	private static class ConfigureSeverityResolution implements IMarkerResolution2, IMarkerResolutionRelevance {
+		private final IJavaProject fProject;
+		private String fOptionId;
+
+		public ConfigureSeverityResolution(IJavaProject project, String optionId) {
+			fProject = project;
+			fOptionId = optionId;
+		}
+
+		@Override
+		public String getDescription() {
+			return null;
+		}
+
+		@Override
+		public Image getImage() {
+			return JavaPluginImages.get(JavaPluginImages.IMG_CONFIGURE_PROBLEM_SEVERITIES);
+		}
+
+		@Override
+		public String getLabel() {
+			return CorrectionMessages.ConfigureProblemSeveritySubProcessor_name;
+		}
+
+		@Override
+		public int getRelevanceForResolution() {
+			return -1;
+		}
+
+		@Override
+		public void run(IMarker marker) {
+			ConfigureProblemSeverityAction problemSeverityAction = new ConfigureProblemSeverityAction(fProject, fOptionId, JavaRuntime.ID_PLUGIN, PreferencePage.BUILDING, null);
+			problemSeverityAction.run();
+		}
+	}
 }