blob: 8281d818a8aabb3e1b07ea78b5f21e42dd520343 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.wizards.buildpath.newsourcepage;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
/**
* Drop down action for toolbars containing
* <code>BuildpathModifierAction</code>s. The drop down action manages a list of
* actions that are displayed when invocing the drop down. If there is at least
* one valid action, then the drop down action itself will also be valid and
* invocing run will delegate the call to the first valid action in the list.
*/
public class BuildpathModifierDropDownAction extends BuildpathModifierAction
implements IMenuCreator {
/** The menu to be populated with items */
private Menu fMenu;
/**
* A list of actions that will be used as drop down items
*/
protected List<BuildpathModifierAction> fActions;
/**
* Index of the action that can be executed when clicking directly on the
* dropdown button.
*/
private int fIndex;
/**
* Create a drop down action using the same descriptors as the provided
* action, but it's on tool tip text. The action will automatically be put
* in the list of actions that are managed by this drop down menu.
*
* @param action
* an action to be added to the dropdown menu
* @param text
* a label text for the action
* @param toolTipText
* the tooltip text for the drop down menu
*/
public BuildpathModifierDropDownAction(BuildpathModifierAction action,
String text, String toolTipText) {
super(action.getOperation(), action.getImageDescriptor(),
action.getDisabledImageDescriptor(), text, toolTipText,
IAction.AS_DROP_DOWN_MENU);
fActions = new ArrayList<>();
fActions.add(action);
fIndex = 0;
}
/**
* Runs the first action of the list of managed actions that is valid.
*/
@Override
public void run() {
BuildpathModifierAction action = fActions.get(fIndex);
action.run();
}
@Override
public IMenuCreator getMenuCreator() {
return this;
}
@Override
public Menu getMenu(Control parent) {
if (fMenu != null) {
fMenu.dispose();
}
fMenu = new Menu(parent);
createEntries(fMenu);
return fMenu;
}
@Override
public Menu getMenu(Menu parent) {
return fMenu;
}
/**
* Add dynamically an action to the drop down menu.
*
* @param action
* the action to be added
*/
public void addAction(BuildpathModifierAction action) {
fActions.add(action);
}
/**
* Add dynamically an array of actions to the drop down menu.
*
* @param actions
* an array of actions to be added
*/
public void addActions(BuildpathModifierAction[] actions) {
for (int i = 0; i < actions.length; i++) {
addAction(actions[i]);
}
}
/**
* Remove an action from the drop down menu
*
* @param action
* the action to be removed
*/
public void removeAction(BuildpathModifierAction action) {
fActions.remove(action);
}
/**
* Get all actions within this drop down menu.
*
* @return an array of actions
*/
public BuildpathModifierAction[] getActions() {
return fActions.toArray(new BuildpathModifierAction[fActions.size()]);
}
/**
* Populate the menu with the given action item
*
* @param parent
* the menu to add an action for
* @param action
* the action to be added
*/
private void addActionToMenu(Menu parent, IAction action) {
ActionContributionItem item = new ActionContributionItem(action);
item.fill(parent, -1);
}
/**
* Fill the menu with all actions
*
* @param menu
* the menu to be populated
*/
private void createEntries(Menu menu) {
for (int i = 0; i < fActions.size(); i++) {
IAction action = fActions.get(i);
addActionToMenu(menu, action);
}
}
@Override
public void dispose() {
if (fMenu != null) {
fMenu.dispose();
fMenu = null;
}
}
/**
* Check all managed actions to find out if at least one is valid. The first
* valid action that is found will be used when calling <code>run()</code>.
*
* @return <code>true</code> if at least one of the managed actions is
* valid, <code>false</code> otherwise.
*/
@Override
public boolean isValid(List selectedElements, int[] types)
throws ModelException {
for (int i = 0; i < fActions.size(); i++) {
BuildpathModifierAction action = fActions.get(i);
if (action.isValid(selectedElements, types)) {
fIndex = i;
return true;
}
}
return false;
}
}