blob: 1099cdd79ea7d78f4ea41d7a48579db1cbbd99db [file] [log] [blame]
/*******************************************************************************
* 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.commands;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.registry.IConfigurationElement;
import org.eclipse.core.runtime.registry.IExtension;
import org.eclipse.core.runtime.registry.IExtensionDelta;
import org.eclipse.core.runtime.registry.IExtensionRegistry;
import org.eclipse.core.runtime.registry.IRegistryChangeEvent;
import org.eclipse.core.runtime.registry.IRegistryChangeListener;
import org.eclipse.ui.internal.util.ConfigurationElementMemento;
public final class ExtensionCommandRegistry extends AbstractCommandRegistry {
private List activeKeyConfigurationDefinitions;
private List activityBindingDefinitions;
private List categoryDefinitions;
private List commandDefinitions;
private IExtensionRegistry extensionRegistry;
private List imageBindingDefinitions;
private List keyConfigurationDefinitions;
private List keySequenceBindingDefinitions;
public ExtensionCommandRegistry(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 void load()
throws IOException {
if (activeKeyConfigurationDefinitions == null)
activeKeyConfigurationDefinitions = new ArrayList();
else
activeKeyConfigurationDefinitions.clear();
if (activityBindingDefinitions == null)
activityBindingDefinitions = new ArrayList();
else
activityBindingDefinitions.clear();
if (categoryDefinitions == null)
categoryDefinitions = new ArrayList();
else
categoryDefinitions.clear();
if (commandDefinitions == null)
commandDefinitions = new ArrayList();
else
commandDefinitions.clear();
if (imageBindingDefinitions == null)
imageBindingDefinitions = new ArrayList();
else
imageBindingDefinitions.clear();
if (keyConfigurationDefinitions == null)
keyConfigurationDefinitions = new ArrayList();
else
keyConfigurationDefinitions.clear();
if (keySequenceBindingDefinitions == null)
keySequenceBindingDefinitions = new ArrayList();
else
keySequenceBindingDefinitions.clear();
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_ACTIVE_KEY_CONFIGURATION.equals(name))
readActiveKeyConfigurationDefinition(configurationElement);
else if (Persistence.TAG_ACTIVITY_BINDING.equals(name))
readActivityBindingDefinition(configurationElement);
else if (Persistence.TAG_CATEGORY.equals(name))
readCategoryDefinition(configurationElement);
else if (Persistence.TAG_COMMAND.equals(name))
readCommandDefinition(configurationElement);
else if (Persistence.TAG_IMAGE_BINDING.equals(name))
readImageBindingDefinition(configurationElement);
else if (Persistence.TAG_KEY_CONFIGURATION.equals(name))
readKeyConfigurationDefinition(configurationElement);
else if (Persistence.TAG_KEY_SEQUENCE_BINDING.equals(name))
readKeySequenceBindingDefinition(configurationElement);
}
boolean commandRegistryChanged = false;
if (!activeKeyConfigurationDefinitions.equals(super.activeKeyConfigurationDefinitions)) {
super.activeKeyConfigurationDefinitions = Collections.unmodifiableList(activeKeyConfigurationDefinitions);
commandRegistryChanged = true;
}
if (!activityBindingDefinitions.equals(super.activityBindingDefinitions)) {
super.activityBindingDefinitions = Collections.unmodifiableList(activityBindingDefinitions);
commandRegistryChanged = true;
}
if (!categoryDefinitions.equals(super.categoryDefinitions)) {
super.categoryDefinitions = Collections.unmodifiableList(categoryDefinitions);
commandRegistryChanged = true;
}
if (!commandDefinitions.equals(super.commandDefinitions)) {
super.commandDefinitions = Collections.unmodifiableList(commandDefinitions);
commandRegistryChanged = true;
}
if (!imageBindingDefinitions.equals(super.imageBindingDefinitions)) {
super.imageBindingDefinitions = Collections.unmodifiableList(imageBindingDefinitions);
commandRegistryChanged = true;
}
if (!keyConfigurationDefinitions.equals(super.keyConfigurationDefinitions)) {
super.keyConfigurationDefinitions = Collections.unmodifiableList(keyConfigurationDefinitions);
commandRegistryChanged = true;
}
if (!keySequenceBindingDefinitions.equals(super.keySequenceBindingDefinitions)) {
super.keySequenceBindingDefinitions = Collections.unmodifiableList(keySequenceBindingDefinitions);
commandRegistryChanged = true;
}
if (commandRegistryChanged)
fireCommandRegistryChanged();
}
private String getPluginId(IConfigurationElement configurationElement) {
String pluginId = null;
if (configurationElement != null) {
IExtension extension = configurationElement.getDeclaringExtension();
if (extension != null)
pluginId = extension.getParentIdentifier();
}
return pluginId;
}
private void readActiveKeyConfigurationDefinition(IConfigurationElement configurationElement) {
IActiveKeyConfigurationDefinition activeKeyConfigurationDefinition = Persistence.readActiveKeyConfigurationDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (activeKeyConfigurationDefinition != null)
activeKeyConfigurationDefinitions.add(activeKeyConfigurationDefinition);
}
private void readActivityBindingDefinition(IConfigurationElement configurationElement) {
IActivityBindingDefinition activityBindingDefinition = Persistence.readActivityBindingDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (activityBindingDefinition != null)
activityBindingDefinitions.add(activityBindingDefinition);
}
private void readCategoryDefinition(IConfigurationElement configurationElement) {
ICategoryDefinition categoryDefinition = Persistence.readCategoryDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (categoryDefinition != null)
categoryDefinitions.add(categoryDefinition);
}
private void readCommandDefinition(IConfigurationElement configurationElement) {
ICommandDefinition commandDefinition = Persistence.readCommandDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (commandDefinition != null)
commandDefinitions.add(commandDefinition);
}
private void readImageBindingDefinition(IConfigurationElement configurationElement) {
IImageBindingDefinition imageBinding = Persistence.readImageBindingDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (imageBinding != null)
imageBindingDefinitions.add(imageBinding);
}
private void readKeyConfigurationDefinition(IConfigurationElement configurationElement) {
IKeyConfigurationDefinition keyConfigurationDefinition = Persistence.readKeyConfigurationDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (keyConfigurationDefinition != null)
keyConfigurationDefinitions.add(keyConfigurationDefinition);
}
private void readKeySequenceBindingDefinition(IConfigurationElement configurationElement) {
IKeySequenceBindingDefinition keySequenceBindingDefinition = Persistence.readKeySequenceBindingDefinition(new ConfigurationElementMemento(configurationElement), getPluginId(configurationElement));
if (keySequenceBindingDefinition != null)
keySequenceBindingDefinitions.add(keySequenceBindingDefinition);
}
}