001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.preferences;
011:
012: import java.util.ArrayList;
013: import java.util.HashMap;
014: import java.util.Iterator;
015: import java.util.Map;
016:
017: import org.eclipse.core.runtime.Assert;
018: import org.eclipse.core.runtime.CoreException;
019: import org.eclipse.core.runtime.IStatus;
020: import org.eclipse.core.runtime.Status;
021:
022: import org.eclipse.swt.SWT;
023: import org.eclipse.swt.custom.StackLayout;
024: import org.eclipse.swt.events.SelectionEvent;
025: import org.eclipse.swt.events.SelectionListener;
026: import org.eclipse.swt.graphics.Image;
027: import org.eclipse.swt.layout.FillLayout;
028: import org.eclipse.swt.layout.GridData;
029: import org.eclipse.swt.layout.GridLayout;
030: import org.eclipse.swt.widgets.Button;
031: import org.eclipse.swt.widgets.Combo;
032: import org.eclipse.swt.widgets.Composite;
033: import org.eclipse.swt.widgets.Control;
034: import org.eclipse.swt.widgets.Label;
035:
036: import org.eclipse.jface.dialogs.Dialog;
037: import org.eclipse.jface.viewers.ComboViewer;
038: import org.eclipse.jface.viewers.ISelectionChangedListener;
039: import org.eclipse.jface.viewers.IStructuredContentProvider;
040: import org.eclipse.jface.viewers.IStructuredSelection;
041: import org.eclipse.jface.viewers.LabelProvider;
042: import org.eclipse.jface.viewers.SelectionChangedEvent;
043: import org.eclipse.jface.viewers.StructuredSelection;
044: import org.eclipse.jface.viewers.Viewer;
045:
046: import org.eclipse.jdt.internal.corext.util.Messages;
047:
048: import org.eclipse.jdt.ui.PreferenceConstants;
049: import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock;
050:
051: import org.eclipse.jdt.internal.ui.JavaPlugin;
052: import org.eclipse.jdt.internal.ui.text.folding.JavaFoldingStructureProviderDescriptor;
053: import org.eclipse.jdt.internal.ui.text.folding.JavaFoldingStructureProviderRegistry;
054: import org.eclipse.jdt.internal.ui.util.PixelConverter;
055:
056: /**
057: * Configures Java Editor folding preferences.
058: *
059: * @since 3.0
060: */
061: class FoldingConfigurationBlock implements
062: IPreferenceConfigurationBlock {
063:
064: private static class ErrorPreferences implements
065: IJavaFoldingPreferenceBlock {
066: private String fMessage;
067:
068: protected ErrorPreferences(String message) {
069: fMessage = message;
070: }
071:
072: /*
073: * @see org.eclipse.jdt.internal.ui.text.folding.IJavaFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
074: */
075: public Control createControl(Composite composite) {
076: Composite inner = new Composite(composite, SWT.NONE);
077: inner.setLayout(new FillLayout(SWT.VERTICAL));
078:
079: Label label = new Label(inner, SWT.CENTER);
080: label.setText(fMessage);
081:
082: return inner;
083: }
084:
085: public void initialize() {
086: }
087:
088: public void performOk() {
089: }
090:
091: public void performDefaults() {
092: }
093:
094: public void dispose() {
095: }
096:
097: }
098:
099: /** The overlay preference store. */
100: private final OverlayPreferenceStore fStore;
101:
102: /* The controls */
103: private Combo fProviderCombo;
104: private Button fFoldingCheckbox;
105: private ComboViewer fProviderViewer;
106: private Composite fGroup;
107: private StackLayout fStackLayout;
108:
109: /* the model */
110: private final Map fProviderDescriptors;
111: private final Map fProviderPreferences;
112: private final Map fProviderControls;
113:
114: public FoldingConfigurationBlock(OverlayPreferenceStore store) {
115: Assert.isNotNull(store);
116: fStore = store;
117: fStore.addKeys(createOverlayStoreKeys());
118: fProviderDescriptors = createListModel();
119: fProviderPreferences = new HashMap();
120: fProviderControls = new HashMap();
121: }
122:
123: private Map createListModel() {
124: JavaFoldingStructureProviderRegistry reg = JavaPlugin
125: .getDefault().getFoldingStructureProviderRegistry();
126: reg.reloadExtensions();
127: JavaFoldingStructureProviderDescriptor[] descs = reg
128: .getFoldingProviderDescriptors();
129: Map map = new HashMap();
130: for (int i = 0; i < descs.length; i++) {
131: map.put(descs[i].getId(), descs[i]);
132: }
133: return map;
134: }
135:
136: private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
137:
138: ArrayList overlayKeys = new ArrayList();
139:
140: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
141: OverlayPreferenceStore.BOOLEAN,
142: PreferenceConstants.EDITOR_FOLDING_ENABLED));
143: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
144: OverlayPreferenceStore.STRING,
145: PreferenceConstants.EDITOR_FOLDING_PROVIDER));
146:
147: OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys
148: .size()];
149: overlayKeys.toArray(keys);
150: return keys;
151: }
152:
153: /**
154: * Creates page for folding preferences.
155: *
156: * @param parent the parent composite
157: * @return the control for the preference page
158: */
159: public Control createControl(Composite parent) {
160:
161: Composite composite = new Composite(parent, SWT.NULL);
162: // assume parent page uses griddata
163: GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER
164: | GridData.VERTICAL_ALIGN_FILL);
165: composite.setLayoutData(gd);
166: GridLayout layout = new GridLayout();
167: layout.numColumns = 2;
168: layout.marginHeight = 0;
169: layout.marginWidth = 0;
170: PixelConverter pc = new PixelConverter(composite);
171: layout.verticalSpacing = pc.convertHeightInCharsToPixels(1) / 2;
172: composite.setLayout(layout);
173:
174: /* check box for new editors */
175: fFoldingCheckbox = new Button(composite, SWT.CHECK);
176: fFoldingCheckbox
177: .setText(PreferencesMessages.FoldingConfigurationBlock_enable);
178: gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
179: | GridData.VERTICAL_ALIGN_BEGINNING);
180: fFoldingCheckbox.setLayoutData(gd);
181: fFoldingCheckbox.addSelectionListener(new SelectionListener() {
182: public void widgetSelected(SelectionEvent e) {
183: boolean enabled = fFoldingCheckbox.getSelection();
184: fStore.setValue(
185: PreferenceConstants.EDITOR_FOLDING_ENABLED,
186: enabled);
187: updateCheckboxDependencies();
188: }
189:
190: public void widgetDefaultSelected(SelectionEvent e) {
191: }
192: });
193:
194: Label label = new Label(composite, SWT.CENTER);
195: gd = new GridData(GridData.FILL_HORIZONTAL
196: | GridData.VERTICAL_ALIGN_BEGINNING);
197: label.setLayoutData(gd);
198:
199: if (fProviderDescriptors.size() > 1) {
200: /* list */
201: Composite comboComp = new Composite(composite, SWT.NONE);
202: gd = new GridData(GridData.FILL_HORIZONTAL
203: | GridData.VERTICAL_ALIGN_BEGINNING);
204: GridLayout gridLayout = new GridLayout(2, false);
205: gridLayout.marginWidth = 0;
206: comboComp.setLayout(gridLayout);
207:
208: Label comboLabel = new Label(comboComp, SWT.CENTER);
209: gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
210: | GridData.VERTICAL_ALIGN_CENTER);
211: comboLabel.setLayoutData(gd);
212: comboLabel
213: .setText(PreferencesMessages.FoldingConfigurationBlock_combo_caption);
214:
215: label = new Label(composite, SWT.CENTER);
216: gd = new GridData(GridData.FILL_HORIZONTAL
217: | GridData.VERTICAL_ALIGN_BEGINNING);
218: label.setLayoutData(gd);
219:
220: fProviderCombo = new Combo(comboComp, SWT.READ_ONLY
221: | SWT.DROP_DOWN);
222: gd = new GridData(GridData.HORIZONTAL_ALIGN_END
223: | GridData.VERTICAL_ALIGN_CENTER);
224: fProviderCombo.setLayoutData(gd);
225:
226: fProviderViewer = createProviderViewer();
227: }
228:
229: Composite groupComp = new Composite(composite, SWT.NONE);
230: gd = new GridData(GridData.FILL_BOTH);
231: gd.horizontalSpan = 2;
232: groupComp.setLayoutData(gd);
233: GridLayout gridLayout = new GridLayout(1, false);
234: gridLayout.marginWidth = 0;
235: groupComp.setLayout(gridLayout);
236:
237: /* contributed provider preferences. */
238: fGroup = new Composite(groupComp, SWT.NONE);
239: gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
240: | GridData.VERTICAL_ALIGN_BEGINNING);
241: fGroup.setLayoutData(gd);
242: fStackLayout = new StackLayout();
243: fGroup.setLayout(fStackLayout);
244:
245: return composite;
246: }
247:
248: private ComboViewer createProviderViewer() {
249: /* list viewer */
250: ComboViewer viewer = new ComboViewer(fProviderCombo);
251: viewer.setContentProvider(new IStructuredContentProvider() {
252:
253: /*
254: * @see org.eclipse.jface.viewers.IContentProvider#dispose()
255: */
256: public void dispose() {
257: }
258:
259: /*
260: * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
261: */
262: public void inputChanged(Viewer v, Object oldInput,
263: Object newInput) {
264: }
265:
266: /*
267: * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
268: */
269: public Object[] getElements(Object inputElement) {
270: return fProviderDescriptors.values().toArray();
271: }
272: });
273: viewer.setLabelProvider(new LabelProvider() {
274: /*
275: * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
276: */
277: public Image getImage(Object element) {
278: return null;
279: }
280:
281: /*
282: * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
283: */
284: public String getText(Object element) {
285: return ((JavaFoldingStructureProviderDescriptor) element)
286: .getName();
287: }
288: });
289: viewer
290: .addSelectionChangedListener(new ISelectionChangedListener() {
291:
292: public void selectionChanged(
293: SelectionChangedEvent event) {
294: IStructuredSelection sel = (IStructuredSelection) event
295: .getSelection();
296: if (!sel.isEmpty()) {
297: fStore
298: .setValue(
299: PreferenceConstants.EDITOR_FOLDING_PROVIDER,
300: ((JavaFoldingStructureProviderDescriptor) sel
301: .getFirstElement())
302: .getId());
303: updateListDependencies();
304: }
305: }
306: });
307: viewer.setInput(fProviderDescriptors);
308: viewer.refresh();
309:
310: return viewer;
311: }
312:
313: private void updateCheckboxDependencies() {
314: }
315:
316: void updateListDependencies() {
317: String id = fStore
318: .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
319: JavaFoldingStructureProviderDescriptor desc = (JavaFoldingStructureProviderDescriptor) fProviderDescriptors
320: .get(id);
321: IJavaFoldingPreferenceBlock prefs;
322:
323: if (desc == null) {
324: // safety in case there is no such descriptor
325: String message = Messages
326: .format(
327: PreferencesMessages.FoldingConfigurationBlock_error_not_exist,
328: id);
329: JavaPlugin.log(new Status(IStatus.WARNING, JavaPlugin
330: .getPluginId(), IStatus.OK, message, null));
331: prefs = new ErrorPreferences(message);
332: } else {
333: prefs = (IJavaFoldingPreferenceBlock) fProviderPreferences
334: .get(id);
335: if (prefs == null) {
336: try {
337: prefs = desc.createPreferences();
338: fProviderPreferences.put(id, prefs);
339: } catch (CoreException e) {
340: JavaPlugin.log(e);
341: prefs = new ErrorPreferences(e
342: .getLocalizedMessage());
343: }
344: }
345: }
346:
347: Control control = (Control) fProviderControls.get(id);
348: if (control == null) {
349: control = prefs.createControl(fGroup);
350: if (control == null) {
351: String message = PreferencesMessages.FoldingConfigurationBlock_info_no_preferences;
352: control = new ErrorPreferences(message)
353: .createControl(fGroup);
354: } else {
355: fProviderControls.put(id, control);
356: }
357: }
358: Dialog.applyDialogFont(control);
359: fStackLayout.topControl = control;
360: control.pack();
361: fGroup.layout();
362: fGroup.getParent().layout();
363:
364: prefs.initialize();
365: }
366:
367: public void initialize() {
368: restoreFromPreferences();
369: }
370:
371: public void performOk() {
372: for (Iterator it = fProviderPreferences.values().iterator(); it
373: .hasNext();) {
374: IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it
375: .next();
376: prefs.performOk();
377: }
378: }
379:
380: public void performDefaults() {
381: restoreFromPreferences();
382: for (Iterator it = fProviderPreferences.values().iterator(); it
383: .hasNext();) {
384: IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it
385: .next();
386: prefs.performDefaults();
387: }
388: }
389:
390: public void dispose() {
391: for (Iterator it = fProviderPreferences.values().iterator(); it
392: .hasNext();) {
393: IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it
394: .next();
395: prefs.dispose();
396: }
397: }
398:
399: private void restoreFromPreferences() {
400: boolean enabled = fStore
401: .getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED);
402: fFoldingCheckbox.setSelection(enabled);
403: updateCheckboxDependencies();
404:
405: String id = fStore
406: .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
407: Object provider = fProviderDescriptors.get(id);
408:
409: // Fallback to default
410: if (provider == null) {
411: String message = Messages
412: .format(
413: PreferencesMessages.FoldingConfigurationBlock_warning_providerNotFound_resetToDefault,
414: id);
415: JavaPlugin.log(new Status(IStatus.WARNING, JavaPlugin
416: .getPluginId(), IStatus.OK, message, null));
417:
418: id = JavaPlugin
419: .getDefault()
420: .getPreferenceStore()
421: .getDefaultString(
422: PreferenceConstants.EDITOR_FOLDING_PROVIDER);
423:
424: provider = fProviderDescriptors.get(id);
425: Assert.isNotNull(provider);
426:
427: fStore
428: .setToDefault(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
429: }
430:
431: if (fProviderViewer == null)
432: updateListDependencies();
433: else
434: fProviderViewer.setSelection(new StructuredSelection(
435: provider), true);
436: }
437: }
|