1) Moved net.sourceforge.phpeclipse.ui\src\net\sourceforge\phpdt back to net.sourcefo...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / preferences / FoldingConfigurationBlock.java
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 (file)
index 0000000..cac7948
--- /dev/null
@@ -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();
+               }
+       }
+}