]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/FoldingConfigurationBlock.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / preferences / FoldingConfigurationBlock.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.preferences;
12
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.Iterator;
16 import java.util.Map;
17
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.custom.StackLayout;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.events.SelectionListener;
22 import org.eclipse.swt.graphics.Image;
23 import org.eclipse.swt.layout.FillLayout;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Button;
27 import org.eclipse.swt.widgets.Combo;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Control;
30 import org.eclipse.swt.widgets.Label;
31
32 import org.eclipse.core.runtime.Assert;
33 import org.eclipse.core.runtime.CoreException;
34 import org.eclipse.core.runtime.IStatus;
35 import org.eclipse.core.runtime.Status;
36
37 import org.eclipse.jface.dialogs.Dialog;
38 import org.eclipse.jface.layout.PixelConverter;
39 import org.eclipse.jface.viewers.ComboViewer;
40 import org.eclipse.jface.viewers.ISelectionChangedListener;
41 import org.eclipse.jface.viewers.IStructuredContentProvider;
42 import org.eclipse.jface.viewers.IStructuredSelection;
43 import org.eclipse.jface.viewers.LabelProvider;
44 import org.eclipse.jface.viewers.SelectionChangedEvent;
45 import org.eclipse.jface.viewers.StructuredSelection;
46 import org.eclipse.jface.viewers.Viewer;
47
48 import org.eclipse.jdt.internal.corext.util.Messages;
49
50 import org.eclipse.jdt.ui.PreferenceConstants;
51 import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock;
52
53 import org.eclipse.jdt.internal.ui.JavaPlugin;
54 import org.eclipse.jdt.internal.ui.preferences.OverlayPreferenceStore.OverlayKey;
55 import org.eclipse.jdt.internal.ui.text.folding.JavaFoldingStructureProviderDescriptor;
56 import org.eclipse.jdt.internal.ui.text.folding.JavaFoldingStructureProviderRegistry;
57 import org.eclipse.jdt.internal.ui.util.SWTUtil;
58
59
60 /**
61  * Configures Java Editor folding preferences.
62  *
63  * @since 3.0
64  */
65 class FoldingConfigurationBlock implements IPreferenceConfigurationBlock {
66
67         private static class ErrorPreferences implements IJavaFoldingPreferenceBlock {
68                 private String fMessage;
69
70                 protected ErrorPreferences(String message) {
71                         fMessage= message;
72                 }
73
74                 /*
75                  * @see org.eclipse.jdt.internal.ui.text.folding.IJavaFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
76                  */
77                 public Control createControl(Composite composite) {
78                         Composite inner= new Composite(composite, SWT.NONE);
79                         inner.setLayout(new FillLayout(SWT.VERTICAL));
80
81                         Label label= new Label(inner, SWT.CENTER);
82                         label.setText(fMessage);
83
84                         return inner;
85                 }
86
87                 public void initialize() {
88                 }
89
90                 public void performOk() {
91                 }
92
93                 public void performDefaults() {
94                 }
95
96                 public void dispose() {
97                 }
98
99         }
100
101         /** The overlay preference store. */
102         final OverlayPreferenceStore fStore;
103
104         /* The controls */
105         private Combo fProviderCombo;
106         Button fFoldingCheckbox;
107         private ComboViewer fProviderViewer;
108         private Composite fGroup;
109         private StackLayout fStackLayout;
110
111         /* the model */
112         final Map<String, JavaFoldingStructureProviderDescriptor> fProviderDescriptors;
113         private final Map<String, IJavaFoldingPreferenceBlock> fProviderPreferences;
114         private final Map<String, Control> fProviderControls;
115
116
117         public FoldingConfigurationBlock(OverlayPreferenceStore store) {
118                 Assert.isNotNull(store);
119                 fStore= store;
120                 fStore.addKeys(createOverlayStoreKeys());
121                 fProviderDescriptors= createListModel();
122                 fProviderPreferences= new HashMap<String, IJavaFoldingPreferenceBlock>();
123                 fProviderControls= new HashMap<String, Control>();
124         }
125
126         private Map<String, JavaFoldingStructureProviderDescriptor> createListModel() {
127                 JavaFoldingStructureProviderRegistry reg= JavaPlugin.getDefault().getFoldingStructureProviderRegistry();
128                 return reg.generated_5450102624066877967();
129         }
130
131         private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
132
133                 ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>();
134
135                 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_ENABLED));
136                 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_FOLDING_PROVIDER));
137
138                 OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
139                 overlayKeys.toArray(keys);
140                 return keys;
141         }
142
143         /**
144          * Creates page for folding preferences.
145          *
146          * @param parent the parent composite
147          * @return the control for the preference page
148          */
149         public Control createControl(Composite parent) {
150
151                 Composite composite= new Composite(parent, SWT.NULL);
152                 // assume parent page uses griddata
153                 GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL);
154                 composite.setLayoutData(gd);
155                 GridLayout layout= new GridLayout();
156                 layout.numColumns= 2;
157                 layout.marginHeight= 0;
158                 layout.marginWidth= 0;
159                 PixelConverter pc= new PixelConverter(composite);
160                 layout.verticalSpacing= pc.convertHeightInCharsToPixels(1) / 2;
161                 composite.setLayout(layout);
162
163
164                 /* check box for new editors */
165                 fFoldingCheckbox= new Button(composite, SWT.CHECK);
166                 fFoldingCheckbox.setText(PreferencesMessages.FoldingConfigurationBlock_enable);
167                 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
168                 fFoldingCheckbox.setLayoutData(gd);
169                 fFoldingCheckbox.addSelectionListener(new SelectionListener() {
170                         public void widgetSelected(SelectionEvent e) {
171                                 boolean enabled= fFoldingCheckbox.getSelection();
172                                 fStore.setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, enabled);
173                                 updateCheckboxDependencies();
174                         }
175
176                         public void widgetDefaultSelected(SelectionEvent e) {
177                         }
178                 });
179
180                 Label label= new Label(composite, SWT.CENTER);
181                 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
182                 label.setLayoutData(gd);
183
184                 if (fProviderDescriptors.size() > 1) {
185                         /* list */
186                         Composite comboComp= new Composite(composite, SWT.NONE);
187                         gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
188                         GridLayout gridLayout= new GridLayout(2, false);
189                         gridLayout.marginWidth= 0;
190                         comboComp.setLayout(gridLayout);
191
192                         Label comboLabel= new Label(comboComp, SWT.CENTER);
193                         gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER);
194                         comboLabel.setLayoutData(gd);
195                         comboLabel.setText(PreferencesMessages.FoldingConfigurationBlock_combo_caption);
196
197                         label= new Label(composite, SWT.CENTER);
198                         gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
199                         label.setLayoutData(gd);
200
201                         fProviderCombo= new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN);
202                         SWTUtil.setDefaultVisibleItemCount(fProviderCombo);
203                         gd= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER);
204                         fProviderCombo.setLayoutData(gd);
205
206                         fProviderViewer= createProviderViewer();
207                 }
208
209                 Composite groupComp= new Composite(composite, SWT.NONE);
210                 gd= new GridData(GridData.FILL_BOTH);
211                 gd.horizontalSpan= 2;
212                 groupComp.setLayoutData(gd);
213                 GridLayout gridLayout= new GridLayout(1, false);
214                 gridLayout.marginWidth= 0;
215                 groupComp.setLayout(gridLayout);
216
217                 /* contributed provider preferences. */
218                 fGroup= new Composite(groupComp, SWT.NONE);
219                 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
220                 fGroup.setLayoutData(gd);
221                 fStackLayout= new StackLayout();
222                 fGroup.setLayout(fStackLayout);
223
224                 return composite;
225         }
226
227         private ComboViewer createProviderViewer() {
228                 /* list viewer */
229                 ComboViewer viewer= new ComboViewer(fProviderCombo);
230                 viewer.setContentProvider(new IStructuredContentProvider() {
231
232                         /*
233                          * @see org.eclipse.jface.viewers.IContentProvider#dispose()
234                          */
235                         public void dispose() {
236                         }
237
238                         /*
239                          * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
240                          */
241                         public void inputChanged(Viewer v, Object oldInput, Object newInput) {
242                         }
243
244                         /*
245                          * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
246                          */
247                         public Object[] getElements(Object inputElement) {
248                                 return fProviderDescriptors.values().toArray();
249                         }
250                 });
251                 viewer.setLabelProvider(new LabelProvider() {
252                         /*
253                          * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
254                          */
255                         @Override
256                         public Image getImage(Object element) {
257                                 return null;
258                         }
259
260                         /*
261                          * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
262                          */
263                         @Override
264                         public String getText(Object element) {
265                                 return ((JavaFoldingStructureProviderDescriptor) element).getName();
266                         }
267                 });
268                 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
269
270                         public void selectionChanged(SelectionChangedEvent event) {
271                                 IStructuredSelection sel= (IStructuredSelection) event.getSelection();
272                                 if (!sel.isEmpty()) {
273                                         fStore.setValue(PreferenceConstants.EDITOR_FOLDING_PROVIDER, ((JavaFoldingStructureProviderDescriptor) sel.getFirstElement()).getId());
274                                         updateListDependencies();
275                                 }
276                         }
277                 });
278                 viewer.setInput(fProviderDescriptors);
279                 viewer.refresh();
280
281                 return viewer;
282         }
283
284         void updateCheckboxDependencies() {
285         }
286
287         void updateListDependencies() {
288                 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
289                 JavaFoldingStructureProviderDescriptor desc= fProviderDescriptors.get(id);
290                 IJavaFoldingPreferenceBlock prefs;
291
292                 if (desc == null) {
293                         // safety in case there is no such descriptor
294                         String message= Messages.format(PreferencesMessages.FoldingConfigurationBlock_error_not_exist, id);
295                         JavaPlugin.log(new Status(IStatus.WARNING, JavaPlugin.getPluginId(), IStatus.OK, message, null));
296                         prefs= new ErrorPreferences(message);
297                 } else {
298                         prefs= fProviderPreferences.get(id);
299                         if (prefs == null) {
300                                 try {
301                                         prefs= desc.createPreferences();
302                                         fProviderPreferences.put(id, prefs);
303                                 } catch (CoreException e) {
304                                         JavaPlugin.log(e);
305                                         prefs= new ErrorPreferences(e.getLocalizedMessage());
306                                 }
307                         }
308                 }
309
310                 Control control= fProviderControls.get(id);
311                 if (control == null) {
312                         control= prefs.createControl(fGroup);
313                         if (control == null) {
314                                 String message= PreferencesMessages.FoldingConfigurationBlock_info_no_preferences;
315                                 control= new ErrorPreferences(message).createControl(fGroup);
316                         } else {
317                                 fProviderControls.put(id, control);
318                         }
319                 }
320                 Dialog.applyDialogFont(control);
321                 fStackLayout.topControl= control;
322                 control.pack();
323                 fGroup.layout();
324                 fGroup.getParent().layout();
325
326                 prefs.initialize();
327         }
328
329         public void initialize() {
330                 restoreFromPreferences();
331         }
332
333         public void performOk() {
334                 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
335                         IJavaFoldingPreferenceBlock prefs= it.next();
336                         prefs.performOk();
337                 }
338         }
339
340         public void performDefaults() {
341                 restoreFromPreferences();
342                 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
343                         IJavaFoldingPreferenceBlock prefs= it.next();
344                         prefs.performDefaults();
345                 }
346         }
347
348         public void dispose() {
349                 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
350                         IJavaFoldingPreferenceBlock prefs= it.next();
351                         prefs.dispose();
352                 }
353         }
354
355         private void restoreFromPreferences() {
356                 Object provider= fStore.generated_329510490482476986(this);
357
358                 if (fProviderViewer == null)
359                         updateListDependencies();
360                 else
361                         fProviderViewer.setSelection(new StructuredSelection(provider), true);
362         }
363 }