| /******************************************************************************* |
| * Copyright (c) 2006, 2007 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ui.internal.commands; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.core.commands.Category; |
| import org.eclipse.core.commands.Command; |
| import org.eclipse.core.commands.IExecutionListener; |
| import org.eclipse.core.commands.IHandler; |
| import org.eclipse.core.commands.ParameterType; |
| import org.eclipse.core.commands.ParameterizedCommand; |
| import org.eclipse.core.commands.SerializationException; |
| import org.eclipse.core.commands.common.NotDefinedException; |
| import org.eclipse.ui.commands.IElementReference; |
| import org.eclipse.ui.commands.ICommandService; |
| import org.eclipse.ui.menus.UIElement; |
| |
| /** |
| * A command service which delegates almost all responsibility to the parent |
| * service. |
| * <p> |
| * This class is not intended for use outside of the |
| * <code>org.eclipse.ui.workbench</code> plug-in. |
| * </p> |
| * |
| * @since 3.2 |
| */ |
| public class SlaveCommandService implements ICommandService { |
| |
| private Collection fExecutionListeners = new ArrayList(); |
| |
| /** |
| * The collection of ICallbackReferences added through this service. |
| * |
| * @since 3.3 |
| */ |
| private Set fCallbackCache = new HashSet(); |
| |
| private ICommandService fParentService; |
| |
| /** |
| * The scoping constant added to callback registrations submitted through |
| * this service. |
| * |
| * @since 3.3 |
| */ |
| private String fScopingName; |
| |
| /** |
| * The object to scope. In theory, the service locator that would find this |
| * service. |
| * |
| * @since 3.3 |
| */ |
| private Object fScopingValue; |
| |
| /** |
| * Build the slave service. |
| * |
| * @param parent |
| * the parent service. This must not be <code>null</code>. |
| */ |
| public SlaveCommandService(ICommandService parent, String scopeName, |
| Object scopeValue) { |
| if (parent == null) { |
| throw new NullPointerException( |
| "The parent command service must not be null"); //$NON-NLS-1$ |
| } |
| fParentService = parent; |
| fScopingName = scopeName; |
| fScopingValue = scopeValue; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#addExecutionListener(org.eclipse.core.commands.IExecutionListener) |
| */ |
| public void addExecutionListener(IExecutionListener listener) { |
| if (!fExecutionListeners.contains(listener)) { |
| fExecutionListeners.add(listener); |
| } |
| fParentService.addExecutionListener(listener); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#defineUncategorizedCategory(java.lang.String, |
| * java.lang.String) |
| */ |
| public void defineUncategorizedCategory(String name, String description) { |
| fParentService.defineUncategorizedCategory(name, description); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#deserialize(java.lang.String) |
| */ |
| public ParameterizedCommand deserialize( |
| String serializedParameterizedCommand) throws NotDefinedException, |
| SerializationException { |
| return fParentService.deserialize(serializedParameterizedCommand); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.services.IDisposable#dispose() |
| */ |
| public void dispose() { |
| if (!fExecutionListeners.isEmpty()) { |
| Object[] array = fExecutionListeners.toArray(); |
| for (int i = 0; i < array.length; i++) { |
| removeExecutionListener((IExecutionListener) array[i]); |
| } |
| fExecutionListeners.clear(); |
| } |
| if (!fCallbackCache.isEmpty()) { |
| Object[] array = fCallbackCache.toArray(); |
| for (int i = 0; i < array.length; i++) { |
| unregisterElement((IElementReference) array[i]); |
| } |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getCategory(java.lang.String) |
| */ |
| public Category getCategory(String categoryId) { |
| return fParentService.getCategory(categoryId); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getCommand(java.lang.String) |
| */ |
| public Command getCommand(String commandId) { |
| return fParentService.getCommand(commandId); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedCategories() |
| */ |
| public Category[] getDefinedCategories() { |
| return fParentService.getDefinedCategories(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedCategoryIds() |
| */ |
| public Collection getDefinedCategoryIds() { |
| return fParentService.getDefinedCategoryIds(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedCommandIds() |
| */ |
| public Collection getDefinedCommandIds() { |
| return fParentService.getDefinedCommandIds(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedCommands() |
| */ |
| public Command[] getDefinedCommands() { |
| return fParentService.getDefinedCommands(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedParameterTypeIds() |
| */ |
| public Collection getDefinedParameterTypeIds() { |
| return fParentService.getDefinedParameterTypeIds(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getDefinedParameterTypes() |
| */ |
| public ParameterType[] getDefinedParameterTypes() { |
| return fParentService.getDefinedParameterTypes(); |
| } |
| |
| public final String getHelpContextId(final Command command) |
| throws NotDefinedException { |
| return fParentService.getHelpContextId(command); |
| } |
| |
| public final String getHelpContextId(final String commandId) |
| throws NotDefinedException { |
| return fParentService.getHelpContextId(commandId); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#getParameterType(java.lang.String) |
| */ |
| public ParameterType getParameterType(String parameterTypeId) { |
| return fParentService.getParameterType(parameterTypeId); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#readRegistry() |
| */ |
| public void readRegistry() { |
| fParentService.readRegistry(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#removeExecutionListener(org.eclipse.core.commands.IExecutionListener) |
| */ |
| public void removeExecutionListener(IExecutionListener listener) { |
| fExecutionListeners.remove(listener); |
| fParentService.removeExecutionListener(listener); |
| } |
| |
| public final void setHelpContextId(final IHandler handler, |
| final String helpContextId) { |
| fParentService.setHelpContextId(handler, helpContextId); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#refreshElements(java.lang.String, |
| * java.util.Map) |
| */ |
| public void refreshElements(String commandId, Map filter) { |
| fParentService.refreshElements(commandId, filter); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#registerElementForCommand(org.eclipse.core.commands.ParameterizedCommand, |
| * org.eclipse.ui.menus.UIElement) |
| */ |
| public IElementReference registerElementForCommand( |
| ParameterizedCommand command, UIElement element) |
| throws NotDefinedException { |
| if (!command.getCommand().isDefined()) { |
| throw new NotDefinedException( |
| "Cannot define a callback for undefined command " //$NON-NLS-1$ |
| + command.getCommand().getId()); |
| } |
| if (element == null) { |
| throw new NotDefinedException("No callback defined for command " //$NON-NLS-1$ |
| + command.getCommand().getId()); |
| } |
| |
| ElementReference ref = new ElementReference(command.getId(), element, |
| command.getParameterMap()); |
| registerElement(ref); |
| return ref; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#registerElement(org.eclipse.ui.commands.IElementReference) |
| */ |
| public void registerElement(IElementReference elementReference) { |
| fCallbackCache.add(elementReference); |
| elementReference.getParameters().put(fScopingName, fScopingValue); |
| fParentService.registerElement(elementReference); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandService#unregisterElement(org.eclipse.ui.commands.IElementReference) |
| */ |
| public void unregisterElement(IElementReference elementReference) { |
| fCallbackCache.remove(elementReference); |
| fParentService.unregisterElement(elementReference); |
| } |
| } |