package name.abuchen.portfolio.ui.util; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import name.abuchen.portfolio.ui.Images; public abstract class ToolBarDropdownMenu<E> extends SelectionAdapter { private static final String INDEX = "$index"; //$NON-NLS-1$ private ToolBar toolBar; private ToolItem dropdown; private Menu menu; public ToolBarDropdownMenu(ToolBar toolBar) { this.toolBar = toolBar; dropdown = new ToolItem(toolBar, SWT.DROP_DOWN); dropdown.addSelectionListener(this); menu = new Menu(dropdown.getParent().getShell()); toolBar.addDisposeListener(e -> { if (!menu.isDisposed()) menu.dispose(); }); } public int getSelectedIndex() { return (Integer) dropdown.getData(INDEX); } public void select(int index) { int selected = index >= 0 && index < menu.getItemCount() ? index : 0; menu.getItem(selected).notifyListeners(SWT.Selection, new Event()); } public void select(E data) { for (MenuItem item : menu.getItems()) { if (item.getData() == data) { item.notifyListeners(SWT.Selection, new Event()); return; } } select(0); } public final void add(final E data, String label) { add(data, label, null); } public final void add(final E data, String label, Images image) { MenuItem menuItem = new MenuItem(menu, SWT.CHECK); menuItem.setText(label); if (image != null) menuItem.setImage(image.image()); menuItem.setData(data); menuItem.setData(INDEX, Integer.valueOf(menu.getItemCount() - 1)); menuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { MenuItem selected = (MenuItem) event.widget; for (MenuItem item : menu.getItems()) item.setSelection(false); selected.setSelection(true); if (selected.getImage() != null) dropdown.setImage(selected.getImage()); else dropdown.setText(selected.getText()); dropdown.setToolTipText(selected.getText()); dropdown.setData(INDEX, selected.getData(INDEX)); toolBar.getParent().layout(); itemSelected(data); } }); } public 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.setLocation(pt.x, pt.y + rect.height); menu.setVisible(true); } protected abstract void itemSelected(E data); }