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.preferences;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.Iterator;
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;
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;
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;
48 import org.eclipse.jdt.internal.corext.util.Messages;
50 import org.eclipse.jdt.ui.PreferenceConstants;
51 import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock;
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;
61 * Configures Java Editor folding preferences.
65 class FoldingConfigurationBlock implements IPreferenceConfigurationBlock {
67 private static class ErrorPreferences implements IJavaFoldingPreferenceBlock {
68 private String fMessage;
70 protected ErrorPreferences(String message) {
75 * @see org.eclipse.jdt.internal.ui.text.folding.IJavaFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
77 public Control createControl(Composite composite) {
78 Composite inner= new Composite(composite, SWT.NONE);
79 inner.setLayout(new FillLayout(SWT.VERTICAL));
81 Label label= new Label(inner, SWT.CENTER);
82 label.setText(fMessage);
87 public void initialize() {
90 public void performOk() {
93 public void performDefaults() {
96 public void dispose() {
101 /** The overlay preference store. */
102 final OverlayPreferenceStore fStore;
105 private Combo fProviderCombo;
106 Button fFoldingCheckbox;
107 private ComboViewer fProviderViewer;
108 private Composite fGroup;
109 private StackLayout fStackLayout;
112 final Map<String, JavaFoldingStructureProviderDescriptor> fProviderDescriptors;
113 private final Map<String, IJavaFoldingPreferenceBlock> fProviderPreferences;
114 private final Map<String, Control> fProviderControls;
117 public FoldingConfigurationBlock(OverlayPreferenceStore store) {
118 Assert.isNotNull(store);
120 fStore.addKeys(createOverlayStoreKeys());
121 fProviderDescriptors= createListModel();
122 fProviderPreferences= new HashMap<String, IJavaFoldingPreferenceBlock>();
123 fProviderControls= new HashMap<String, Control>();
126 private Map<String, JavaFoldingStructureProviderDescriptor> createListModel() {
127 JavaFoldingStructureProviderRegistry reg= JavaPlugin.getDefault().getFoldingStructureProviderRegistry();
128 return reg.generated_5450102624066877967();
131 private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
133 ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>();
135 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_ENABLED));
136 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_FOLDING_PROVIDER));
138 OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
139 overlayKeys.toArray(keys);
144 * Creates page for folding preferences.
146 * @param parent the parent composite
147 * @return the control for the preference page
149 public Control createControl(Composite parent) {
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);
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();
176 public void widgetDefaultSelected(SelectionEvent e) {
180 Label label= new Label(composite, SWT.CENTER);
181 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
182 label.setLayoutData(gd);
184 if (fProviderDescriptors.size() > 1) {
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);
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);
197 label= new Label(composite, SWT.CENTER);
198 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
199 label.setLayoutData(gd);
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);
206 fProviderViewer= createProviderViewer();
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);
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);
227 private ComboViewer createProviderViewer() {
229 ComboViewer viewer= new ComboViewer(fProviderCombo);
230 viewer.setContentProvider(new IStructuredContentProvider() {
233 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
235 public void dispose() {
239 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
241 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
245 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
247 public Object[] getElements(Object inputElement) {
248 return fProviderDescriptors.values().toArray();
251 viewer.setLabelProvider(new LabelProvider() {
253 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
256 public Image getImage(Object element) {
261 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
264 public String getText(Object element) {
265 return ((JavaFoldingStructureProviderDescriptor) element).getName();
268 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
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();
278 viewer.setInput(fProviderDescriptors);
284 void updateCheckboxDependencies() {
287 void updateListDependencies() {
288 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
289 JavaFoldingStructureProviderDescriptor desc= fProviderDescriptors.get(id);
290 IJavaFoldingPreferenceBlock prefs;
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);
298 prefs= fProviderPreferences.get(id);
301 prefs= desc.createPreferences();
302 fProviderPreferences.put(id, prefs);
303 } catch (CoreException e) {
305 prefs= new ErrorPreferences(e.getLocalizedMessage());
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);
317 fProviderControls.put(id, control);
320 Dialog.applyDialogFont(control);
321 fStackLayout.topControl= control;
324 fGroup.getParent().layout();
329 public void initialize() {
330 restoreFromPreferences();
333 public void performOk() {
334 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
335 IJavaFoldingPreferenceBlock prefs= it.next();
340 public void performDefaults() {
341 restoreFromPreferences();
342 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
343 IJavaFoldingPreferenceBlock prefs= it.next();
344 prefs.performDefaults();
348 public void dispose() {
349 for (Iterator<IJavaFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
350 IJavaFoldingPreferenceBlock prefs= it.next();
355 private void restoreFromPreferences() {
356 Object provider= fStore.generated_329510490482476986(this);
358 if (fProviderViewer == null)
359 updateListDependencies();
361 fProviderViewer.setSelection(new StructuredSelection(provider), true);