blob: f27c0decd015ef6e34fc51e18d1dab6ef4d5c981 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* This is an implementation of an early-draft specification developed under the Java
* Community Process (JCP) and is made available for testing and evaluation purposes
* only. The code is not compatible with any specification of the JCP.
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.text.correction;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.progress.IProgressService;
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.ui.JavaElementLabels;
import org.eclipse.jdt.ui.text.java.IInvocationContext;
import org.eclipse.jdt.ui.text.java.IProblemLocation;
import org.eclipse.jdt.ui.text.java.correction.ChangeCorrectionProposal;
import org.eclipse.jdt.ui.text.java.correction.ICommandAccess;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
import org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog;
import org.eclipse.jdt.internal.ui.preferences.ComplianceConfigurationBlock;
import org.eclipse.jdt.internal.ui.preferences.CompliancePreferencePage;
import org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock;
import org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock.Key;
import org.eclipse.jdt.internal.ui.text.java.hover.JavaHoverMessages;
import org.eclipse.jdt.internal.ui.util.CoreUtility;
public class PreviewFeaturesSubProcessor {
private static final String CONFIGURE_COMPILER_PROBLEM_SEVERITY_DIALOG_ID= "configure_compiler_settings_dialog_id"; //$NON-NLS-1$
private static final String ENABLED= "enabled"; //$NON-NLS-1$
private static class EnablePreviewFeatureProposal extends ChangeCorrectionProposal implements IWorkspaceRunnable {
private final IJavaProject fJavaProject;
private IProject fProject;
private Job fUpdateJob;
private boolean fChangeOnWorkspace;
public EnablePreviewFeatureProposal(String name, IJavaProject project, boolean changeOnWorkspace, int relevance) {
super(name, null, relevance, JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE));
fJavaProject= project;
fUpdateJob= null;
fChangeOnWorkspace= changeOnWorkspace;
if (fJavaProject != null) {
fProject= fJavaProject.getProject();
}
}
@Override
public void run(IProgressMonitor monitor) throws CoreException {
fUpdateJob= CoreUtility.getBuildJob(fChangeOnWorkspace ? null : fProject.getProject());
}
@Override
public void apply(IDocument document) {
if (fJavaProject == null) {
return;
}
if (fChangeOnWorkspace) {
Hashtable<String, String> map= JavaCore.getOptions();
map.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
JavaCore.setOptions(map);
} else {
Map<String, String> map= fJavaProject.getOptions(false);
map.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
fJavaProject.setOptions(map);
}
try {
IProgressService progressService= PlatformUI.getWorkbench().getProgressService();
progressService.run(true, true, new WorkbenchRunnableAdapter(this));
} catch (InvocationTargetException e) {
JavaPlugin.log(e);
} catch (InterruptedException e) {
return;
}
if (fUpdateJob != null) {
fUpdateJob.schedule();
}
}
@Override
public String getAdditionalProposalInfo(IProgressMonitor monitor) {
if (fChangeOnWorkspace) {
return CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features_workspace_info;
}else {
return CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features_info;
}
}
}
public static void getOpenCompliancePageToEnablePreviewFeaturesProposal(IInvocationContext context, Collection<ICommandAccess> proposals) {
IJavaProject javaProject= context.getCompilationUnit().getJavaProject();
boolean hasProjectSpecificOptions= hasProjectSpecificOptions(javaProject);
String label= CorrectionMessages.PreviewFeaturesSubProcessor_open_compliance_page_enable_preview_features;
if (hasProjectSpecificOptions) {
label= CorrectionMessages.PreviewFeaturesSubProcessor_open_compliance_properties_page_enable_preview_features;
}
ChangeCorrectionProposal proposal= new ChangeCorrectionProposal(label, null, IProposalRelevance.ENABLE_PREVIEW_FEATURES,
JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE)) {
@Override
public void apply(IDocument document) {
Shell shell= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
boolean usePropertyPage;
if (!hasProjectSpecificOptions) {
String message= Messages.format(
JavaHoverMessages.ProblemHover_chooseCompilerSettingsTypeDialog_message,
new Object[] { JavaElementLabels.getElementLabel(javaProject, JavaElementLabels.ALL_DEFAULT) });
String[] buttons= new String[] {
JavaHoverMessages.ProblemHover_chooseSettingsTypeDialog_button_project,
JavaHoverMessages.ProblemHover_chooseSettingsTypeDialog_button_workspace,
IDialogConstants.CANCEL_LABEL };
int result= OptionalMessageDialog.open(
CONFIGURE_COMPILER_PROBLEM_SEVERITY_DIALOG_ID, shell, JavaHoverMessages.ProblemHover_chooseCompilerSettingsTypeDialog_title, null, message, MessageDialog.QUESTION, buttons,
0, JavaHoverMessages.ProblemHover_chooseSettingsTypeDialog_checkBox_dontShowAgain);
if (result == OptionalMessageDialog.NOT_SHOWN) {
usePropertyPage= false;
} else if (result == 2 || result == SWT.DEFAULT) {
return;
} else if (result == 0) {
usePropertyPage= true;
} else {
usePropertyPage= false;
}
} else {
usePropertyPage= true;
}
String pageId;
Map<String, Object> data= new HashMap<>();
if (usePropertyPage) {
pageId= CompliancePreferencePage.PROP_ID;
data.put(CompliancePreferencePage.USE_PROJECT_SPECIFIC_OPTIONS, Boolean.TRUE);
} else {
pageId= CompliancePreferencePage.PREF_ID;
}
if (usePropertyPage) {
PreferencesUtil.createPropertyDialogOn(shell, javaProject, pageId, null, data).open();
} else {
PreferencesUtil.createPreferenceDialogOn(shell, pageId, null, data).open();
}
}
@Override
public String getAdditionalProposalInfo(IProgressMonitor monitor) {
String additionalProposalInfo= CorrectionMessages.PreviewFeaturesSubProcessor_open_compliance_page_enable_preview_features_info;
if (hasProjectSpecificOptions) {
additionalProposalInfo= CorrectionMessages.PreviewFeaturesSubProcessor_open_compliance_properties_page_enable_preview_features_info;
}
return additionalProposalInfo;
}
};
proposals.add(proposal);
}
public static void getEnablePreviewFeaturesProposal(IInvocationContext context, Collection<ICommandAccess> proposals) {
IJavaProject javaProject= context.getCompilationUnit().getJavaProject();
if (javaProject != null) {
boolean changeOnWorkspace= !hasProjectSpecificOptions(javaProject);
String label= CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features;
if (changeOnWorkspace) {
label= CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features_workspace;
}
EnablePreviewFeatureProposal enableProposal= new EnablePreviewFeatureProposal(label, javaProject, changeOnWorkspace, IProposalRelevance.ENABLE_PREVIEW_FEATURES);
proposals.add(enableProposal);
}
}
public static void getNeedHigherComplianceProposals(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) {
String[] args= problem.getProblemArguments();
if (args != null && args.length > 0) {
String supportedVersion= JavaCore.VERSION_13;
String arg= args[1];
if (arg.equals(supportedVersion)) {
ReorgCorrectionsSubProcessor.getNeedHigherComplianceProposals(context, problem, proposals, true, supportedVersion);
}
}
}
public static boolean hasProjectSpecificOptions(IJavaProject javaProject) {
boolean hasProjectSpecificOptions= false;
if (javaProject != null) {
IProject project= javaProject.getProject();
Key[] keys= ComplianceConfigurationBlock.getKeys(true);
hasProjectSpecificOptions= OptionsConfigurationBlock.hasProjectSpecificOptions(project, keys, null);
}
return hasProjectSpecificOptions;
}
public static boolean isPreviewFeatureEnabled(IJavaProject javaProject) {
boolean isPreviewFeatureEnabled= false;
if (javaProject != null && JavaModelUtil.is13OrHigher(javaProject)) {
IProject project= javaProject.getProject();
Key[] keys= ComplianceConfigurationBlock.getKeys(true);
boolean hasProjectSpecificOptions= OptionsConfigurationBlock.hasProjectSpecificOptions(project, keys, null);
if (hasProjectSpecificOptions) {
String option= javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
if (option != null && option.equals(ENABLED)) {
isPreviewFeatureEnabled= true;
}
} else {
String option= JavaCore.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES);
if (option != null && option.equals(ENABLED)) {
isPreviewFeatureEnabled= true;
}
}
}
return isPreviewFeatureEnabled;
}
}