/*
* Copyright (c) 2012 European Synchrotron Radiation Facility,
* Diamond Light Source Ltd.
*
* 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 fable.framework.toolbox;
import java.util.ArrayList;
import java.util.List;
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.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
/**
* Simple action which will have other actions in a drop down menu.
*/
public class MenuAction extends Action implements IMenuCreator, IPropertyChangeListener {
private Menu fMenu;
private List<IAction> actions;
private Action lastAction;
private String mainText;
private boolean useTextOfAction;
public MenuAction(final String text) {
this(text,false);
}
public MenuAction(final String text, boolean useTextOfAction) {
super(text, IAction.AS_DROP_DOWN_MENU);
setMenuCreator(this);
this.actions = new ArrayList<IAction>(7);
this.useTextOfAction = useTextOfAction;
}
@Override
public void dispose() {
if (fMenu != null) {
fMenu.dispose();
fMenu= null;
}
for (IAction action : actions) {
action.removePropertyChangeListener(this);
}
actions.clear();
lastAction=null;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
this.lastAction = (Action)event.getSource();
updateSelectedValue();
}
private void updateSelectedValue() {
IAction selAction = lastAction;
if (selAction==null) for (IAction action : actions) {
if (action.isChecked()) {
selAction = action;
break;
}
}
if (selAction!=null) {
final StringBuilder buf = new StringBuilder();
if (mainText!=null) {
buf.append(mainText);
buf.append("\n");
}
buf.append(selAction.getText());
super.setToolTipText(buf.toString());
if (useTextOfAction) {
setText(selAction.getText());
}
}
}
public void setToolTipText(final String ttext) {
this.mainText = ttext;
super.setToolTipText(ttext);
updateSelectedValue();
}
@Override
public Menu getMenu(Menu parent) {
if (fMenu != null) fMenu.dispose();
fMenu= new Menu(parent);
for (IAction action : actions) {
addActionToMenu(fMenu, action);
}
return fMenu;
}
public void add(final IAction action) {
actions.add(action);
action.addPropertyChangeListener(this);
}
@Override
public Menu getMenu(Control parent) {
if (fMenu != null) fMenu.dispose();
fMenu= new Menu(parent);
for (IAction action : actions) {
addActionToMenu(fMenu, action);
}
return fMenu;
}
protected void addActionToMenu(Menu parent, IAction action) {
ActionContributionItem item= new ActionContributionItem(action);
item.fill(parent, -1);
}
public void run() {
if (lastAction!=null) lastAction.run();
}
/**
* Get's rid of the menu, because the menu hangs on to * the searches, etc.
*/
void clear() {
dispose();
}
public void setSelected(int index) {
if (actions==null || index>actions.size()-1) return;
actions.get(index).setChecked(true);
}
}