X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/FoldingConfigurationBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/FoldingConfigurationBlock.java new file mode 100644 index 0000000..cac7948 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/FoldingConfigurationBlock.java @@ -0,0 +1,399 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package net.sourceforge.phpdt.internal.ui.preferences; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.sourceforge.phpdt.internal.ui.text.folding.JavaFoldingStructureProviderDescriptor; +import net.sourceforge.phpdt.internal.ui.text.folding.JavaFoldingStructureProviderRegistry; +import net.sourceforge.phpdt.internal.ui.util.PixelConverter; +import net.sourceforge.phpdt.ui.PreferenceConstants; +import net.sourceforge.phpdt.ui.text.folding.IJavaFoldingPreferenceBlock; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +//incastrix +//import org.eclipse.jface.text.Assert; +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +/** + * Configures Java Editor folding preferences. + * + * @since 3.0 + */ +class FoldingConfigurationBlock { + + private static class ErrorPreferences implements + IJavaFoldingPreferenceBlock { + private String fMessage; + + protected ErrorPreferences(String message) { + fMessage = message; + } + + /* + * @see net.sourceforge.phpdt.internal.ui.text.folding.IJavaFoldingPreferences#createControl(org.eclipse.swt.widgets.Group) + */ + public Control createControl(Composite composite) { + Composite inner = new Composite(composite, SWT.NONE); + inner.setLayout(new FillLayout(SWT.VERTICAL)); + + Label label = new Label(inner, SWT.CENTER); + label.setText(fMessage); + + return inner; + } + + public void initialize() { + } + + public void performOk() { + } + + public void performDefaults() { + } + + public void dispose() { + } + + } + + /** The overlay preference store. */ + private final OverlayPreferenceStore fStore; + + /* The controls */ + private Combo fProviderCombo; + + private Button fFoldingCheckbox; + + private ComboViewer fProviderViewer; + + private Map fProviderDescriptors; + + private Composite fGroup; + + private Map fProviderPreferences; + + private Map fProviderControls; + + private StackLayout fStackLayout; + + public FoldingConfigurationBlock(OverlayPreferenceStore store) { + Assert.isNotNull(store); + fStore = store; + fStore.addKeys(createOverlayStoreKeys()); + fProviderDescriptors = createListModel(); + fProviderPreferences = new HashMap(); + fProviderControls = new HashMap(); + } + + private Map createListModel() { + JavaFoldingStructureProviderRegistry reg = PHPeclipsePlugin + .getDefault().getFoldingStructureProviderRegistry(); + reg.reloadExtensions(); + JavaFoldingStructureProviderDescriptor[] descs = reg + .getFoldingProviderDescriptors(); + Map map = new HashMap(); + for (int i = 0; i < descs.length; i++) { + map.put(descs[i].getId(), descs[i]); + } + return map; + } + + private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() { + + ArrayList overlayKeys = new ArrayList(); + + overlayKeys.add(new OverlayPreferenceStore.OverlayKey( + OverlayPreferenceStore.BOOLEAN, + PreferenceConstants.EDITOR_FOLDING_ENABLED)); + overlayKeys.add(new OverlayPreferenceStore.OverlayKey( + OverlayPreferenceStore.STRING, + PreferenceConstants.EDITOR_FOLDING_PROVIDER)); + + OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys + .size()]; + overlayKeys.toArray(keys); + return keys; + } + + /** + * Creates page for folding preferences. + * + * @param parent + * the parent composite + * @return the control for the preference page + */ + Control createControl(Composite parent) { + + Composite composite = new Composite(parent, SWT.NULL); + // assume parent page uses griddata + GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER + | GridData.VERTICAL_ALIGN_FILL); + composite.setLayoutData(gd); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + PixelConverter pc = new PixelConverter(composite); + layout.verticalSpacing = pc.convertHeightInCharsToPixels(1) / 2; + composite.setLayout(layout); + + /* check box for new editors */ + fFoldingCheckbox = new Button(composite, SWT.CHECK); + fFoldingCheckbox.setText(PreferencesMessages + .getString("FoldingConfigurationBlock.enable")); //$NON-NLS-1$ + gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING + | GridData.VERTICAL_ALIGN_BEGINNING); + fFoldingCheckbox.setLayoutData(gd); + fFoldingCheckbox.addSelectionListener(new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + boolean enabled = fFoldingCheckbox.getSelection(); + fStore.setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, + enabled); + updateCheckboxDependencies(); + } + + public void widgetDefaultSelected(SelectionEvent e) { + } + }); + + Label label = new Label(composite, SWT.CENTER); + gd = new GridData(GridData.FILL_HORIZONTAL + | GridData.VERTICAL_ALIGN_BEGINNING); + label.setLayoutData(gd); + + /* list */ + Composite comboComp = new Composite(composite, SWT.NONE); + gd = new GridData(GridData.FILL_HORIZONTAL + | GridData.VERTICAL_ALIGN_BEGINNING); + GridLayout gridLayout = new GridLayout(2, false); + gridLayout.marginWidth = 0; + comboComp.setLayout(gridLayout); + + Label comboLabel = new Label(comboComp, SWT.CENTER); + gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING + | GridData.VERTICAL_ALIGN_CENTER); + comboLabel.setLayoutData(gd); + comboLabel.setText(PreferencesMessages + .getString("FoldingConfigurationBlock.combo_caption")); //$NON-NLS-1$ + + label = new Label(composite, SWT.CENTER); + gd = new GridData(GridData.FILL_HORIZONTAL + | GridData.VERTICAL_ALIGN_BEGINNING); + label.setLayoutData(gd); + + fProviderCombo = new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN); + gd = new GridData(GridData.HORIZONTAL_ALIGN_END + | GridData.VERTICAL_ALIGN_CENTER); + fProviderCombo.setLayoutData(gd); + + /* list viewer */ + fProviderViewer = new ComboViewer(fProviderCombo); + fProviderViewer.setContentProvider(new IStructuredContentProvider() { + + /* + * @see org.eclipse.jface.viewers.IContentProvider#dispose() + */ + public void dispose() { + } + + /* + * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) + */ + public void inputChanged(Viewer viewer, Object oldInput, + Object newInput) { + } + + /* + * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) + */ + public Object[] getElements(Object inputElement) { + return fProviderDescriptors.values().toArray(); + } + }); + fProviderViewer.setLabelProvider(new LabelProvider() { + /* + * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) + */ + public Image getImage(Object element) { + return null; + } + + /* + * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) + */ + public String getText(Object element) { + return ((JavaFoldingStructureProviderDescriptor) element) + .getName(); + } + }); + fProviderViewer + .addSelectionChangedListener(new ISelectionChangedListener() { + + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection sel = (IStructuredSelection) event + .getSelection(); + if (!sel.isEmpty()) { + fStore + .setValue( + PreferenceConstants.EDITOR_FOLDING_PROVIDER, + ((JavaFoldingStructureProviderDescriptor) sel + .getFirstElement()).getId()); + updateListDependencies(); + } + } + }); + fProviderViewer.setInput(fProviderDescriptors); + fProviderViewer.refresh(); + + Composite groupComp = new Composite(composite, SWT.NONE); + gd = new GridData(GridData.FILL_BOTH); + gd.horizontalSpan = 2; + groupComp.setLayoutData(gd); + gridLayout = new GridLayout(1, false); + gridLayout.marginWidth = 0; + groupComp.setLayout(gridLayout); + + /* contributed provider preferences. */ + fGroup = new Composite(groupComp, SWT.NONE); + gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING + | GridData.VERTICAL_ALIGN_BEGINNING); + fGroup.setLayoutData(gd); + fStackLayout = new StackLayout(); + fGroup.setLayout(fStackLayout); + + return composite; + } + + private void updateCheckboxDependencies() { + } + + void updateListDependencies() { + String id = fStore + .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER); + JavaFoldingStructureProviderDescriptor desc = (JavaFoldingStructureProviderDescriptor) fProviderDescriptors + .get(id); + IJavaFoldingPreferenceBlock prefs; + + if (desc == null) { + // safety in case there is no such descriptor + String message = PreferencesMessages + .getString("FoldingConfigurationBlock.error.not_exist"); //$NON-NLS-1$ + PHPeclipsePlugin.log(new Status(IStatus.WARNING, PHPeclipsePlugin + .getPluginId(), IStatus.OK, message, null)); + prefs = new ErrorPreferences(message); + } else { + prefs = (IJavaFoldingPreferenceBlock) fProviderPreferences.get(id); + if (prefs == null) { + try { + prefs = desc.createPreferences(); + fProviderPreferences.put(id, prefs); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + prefs = new ErrorPreferences(e.getLocalizedMessage()); + } + } + } + + Control control = (Control) fProviderControls.get(id); + if (control == null) { + control = prefs.createControl(fGroup); + if (control == null) { + String message = PreferencesMessages + .getString("FoldingConfigurationBlock.info.no_preferences"); //$NON-NLS-1$ + control = new ErrorPreferences(message).createControl(fGroup); + } else { + fProviderControls.put(id, control); + } + } + fStackLayout.topControl = control; + control.pack(); + fGroup.layout(); + fGroup.getParent().layout(); + + prefs.initialize(); + } + + void initialize() { + restoreFromPreferences(); + } + + void performOk() { + for (Iterator it = fProviderPreferences.values().iterator(); it + .hasNext();) { + IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it + .next(); + prefs.performOk(); + } + } + + void performDefaults() { + restoreFromPreferences(); + for (Iterator it = fProviderPreferences.values().iterator(); it + .hasNext();) { + IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it + .next(); + prefs.performDefaults(); + } + } + + void dispose() { + for (Iterator it = fProviderPreferences.values().iterator(); it + .hasNext();) { + IJavaFoldingPreferenceBlock prefs = (IJavaFoldingPreferenceBlock) it + .next(); + prefs.dispose(); + } + } + + private void restoreFromPreferences() { + boolean enabled = fStore + .getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED); + fFoldingCheckbox.setSelection(enabled); + updateCheckboxDependencies(); + + String id = fStore + .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER); + Object provider = fProviderDescriptors.get(id); + if (provider != null) { + fProviderViewer.setSelection(new StructuredSelection(provider), + true); + updateListDependencies(); + } + } +}