1 /*******************************************************************************
2 * Copyright (c) 2000, 2010 QNX Software Systems 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 *******************************************************************************/
12 package org.eclipse.cdt.internal.ui.preferences;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.Iterator;
19 import org.eclipse.core.runtime.Assert;
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IStatus;
22 import org.eclipse.core.runtime.Status;
23 import org.eclipse.jface.layout.PixelConverter;
24 import org.eclipse.jface.viewers.ComboViewer;
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
26 import org.eclipse.jface.viewers.IStructuredContentProvider;
27 import org.eclipse.jface.viewers.IStructuredSelection;
28 import org.eclipse.jface.viewers.LabelProvider;
29 import org.eclipse.jface.viewers.SelectionChangedEvent;
30 import org.eclipse.jface.viewers.StructuredSelection;
31 import org.eclipse.jface.viewers.Viewer;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.custom.StackLayout;
34 import org.eclipse.swt.events.SelectionEvent;
35 import org.eclipse.swt.events.SelectionListener;
36 import org.eclipse.swt.graphics.Image;
37 import org.eclipse.swt.layout.FillLayout;
38 import org.eclipse.swt.layout.GridData;
39 import org.eclipse.swt.layout.GridLayout;
40 import org.eclipse.swt.widgets.Button;
41 import org.eclipse.swt.widgets.Combo;
42 import org.eclipse.swt.widgets.Composite;
43 import org.eclipse.swt.widgets.Control;
44 import org.eclipse.swt.widgets.Label;
46 import org.eclipse.cdt.ui.CUIPlugin;
47 import org.eclipse.cdt.ui.PreferenceConstants;
48 import org.eclipse.cdt.ui.text.folding.ICFoldingPreferenceBlock;
50 import org.eclipse.cdt.internal.ui.preferences.OverlayPreferenceStore.OverlayKey;
51 import org.eclipse.cdt.internal.ui.text.folding.CFoldingStructureProviderDescriptor;
52 import org.eclipse.cdt.internal.ui.text.folding.CFoldingStructureProviderRegistry;
55 * Configures C Editor folding preferences.
59 class FoldingConfigurationBlock implements IPreferenceConfigurationBlock {
61 private static class ErrorPreferences implements ICFoldingPreferenceBlock {
62 private String fMessage;
64 protected ErrorPreferences(String message) {
69 * @see org.eclipse.cdt.internal.ui.text.folding.ICFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
71 public Control createControl(Composite composite) {
72 Composite inner= new Composite(composite, SWT.NONE);
73 inner.setLayout(new FillLayout(SWT.VERTICAL));
75 Label label= new Label(inner, SWT.CENTER);
76 label.setText(fMessage);
81 public void initialize() {
84 public void performOk() {
87 public void performDefaults() {
90 public void dispose() {
95 /** The overlay preference store. */
96 protected final OverlayPreferenceStore fStore;
99 private Combo fProviderCombo;
100 protected Button fFoldingCheckbox;
101 private ComboViewer fProviderViewer;
102 protected Map<String, CFoldingStructureProviderDescriptor> fProviderDescriptors;
103 private Composite fGroup;
104 private Map<String, ICFoldingPreferenceBlock> fProviderPreferences;
105 private Map<String, Control> fProviderControls;
106 private StackLayout fStackLayout;
109 public FoldingConfigurationBlock(OverlayPreferenceStore store) {
110 Assert.isNotNull(store);
112 fStore.addKeys(createOverlayStoreKeys());
113 fProviderDescriptors= createListModel();
114 fProviderPreferences= new HashMap<String, ICFoldingPreferenceBlock>();
115 fProviderControls= new HashMap<String, Control>();
118 private Map<String, CFoldingStructureProviderDescriptor> createListModel() {
119 CFoldingStructureProviderRegistry reg= CUIPlugin.getDefault().getFoldingStructureProviderRegistry();
120 reg.reloadExtensions();
121 CFoldingStructureProviderDescriptor[] descs= reg.getFoldingProviderDescriptors();
122 Map<String, CFoldingStructureProviderDescriptor> map= new HashMap<String, CFoldingStructureProviderDescriptor>();
123 for (int i= 0; i < descs.length; i++) {
124 map.put(descs[i].getId(), descs[i]);
129 private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
131 ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>();
133 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_ENABLED));
134 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_FOLDING_PROVIDER));
136 OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
137 overlayKeys.toArray(keys);
142 * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#createControl(org.eclipse.swt.widgets.Composite)
144 public Control createControl(Composite parent) {
146 Composite composite= new Composite(parent, SWT.NULL);
147 // assume parent page uses griddata
148 GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL);
149 composite.setLayoutData(gd);
150 GridLayout layout= new GridLayout();
151 layout.numColumns= 2;
152 PixelConverter pc= new PixelConverter(composite);
153 layout.verticalSpacing= pc.convertHeightInCharsToPixels(1) / 2;
154 composite.setLayout(layout);
157 /* check box for new editors */
158 fFoldingCheckbox= new Button(composite, SWT.CHECK);
159 fFoldingCheckbox.setText(PreferencesMessages.FoldingConfigurationBlock_enable);
160 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
161 fFoldingCheckbox.setLayoutData(gd);
162 fFoldingCheckbox.addSelectionListener(new SelectionListener() {
163 public void widgetSelected(SelectionEvent e) {
164 boolean enabled= fFoldingCheckbox.getSelection();
165 fStore.setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, enabled);
166 updateCheckboxDependencies();
169 public void widgetDefaultSelected(SelectionEvent e) {
173 Label label= new Label(composite, SWT.CENTER);
174 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
175 label.setLayoutData(gd);
178 Composite comboComp= new Composite(composite, SWT.NONE);
179 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
180 GridLayout gridLayout= new GridLayout(2, false);
181 gridLayout.marginWidth= 0;
182 comboComp.setLayout(gridLayout);
184 Label comboLabel= new Label(comboComp, SWT.CENTER);
185 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER);
186 comboLabel.setLayoutData(gd);
187 comboLabel.setText(PreferencesMessages.FoldingConfigurationBlock_combo_caption);
189 label= new Label(composite, SWT.CENTER);
190 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
191 label.setLayoutData(gd);
193 fProviderCombo= new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN);
194 gd= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER);
195 fProviderCombo.setLayoutData(gd);
198 fProviderViewer= new ComboViewer(fProviderCombo);
199 fProviderViewer.setContentProvider(new IStructuredContentProvider() {
202 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
204 public void dispose() {
208 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
210 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
214 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
216 public Object[] getElements(Object inputElement) {
217 return fProviderDescriptors.values().toArray();
220 fProviderViewer.setLabelProvider(new LabelProvider() {
222 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
225 public Image getImage(Object element) {
230 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
233 public String getText(Object element) {
234 return ((CFoldingStructureProviderDescriptor) element).getName();
237 fProviderViewer.addSelectionChangedListener(new ISelectionChangedListener() {
239 public void selectionChanged(SelectionChangedEvent event) {
240 IStructuredSelection sel= (IStructuredSelection) event.getSelection();
241 if (!sel.isEmpty()) {
242 fStore.setValue(PreferenceConstants.EDITOR_FOLDING_PROVIDER, ((CFoldingStructureProviderDescriptor) sel.getFirstElement()).getId());
243 updateListDependencies();
247 fProviderViewer.setInput(fProviderDescriptors);
248 fProviderViewer.refresh();
250 Composite groupComp= new Composite(composite, SWT.NONE);
251 gd= new GridData(GridData.FILL_BOTH);
252 gd.horizontalSpan= 2;
253 groupComp.setLayoutData(gd);
254 gridLayout= new GridLayout(1, false);
255 gridLayout.marginWidth= 0;
256 groupComp.setLayout(gridLayout);
258 /* contributed provider preferences. */
259 fGroup= new Composite(groupComp, SWT.NONE);
260 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
261 fGroup.setLayoutData(gd);
262 fStackLayout= new StackLayout();
263 fGroup.setLayout(fStackLayout);
268 protected void updateCheckboxDependencies() {
271 void updateListDependencies() {
272 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
273 CFoldingStructureProviderDescriptor desc= fProviderDescriptors.get(id);
274 ICFoldingPreferenceBlock prefs;
277 // safety in case there is no such descriptor
278 String message= PreferencesMessages.FoldingConfigurationBlock_error_not_exist;
279 CUIPlugin.log(new Status(IStatus.WARNING, CUIPlugin.getPluginId(), IStatus.OK, message, null));
280 prefs= new ErrorPreferences(message);
282 prefs= fProviderPreferences.get(id);
285 prefs= desc.createPreferences();
286 fProviderPreferences.put(id, prefs);
287 } catch (CoreException e) {
289 prefs= new ErrorPreferences(e.getLocalizedMessage());
294 Control control= fProviderControls.get(id);
295 if (control == null) {
296 control= prefs.createControl(fGroup);
297 if (control == null) {
298 String message= PreferencesMessages.FoldingConfigurationBlock_info_no_preferences;
299 control= new ErrorPreferences(message).createControl(fGroup);
301 fProviderControls.put(id, control);
304 fStackLayout.topControl= control;
307 fGroup.getParent().layout();
313 * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#initialize()
315 public void initialize() {
316 restoreFromPreferences();
320 * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#performOk()
322 public void performOk() {
323 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
324 ICFoldingPreferenceBlock prefs= it.next();
330 * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#performDefaults()
332 public void performDefaults() {
333 restoreFromPreferences();
334 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
335 ICFoldingPreferenceBlock prefs= it.next();
336 prefs.performDefaults();
341 * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#dispose()
343 public void dispose() {
344 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
345 ICFoldingPreferenceBlock prefs= it.next();
350 private void restoreFromPreferences() {
351 boolean enabled= fStore.getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED);
352 fFoldingCheckbox.setSelection(enabled);
353 updateCheckboxDependencies();
355 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
356 Object provider= fProviderDescriptors.get(id);
357 if (provider != null) {
358 fProviderViewer.setSelection(new StructuredSelection(provider), true);
359 updateListDependencies();