package org.bundlemaker.core.ui.projecteditor.provider.internal; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import org.bundlemaker.core.ui.projecteditor.dnd.IProjectEditorDropProvider; import org.bundlemaker.core.ui.projecteditor.provider.INewProjectContentProviderWizardContribution; import org.bundlemaker.core.ui.projecteditor.provider.IProjectContentProviderEditor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.RegistryFactory; import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler; import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; /** * <p> * </p> * */ public class ProjectEditorContributionRegistry implements IExtensionChangeHandler { /** - */ public static final String EXTENSION_POINT_ID = "org.bundlemaker.core.ui.projecteditor"; /** - */ private ExtensionTracker _tracker; /** - */ private final List<ProjectEditorContribution> _projectEditorContributions = new CopyOnWriteArrayList<ProjectEditorContribution>(); /** * <p> * </p> */ public ProjectEditorContributionRegistry() { // get the extension registry IExtensionRegistry registry = RegistryFactory.getRegistry(); // get the extension points IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_POINT_ID); // get the extension tracker _tracker = new ExtensionTracker(registry); // for (IExtension extension : extensionPoint.getExtensions()) { addExtension(_tracker, extension); } // register IExtensionChangeHandler _tracker.registerHandler(this, ExtensionTracker.createExtensionPointFilter(extensionPoint)); } /** * <p> * </p> */ public void dispose() { _tracker.unregisterHandler(this); } /** * <p> * </p> * * @return */ public Set<IProjectContentProviderEditor> getContentProviderEditors() { Set<IProjectContentProviderEditor> result = new HashSet<IProjectContentProviderEditor>(); for (ProjectEditorContribution projectEditorContribution : _projectEditorContributions) { if (projectEditorContribution.hasContentProviderEditor()) { result.add(projectEditorContribution.getContentProviderEditor()); } } return result; } public Set<IProjectEditorDropProvider> getDropProviders() { Set<IProjectEditorDropProvider> result = new HashSet<IProjectEditorDropProvider>(); for (ProjectEditorContribution projectEditorContribution : _projectEditorContributions) { if (projectEditorContribution.hasDropProvider()) { result.add(projectEditorContribution.getDropProvider()); } } return result; } public Set<INewProjectContentProviderWizardContribution> getNewProjectContentProviderWizardContributions() { Set<INewProjectContentProviderWizardContribution> result = new HashSet<INewProjectContentProviderWizardContribution>(); for (ProjectEditorContribution projectEditorContribution : _projectEditorContributions) { if (projectEditorContribution.hasNewProjectContentProviderWizardContribution()) { result.add(projectEditorContribution.getNewProjectContentProviderWizardContribution()); } } return result; } /** * {@inheritDoc} */ @Override public void addExtension(IExtensionTracker tracker, IExtension extension) { try { // instantiate ProjectEditorContribution contribution = createProjectEditorContributionFromExtension(extension); // register _tracker.registerObject(extension, contribution, IExtensionTracker.REF_STRONG); // add _projectEditorContributions.add(contribution); } catch (CoreException e) { // } } @Override public void removeExtension(IExtension extension, Object[] objects) { for (Object object : objects) { ProjectEditorContribution contribution = (ProjectEditorContribution) object; _projectEditorContributions.remove(contribution); _tracker.unregisterObject(extension, contribution); } } /** * <p> * </p> * * @param extension * @return * @throws CoreException */ private ProjectEditorContribution createProjectEditorContributionFromExtension(IExtension extension) throws CoreException { // IConfigurationElement[] configurationElements = extension.getConfigurationElements(); IProjectContentProviderEditor projectContentProviderEditor = null; IProjectEditorDropProvider dropProvider = null; INewProjectContentProviderWizardContribution newProjectContentProviderWizardContribution = null; // read contributions for (IConfigurationElement iConfigurationElement : configurationElements) { if ("provider-editor".equals(iConfigurationElement.getName())) { projectContentProviderEditor = (IProjectContentProviderEditor) iConfigurationElement .createExecutableExtension("class"); } else if ("drop-provider".equals(iConfigurationElement.getName())) { dropProvider = (IProjectEditorDropProvider) iConfigurationElement.createExecutableExtension("class"); } if ("new-wizard-contribution".equals(iConfigurationElement.getName())) { newProjectContentProviderWizardContribution = (INewProjectContentProviderWizardContribution) iConfigurationElement .createExecutableExtension("class"); } } // create contribution ProjectEditorContribution projectEditorContribution = new ProjectEditorContribution(projectContentProviderEditor, dropProvider, newProjectContentProviderWizardContribution); return projectEditorContribution; } private static final class ProjectEditorContribution { private final IProjectContentProviderEditor _contentProviderEditor; private final IProjectEditorDropProvider _dropProvider; private final INewProjectContentProviderWizardContribution _newProjectContentProviderWizardContribution; /** * @param contentProviderEditor * @param dropProvider * @param newProjectContentProviderWizardContribution */ public ProjectEditorContribution(IProjectContentProviderEditor contentProviderEditor, IProjectEditorDropProvider dropProvider, INewProjectContentProviderWizardContribution newProjectContentProviderWizardContribution) { super(); _contentProviderEditor = contentProviderEditor; _dropProvider = dropProvider; _newProjectContentProviderWizardContribution = newProjectContentProviderWizardContribution; } /** * @return the contentProviderEditor */ public IProjectContentProviderEditor getContentProviderEditor() { return _contentProviderEditor; } /** * @return the dropProvider */ public IProjectEditorDropProvider getDropProvider() { return _dropProvider; } /** * @return the newProjectContentProviderWizardContribution */ public INewProjectContentProviderWizardContribution getNewProjectContentProviderWizardContribution() { return _newProjectContentProviderWizardContribution; } public boolean hasContentProviderEditor() { return _contentProviderEditor != null; } public boolean hasDropProvider() { return _dropProvider != null; } public boolean hasNewProjectContentProviderWizardContribution() { return _newProjectContentProviderWizardContribution != null; } } }