]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/fix/CleanUpSaveParticipantPreferenceConfiguration.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / fix / CleanUpSaveParticipantPreferenceConfiguration.java
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
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.fix;
12
13 import java.util.HashMap;
14 import java.util.Hashtable;
15 import java.util.Iterator;
16 import java.util.Map;
17 import java.util.Set;
18
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;
28
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;
33
34 import org.eclipse.core.resources.IProject;
35 import org.eclipse.core.resources.ProjectScope;
36
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;
41
42 import org.eclipse.ui.dialogs.PreferencesUtil;
43 import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
44
45 import org.eclipse.jdt.core.IJavaProject;
46 import org.eclipse.jdt.core.JavaCore;
47
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;
51
52 import org.eclipse.jdt.ui.JavaUI;
53 import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
54 import org.eclipse.jdt.ui.cleanup.ICleanUp;
55
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;
61
62
63 /**
64  * Preference configuration UI for the clean up save participant.
65  *
66  * @since 3.3
67  */
68 public class CleanUpSaveParticipantPreferenceConfiguration extends AbstractSaveParticipantPreferenceConfiguration {
69
70         private static final int INDENT= 10;
71
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;
78         private Shell fShell;
79         private Link fFormatConfigLink;
80         private Link fOrganizeImportsConfigLink;
81         private IPreferencePageContainer fContainer;
82         private Button fAdditionalActionButton;
83         private Button fConfigureButton;
84         private Button fFormatAllButton;
85
86         private Composite fCleanUpOptionsComposite;
87         private ControlEnableState fControlEnableState;
88
89         /**
90          * {@inheritDoc}
91          */
92         @Override
93         public void createConfigControl(final Composite parent, IPreferencePageContainer container) {
94                 fContainer= container;
95                 fShell= parent.getShell();
96
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);
105
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() {
110                         /**
111                          * {@inheritDoc}
112                          */
113                         @Override
114                         public void widgetSelected(SelectionEvent e) {
115                                 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE, fFormatCodeButton.getSelection());
116                         }
117                 });
118
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);
127
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() {
133                         /**
134                          * {@inheritDoc}
135                          */
136                         @Override
137                         public void widgetSelected(SelectionEvent e) {
138                                 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, !fFormatAllButton.getSelection());
139                         }
140                 });
141
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() {
147                         /**
148                          * {@inheritDoc}
149                          */
150                         @Override
151                         public void widgetSelected(SelectionEvent e) {
152                                 changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE_CHANGES_ONLY, fFormatChangedOnlyButton.getSelection());
153                         }
154                 });
155
156                 PixelConverter pixelConverter= new PixelConverter(parent);
157                 int heightOneHalf= (int)Math.round(pixelConverter.convertHeightInCharsToPixels(1) * 1.5);
158
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);
165
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() {
170                         /**
171                          * {@inheritDoc}
172                          */
173                         @Override
174                         public void widgetSelected(SelectionEvent e) {
175                                 changeSettingsValue(CleanUpConstants.ORGANIZE_IMPORTS, fOrganizeImportsButton.getSelection());
176                         }
177                 });
178
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);
185
186                 fAdditionalActionButton= new Button(fCleanUpOptionsComposite, SWT.CHECK);
187                 fAdditionalActionButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_AdditionalActions_Checkbox);
188
189                 createAdvancedComposite(fCleanUpOptionsComposite);
190                 fAdditionalActionButton.addSelectionListener(new SelectionAdapter() {
191                         /**
192                          * {@inheritDoc}
193                          */
194                         @Override
195                         public void widgetSelected(SelectionEvent e) {
196                                 changeSettingsValue(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS, fAdditionalActionButton.getSelection());
197                         }
198                 });
199         }
200
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);
210
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);
215
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() {
220                         /**
221                          * {@inheritDoc}
222                          */
223                         @Override
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;
229                                         settingsChanged();
230                                 }
231                         }
232
233                 });
234
235                 return composite;
236         }
237
238         /**
239          * {@inheritDoc}
240          */
241         @Override
242         public void initialize(final IScopeContext context, IAdaptable element) {
243                 fContext= context;
244                 fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(context);
245
246                 settingsChanged();
247
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;
255                                 }
256                         }
257                 }
258
259                 configurePreferenceLink(fFormatConfigLink, javaProject, CodeFormatterPreferencePage.PREF_ID, CodeFormatterPreferencePage.PROP_ID);
260                 configurePreferenceLink(fOrganizeImportsConfigLink, javaProject, ImportOrganizePreferencePage.PREF_ID, ImportOrganizePreferencePage.PROP_ID);
261
262                 super.initialize(context, element);
263         }
264
265         /**
266          * {@inheritDoc}
267          */
268         @Override
269         public void performDefaults() {
270                 if (ProjectScope.SCOPE.equals(fContext.getName()) && !hasSettingsInScope(fContext))
271                         return;
272
273                 enabled(true);
274
275                 if (ProjectScope.SCOPE.equals(fContext.getName())) {
276                         fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(InstanceScope.INSTANCE);
277                 } else {
278                         fSettings= JavaPlugin.getDefault().getCleanUpRegistry().getDefaultOptions(CleanUpConstants.DEFAULT_SAVE_ACTION_OPTIONS).getMap();
279                 }
280                 settingsChanged();
281
282                 super.performDefaults();
283         }
284
285         /**
286          * {@inheritDoc}
287          */
288         @Override
289         public void performOk() {
290                 super.performOk();
291
292                 if (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext))
293                         CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
294         }
295
296         /**
297          * {@inheritDoc}
298          */
299         @Override
300         public void enableProjectSettings() {
301                 super.enableProjectSettings();
302
303                 CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
304         }
305
306         /**
307          * {@inheritDoc}
308          */
309         @Override
310         public void disableProjectSettings() {
311                 super.disableProjectSettings();
312
313                 IEclipsePreferences node= fContext.getNode(JavaUI.ID_PLUGIN);
314
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);
319                 }
320         }
321
322         /**
323          * {@inheritDoc}
324          */
325         @Override
326         protected String getPostSaveListenerId() {
327                 return CleanUpPostSaveListener.POSTSAVELISTENER_ID;
328         }
329
330         /**
331          * {@inheritDoc}
332          */
333         @Override
334         protected String getPostSaveListenerName() {
335                 return SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpActionsTopNodeName_Checkbox;
336         }
337
338         /**
339          * {@inheritDoc}
340          */
341         @Override
342         protected void enabled(boolean isEnabled) {
343                 if (isEnabled) {
344                         if (fControlEnableState == null)
345                                 return;
346
347                         fControlEnableState.restore();
348                         fControlEnableState= null;
349                 } else {
350                         if (fControlEnableState != null)
351                                 return;
352
353                         fControlEnableState= ControlEnableState.disable(fCleanUpOptionsComposite);
354                 }
355         }
356
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)));
362
363                 fFormatChangedOnlyButton.setEnabled(isFormatting);
364                 fFormatAllButton.setEnabled(isFormatting);
365                 fFormatConfigLink.setEnabled(isFormatting);
366
367                 fOrganizeImportsButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.ORGANIZE_IMPORTS)));
368                 fOrganizeImportsConfigLink.setEnabled(fOrganizeImportsButton.getSelection());
369
370                 fAdditionalActionButton.setSelection(CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS)));
371
372                 boolean additionalEnabled= CleanUpOptions.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS));
373
374                 fSelectedActionsText.setEnabled(additionalEnabled);
375                 fConfigureButton.setEnabled(additionalEnabled);
376
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);
381
382                 fSelectedActionsText.setText(getSelectedCleanUpsText(options));
383         }
384
385         private String getSelectedCleanUpsText(CleanUpOptions options) {
386                 StringBuffer buf= new StringBuffer();
387
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) {
395                                                 buf.append('\n');
396                                         }
397                                         buf.append(descriptions[j]);
398                                 }
399                 }
400         }
401                 String string= buf.toString();
402                 return string;
403         }
404
405         private void configurePreferenceLink(Link link, final IJavaProject javaProject, final String preferenceId, final String propertyId) {
406                 link.addSelectionListener(new SelectionAdapter() {
407                         @Override
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);
413                                         } else {
414                                                 container.openPage(preferenceId, null);
415                                         }
416                                 } else {
417                                         PreferencesUtil.createPreferenceDialogOn(fShell, preferenceId, null, null);
418                                 }
419                         }
420                 });
421         }
422
423         private void changeSettingsValue(String key, boolean enabled) {
424                 String value;
425                 if (enabled) {
426                         value= CleanUpOptions.TRUE;
427                 } else {
428                         value= CleanUpOptions.FALSE;
429                 }
430                 fSettings.put(key, value);
431                 settingsChanged();
432         }
433 }