blob: 0ddc8d0aff7050a5d388ac519f76eba13541d937 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 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.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.HandlerEvent;
import org.eclipse.core.commands.IHandlerAttributes;
import org.eclipse.core.commands.IHandlerListener;
/**
* This class is a partial implementation of <code>IHandler</code>. This
* abstract implementation provides support for handler listeners. You should
* subclass from this method unless you want to implement your own listener
* support. Subclasses should call
* {@link AbstractHandler#fireHandlerChanged(HandlerEvent)}when the handler
* changes. Subclasses should also override
* {@link AbstractHandler#getAttributeValuesByName()}if they have any
* attributes.
*
* @since 3.0
* @deprecated Please use the "org.eclipse.core.commands" plug-in instead.
* @see org.eclipse.core.commands.AbstractHandler
*/
public abstract class AbstractHandler extends
org.eclipse.core.commands.AbstractHandler implements IHandler {
/**
* Those interested in hearing about changes to this instance of
* <code>IHandler</code>. This member is null iff there are
* no listeners attached to this handler. (Most handlers don't
* have any listeners, and this optimization saves some memory.)
*/
private List handlerListeners;
/**
* @see IHandler#addHandlerListener(IHandlerListener)
*/
public void addHandlerListener(
org.eclipse.ui.commands.IHandlerListener handlerListener) {
if (handlerListener == null) {
throw new NullPointerException();
}
if (handlerListeners == null) {
handlerListeners = new ArrayList();
}
if (!handlerListeners.contains(handlerListener)) {
handlerListeners.add(handlerListener);
}
}
/**
* The default implementation does nothing. Subclasses who attach listeners
* to other objects are encouraged to detach them in this method.
*
* @see org.eclipse.ui.commands.IHandler#dispose()
*/
public void dispose() {
// Do nothing.
}
public Object execute(final ExecutionEvent event) throws ExecutionException {
try {
return execute(event.getParameters());
} catch (final org.eclipse.ui.commands.ExecutionException e) {
throw new ExecutionException(e.getMessage(), e.getCause());
}
}
/**
* Fires an event to all registered listeners describing changes to this
* instance.
*
* @param handlerEvent
* the event describing changes to this instance. Must not be
* <code>null</code>.
*/
protected void fireHandlerChanged(HandlerEvent handlerEvent) {
super.fireHandlerChanged(handlerEvent);
if (handlerListeners != null) {
final boolean attributesChanged = handlerEvent.isEnabledChanged()
|| handlerEvent.isHandledChanged();
final Map previousAttributes;
if (attributesChanged) {
previousAttributes = new HashMap();
previousAttributes.putAll(getAttributeValuesByName());
if (handlerEvent.isEnabledChanged()) {
Boolean disabled = !isEnabled() ? Boolean.TRUE: Boolean.FALSE;
previousAttributes
.put("enabled", disabled); //$NON-NLS-1$
}
if (handlerEvent.isHandledChanged()) {
Boolean notHandled = !isHandled() ? Boolean.TRUE: Boolean.FALSE;
previousAttributes.put(
IHandlerAttributes.ATTRIBUTE_HANDLED, notHandled);
}
} else {
previousAttributes = null;
}
final org.eclipse.ui.commands.HandlerEvent legacyEvent = new org.eclipse.ui.commands.HandlerEvent(
this, attributesChanged, previousAttributes);
for (int i = 0; i < handlerListeners.size(); i++) {
((org.eclipse.ui.commands.IHandlerListener) handlerListeners
.get(i)).handlerChanged(legacyEvent);
}
}
}
protected void fireHandlerChanged(
final org.eclipse.ui.commands.HandlerEvent handlerEvent) {
if (handlerEvent == null) {
throw new NullPointerException();
}
if (handlerListeners != null) {
for (int i = 0; i < handlerListeners.size(); i++) {
((org.eclipse.ui.commands.IHandlerListener) handlerListeners
.get(i)).handlerChanged(handlerEvent);
}
}
if (super.hasListeners()) {
final boolean enabledChanged;
final boolean handledChanged;
if (handlerEvent.haveAttributeValuesByNameChanged()) {
Map previousAttributes = handlerEvent
.getPreviousAttributeValuesByName();
Object attribute = previousAttributes.get("enabled"); //$NON-NLS-1$
if (attribute instanceof Boolean) {
enabledChanged = ((Boolean) attribute).booleanValue();
} else {
enabledChanged = false;
}
attribute = previousAttributes
.get(IHandlerAttributes.ATTRIBUTE_HANDLED);
if (attribute instanceof Boolean) {
handledChanged = ((Boolean) attribute).booleanValue();
} else {
handledChanged = false;
}
} else {
enabledChanged = false;
handledChanged = true;
}
final HandlerEvent newEvent = new HandlerEvent(this,
enabledChanged, handledChanged);
super.fireHandlerChanged(newEvent);
}
}
/**
* This simply return an empty map. The default implementation has no
* attributes.
*
* @see IHandler#getAttributeValuesByName()
*/
public Map getAttributeValuesByName() {
return Collections.EMPTY_MAP;
}
/**
* Returns true iff there is one or more IHandlerListeners attached to this
* AbstractHandler.
*
* @return true iff there is one or more IHandlerListeners attached to this
* AbstractHandler
* @since 3.1
*/
protected final boolean hasListeners() {
return super.hasListeners() || handlerListeners != null;
}
public boolean isEnabled() {
final Object handled = getAttributeValuesByName().get("enabled"); //$NON-NLS-1$
if (handled instanceof Boolean) {
return ((Boolean) handled).booleanValue();
}
return false;
}
public boolean isHandled() {
final Object handled = getAttributeValuesByName().get(
IHandlerAttributes.ATTRIBUTE_HANDLED);
if (handled instanceof Boolean) {
return ((Boolean) handled).booleanValue();
}
return false;
}
/**
* @see IHandler#removeHandlerListener(IHandlerListener)
*/
public void removeHandlerListener(
org.eclipse.ui.commands.IHandlerListener handlerListener) {
if (handlerListener == null) {
throw new NullPointerException();
}
if (handlerListeners == null) {
return;
}
if (handlerListeners != null) {
handlerListeners.remove(handlerListener);
}
if (handlerListeners.isEmpty()) {
handlerListeners = null;
}
}
}