blob: ca8c49c7c5a825bf2dcf358ce47f2383b3bceee4 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}