| /******************************************************************************* |
| * Copyright (c) 2014 TwelveTone LLC 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 |
| * |
| * Contributors: |
| * Steven Spungin <steven@spungin.tv> - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.e4.tools.emf.ui.internal.common.component.tabs; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| |
| import org.eclipse.core.commands.ParameterizedCommand; |
| import org.eclipse.core.commands.common.NotDefinedException; |
| import org.eclipse.e4.core.commands.ECommandService; |
| import org.eclipse.e4.core.commands.EHandlerService; |
| import org.eclipse.e4.core.contexts.IEclipseContext; |
| 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.Menu; |
| import org.eclipse.swt.widgets.MenuItem; |
| import org.eclipse.swt.widgets.ToolBar; |
| import org.eclipse.swt.widgets.ToolItem; |
| |
| /** |
| * A tool item that displays commands in a drop down menu. The enabled state is |
| * set by querying the handler when the menu is opened. |
| * |
| * @author Steven Spungin |
| * |
| */ |
| public class E4ToolItemMenu { |
| |
| public static final String SEPARATOR = "~separator~"; //$NON-NLS-1$ |
| private final IEclipseContext context; |
| private final ArrayList<String> commandIds = new ArrayList<String>(); |
| private final Menu menu; |
| private final ECommandService commandService; |
| private final EHandlerService handlerService; |
| private final ToolItem toolItem; |
| |
| public E4ToolItemMenu(final ToolBar parent, IEclipseContext context) { |
| |
| toolItem = new ToolItem(parent, SWT.DROP_DOWN); |
| this.context = context; |
| commandService = this.context.get(ECommandService.class); |
| handlerService = this.context.get(EHandlerService.class); |
| |
| menu = new Menu(parent.getShell(), SWT.POP_UP); |
| |
| toolItem.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent event) { |
| // if (event.detail == SWT.ARROW) { |
| final Rectangle rect = toolItem.getBounds(); |
| Point pt = new Point(rect.x, rect.y + rect.height); |
| pt = parent.toDisplay(pt); |
| menu.setLocation(pt.x, pt.y); |
| menu.setVisible(true); |
| for (final MenuItem mi : menu.getItems()) { |
| if (mi.getData() instanceof ParameterizedCommand) { |
| final ParameterizedCommand cmd = (ParameterizedCommand) mi.getData(); |
| mi.setEnabled(handlerService.canExecute(cmd)); |
| } |
| } |
| // } |
| } |
| }); |
| } |
| |
| public void addCommands(Collection<String> commandIds) { |
| this.commandIds.addAll(commandIds); |
| |
| for (final String id : commandIds) { |
| if (id.equals(SEPARATOR)) { |
| new MenuItem(menu, SWT.SEPARATOR); |
| } else { |
| final ParameterizedCommand myCommand = commandService.createCommand(id, null); |
| if (myCommand != null) { |
| final MenuItem item = new MenuItem(menu, SWT.PUSH); |
| try { |
| item.setText(myCommand.getName()); |
| } catch (final NotDefinedException e1) { |
| item.setText(id); |
| e1.printStackTrace(); |
| } |
| item.setData(myCommand); |
| item.addSelectionListener(new SelectionAdapter() { |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| final ParameterizedCommand cmd = (ParameterizedCommand) item.getData(); |
| handlerService.executeHandler(cmd); |
| } |
| |
| }); |
| } |
| } |
| } |
| } |
| |
| public ToolItem getToolItem() { |
| return toolItem; |
| } |
| } |