All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jface.commands.ActionHandler Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2004, 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
 *     Lars Vogel  - Bug 475689
 *******************************************************************************/
package org.eclipse.jface.commands;

import java.util.Optional;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.HandlerEvent;
import org.eclipse.core.commands.IHandlerListener;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.LegacyActionTools;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.swt.widgets.Event;

/**
 * 

* This class adapts instances of IAction to IHandler. *

* * @since 3.1 */ public final class ActionHandler extends AbstractHandler { /** * The wrapped action. This value is never null. */ private final IAction action; /** * The property change listener hooked on to the action. This is initialized * when the first listener is attached to this handler, and is removed when * the handler is disposed or the last listener is removed. */ private IPropertyChangeListener propertyChangeListener; /** * Creates a new instance of this class given an instance of * IAction. * * @param action * the action. Must not be null. */ public ActionHandler(final IAction action) { if (action == null) { throw new NullPointerException(); } this.action = action; } @Override public final void addHandlerListener(final IHandlerListener handlerListener) { if (!hasListeners()) { attachListener(); } super.addHandlerListener(handlerListener); } /** * When a listener is attached to this handler, then this registers a * listener with the underlying action. * * @since 3.1 */ private final void attachListener() { if (propertyChangeListener == null) { propertyChangeListener = propertyChangeEvent -> { final String property = propertyChangeEvent.getProperty(); fireHandlerChanged(new HandlerEvent(ActionHandler.this, IAction.ENABLED.equals(property), IAction.HANDLED.equals(property))); }; } this.action.addPropertyChangeListener(propertyChangeListener); } /** * When no more listeners are registered, then this is used to removed the * property change listener from the underlying action. */ private final void detachListener() { this.action.removePropertyChangeListener(propertyChangeListener); propertyChangeListener = null; } /** * Removes the property change listener from the action. * * @see org.eclipse.core.commands.IHandler#dispose() */ @Override public final void dispose() { if (hasListeners()) { action.removePropertyChangeListener(propertyChangeListener); } } @Override public final Object execute(final ExecutionEvent event) throws ExecutionException { if ((action.getStyle() == IAction.AS_CHECK_BOX) || (action.getStyle() == IAction.AS_RADIO_BUTTON)) { action.setChecked(!action.isChecked()); } final Object trigger = event.getTrigger(); try { if (trigger instanceof Event) { action.runWithEvent((Event) trigger); } else { action.runWithEvent(new Event()); } } catch (Exception e) { throw new ExecutionException( "While executing the action, an exception occurred", e); //$NON-NLS-1$ } return null; } /** * Returns the action associated with this handler * * @return the action associated with this handler (not null) * @since 3.1 */ public final IAction getAction() { return action; } @Override public final boolean isEnabled() { return action.isEnabled(); } @Override public final boolean isHandled() { return action.isHandled(); } @Override public final void removeHandlerListener(final IHandlerListener handlerListener) { super.removeHandlerListener(handlerListener); if (!hasListeners()) { detachListener(); } } @Override public final String toString() { final StringBuilder buffer = new StringBuilder(); buffer.append("ActionHandler("); //$NON-NLS-1$ buffer.append(action); buffer.append(')'); return buffer.toString(); } @Override public String getHandlerLabel() { return Optional.of(action).map(IAction::getText).map(LegacyActionTools::removeAcceleratorText).orElse(null); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy