package name.abuchen.portfolio.ui.util; import java.util.function.BiConsumer; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; public abstract class AbstractDropDown implements IMenuListener { private ToolBar toolBar; private ToolItem dropdown; private MenuManager menuMgr; public AbstractDropDown(ToolBar toolBar, String label) { this(toolBar, label, null, SWT.DROP_DOWN); } public AbstractDropDown(ToolBar toolBar, String label, Image image, int style) { this.toolBar = toolBar; dropdown = new ToolItem(toolBar, style); if (image != null) { dropdown.setImage(image); dropdown.setToolTipText(label); } else { dropdown.setText(label); } dropdown.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { AbstractDropDown.this.widgetSelected(e); } }); menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(this); } public static final AbstractDropDown create(ToolBar toolBar, String label, Image image, int style, IMenuListener listener) { return new AbstractDropDown(toolBar, label, image, style) { @Override public void menuAboutToShow(IMenuManager manager) { listener.menuAboutToShow(manager); } }; } public static final AbstractDropDown create(ToolBar toolBar, String label, Image image, int style, BiConsumer<AbstractDropDown, IMenuManager> listener) { return new AbstractDropDown(toolBar, label, image, style) { @Override public void menuAboutToShow(IMenuManager manager) { listener.accept(this, manager); } }; } private void widgetSelected(SelectionEvent event) { ToolItem item = (ToolItem) event.widget; Rectangle rect = item.getBounds(); Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y)); Menu menu = menuMgr.createContextMenu(toolBar); menu.setLocation(pt.x, pt.y + rect.height); menu.setVisible(true); } public ToolBar getToolBar() { return toolBar; } public ToolItem getToolItem() { return dropdown; } public void setLabel(String label) { if (dropdown.getImage() != null) dropdown.setToolTipText(label); else dropdown.setText(label); toolBar.getParent().layout(); } }