99f7f2ff8bf569698ed4fabce352877b0d5e6f55
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / text / folding / JavaFoldingStructureProviderRegistry.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.ui.text.folding;
12
13 import java.util.Collections;
14 import java.util.HashMap;
15 import java.util.Map;
16
17 import net.sourceforge.phpdt.ui.PreferenceConstants;
18 import net.sourceforge.phpdt.ui.text.folding.IJavaFoldingStructureProvider;
19 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
20
21 import org.eclipse.core.runtime.CoreException;
22 import org.eclipse.core.runtime.IConfigurationElement;
23 import org.eclipse.core.runtime.IExtensionRegistry;
24 import org.eclipse.core.runtime.Platform;
25
26 /**
27  * @since 3.0
28  */
29 public class JavaFoldingStructureProviderRegistry {
30
31         private static final String EXTENSION_POINT = "foldingStructureProviders"; //$NON-NLS-1$
32
33         /** The map of descriptors, indexed by their identifiers. */
34         private Map fDescriptors;
35
36         /**
37          * Creates a new instance.
38          */
39         public JavaFoldingStructureProviderRegistry() {
40         }
41
42         /**
43          * Returns an array of <code>IJavaFoldingProviderDescriptor</code>
44          * describing all extension to the <code>foldingProviders</code> extension
45          * point.
46          * 
47          * @return the list of extensions to the
48          *         <code>quickDiffReferenceProvider</code> extension point.
49          */
50         public JavaFoldingStructureProviderDescriptor[] getFoldingProviderDescriptors() {
51                 synchronized (this) {
52                         ensureRegistered();
53                         return (JavaFoldingStructureProviderDescriptor[]) fDescriptors
54                                         .values()
55                                         .toArray(
56                                                         new JavaFoldingStructureProviderDescriptor[fDescriptors
57                                                                         .size()]);
58                 }
59         }
60
61         /**
62          * Returns the folding provider with identifier <code>id</code> or
63          * <code>null</code> if no such provider is registered.
64          * 
65          * @param id
66          *            the identifier for which a provider is wanted
67          * @return the corresponding provider, or <code>null</code> if none can be
68          *         found
69          */
70         public JavaFoldingStructureProviderDescriptor getFoldingProviderDescriptor(
71                         String id) {
72                 synchronized (this) {
73                         ensureRegistered();
74                         return (JavaFoldingStructureProviderDescriptor) fDescriptors
75                                         .get(id);
76                 }
77         }
78
79         /**
80          * Instantiates and returns the provider that is currently configured in the
81          * preferences.
82          * 
83          * @return the current provider according to the preferences
84          */
85         public IJavaFoldingStructureProvider getCurrentFoldingProvider() {
86                 String id = PHPeclipsePlugin.getDefault().getPreferenceStore()
87                                 .getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
88                 JavaFoldingStructureProviderDescriptor desc = getFoldingProviderDescriptor(id);
89                 if (desc != null) {
90                         try {
91                                 return desc.createProvider();
92                         } catch (CoreException e) {
93                                 PHPeclipsePlugin.log(e);
94                         }
95                 }
96                 return null;
97         }
98
99         /**
100          * Ensures that the extensions are read and stored in
101          * <code>fDescriptors</code>.
102          */
103         private void ensureRegistered() {
104                 if (fDescriptors == null)
105                         reloadExtensions();
106         }
107
108         /**
109          * Reads all extensions.
110          * <p>
111          * This method can be called more than once in order to reload from a
112          * changed extension registry.
113          * </p>
114          */
115         public void reloadExtensions() {
116                 IExtensionRegistry registry = Platform.getExtensionRegistry();
117                 Map map = new HashMap();
118
119                 IConfigurationElement[] elements = registry
120                                 .getConfigurationElementsFor(PHPeclipsePlugin.getPluginId(),
121                                                 EXTENSION_POINT);
122                 for (int i = 0; i < elements.length; i++) {
123                         JavaFoldingStructureProviderDescriptor desc = new JavaFoldingStructureProviderDescriptor(
124                                         elements[i]);
125                         map.put(desc.getId(), desc);
126                 }
127
128                 synchronized (this) {
129                         fDescriptors = Collections.unmodifiableMap(map);
130                 }
131         }
132
133 }