package fr.opensagres.nosql.ide.ui.internal.actions;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
public abstract class AbstractTreeNodeActionGroup extends
AbstractTreeNodeAction implements IMenuCreator {
private Menu menu;
protected AbstractTreeNodeActionGroup(ISelectionProvider provider,
String text) {
super(provider, text);
setMenuCreator(this);
}
@Override
protected void perform(Object obj) {
Action runAction = null;
if (obj != null) {
runAction = getDefaultAction(obj);
}
if (runAction == null) {
Collection<Action> actions = getActions(obj);
runAction = getFirstAction(actions);
}
if (runAction != null) {
runAction.run();
}
}
private Action getFirstAction(Collection<Action> actions) {
if (actions == null) {
return null;
}
for (Action action : actions) {
return action;
}
return null;
}
public void dispose() {
if (menu != null) {
menu.dispose();
menu = null;
}
}
public Menu getMenu(Control parent) {
if (menu != null)
menu.dispose();
menu = new Menu(parent);
Collection<Action> actions = getActions();
if (actions != null) {
for (Action action : actions) {
addActionToMenu(menu, action);
}
}
return menu;
}
private Collection<Action> getActions() {
Object selectedElement = getSelectedElement();
if (selectedElement == null) {
return Collections.emptyList();
}
return getActions(selectedElement);
}
private Object getSelectedElement() {
IStructuredSelection selection = getStructuredSelection();
if (!selection.isEmpty()) {
return selection.getFirstElement();
}
return null;
}
@Override
protected boolean accept(Object obj) {
if (obj == null) {
return false;
}
Collection<Action> actions = getActions(obj);
if (!(actions != null && actions.size() > 0)) {
return false;
}
for (Action action : actions) {
if (((AbstractTreeNodeAction) action).accept(obj)) {
return true;
}
}
return false;
}
protected abstract Collection<Action> getActions(Object obj);
protected abstract Action getDefaultAction(Object obj);
public Menu getMenu(Menu parent) {
return null;
}
private void addActionToMenu(Menu parent, Action action) {
ActionContributionItem item = new ActionContributionItem(action);
item.fill(parent, -1);
}
}