1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.fix;
13 import java.util.HashMap;
14 import java.util.Hashtable;
15 import java.util.Iterator;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.events.SelectionAdapter;
21 import org.eclipse.swt.events.SelectionEvent;
22 import org.eclipse.swt.layout.GridData;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.widgets.Button;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Link;
27 import org.eclipse.swt.widgets.Shell;
29 import org.eclipse.core.runtime.IAdaptable;
30 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
31 import org.eclipse.core.runtime.preferences.IScopeContext;
32 import org.eclipse.core.runtime.preferences.InstanceScope;
34 import org.eclipse.core.resources.IProject;
35 import org.eclipse.core.resources.ProjectScope;
37 import org.eclipse.jface.dialogs.ControlEnableState;
38 import org.eclipse.jface.layout.PixelConverter;
39 import org.eclipse.jface.preference.IPreferencePageContainer;
40 import org.eclipse.jface.window.Window;
42 import org.eclipse.ui.dialogs.PreferencesUtil;
43 import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
45 import org.eclipse.jdt.core.IJavaProject;
46 import org.eclipse.jdt.core.JavaCore;
48 import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
49 import org.eclipse.jdt.internal.corext.fix.CleanUpPostSaveListener;
50 import org.eclipse.jdt.internal.corext.fix.CleanUpPreferenceUtil;
52 import org.eclipse.jdt.ui.JavaUI;
53 import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
54 import org.eclipse.jdt.ui.cleanup.ICleanUp;
56 import org.eclipse.jdt.internal.ui.JavaPlugin;
57 import org.eclipse.jdt.internal.ui.javaeditor.saveparticipant.AbstractSaveParticipantPreferenceConfiguration;
58 import org.eclipse.jdt.internal.ui.preferences.BulletListBlock;
59 import org.eclipse.jdt.internal.ui.preferences.CodeFormatterPreferencePage;
60 import org.eclipse.jdt.internal.ui.preferences.ImportOrganizePreferencePage;
64 * Preference configuration UI for the clean up save participant.
68 public class CleanUpSaveParticipantPreferenceConfiguration extends AbstractSaveParticipantPreferenceConfiguration {
70 private static final int INDENT= 10;
72 private IScopeContext fContext;
73 private Map<String, String> fSettings;
74 private BulletListBlock fSelectedActionsText;
75 private Button fFormatCodeButton;
76 private Button fFormatChangedOnlyButton;
77 private Button fOrganizeImportsButton;
79 private Link fFormatConfigLink;
80 private Link fOrganizeImportsConfigLink;
81 private IPreferencePageContainer fContainer;
82 private Button fAdditionalActionButton;
83 private Button fConfigureButton;
84 private Button fFormatAllButton;
86 private Composite fCleanUpOptionsComposite;
87 private ControlEnableState fControlEnableState;
93 public void createConfigControl(final Composite parent, IPreferencePageContainer container) {
94 fContainer= container;
95 fShell= parent.getShell();
97 fCleanUpOptionsComposite= new Composite(parent, SWT.NONE);
98 GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
99 gridData.horizontalIndent= INDENT;
100 fCleanUpOptionsComposite.setLayoutData(gridData);
101 GridLayout gridLayout= new GridLayout(1, false);
102 gridLayout.marginHeight= 0;
103 gridLayout.marginWidth= 0;
104 fCleanUpOptionsComposite.setLayout(gridLayout);
106 fFormatCodeButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
107 fFormatCodeButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatSource_Checkbox);
108 fFormatCodeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
109 fFormatCodeButton.addSelectionListener(new SelectionAdapter() {
114 public void widgetSelected(SelectionEvent e) {
115 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE, fFormatCodeButton.getSelection());
119 Composite regionFormatingCombo= new Composite(fCleanUpOptionsComposite, SWT.NONE);
120 gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
121 gridData.horizontalIndent= 20;
122 regionFormatingCombo.setLayoutData(gridData);
123 gridLayout= new GridLayout(1, false);
124 gridLayout.marginHeight= 0;
125 gridLayout.marginWidth= 0;
126 regionFormatingCombo.setLayout(gridLayout);
128 fFormatAllButton= new Button(regionFormatingCombo, SWT.RADIO);
129 fFormatAllButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePAge_FormatAllLines_Radio);
130 gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
131 fFormatAllButton.setLayoutData(gridData);
132 fFormatAllButton.addSelectionListener(new SelectionAdapter() {
137 public void widgetSelected(SelectionEvent e) {
138 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, !fFormatAllButton.getSelection());
142 fFormatChangedOnlyButton= new Button(regionFormatingCombo, SWT.RADIO);
143 fFormatChangedOnlyButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatOnlyChangedRegions_Radio);
144 gridData= new GridData(SWT.FILL, SWT.TOP, true, false);
145 fFormatChangedOnlyButton.setLayoutData(gridData);
146 fFormatChangedOnlyButton.addSelectionListener(new SelectionAdapter() {
151 public void widgetSelected(SelectionEvent e) {
152 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, fFormatChangedOnlyButton.getSelection());
156 PixelConverter pixelConverter= new PixelConverter(parent);
157 int heightOneHalf= (int)Math.round(pixelConverter.convertHeightInCharsToPixels(1) * 1.5);
159 fFormatConfigLink= new Link(fCleanUpOptionsComposite, SWT.NONE);
160 fFormatConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureFormatter_Link);
161 GridData gridData2= new GridData(SWT.LEFT, SWT.TOP, false, false);
162 gridData2.horizontalIndent= 20;
163 gridData2.minimumHeight= heightOneHalf;
164 fFormatConfigLink.setLayoutData(gridData2);
166 fOrganizeImportsButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
167 fOrganizeImportsButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_OrganizeImports_Checkbox);
168 fOrganizeImportsButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
169 fOrganizeImportsButton.addSelectionListener(new SelectionAdapter() {
174 public void widgetSelected(SelectionEvent e) {
175 changeSettingsValue(CleanUpConstants.ORGANIZE_IMPORTS, fOrganizeImportsButton.getSelection());
179 fOrganizeImportsConfigLink= new Link(fCleanUpOptionsComposite, SWT.NONE);
180 fOrganizeImportsConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureImports_Link);
181 GridData gridData3= new GridData(SWT.LEFT, SWT.TOP, false, false);
182 gridData3.horizontalIndent= 20;
183 gridData3.minimumHeight= heightOneHalf;
184 fOrganizeImportsConfigLink.setLayoutData(gridData3);
186 fAdditionalActionButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
187 fAdditionalActionButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_AdditionalActions_Checkbox);
189 createAdvancedComposite(fCleanUpOptionsComposite);
190 fAdditionalActionButton.addSelectionListener(new SelectionAdapter() {
195 public void widgetSelected(SelectionEvent e) {
196 changeSettingsValue(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS, fAdditionalActionButton.getSelection());
201 private Composite createAdvancedComposite(final Composite parent) {
202 Composite composite= new Composite(parent, SWT.NONE);
203 GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
204 gridData.horizontalIndent= INDENT;
205 composite.setLayoutData(gridData);
206 GridLayout layout= new GridLayout(2, false);
207 layout.marginHeight= 0;
208 layout.marginWidth= 0;
209 composite.setLayout(layout);
211 fSelectedActionsText= new BulletListBlock(composite, SWT.NONE);
212 gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
213 gridData.heightHint= new PixelConverter(composite).convertHeightInCharsToPixels(8);
214 fSelectedActionsText.setLayoutData(gridData);
216 fConfigureButton= new Button(composite, SWT.NONE);
217 fConfigureButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_Configure_Button);
218 fConfigureButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
219 fConfigureButton.addSelectionListener(new SelectionAdapter() {
224 public void widgetSelected(SelectionEvent e) {
225 Hashtable<String, String> workingValues= new Hashtable<String, String>(fSettings);
226 SaveActionSelectionDialog dialog= new SaveActionSelectionDialog(parent.getShell(), workingValues);
227 if (dialog.open() == Window.OK) {
228 fSettings= workingValues;
242 public void initialize(final IScopeContext context, IAdaptable element) {
244 fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(context);
248 IJavaProject javaProject= null;
249 if (element != null) {
250 IProject project= (IProject)element.getAdapter(IProject.class);
251 if (project != null) {
252 IJavaProject jProject= JavaCore.create(project);
253 if (jProject != null && jProject.exists()) {
254 javaProject= jProject;
259 configurePreferenceLink(fFormatConfigLink, javaProject, CodeFormatterPreferencePage.PREF_ID, CodeFormatterPreferencePage.PROP_ID);
260 configurePreferenceLink(fOrganizeImportsConfigLink, javaProject, ImportOrganizePreferencePage.PREF_ID, ImportOrganizePreferencePage.PROP_ID);
262 super.initialize(context, element);
269 public void performDefaults() {
270 if (ProjectScope.SCOPE.equals(fContext.getName()) && !hasSettingsInScope(fContext))
275 if (ProjectScope.SCOPE.equals(fContext.getName())) {
276 fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(InstanceScope.INSTANCE);
278 fSettings= JavaPlugin.getDefault().getCleanUpRegistry().getDefaultOptions(CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS).getMap();
282 super.performDefaults();
289 public void performOk() {
292 if (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext))
293 CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
300 public void enableProjectSettings() {
301 super.enableProjectSettings();
303 CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
310 public void disableProjectSettings() {
311 super.disableProjectSettings();
313 IEclipsePreferences node= fContext.getNode(JavaUI.ID_PLUGIN);
315 Set<String> keys= JavaPlugin.getDefault().getCleanUpRegistry().getDefaultOptions(CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS).getKeys();
316 for (Iterator<String> iterator= keys.iterator(); iterator.hasNext();) {
317 String key= iterator.next();
318 node.remove(CleanUpPreferenceUtil.SAVE_PARTICIPANT_KEY_PREFIX + key);
326 protected String getPostSaveListenerId() {
327 return CleanUpPostSaveListener.POSTSAVELISTENER_ID;
334 protected String getPostSaveListenerName() {
335 return SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpActionsTopNodeName_Checkbox;
342 protected void enabled(boolean isEnabled) {
344 if (fControlEnableState == null)
347 fControlEnableState.restore();
348 fControlEnableState= null;
350 if (fControlEnableState != null)
353 fControlEnableState= ControlEnableState.disable(fCleanUpOptionsComposite);
357 private void settingsChanged() {
358 fFormatCodeButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE)));
359 boolean isFormatting= fFormatCodeButton.getSelection();
360 fFormatChangedOnlyButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY)));
361 fFormatAllButton.setSelection(CleanUpOptions.FALSE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY)));
363 fFormatChangedOnlyButton.setEnabled(isFormatting);
364 fFormatAllButton.setEnabled(isFormatting);
365 fFormatConfigLink.setEnabled(isFormatting);
367 fOrganizeImportsButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.ORGANIZE_IMPORTS)));
368 fOrganizeImportsConfigLink.setEnabled(fOrganizeImportsButton.getSelection());
370 fAdditionalActionButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS)));
372 boolean additionalEnabled= CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS));
374 fSelectedActionsText.setEnabled(additionalEnabled);
375 fConfigureButton.setEnabled(additionalEnabled);
377 Map<String, String> settings= new HashMap<String, String>(fSettings);
378 settings.put(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpOptions.FALSE);
379 settings.put(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpOptions.FALSE);
380 CleanUpOptions options= new MapCleanUpOptions(settings);
382 fSelectedActionsText.setText(getSelectedCleanUpsText(options));
385 private String getSelectedCleanUpsText(CleanUpOptions options) {
386 StringBuffer buf= new StringBuffer();
388 final ICleanUp[] cleanUps= JavaPlugin.getDefault().getCleanUpRegistry().createCleanUps();
389 for (int i= 0; i < cleanUps.length; i++) {
390 cleanUps[i].setOptions(options);
391 String[] descriptions= cleanUps[i].getStepDescriptions();
392 if (descriptions != null) {
393 for (int j= 0; j < descriptions.length; j++) {
394 if (buf.length() > 0) {
397 buf.append(descriptions[j]);
401 String string= buf.toString();
405 private void configurePreferenceLink(Link link, final IJavaProject javaProject, final String preferenceId, final String propertyId) {
406 link.addSelectionListener(new SelectionAdapter() {
408 public void widgetSelected(SelectionEvent e) {
409 if (fContainer instanceof IWorkbenchPreferenceContainer) {
410 IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer)fContainer;
411 if (javaProject != null) {
412 container.openPage(propertyId, null);
414 container.openPage(preferenceId, null);
417 PreferencesUtil.createPreferenceDialogOn(fShell, preferenceId, null, null);
423 private void changeSettingsValue(String key, boolean enabled) {
426 value= CleanUpOptions.TRUE;
428 value= CleanUpOptions.FALSE;
430 fSettings.put(key, value);