blob: 990671d6fafb4d44e7e01456114649844b8119cc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.gef.ui.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.IAction;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.actions.RetargetAction;
import org.eclipse.ui.part.EditorActionBarContributor;
/**
* Contributes actions to the workbench. !!Warning: This class is subject to
* change.
*/
public abstract class ActionBarContributor extends EditorActionBarContributor {
private ActionRegistry registry = new ActionRegistry();
/**
* Contains the {@link RetargetAction}s that are registered as global action
* handlers. We need to hold on to these so that we can remove them as
* PartListeners in dispose().
*/
private List retargetActions = new ArrayList();
private List globalActionKeys = new ArrayList();
/**
* Adds the given action to the action registry.
*
* @param action
* the action to add
*/
protected void addAction(IAction action) {
getActionRegistry().registerAction(action);
}
/**
* Indicates the existence of a global action identified by the specified
* key. This global action is defined outside the scope of this contributor,
* such as the Workbench's undo action, or an action provided by a workbench
* ActionSet. The list of global action keys is used whenever the active
* editor is changed ({@link #setActiveEditor(IEditorPart)}). Keys provided
* here will result in corresponding actions being obtained from the active
* editor's <code>ActionRegistry</code>, and those actions will be
* registered with the ActionBars for this contributor. The editor's action
* handler and the global action must have the same key.
*
* @param key
* the key identifying the global action
*/
protected void addGlobalActionKey(String key) {
globalActionKeys.add(key);
}
/**
* Adds the specified RetargetAction to this contributors
* <code>ActionRegistry</code>. The RetargetAction is also added as a
* <code>IPartListener</code> of the contributor's page. Also, the retarget
* action's ID is flagged as a global action key, by calling
* {@link #addGlobalActionKey(String)}.
*
* @param action
* the retarget action being added
*/
protected void addRetargetAction(RetargetAction action) {
addAction(action);
retargetActions.add(action);
getPage().addPartListener(action);
addGlobalActionKey(action.getId());
}
/**
* Creates and initializes Actions managed by this contributor.
*/
protected abstract void buildActions();
/**
* Subclasses must implement to declare additional global actions IDs. Only
* IDs which were not already added directly or indirectly using
* {@link #addGlobalActionKey(String)} need to be added.
*
* @see #addGlobalActionKey(String)
*/
protected abstract void declareGlobalActionKeys();
/**
* Disposes the contributor. Removes all {@link RetargetAction}s that were
* {@link org.eclipse.ui.IPartListener}s on the
* {@link org.eclipse.ui.IWorkbenchPage} and disposes them. Also disposes
* the action registry.
* <P>
* Subclasses may extend this method to perform additional cleanup.
*
* @see org.eclipse.ui.part.EditorActionBarContributor#dispose()
*/
public void dispose() {
for (int i = 0; i < retargetActions.size(); i++) {
RetargetAction action = (RetargetAction) retargetActions.get(i);
getPage().removePartListener(action);
action.dispose();
}
registry.dispose();
retargetActions = null;
registry = null;
}
/**
* Retrieves an action from the action registry using the given ID.
*
* @param id
* the ID of the sought action
* @return <code>null</code> or the action if found
*/
protected IAction getAction(String id) {
return getActionRegistry().getAction(id);
}
/**
* returns this contributor's ActionRegsitry.
*
* @return the ActionRegistry
*/
protected ActionRegistry getActionRegistry() {
return registry;
}
/**
* @see EditorActionBarContributor#init(IActionBars)
*/
public void init(IActionBars bars) {
buildActions();
declareGlobalActionKeys();
super.init(bars);
}
/**
* @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(IEditorPart)
*/
public void setActiveEditor(IEditorPart editor) {
ActionRegistry registry = (ActionRegistry) editor
.getAdapter(ActionRegistry.class);
IActionBars bars = getActionBars();
for (int i = 0; i < globalActionKeys.size(); i++) {
String id = (String) globalActionKeys.get(i);
IAction handler = registry != null ? registry.getAction(id) : null;
bars.setGlobalActionHandler(id, handler);
}
}
}