--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 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.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;
+
+
+/**
+ * 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;
+ public Map<String, String> fSettings;
+ public BulletListBlock fSelectedActionsText;
+ private Button fFormatCodeButton;
+ public Button fFormatChangedOnlyButton;
+ public Button fOrganizeImportsButton;
+ private Shell fShell;
+ public Link fFormatConfigLink;
+ public Link fOrganizeImportsConfigLink;
+ private IPreferencePageContainer fContainer;
+ public Button fAdditionalActionButton;
+ public Button fConfigureButton;
+ public 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= 20;
+ 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= 20;
+ 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= 20;
+ 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= (IProject)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();
+ fSelectedActionsText.generated_3604379449122961324(this, isFormatting);
+ }
+
+ public 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();
+ }
+}
\ No newline at end of file