| /******************************************************************************* |
| * 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 org.eclipse.ui.internal.contexts; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionDelta; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.IRegistryChangeEvent; |
| import org.eclipse.core.runtime.IRegistryChangeListener; |
| import org.eclipse.ui.internal.util.ConfigurationElementMemento; |
| |
| final class ExtensionContextRegistry extends AbstractContextRegistry { |
| private List contextContextBindingDefinitions; |
| private List contextDefinitions; |
| private IExtensionRegistry extensionRegistry; |
| |
| ExtensionContextRegistry(IExtensionRegistry extensionRegistry) { |
| if (extensionRegistry == null) |
| throw new NullPointerException(); |
| |
| this.extensionRegistry = extensionRegistry; |
| |
| this |
| .extensionRegistry |
| .addRegistryChangeListener(new IRegistryChangeListener() { |
| public void registryChanged(IRegistryChangeEvent registryChangeEvent) { |
| IExtensionDelta[] extensionDeltas = |
| registryChangeEvent.getExtensionDeltas( |
| Persistence.PACKAGE_PREFIX, |
| Persistence.PACKAGE_BASE); |
| |
| if (extensionDeltas.length != 0) |
| try { |
| load(); |
| } catch (IOException eIO) { |
| } |
| } |
| }); |
| |
| try { |
| load(); |
| } catch (IOException eIO) { |
| } |
| } |
| |
| private String getNamespace(IConfigurationElement configurationElement) { |
| String namespace = null; |
| |
| if (configurationElement != null) { |
| IExtension extension = configurationElement.getDeclaringExtension(); |
| |
| if (extension != null) |
| namespace = extension.getNamespace(); |
| } |
| |
| return namespace; |
| } |
| |
| private void load() throws IOException { |
| if (contextContextBindingDefinitions == null) |
| contextContextBindingDefinitions = new ArrayList(); |
| else |
| contextContextBindingDefinitions.clear(); |
| |
| if (contextDefinitions == null) |
| contextDefinitions = new ArrayList(); |
| else |
| contextDefinitions.clear(); |
| |
| // TODO deprecated start |
| IConfigurationElement[] deprecatedConfigurationElements = extensionRegistry.getConfigurationElementsFor("org.eclipse.ui.acceleratorScopes"); //$NON-NLS-1$ |
| |
| for (int i = 0; i < deprecatedConfigurationElements.length; i++) { |
| IConfigurationElement deprecatedConfigurationElement = |
| deprecatedConfigurationElements[i]; |
| String name = deprecatedConfigurationElement.getName(); |
| |
| if ("acceleratorScope".equals(name)) //$NON-NLS-1$ |
| readContextDefinition(deprecatedConfigurationElement); |
| } |
| |
| deprecatedConfigurationElements = extensionRegistry.getConfigurationElementsFor("org.eclipse.ui.commands"); //$NON-NLS-1$ |
| |
| for (int i = 0; i < deprecatedConfigurationElements.length; i++) { |
| IConfigurationElement deprecatedConfigurationElement = |
| deprecatedConfigurationElements[i]; |
| String name = deprecatedConfigurationElement.getName(); |
| |
| if ("scope".equals(name)) //$NON-NLS-1$ |
| readContextDefinition(deprecatedConfigurationElement); |
| } |
| // TODO deprecated end |
| |
| IConfigurationElement[] configurationElements = |
| extensionRegistry.getConfigurationElementsFor( |
| Persistence.PACKAGE_FULL); |
| |
| for (int i = 0; i < configurationElements.length; i++) { |
| IConfigurationElement configurationElement = |
| configurationElements[i]; |
| String name = configurationElement.getName(); |
| |
| if (Persistence.TAG_CONTEXT.equals(name)) |
| readContextDefinition(configurationElement); |
| } |
| |
| boolean contextRegistryChanged = false; |
| |
| if (!contextContextBindingDefinitions |
| .equals(super.contextContextBindingDefinitions)) { |
| super.contextContextBindingDefinitions = |
| Collections.unmodifiableList(contextContextBindingDefinitions); |
| contextRegistryChanged = true; |
| } |
| |
| if (!contextDefinitions.equals(super.contextDefinitions)) { |
| super.contextDefinitions = |
| Collections.unmodifiableList(contextDefinitions); |
| contextRegistryChanged = true; |
| } |
| |
| if (contextRegistryChanged) |
| fireContextRegistryChanged(); |
| } |
| |
| private void readContextDefinition(IConfigurationElement configurationElement) { |
| ContextDefinition contextDefinition = |
| Persistence.readContextDefinition( |
| new ConfigurationElementMemento(configurationElement), |
| getNamespace(configurationElement)); |
| |
| if (contextDefinition != null) |
| contextDefinitions.add(contextDefinition); |
| } |
| } |