blob: 880dadb9324cb576e9d6c099dbd2a8b37e9773d1 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.actions;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.actions.ActionGroup;
/**
* A MultiActionGroup will display a list of IActions in a menu by transforming them
* into MenuItems. The list of labels given will be what is displayed in the ViewMenu for
* the corresponding action (the action at the same position in the action array).
* The actions are currently implemented as state based
* so that after an action is executed the label will have a selection check.
*
* Code taken from org.eclipse.jdt.internal.ui.actions.MultiActionGroup.class
*/
public class MultiActionGroup extends ActionGroup {
public IAction[] NO_ACTIONS = new IAction[0];
private IAction[] fActions;
private int fCurrentSelection;
private MenuItem[] fItems;
/**
* Creates a new action group with a given set of actions.
*
* @param actions the actions for this multi group
* @param currentSelection decides which action is selected in the menu on start up.
* Denotes the location in the actions array of the current
* selected state. It cannot be null.
*/
public MultiActionGroup(IAction[] actions, int currentSelection) {
super();
setActions(actions, currentSelection);
}
/**
* Creates a new action group. Clients using this constructor must set the actions
* immediately after creating the multi action group by calling {@link #setActions(IAction[], int)}.
*/
protected MultiActionGroup() {
super();
}
/**
* Sets the given actions.
*
* @param actions the actions for this multi group, at least one
* @param currentSelection decides which action is selected in the menu on start up.
* Denotes the location in the actions array of the current
* selected state. It cannot be null.
*/
protected final void setActions(IAction[] actions, int currentSelection) {
fCurrentSelection= currentSelection;
fActions = actions;
}
/**
* Adds the actions to the given menu manager.
*/
protected void addActions(IMenuManager viewMenu) {
viewMenu.add(new Separator());
fItems= new MenuItem[fActions.length];
for (int i= 0; i < fActions.length; i++) {
final int j= i;
viewMenu.add(new ContributionItem() {
public void fill(Menu menu, int index) {
int style= SWT.CHECK;
if ((fActions[j].getStyle() & IAction.AS_RADIO_BUTTON) != 0)
style= SWT.RADIO;
MenuItem mi= new MenuItem(menu, style, index);
ImageDescriptor d= fActions[j].getImageDescriptor();
mi.setImage(AuthoringUIPlugin.getImageDescriptorRegistry().get(d));
fItems[j]= mi;
mi.setText(fActions[j].getText());
mi.setSelection(fCurrentSelection == j);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (fCurrentSelection == j) {
fItems[fCurrentSelection].setSelection(true);
return;
}
fActions[j].run();
// Update checked state
fItems[fCurrentSelection].setSelection(false);
fCurrentSelection= j;
fItems[fCurrentSelection].setSelection(true);
}
});
}
public boolean isDynamic() {
return false;
}
});
}
}
}