/*******************************************************************************
* 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 IJavaFoldingProviderDescriptor
* describing all extension to the foldingProviders
extension
* point.
*
* @return the list of extensions to the
* quickDiffReferenceProvider
extension point.
*/
public JavaFoldingStructureProviderDescriptor[] getFoldingProviderDescriptors() {
synchronized (this) {
ensureRegistered();
return (JavaFoldingStructureProviderDescriptor[]) fDescriptors
.values()
.toArray(
new JavaFoldingStructureProviderDescriptor[fDescriptors
.size()]);
}
}
/**
* Returns the folding provider with identifier id
or
* null
if no such provider is registered.
*
* @param id
* the identifier for which a provider is wanted
* @return the corresponding provider, or null
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
* fDescriptors
.
*/
private void ensureRegistered() {
if (fDescriptors == null)
reloadExtensions();
}
/**
* Reads all extensions.
*
* This method can be called more than once in order to reload from a * changed extension registry. *
*/ 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); } } }