/******************************************************************************* * Copyright (c) 2000, 2010, 2012 IBM Corporation, Gerhardt Informatics Kft. 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 * Gerhardt Informatics Kft. - GEFGWT port *******************************************************************************/ package org.eclipse.gef.ui.actions; import org.eclipse.gef.Disposable; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CommandStack; import org.eclipse.jface.action.Action; import org.eclipse.ui.IWorkbenchPart; /** * Base class for actions involving a WorkbenchPart. The workbench part is * useful for obtaining data needed by the action. For example, selection can be * obtained using the part's site. Anything can potentially be obtained using * {@link org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)}. */ public abstract class WorkbenchPartAction extends Action implements Disposable, UpdateAction { private IWorkbenchPart workbenchPart; private boolean lazyEnablement = true; /** * Constructs a WorkbenchPartAction for the given part. * * @param part * the workbench part */ public WorkbenchPartAction(IWorkbenchPart part) { setWorkbenchPart(part); init(); } /** * Constructs a WorkbenchPartAction for the given part and style. * * @param part * the workbench part * @param style * one of <code>AS_PUSH_BUTTON</code>, <code>AS_CHECK_BOX</code>, * <code>AS_DROP_DOWN_MENU</code>, <code>AS_RADIO_BUTTON</code>, * and <code>AS_UNSPECIFIED</code>. */ public WorkbenchPartAction(IWorkbenchPart part, int style) { super(null, style); setWorkbenchPart(part); init(); } /** * Calculates and returns the enabled state of this action. * * @return <code>true</code> if the action is enabled */ protected abstract boolean calculateEnabled(); /** * Disposes the action when it is no longer needed. */ public void dispose() { } /** * Executes the given {@link Command} using the command stack. The stack is * obtained by calling {@link #getCommandStack()}, which uses * <code>IAdapatable</code> to retrieve the stack from the workbench part. * * @param command * the command to execute */ protected void execute(Command command) { if (command == null || !command.canExecute()) return; getCommandStack().execute(command); } /** * Returns the editor's command stack. This is done by asking the workbench * part for its CommandStack via * {@link org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)}. * * @return the command stack */ protected CommandStack getCommandStack() { return (CommandStack) getWorkbenchPart().getAdapter(CommandStack.class); } /** * Returns the workbench part given in the constructor * * @return the workbench part */ protected IWorkbenchPart getWorkbenchPart() { return workbenchPart; } /** * Initializes this action. */ protected void init() { } /** * Returns <code>true</code> if the action is enabled. If the action * determines enablemenu lazily, then {@link #calculateEnabled()} is always * called. Otherwise, the enablement state set using * {@link Action#setEnabled(boolean)} is returned. * * @see #setLazyEnablementCalculation(boolean) * @return <code>true</code> if the action is enabled */ public boolean isEnabled() { if (lazyEnablement) setEnabled(calculateEnabled()); return super.isEnabled(); } /** * Refreshes the properties of this action. */ protected void refresh() { setEnabled(calculateEnabled()); } /** * Sets lazy calculation of the isEnabled property. If this value is set to * <code>true</code>, then the action will always use * {@link #calculateEnabled()} whenever {@link #isEnabled()} is called. * <P> * Sometimes a value of <code>false</code> can be used to improve * performance and reduce the number of times {@link #calculateEnabled()} is * called. However, the client must then call the {@link #update()} method * at the proper times to force the update of enablement. * <P> * Sometimes a value of <code>true</code> can be used to improve * performance. If an <code>Action</code> only appears in a dynamic context * menu, then there is no reason to agressively update its enablement status * because the user cannot see the Action. Instead, its enablement only * needs to be determined when asked for, or <i>lazily</i>. * <P> * The default value for this setting is <code>true</code>. * * @param value * <code>true</code> if the enablement should be lazy */ public void setLazyEnablementCalculation(boolean value) { lazyEnablement = value; } /** * Sets the workbench part. * * @param part * the workbench part */ protected void setWorkbenchPart(IWorkbenchPart part) { workbenchPart = part; } /** * @see UpdateAction#update() */ public void update() { refresh(); } }