package org.codehaus.groovy.eclipse.actions; import java.util.ArrayList; import java.util.List; import org.codehaus.groovy.eclipse.GroovyPlugin; import org.codehaus.groovy.eclipse.core.GroovyCore; import org.codehaus.groovy.eclipse.core.compiler.CompilerUtils; import org.codehaus.groovy.eclipse.preferences.CompilerPreferencesPage; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolution2; import org.eclipse.ui.IMarkerResolutionGenerator; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.views.markers.WorkbenchMarkerResolution; public class CompilerMismatchMarkerResolutionGenerator implements IMarkerResolutionGenerator { private static final IMarkerResolution[] NO_RESOLUTIONS = new IMarkerResolution[0]; private static abstract class AbstractCompilerConfigurator extends WorkbenchMarkerResolution implements IMarkerResolution2 { private final IMarker thisMarker; public AbstractCompilerConfigurator(IMarker thisMarker) { this.thisMarker = thisMarker; } @Override public IMarker[] findOtherMarkers(IMarker[] markers) { List<IMarker> markerList = new ArrayList<IMarker>(markers.length); for (IMarker marker : markers) { try { if (marker != thisMarker && marker.getType().equals(GroovyPlugin.COMPILER_MISMATCH_MARKER)) { markerList.add(marker); } } catch (CoreException e) { GroovyCore.logException("Error accessing marker", e); } } return markerList.toArray(new IMarker[0]); } } private static class ConfigureCompilerLevelResolution extends AbstractCompilerConfigurator { ConfigureCompilerLevelResolution(IMarker thisMarker) { super(thisMarker); } public String getLabel() { return "2. Configure Groovy compiler level for project"; } public void run(IMarker marker) { IProject project = marker.getResource().getProject(); PreferenceDialog propertyDialog = PreferencesUtil.createPropertyDialogOn(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), project, CompilerPreferencesPage.PROPERTY_ID, new String[] { CompilerPreferencesPage.PROPERTY_ID }, null); propertyDialog.open(); } public String getDescription() { return "Opens the Groovy Compiler preferences for the project so that the compiler level can be changed."; } public Image getImage() { return JavaPluginImages.DESC_ELCL_CONFIGURE_BUILDPATH.createImage(); } } private static class ConfigureWorksaceCompilerLevelResolution extends AbstractCompilerConfigurator { public ConfigureWorksaceCompilerLevelResolution(IMarker thisMarker) { super(thisMarker); } public String getLabel() { return "3. Configure the Groovy compiler level for the entire workspace"; } public void run(IMarker marker) { PreferenceDialog preferenceDialog = PreferencesUtil.createPreferenceDialogOn(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), CompilerPreferencesPage.PREFERENCES_ID, new String[] { CompilerPreferencesPage.PREFERENCES_ID }, null); preferenceDialog.open(); } public String getDescription() { return "Opens the Groovy Compiler preferences for the workspace preferences. From here, you can choose the Groovy compiler level for the workspace (restart required)."; } public Image getImage() { return JavaPluginImages.DESC_ELCL_CONFIGURE_BUILDPATH.createImage(); } } private static class SetToWorkspaceCompilerLevelResolution extends AbstractCompilerConfigurator { public SetToWorkspaceCompilerLevelResolution(IMarker thisMarker) { super(thisMarker); } public String getLabel() { return "1. Set the Groovy compiler level for project to match the workspace level"; } public void run(IMarker marker) { IProject project = marker.getResource().getProject(); CompilerUtils.setCompilerLevel(project, CompilerUtils.getActiveGroovyVersion(), true); } public String getDescription() { return "Forces the workspace Groovy compiler level onto this project."; } public Image getImage() { return JavaPluginImages.DESC_ELCL_CONFIGURE_BUILDPATH.createImage(); } } public IMarkerResolution[] getResolutions(IMarker marker) { if (marker.getResource().getType() == IResource.PROJECT) { return new IMarkerResolution[] { new ConfigureCompilerLevelResolution(marker), new SetToWorkspaceCompilerLevelResolution(marker), new ConfigureWorksaceCompilerLevelResolution(marker) }; } return NO_RESOLUTIONS; } }