/******************************************************************************* * Copyright (c) 2000, 2008 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.wst.jsdt.internal.ui.fix; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; 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.jface.preference.IPreferencePageContainer; 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.Control; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; import org.eclipse.wst.jsdt.core.IJavaScriptProject; import org.eclipse.wst.jsdt.core.JavaScriptCore; import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpConstants; import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpPostSaveListener; import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpPreferenceUtil; import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpRefactoring; import org.eclipse.wst.jsdt.internal.ui.javaeditor.saveparticipant.AbstractSaveParticipantPreferenceConfiguration; import org.eclipse.wst.jsdt.internal.ui.preferences.BulletListBlock; import org.eclipse.wst.jsdt.internal.ui.preferences.CodeFormatterPreferencePage; import org.eclipse.wst.jsdt.internal.ui.util.PixelConverter; import org.eclipse.wst.jsdt.ui.JavaScriptUI; /** * Preference configuration UI for the clean up save participant. * * */ public class CleanUpSaveParticipantPreferenceConfiguration extends AbstractSaveParticipantPreferenceConfiguration { private static final int INDENT= 10; private IScopeContext fContext; private Map fSettings; private BulletListBlock fSelectedActionsText; private Button fFormatCodeButton; // private Button fOrganizeImportsButton; private Shell fShell; private Link fFormatConfigLink; // private Link fOrganizeImportsConfigLink; private IPreferencePageContainer fContainer; private Button fAdditionalActionButton; private Button fConfigureButton; /** * {@inheritDoc} */ public Control createConfigControl(final Composite parent, IPreferencePageContainer container) { fContainer= container; fShell= parent.getShell(); final Composite composite= new Composite(parent, SWT.NONE); GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true); gridData.horizontalIndent= INDENT; composite.setLayoutData(gridData); GridLayout gridLayout= new GridLayout(1, false); gridLayout.marginHeight= 0; gridLayout.marginWidth= 0; composite.setLayout(gridLayout); fFormatCodeButton= new Button(composite, SWT.CHECK); fFormatCodeButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatSource_Checkbox); fFormatCodeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); fFormatCodeButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE, fFormatCodeButton.getSelection()); } }); PixelConverter pixelConverter= new PixelConverter(parent); int heightOneHalf= (int)Math.round(pixelConverter.convertHeightInCharsToPixels(1) * 1.5); fFormatConfigLink= new Link(composite, SWT.NONE); fFormatConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureFormatter_Link); GridData gridData2= new GridData(SWT.LEFT, SWT.TOP, false, true); gridData2.horizontalIndent= 20; gridData2.minimumHeight= heightOneHalf; fFormatConfigLink.setLayoutData(gridData2); // fOrganizeImportsButton= new Button(composite, SWT.CHECK); // fOrganizeImportsButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_OrganizeImports_Checkbox); // fOrganizeImportsButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // fOrganizeImportsButton.addSelectionListener(new SelectionAdapter() { // /** // * {@inheritDoc} // */ // public void widgetSelected(SelectionEvent e) { // changeSettingsValue(CleanUpConstants.ORGANIZE_IMPORTS, fOrganizeImportsButton.getSelection()); // } // }); // fOrganizeImportsConfigLink= new Link(composite, SWT.NONE); // fOrganizeImportsConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureImports_Link); // GridData gridData3= new GridData(SWT.LEFT, SWT.TOP, false, true); // gridData3.horizontalIndent= 20; // gridData3.minimumHeight= heightOneHalf; // fOrganizeImportsConfigLink.setLayoutData(gridData3); fAdditionalActionButton= new Button(composite, SWT.CHECK); fAdditionalActionButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_AdditionalActions_Checkbox); createAdvancedComposite(composite); fAdditionalActionButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { changeSettingsValue(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS, fAdditionalActionButton.getSelection()); } }); return composite; } 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(); final GridData data= (GridData)fSelectedActionsText.createControl(composite).getLayoutData(); data.heightHint= new PixelConverter(composite).convertHeightInCharsToPixels(8); 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} */ public void widgetSelected(SelectionEvent e) { new CleanUpSaveParticipantConfigurationModifyDialog(parent.getShell(), fSettings, SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpSaveParticipantConfiguration_Title).open(); settingsChanged(); } }); return composite; } /** * {@inheritDoc} */ public void initialize(final IScopeContext context, IAdaptable element) { fContext= context; fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(context); settingsChanged(); IJavaScriptProject javaProject= null; if (element != null) { IProject project= (IProject)element.getAdapter(IProject.class); if (project != null) { IJavaScriptProject jProject= JavaScriptCore.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} */ public void dispose() { super.dispose(); } /** * {@inheritDoc} */ public void performDefaults() { fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(new InstanceScope()); settingsChanged(); } /** * {@inheritDoc} */ public void performOk() { super.performOk(); if (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext)) CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings); } /** * {@inheritDoc} */ public void enableProjectSettings() { super.enableProjectSettings(); CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings); updateAdvancedEnableState(); } /** * {@inheritDoc} */ public void disableProjectSettings() { super.disableProjectSettings(); IEclipsePreferences node= fContext.getNode(JavaScriptUI.ID_PLUGIN); Map settings= CleanUpConstants.getSaveParticipantSettings(); for (Iterator iterator= settings.keySet().iterator(); iterator.hasNext();) { String key= (String)iterator.next(); node.remove(CleanUpPreferenceUtil.SAVE_PARTICIPANT_KEY_PREFIX + key); } updateAdvancedEnableState(); } /** * {@inheritDoc} */ protected String getPostSaveListenerId() { return CleanUpPostSaveListener.POSTSAVELISTENER_ID; } /** * {@inheritDoc} */ protected String getPostSaveListenerName() { return SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpActionsTopNodeName_Checkbox; } /** * {@inheritDoc} */ protected void enableConfigControl(boolean isEnabled) { super.enableConfigControl(isEnabled); updateAdvancedEnableState(); } private void settingsChanged() { fFormatCodeButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE))); // fOrganizeImportsButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.ORGANIZE_IMPORTS))); fAdditionalActionButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS))); updateAdvancedEnableState(); Map settings= new HashMap(fSettings); settings.put(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpConstants.FALSE); settings.put(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpConstants.FALSE); final ICleanUp[] cleanUps= CleanUpRefactoring.createCleanUps(settings); if (cleanUps.length == 0) { fSelectedActionsText.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_NoActionEnabled_Info); } else { StringBuffer buf= new StringBuffer(); boolean first= true; for (int i= 0; i < cleanUps.length; i++) { String[] descriptions= cleanUps[i].getDescriptions(); if (descriptions != null) { for (int j= 0; j < descriptions.length; j++) { if (first) { first= false; } else { buf.append('\n'); } buf.append(descriptions[j]); } } } fSelectedActionsText.setText(buf.toString()); } } private void updateAdvancedEnableState() { boolean additionalOptionEnabled= isEnabled(fContext) && CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS)); boolean additionalEnabled= additionalOptionEnabled && (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext)); fSelectedActionsText.setEnabled(additionalEnabled); fConfigureButton.setEnabled(additionalEnabled); } private void configurePreferenceLink(Link link, final IJavaScriptProject javaProject, final String preferenceId, final String propertyId) { link.addSelectionListener(new SelectionAdapter() { 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= CleanUpConstants.TRUE; } else { value= CleanUpConstants.FALSE; } fSettings.put(key, value); settingsChanged(); } }