--- /dev/null
+/*******************************************************************************
+ * 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.text.folding;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpdt.ui.text.folding.IJavaFoldingStructureProvider;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @since 3.0
+ */
+public class JavaFoldingStructureProviderRegistry {
+
+ private static final String EXTENSION_POINT = "foldingStructureProviders"; //$NON-NLS-1$
+
+ /** The map of descriptors, indexed by their identifiers. */
+ private Map fDescriptors;
+
+ /**
+ * Creates a new instance.
+ */
+ public JavaFoldingStructureProviderRegistry() {
+ }
+
+ /**
+ * Returns an array of <code>IJavaFoldingProviderDescriptor</code>
+ * describing all extension to the <code>foldingProviders</code> extension
+ * point.
+ *
+ * @return the list of extensions to the
+ * <code>quickDiffReferenceProvider</code> extension point.
+ */
+ public JavaFoldingStructureProviderDescriptor[] getFoldingProviderDescriptors() {
+ synchronized (this) {
+ ensureRegistered();
+ return (JavaFoldingStructureProviderDescriptor[]) fDescriptors
+ .values()
+ .toArray(
+ new JavaFoldingStructureProviderDescriptor[fDescriptors
+ .size()]);
+ }
+ }
+
+ /**
+ * Returns the folding provider with identifier <code>id</code> or
+ * <code>null</code> if no such provider is registered.
+ *
+ * @param id
+ * the identifier for which a provider is wanted
+ * @return the corresponding provider, or <code>null</code> if none can be
+ * found
+ */
+ public JavaFoldingStructureProviderDescriptor getFoldingProviderDescriptor(
+ String id) {
+ synchronized (this) {
+ ensureRegistered();
+ return (JavaFoldingStructureProviderDescriptor) fDescriptors
+ .get(id);
+ }
+ }
+
+ /**
+ * Instantiates and returns the provider that is currently configured in the
+ * preferences.
+ *
+ * @return the current provider according to the preferences
+ */
+ public IJavaFoldingStructureProvider getCurrentFoldingProvider() {
+ String id = PHPeclipsePlugin.getDefault().getPreferenceStore()
+ .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
+ JavaFoldingStructureProviderDescriptor desc = getFoldingProviderDescriptor(id);
+ if (desc != null) {
+ try {
+ return desc.createProvider();
+ } catch (CoreException e) {
+ PHPeclipsePlugin.log(e);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Ensures that the extensions are read and stored in
+ * <code>fDescriptors</code>.
+ */
+ private void ensureRegistered() {
+ if (fDescriptors == null)
+ reloadExtensions();
+ }
+
+ /**
+ * Reads all extensions.
+ * <p>
+ * This method can be called more than once in order to reload from a
+ * changed extension registry.
+ * </p>
+ */
+ public void reloadExtensions() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ Map map = new HashMap();
+
+ IConfigurationElement[] elements = registry
+ .getConfigurationElementsFor(PHPeclipsePlugin.getPluginId(),
+ EXTENSION_POINT);
+ for (int i = 0; i < elements.length; i++) {
+ JavaFoldingStructureProviderDescriptor desc = new JavaFoldingStructureProviderDescriptor(
+ elements[i]);
+ map.put(desc.getId(), desc);
+ }
+
+ synchronized (this) {
+ fDescriptors = Collections.unmodifiableMap(map);
+ }
+ }
+
+}