blob: 66afb87b9c7e91aafa911adc39190933a23babfd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.fix;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.jface.dialogs.ControlEnableState;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
import org.eclipse.jdt.internal.corext.fix.CleanUpPostSaveListener;
import org.eclipse.jdt.internal.corext.fix.CleanUpPreferenceUtil;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
import org.eclipse.jdt.ui.cleanup.ICleanUp;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.javaeditor.saveparticipant.AbstractSaveParticipantPreferenceConfiguration;
import org.eclipse.jdt.internal.ui.preferences.BulletListBlock;
import org.eclipse.jdt.internal.ui.preferences.CodeFormatterPreferencePage;
import org.eclipse.jdt.internal.ui.preferences.ImportOrganizePreferencePage;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
/**
* Preference configuration UI for the clean up save participant.
*
* @since 3.3
*/
public class CleanUpSaveParticipantPreferenceConfiguration extends AbstractSaveParticipantPreferenceConfiguration {
private static final int INDENT= 10;
private IScopeContext fContext;
private Map<String, String> fSettings;
private BulletListBlock fSelectedActionsText;
private Button fFormatCodeButton;
private Button fFormatChangedOnlyButton;
private Button fOrganizeImportsButton;
private Shell fShell;
private Link fFormatConfigLink;
private Link fOrganizeImportsConfigLink;
private IPreferencePageContainer fContainer;
private Button fAdditionalActionButton;
private Button fConfigureButton;
private Button fFormatAllButton;
private Composite fCleanUpOptionsComposite;
private ControlEnableState fControlEnableState;
/**
* {@inheritDoc}
*/
@Override
public void createConfigControl(final Composite parent, IPreferencePageContainer container) {
fContainer= container;
fShell= parent.getShell();
fCleanUpOptionsComposite= new Composite(parent, SWT.NONE);
GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.horizontalIndent= INDENT;
fCleanUpOptionsComposite.setLayoutData(gridData);
GridLayout gridLayout= new GridLayout(1, false);
gridLayout.marginHeight= 0;
gridLayout.marginWidth= 0;
fCleanUpOptionsComposite.setLayout(gridLayout);
fFormatCodeButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
fFormatCodeButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatSource_Checkbox);
fFormatCodeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
fFormatCodeButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE, fFormatCodeButton.getSelection());
}
});
Composite regionFormatingCombo= new Composite(fCleanUpOptionsComposite, SWT.NONE);
gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
gridData.horizontalIndent= LayoutUtil.getIndent();
regionFormatingCombo.setLayoutData(gridData);
gridLayout= new GridLayout(1, false);
gridLayout.marginHeight= 0;
gridLayout.marginWidth= 0;
regionFormatingCombo.setLayout(gridLayout);
fFormatAllButton= new Button(regionFormatingCombo, SWT.RADIO);
fFormatAllButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePAge_FormatAllLines_Radio);
gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
fFormatAllButton.setLayoutData(gridData);
fFormatAllButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, !fFormatAllButton.getSelection());
}
});
fFormatChangedOnlyButton= new Button(regionFormatingCombo, SWT.RADIO);
fFormatChangedOnlyButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatOnlyChangedRegions_Radio);
gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
fFormatChangedOnlyButton.setLayoutData(gridData);
fFormatChangedOnlyButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, fFormatChangedOnlyButton.getSelection());
}
});
PixelConverter pixelConverter= new PixelConverter(parent);
int heightOneHalf= (int)Math.round(pixelConverter.convertHeightInCharsToPixels(1) * 1.5);
fFormatConfigLink= new Link(fCleanUpOptionsComposite, SWT.NONE);
fFormatConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureFormatter_Link);
GridData gridData2= new GridData(SWT.LEFT, SWT.TOP, false, false);
gridData2.horizontalIndent= LayoutUtil.getIndent();
gridData2.minimumHeight= heightOneHalf;
fFormatConfigLink.setLayoutData(gridData2);
fOrganizeImportsButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
fOrganizeImportsButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_OrganizeImports_Checkbox);
fOrganizeImportsButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
fOrganizeImportsButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
changeSettingsValue(CleanUpConstants.ORGANIZE_IMPORTS, fOrganizeImportsButton.getSelection());
}
});
fOrganizeImportsConfigLink= new Link(fCleanUpOptionsComposite, SWT.NONE);
fOrganizeImportsConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureImports_Link);
GridData gridData3= new GridData(SWT.LEFT, SWT.TOP, false, false);
gridData3.horizontalIndent= LayoutUtil.getIndent();
gridData3.minimumHeight= heightOneHalf;
fOrganizeImportsConfigLink.setLayoutData(gridData3);
fAdditionalActionButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
fAdditionalActionButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_AdditionalActions_Checkbox);
createAdvancedComposite(fCleanUpOptionsComposite);
fAdditionalActionButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
changeSettingsValue(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS, fAdditionalActionButton.getSelection());
}
});
}
private Composite createAdvancedComposite(final Composite parent) {
Composite composite= new Composite(parent, SWT.NONE);
GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.horizontalIndent= INDENT;
composite.setLayoutData(gridData);
GridLayout layout= new GridLayout(2, false);
layout.marginHeight= 0;
layout.marginWidth= 0;
composite.setLayout(layout);
fSelectedActionsText= new BulletListBlock(composite, SWT.NONE);
gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.heightHint= new PixelConverter(composite).convertHeightInCharsToPixels(8);
fSelectedActionsText.setLayoutData(gridData);
fConfigureButton= new Button(composite, SWT.NONE);
fConfigureButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_Configure_Button);
fConfigureButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
fConfigureButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
Hashtable<String, String> workingValues= new Hashtable<String, String>(fSettings);
SaveActionSelectionDialog dialog= new SaveActionSelectionDialog(parent.getShell(), workingValues);
if (dialog.open() == Window.OK) {
fSettings= workingValues;
settingsChanged();
}
}
});
return composite;
}
/**
* {@inheritDoc}
*/
@Override
public void initialize(final IScopeContext context, IAdaptable element) {
fContext= context;
fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(context);
settingsChanged();
IJavaProject javaProject= null;
if (element != null) {
IProject project= element.getAdapter(IProject.class);
if (project != null) {
IJavaProject jProject= JavaCore.create(project);
if (jProject != null && jProject.exists()) {
javaProject= jProject;
}
}
}
configurePreferenceLink(fFormatConfigLink, javaProject, CodeFormatterPreferencePage.PREF_ID, CodeFormatterPreferencePage.PROP_ID);
configurePreferenceLink(fOrganizeImportsConfigLink, javaProject, ImportOrganizePreferencePage.PREF_ID, ImportOrganizePreferencePage.PROP_ID);
super.initialize(context, element);
}
/**
* {@inheritDoc}
*/
@Override
public void performDefaults() {
if (ProjectScope.SCOPE.equals(fContext.getName()) && !hasSettingsInScope(fContext))
return;
enabled(true);
if (ProjectScope.SCOPE.equals(fContext.getName())) {
fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(InstanceScope.INSTANCE);
} else {
fSettings= JavaPlugin.getDefault().getCleanUpRegistry().getDefaultOptions(CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS).getMap();
}
settingsChanged();
super.performDefaults();
}
/**
* {@inheritDoc}
*/
@Override
public void performOk() {
super.performOk();
if (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext))
CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
}
/**
* {@inheritDoc}
*/
@Override
public void enableProjectSettings() {
super.enableProjectSettings();
CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
}
/**
* {@inheritDoc}
*/
@Override
public void disableProjectSettings() {
super.disableProjectSettings();
IEclipsePreferences node= fContext.getNode(JavaUI.ID_PLUGIN);
Set<String> keys= JavaPlugin.getDefault().getCleanUpRegistry().getDefaultOptions(CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS).getKeys();
for (Iterator<String> iterator= keys.iterator(); iterator.hasNext();) {
String key= iterator.next();
node.remove(CleanUpPreferenceUtil.SAVE_PARTICIPANT_KEY_PREFIX + key);
}
}
/**
* {@inheritDoc}
*/
@Override
protected String getPostSaveListenerId() {
return CleanUpPostSaveListener.POSTSAVELISTENER_ID;
}
/**
* {@inheritDoc}
*/
@Override
protected String getPostSaveListenerName() {
return SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpActionsTopNodeName_Checkbox;
}
/**
* {@inheritDoc}
*/
@Override
protected void enabled(boolean isEnabled) {
if (isEnabled) {
if (fControlEnableState == null)
return;
fControlEnableState.restore();
fControlEnableState= null;
} else {
if (fControlEnableState != null)
return;
fControlEnableState= ControlEnableState.disable(fCleanUpOptionsComposite);
}
}
private void settingsChanged() {
fFormatCodeButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE)));
boolean isFormatting= fFormatCodeButton.getSelection();
fFormatChangedOnlyButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY)));
fFormatAllButton.setSelection(CleanUpOptions.FALSE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY)));
fFormatChangedOnlyButton.setEnabled(isFormatting);
fFormatAllButton.setEnabled(isFormatting);
fFormatConfigLink.setEnabled(isFormatting);
fOrganizeImportsButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.ORGANIZE_IMPORTS)));
fOrganizeImportsConfigLink.setEnabled(fOrganizeImportsButton.getSelection());
fAdditionalActionButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS)));
boolean additionalEnabled= CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS));
fSelectedActionsText.setEnabled(additionalEnabled);
fConfigureButton.setEnabled(additionalEnabled);
Map<String, String> settings= new HashMap<String, String>(fSettings);
settings.put(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpOptions.FALSE);
settings.put(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpOptions.FALSE);
CleanUpOptions options= new MapCleanUpOptions(settings);
fSelectedActionsText.setText(getSelectedCleanUpsText(options));
}
private String getSelectedCleanUpsText(CleanUpOptions options) {
StringBuffer buf= new StringBuffer();
final ICleanUp[] cleanUps= JavaPlugin.getDefault().getCleanUpRegistry().createCleanUps();
for (int i= 0; i < cleanUps.length; i++) {
cleanUps[i].setOptions(options);
String[] descriptions= cleanUps[i].getStepDescriptions();
if (descriptions != null) {
for (int j= 0; j < descriptions.length; j++) {
if (buf.length() > 0) {
buf.append('\n');
}
buf.append(descriptions[j]);
}
}
}
String string= buf.toString();
return string;
}
private void configurePreferenceLink(Link link, final IJavaProject javaProject, final String preferenceId, final String propertyId) {
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fContainer instanceof IWorkbenchPreferenceContainer) {
IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer)fContainer;
if (javaProject != null) {
container.openPage(propertyId, null);
} else {
container.openPage(preferenceId, null);
}
} else {
PreferencesUtil.createPreferenceDialogOn(fShell, preferenceId, null, null);
}
}
});
}
private void changeSettingsValue(String key, boolean enabled) {
String value;
if (enabled) {
value= CleanUpOptions.TRUE;
} else {
value= CleanUpOptions.FALSE;
}
fSettings.put(key, value);
settingsChanged();
}
}