package org.jbpm.ui.common.action;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.jbpm.ui.common.command.AddActionCommand;
import org.jbpm.ui.common.model.Active;
import org.jbpm.ui.custom.CustomizationRegistry;
import org.jbpm.ui.custom.DelegableProvider;
import org.jbpm.ui.resource.Messages;
public class ActiveActionsDelegate extends BaseActionDelegate implements IMenuCreator {
private Active active;
public void dispose() {
}
public Menu getMenu(Control parent) {
// never called
return null;
}
public Menu getMenu(Menu parent) {
Menu menu = new Menu(parent);
/**
* Add listener to re-populate the menu each time it is shown because
* MenuManager.update(boolean, boolean) doesn't dispose pull-down
* ActionContribution items for each popup menu.
*/
menu.addMenuListener(new MenuAdapter() {
@Override
public void menuShown(MenuEvent e) {
Menu m = (Menu) e.widget;
MenuItem[] items = m.getItems();
for (int i = 0; i < items.length; i++) {
items[i].dispose();
}
fillMenu(m);
}
});
return menu;
}
public void run(IAction action) {
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
super.selectionChanged(action, selection);
if (selectedPart == null)
return;
active = (Active) selectedPart.getModel();
action.setMenuCreator(this);
}
/**
* Fills the menu with applicable launch shortcuts
*
* @param menu
* The menu to fill
*/
protected void fillMenu(Menu menu) {
boolean createSeparator = false;
for (org.jbpm.ui.common.model.Action action : active.getActions()) {
Action menuAction = new ShowAction(action);
menuAction.setText(action.getDisplayName());
ActionContributionItem item = new ActionContributionItem(menuAction);
item.fill(menu, -1);
createSeparator = true;
}
if (createSeparator) {
new MenuItem(menu, SWT.SEPARATOR);
}
Action menuAction = new AddActionAction();
ActionContributionItem item = new ActionContributionItem(menuAction);
item.fill(menu, -1);
}
public class AddActionAction extends Action {
public AddActionAction() {
setText(Messages.getString("button.create"));
}
@Override
public void run() {
AddActionCommand command = new AddActionCommand();
command.setTarget(active);
executeCommand(command);
setFocus(command.getAction());
}
}
private void setFocus(org.jbpm.ui.common.model.Action action) {
getActiveDesignerEditor().select(action);
}
public class ShowAction extends Action {
private org.jbpm.ui.common.model.Action action;
public ShowAction(org.jbpm.ui.common.model.Action action) {
this.action = action;
}
@Override
public void run() {
setFocus(action);
DelegableProvider provider = CustomizationRegistry.getProvider(action.getDelegationClassName());
String newConfig = provider.showConfigurationDialog(action);
if (newConfig != null) {
action.setDelegationConfiguration(newConfig);
}
}
}
}