blob: 9361d0fb754ce93fe8e5dca68f4f8e1b048bb806 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.commands;
import java.util.Collection;
import java.util.Map;
import org.eclipse.core.commands.Category;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.CommandManager;
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.menus.UIElement;
import org.eclipse.ui.services.IDisposable;
/**
* <p>
* Provides services related to the command architecture within the workbench.
* This service can be used to access the set of commands and command
* categories.
* </p>
* <p>
* This service can be acquired from your service locator:
* </p>
*
* <pre>
* ICommandService service = (ICommandService) getSite().getService(ICommandService.class);
* </pre>
* <ul>
* <li>This service is available globally.</li>
* </ul>
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*
* @since 3.1
*/
public interface ICommandService extends IDisposable {
/**
* The identifier of the category in which all auto-generated commands will
* appear. This value must never be <code>null</code>.
*
* @since 3.2
*/
String AUTOGENERATED_CATEGORY_ID = CommandManager.AUTOGENERATED_CATEGORY_ID;
/**
* Adds an execution listener to the command service. This listener will be
* notified as commands are executed.
* <p>
* <b>Note:</b> listeners should be removed when no longer necessary. If not,
* they will be removed when the IServiceLocator used to acquire this service is
* disposed.
* </p>
*
* @param listener The listener to add; must not be <code>null</code>.
* @see #removeExecutionListener(IExecutionListener)
*/
void addExecutionListener(IExecutionListener listener);
/**
* Sets the name and description of the category for uncategorized commands.
* This is the category that will be returned if {@link #getCategory(String)} is
* called with <code>null</code>.
*
* @param name The name of the category for uncategorized commands; must
* not be <code>null</code>.
* @param description The description of the category for uncategorized
* commands; may be <code>null</code>.
* @since 3.2
*/
void defineUncategorizedCategory(String name, String description);
/**
* <p>
* Returns a {@link ParameterizedCommand} with a command and parameterizations
* as specified in the provided <code>serializedParameterizedCommand</code>
* string. The <code>serializedParameterizedCommand</code> must use the format
* returned by {@link ParameterizedCommand#serialize()} and described in the
* Javadoc for that method.
* </p>
* <p>
* If a parameter id encoded in the <code>serializedParameterizedCommand</code>
* does not exist in the encoded command, that parameter id and value are
* ignored. A given parameter id should not be used more than once in
* <code>serializedParameterizedCommand</code>. This will not result in an
* exception, but the value of the parameter when the command is executed cannot
* be specified here.
* </p>
* <p>
* This method will never return <code>null</code>, however it may throw an
* exception if there is a problem processing the serialization string or the
* encoded command is undefined.
* </p>
*
* @param serializedParameterizedCommand a <code>String</code> representing a
* command id and parameter ids and values
* @return a <code>ParameterizedCommand</code> with the command and
* parameterizations encoded in the
* <code>serializedParameterizedCommand</code>
* @throws NotDefinedException if the command indicated in
* <code>serializedParameterizedCommand</code> is
* not defined
* @throws SerializationException if there is an error deserializing
* <code>serializedParameterizedCommand</code>
* @see ParameterizedCommand#serialize()
* @see CommandManager#deserialize(String)
* @since 3.2
*/
ParameterizedCommand deserialize(String serializedParameterizedCommand)
throws NotDefinedException, SerializationException;
/**
* Retrieves the category with the given identifier. If no such category exists,
* then an undefined category with the given id is created.
*
* @param categoryId The identifier to find. If the category is
* <code>null</code>, then a category suitable for
* uncategorized items is defined and returned.
* @return A category with the given identifier, either defined or undefined.
*/
Category getCategory(String categoryId);
/**
* Retrieves the command with the given identifier. If no such command exists,
* then an undefined command with the given id is created.
*
* @param commandId The identifier to find; must not be <code>null</code>.
* @return A command with the given identifier, either defined or undefined.
*/
Command getCommand(String commandId);
/**
* Returns the collection of all of the defined categories in the workbench.
*
* @return The collection of categories (<code>Category</code>) that are
* defined; never <code>null</code>, but may be empty.
* @since 3.2
*/
Category[] getDefinedCategories();
/**
* Returns the collection of the identifiers for all of the defined categories
* in the workbench.
*
* @return The collection of category identifiers (<code>String</code>) that are
* defined; never <code>null</code>, but may be empty.
*/
Collection getDefinedCategoryIds();
/**
* Returns the collection of the identifiers for all of the defined commands in
* the workbench.
*
* @return The collection of command identifiers (<code>String</code>) that are
* defined; never <code>null</code>, but may be empty.
*/
Collection getDefinedCommandIds();
/**
* Returns the collection of all of the defined commands in the workbench.
*
* @return The collection of commands (<code>Command</code>) that are defined;
* never <code>null</code>, but may be empty.
* @since 3.2
*/
Command[] getDefinedCommands();
/**
* Returns the collection of the identifiers for all of the defined command
* parameter types in the workbench.
*
* @return The collection of command parameter type identifiers
* (<code>String</code>) that are defined; never <code>null</code>, but
* may be empty.
* @since 3.2
*/
Collection getDefinedParameterTypeIds();
/**
* Returns the collection of all of the defined command parameter types in the
* workbench.
*
* @return The collection of command parameter types
* (<code>ParameterType</code>) that are defined; never
* <code>null</code>, but may be empty.
* @since 3.2
*/
ParameterType[] getDefinedParameterTypes();
/**
* Gets the help context identifier for a particular command. The command's
* handler is first checked for a help context identifier. If the handler does
* not have a help context identifier, then the help context identifier for the
* command is returned. If neither has a help context identifier, then
* <code>null</code> is returned.
*
* @param command The command for which the help context should be retrieved;
* must not be <code>null</code>.
* @return The help context identifier to use for the given command; may be
* <code>null</code>.
* @throws NotDefinedException If the given command is not defined.
* @since 3.2
*/
String getHelpContextId(Command command) throws NotDefinedException;
/**
* Gets the help context identifier for a particular command. The command's
* handler is first checked for a help context identifier. If the handler does
* not have a help context identifier, then the help context identifier for the
* command is returned. If neither has a help context identifier, then
* <code>null</code> is returned.
*
* @param commandId The identifier of the command for which the help context
* should be retrieved; must not be <code>null</code>.
* @return The help context identifier to use for the given command; may be
* <code>null</code>.
* @throws NotDefinedException If the command with the given identifier is not
* defined.
* @since 3.2
*/
String getHelpContextId(String commandId) throws NotDefinedException;
/**
* Retrieves the command parameter type with the given identifier. If no such
* parameter type exists, then an undefined parameter type with the given id is
* created.
*
* @param parameterTypeId The identifier to find; must not be <code>null</code>.
* @return A command parameter type with the given identifier, either defined or
* undefined.
* @since 3.2
*/
ParameterType getParameterType(String parameterTypeId);
/**
* <p>
* Reads the command information from the registry and the preferences. This
* will overwrite any of the existing information in the command service. This
* method is intended to be called during start-up. When this method completes,
* this command service will reflect the current state of the registry and
* preference store.
* </p>
*/
void readRegistry();
/**
* Removes an execution listener from the command service.
*
* @param listener The listener to remove; must not be <code>null</code>.
*/
void removeExecutionListener(IExecutionListener listener);
/**
* Sets the help context identifier to associate with a particular handler.
*
* @param handler The handler with which to register a help context
* identifier; must not be <code>null</code>.
* @param helpContextId The help context identifier to register; may be
* <code>null</code> if the help context identifier should
* be removed.
* @since 3.2
*/
void setHelpContextId(IHandler handler, String helpContextId);
/**
* Register that this element accepts callbacks for this parameterized command.
* <p>
* <b>Note:</b> elements should be removed when no longer necessary. If not,
* they will be removed when the IServiceLocator used to acquire this service is
* disposed.
* </p>
*
* @param command The parameterized command that is already specialized. Must
* not be <code>null</code>.
* @param element The callback to register for this specialized command
* instance. Must not be <code>null</code>.
* @return A reference for the registered element that can be used to unregister
* it.
* @throws NotDefinedException If the command included in the
* ParameterizedCommand is not defined, or the
* element is <code>null</code>.
* @since 3.3
* @see #unregisterElement(IElementReference)
*/
IElementReference registerElementForCommand(ParameterizedCommand command, UIElement element)
throws NotDefinedException;
/**
* Re-register a callback element provided by the ICommandService. This element
* reference must not currently be held by the ICommandService. i.e. it must
* have been removed using {@link #unregisterElement(IElementReference)}.
* <p>
* <b>Note:</b> elements should be removed when no longer necessary. If not,
* they will be removed when the IServiceLocator used to acquire this service is
* disposed.
* </p>
*
* @param elementReference The reference to re-register. Must not be
* <code>null</code>.
* @since 3.3
* @see #unregisterElement(IElementReference)
*/
void registerElement(IElementReference elementReference);
/**
* Unregister an element callback. It will be removed from the ICommandService.
* The same service that is used to register an element for a command
* <b>must</b> be used to unregister the element.
*
* @param elementReference The callback reference that was provided by the
* command service on registration. Must not be
* <code>null</code>.
* @since 3.3
*/
void unregisterElement(IElementReference elementReference);
/**
* Refresh any elements registered against the command with the given id. It
* allows the active handler the opportunity to provide user feedback. If the
* command is parameterized, some of the parameters can be specified to help
* narrow down which elements to refresh.
* <p>
* The service locator used in registering the element can also be used to scope
* the search. For example: if you wanted all elements for your command but only
* within the part's workbench window, you could use:
* </p>
*
* <pre>
* Map filter = new HashMap();
* filter.put(IServiceScopes.WINDOW_SCOPE, getSite().getPage().getWorkbenchWindow());
* commandService.refreshElements(commandId, filter);
* </pre>
*
*
* @param commandId The command id to refresh if it has registered eleemnts.
* @param filter key-value pairs that can narrow down the callbacks to
* return. The parameters are <b>AND</b>ed together. This may
* be <code>null</code>.
* @since 3.3
*/
void refreshElements(String commandId, Map filter);
}