/******************************************************************************* * Copyright (c) 2007, 2008 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.actions; import java.util.Map; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.CommandEvent; import org.eclipse.core.commands.ICommandListener; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.jface.action.Action; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.commands.ICommandImageService; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.services.IServiceLocator; /** * Instantiate an action that will execute the command. * <p> * This is a legacy bridge class, and should not be used outside of the * framework. Please use menu contributions to display a command in a menu or * toolbar. * </p> * <p> * <b>Note:</b> Clients my instantiate, but they must not subclass. * </p> * * @since 3.3 */ public class CommandAction extends Action { private IHandlerService handlerService = null; private ParameterizedCommand parameterizedCommand = null; private ICommandListener commandListener; protected CommandAction() { } /** * Creates the action backed by a command. For commands that don't take * parameters. * * @param serviceLocator * The service locator that is closest in lifecycle to this * action. * @param commandIdIn * the command id. Must not be <code>null</code>. */ public CommandAction(IServiceLocator serviceLocator, String commandIdIn) { this(serviceLocator, commandIdIn, null); } /** * Creates the action backed by a parameterized command. The parameterMap * must contain only all required parameters, and may contain the optional * parameters. * * @param serviceLocator * The service locator that is closest in lifecycle to this * action. * @param commandIdIn * the command id. Must not be <code>null</code>. * @param parameterMap * the parameter map. May be <code>null</code>. */ public CommandAction(IServiceLocator serviceLocator, String commandIdIn, Map parameterMap) { if (commandIdIn == null) { throw new NullPointerException("commandIdIn must not be null"); //$NON-NLS-1$ } init(serviceLocator, commandIdIn, parameterMap); } protected ICommandListener getCommandListener() { if (commandListener == null) { commandListener = new ICommandListener() { public void commandChanged(CommandEvent commandEvent) { if (commandEvent.isHandledChanged() || commandEvent.isEnabledChanged()) { if (commandEvent.getCommand().isDefined()) { setEnabled(commandEvent.getCommand().isEnabled()); } } } }; } return commandListener; } /** * Build a command from the executable extension information. * * @param commandService * to get the Command object * @param commandId * the command id for this action * @param parameterMap */ private void createCommand(ICommandService commandService, String commandId, Map parameterMap) { Command cmd = commandService.getCommand(commandId); if (!cmd.isDefined()) { WorkbenchPlugin.log("Command " + commandId + " is undefined"); //$NON-NLS-1$//$NON-NLS-2$ return; } if (parameterMap == null) { parameterizedCommand = new ParameterizedCommand(cmd, null); return; } parameterizedCommand = ParameterizedCommand.generateCommand(cmd, parameterMap); } public void dispose() { // not important for command ID, maybe for command though. handlerService = null; if (commandListener != null) { parameterizedCommand.getCommand().removeCommandListener( commandListener); commandListener = null; } parameterizedCommand = null; } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event) */ public void runWithEvent(Event event) { if (handlerService == null) { String commandId = (parameterizedCommand == null ? "unknownCommand" //$NON-NLS-1$ : parameterizedCommand.getId()); WorkbenchPlugin.log("Cannot run " + commandId //$NON-NLS-1$ + " before command action has been initialized"); //$NON-NLS-1$ return; } try { if (parameterizedCommand != null) { handlerService.executeCommand(parameterizedCommand, event); } } catch (Exception e) { WorkbenchPlugin.log(e); } } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ public void run() { // hopefully this is never called runWithEvent(null); } protected void init(IServiceLocator serviceLocator, String commandIdIn, Map parameterMap) { if (handlerService != null) { // already initialized return; } handlerService = (IHandlerService) serviceLocator .getService(IHandlerService.class); ICommandService commandService = (ICommandService) serviceLocator .getService(ICommandService.class); ICommandImageService commandImageService = (ICommandImageService) serviceLocator .getService(ICommandImageService.class); createCommand(commandService, commandIdIn, parameterMap); if (parameterizedCommand != null) { setId(parameterizedCommand.getId()); setActionDefinitionId(parameterizedCommand.getId()); try { setText(parameterizedCommand.getName()); } catch (NotDefinedException e) { // if we get this far it shouldn't be a problem } parameterizedCommand.getCommand().addCommandListener( getCommandListener()); parameterizedCommand.getCommand().setEnabled( handlerService.getCurrentState()); setEnabled(parameterizedCommand.getCommand().isEnabled()); setImageDescriptor(commandImageService.getImageDescriptor( commandIdIn, ICommandImageService.TYPE_DEFAULT)); setDisabledImageDescriptor(commandImageService.getImageDescriptor( commandIdIn, ICommandImageService.TYPE_DISABLED)); setHoverImageDescriptor(commandImageService.getImageDescriptor( commandIdIn, ICommandImageService.TYPE_HOVER)); } } protected ParameterizedCommand getParameterizedCommand() { return parameterizedCommand; } public String getActionDefinitionId() { return super.getActionDefinitionId(); } }