package org.codemap.mapview.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.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public abstract class DropDownAction extends Action implements IMenuCreator {
private Menu menu;
public DropDownAction() {
super("", AS_DROP_DOWN_MENU);
setMenuCreator(this);
setup();
}
@Override
public void dispose() {
if (menu != null) menu.dispose();
}
@Override
public Menu getMenu(Control parent) {
if (menu == null) {
menu = new Menu(parent);
createMenu(menu);
}
return menu;
}
@Override
public Menu getMenu(Menu parent) {
// submenus are not supported ...
return null;
}
public void addActionToMenu(Menu parent, Action action) {
ActionContributionItem item = new ActionContributionItem(action);
item.fill(parent, -1);
}
protected void setup() {
// maybe do stuff ...
}
/**
* Create and show the menu when clicked.
*
* Creates and shows the same menu that appears when clicking the black menu-arrow.
* The menu appears when the Action/Icon is clicked.
*/
public void runWithEvent(Event event) {
if (event.widget instanceof ToolItem) {
ToolItem toolItem= (ToolItem) event.widget;
Control control= toolItem.getParent();
Menu menu= getMenu(control);
Rectangle bounds= toolItem.getBounds();
Point topLeft= new Point(bounds.x, bounds.y + bounds.height);
menu.setLocation(control.toDisplay(topLeft));
menu.setVisible(true);
}
}
/**
* Tells the DropDownAction that it should listen to mouse events on a given
* ToolBarManager. Used to display the Menu when the mouse is clicked.
*/
public IAction listenToMouseOn(IToolBarManager tbm) {
final ToolBar tb = ((ToolBarManager)tbm).getControl();
tb.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
ToolItem ti = tb.getItem(new Point(e.x, e.y));
if (!(ti.getData() instanceof ActionContributionItem)) return;
ActionContributionItem actionContributionItem = (ActionContributionItem) ti.getData();
IAction action = actionContributionItem.getAction();
if (action != DropDownAction.this) return;
Event event = new Event();
event.widget = ti;
event.x = e.x;
event.y = e.y;
action.runWithEvent(event);
}
});
return this;
}
protected abstract void createMenu(Menu newMenu);
}