org.eclipse.ui.menus.CommandContributionItem Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of workbench Show documentation
Show all versions of workbench Show documentation
This plug-in contains the bulk of the Workbench implementation, and depends on JFace, SWT, and Core Runtime. It cannot be used independently from org.eclipse.ui. Workbench client plug-ins should not depend directly on this plug-in.
The newest version!
/*******************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.menus;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.CommandEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.ICommandListener;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.NotEnabledException;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
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 org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.commands.IElementReference;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.commands.ICommandImageService;
import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.services.IServiceLocator;
/**
* A contribution item which delegates to a command. It can be used in
* {@link AbstractContributionFactory#createContributionItems(IServiceLocator, IContributionRoot)}.
*
* It currently supports placement in menus and toolbars.
*
*
* This class may be instantiated; it is not intended to be subclassed.
*
*
* @since 3.3
*/
public final class CommandContributionItem extends ContributionItem {
/**
* A push button tool item or menu item.
*/
public static final int STYLE_PUSH = SWT.PUSH;
/**
* A checked tool item or menu item.
*/
public static final int STYLE_CHECK = SWT.CHECK;
/**
* A radio-button style menu item.
*/
public static final int STYLE_RADIO = SWT.RADIO;
/**
* A ToolBar pulldown item.
*/
public static final int STYLE_PULLDOWN = SWT.DROP_DOWN;
private LocalResourceManager localResourceManager;
private Listener menuItemListener;
private Widget widget;
private IMenuService menuService;
private ICommandService commandService;
private IHandlerService handlerService;
private IBindingService bindingService;
private ParameterizedCommand command;
private ImageDescriptor icon;
private String label;
private String tooltip;
private ImageDescriptor disabledIcon;
private ImageDescriptor hoverIcon;
private String mnemonic;
private IElementReference elementRef;
private boolean checkedState;
private int style;
private ICommandListener commandListener;
private String dropDownMenuOverride;
/**
* Create a CommandContributionItem to place in a ContributionManager.
*
* @param serviceLocator
* a service locator that is most appropriate for this
* contribution. Typically the local {@link IWorkbenchWindow} or
* {@link IWorkbenchPartSite} will be sufficient.
* @param id
* The id for this item. May be null
. Items
* without an id cannot be referenced later.
* @param commandId
* A command id for a defined command. Must not be
* null
.
* @param parameters
* A map of strings to strings which represent parameter names to
* values. The parameter names must match those in the command
* definition.
* @param icon
* An icon for this item. May be null
.
* @param disabledIcon
* A disabled icon for this item. May be null
.
* @param hoverIcon
* A hover icon for this item. May be null
.
* @param label
* A label for this item. May be null
.
* @param mnemonic
* A mnemonic for this item to be applied to the label. May be
* null
.
* @param tooltip
* A tooltip for this item. May be null
. Tooltips
* are currently only valid for toolbar contributions.
* @param style
* The style of this menu contribution. See the STYLE_* contants.
*/
public CommandContributionItem(IServiceLocator serviceLocator, String id,
String commandId, Map parameters, ImageDescriptor icon,
ImageDescriptor disabledIcon, ImageDescriptor hoverIcon,
String label, String mnemonic, String tooltip, int style) {
super(id);
this.icon = icon;
this.disabledIcon = disabledIcon;
this.hoverIcon = hoverIcon;
this.label = label;
this.mnemonic = mnemonic;
this.tooltip = tooltip;
this.style = style;
menuService = (IMenuService) serviceLocator
.getService(IMenuService.class);
commandService = (ICommandService) serviceLocator
.getService(ICommandService.class);
handlerService = (IHandlerService) serviceLocator
.getService(IHandlerService.class);
bindingService = (IBindingService) serviceLocator
.getService(IBindingService.class);
createCommand(commandId, parameters);
if (command != null) {
try {
UIElement callback = new UIElement(serviceLocator) {
public void setChecked(boolean checked) {
CommandContributionItem.this.setChecked(checked);
}
public void setDisabledIcon(ImageDescriptor desc) {
CommandContributionItem.this.setDisabledIcon(desc);
}
public void setHoverIcon(ImageDescriptor desc) {
CommandContributionItem.this.setHoverIcon(desc);
}
public void setIcon(ImageDescriptor desc) {
CommandContributionItem.this.setIcon(desc);
}
public void setText(String text) {
CommandContributionItem.this.setText(text);
}
public void setTooltip(String text) {
CommandContributionItem.this.setTooltip(text);
}
public void setDropDownId(String id) {
dropDownMenuOverride = id;
}
};
elementRef = commandService.registerElementForCommand(command,
callback);
command.getCommand().addCommandListener(getCommandListener());
setImages(serviceLocator);
} catch (NotDefinedException e) {
WorkbenchPlugin.log("Unable to register menu item \"" + getId() //$NON-NLS-1$
+ "\", command \"" + commandId + "\" not defined"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
private void setImages(IServiceLocator locator) {
if (icon == null) {
ICommandImageService service = (ICommandImageService) locator
.getService(ICommandImageService.class);
icon = service.getImageDescriptor(command.getId(),
ICommandImageService.TYPE_DEFAULT);
disabledIcon = service.getImageDescriptor(command.getId(),
ICommandImageService.TYPE_DISABLED);
hoverIcon = service.getImageDescriptor(command.getId(),
ICommandImageService.TYPE_HOVER);
}
}
/**
* @return
*/
private ICommandListener getCommandListener() {
if (commandListener == null) {
commandListener = new ICommandListener() {
public void commandChanged(CommandEvent commandEvent) {
if (commandEvent.isHandledChanged()
|| commandEvent.isEnabledChanged()
|| commandEvent.isDefinedChanged()) {
if (commandEvent.isHandledChanged()) {
dropDownMenuOverride = null;
}
if (commandEvent.getCommand().isDefined()) {
update(null);
}
}
}
};
}
return commandListener;
}
ParameterizedCommand getCommand() {
return command;
}
void createCommand(String commandId, Map parameters) {
if (commandId == null) {
WorkbenchPlugin.log("Unable to create menu item \"" + getId() //$NON-NLS-1$
+ "\", no command id"); //$NON-NLS-1$
return;
}
Command cmd = commandService.getCommand(commandId);
if (!cmd.isDefined()) {
WorkbenchPlugin.log("Unable to create menu item \"" + getId() //$NON-NLS-1$
+ "\", command \"" + commandId + "\" not defined"); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
if (parameters == null || parameters.size() == 0) {
command = new ParameterizedCommand(cmd, null);
return;
}
try {
ArrayList parmList = new ArrayList();
Iterator i = parameters.entrySet().iterator();
while (i.hasNext()) {
Map.Entry entry = (Map.Entry) i.next();
String parmName = (String) entry.getKey();
IParameter parm;
parm = cmd.getParameter(parmName);
if (parm == null) {
WorkbenchPlugin
.log("Unable to create menu item \"" + getId() //$NON-NLS-1$
+ "\", parameter \"" + parmName + "\" for command \"" //$NON-NLS-1$ //$NON-NLS-2$
+ commandId + "\" is not defined"); //$NON-NLS-1$
return;
}
parmList.add(new Parameterization(parm, (String) entry
.getValue()));
}
command = new ParameterizedCommand(cmd,
(Parameterization[]) parmList
.toArray(new Parameterization[parmList.size()]));
} catch (NotDefinedException e) {
// this shouldn't happen as we checked for !defined, but we
// won't take the chance
WorkbenchPlugin.log("Failed to create menu item " //$NON-NLS-1$
+ getId(), e);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
* int)
*/
public void fill(Menu parent, int index) {
if (command == null) {
return;
}
if (widget != null || parent == null) {
return;
}
// Menus don't support the pulldown style
int tmpStyle = style;
if (tmpStyle == STYLE_PULLDOWN)
tmpStyle = STYLE_PUSH;
MenuItem item = null;
if (index >= 0) {
item = new MenuItem(parent, tmpStyle, index);
} else {
item = new MenuItem(parent, tmpStyle);
}
item.setData(this);
item.addListener(SWT.Dispose, getItemListener());
item.addListener(SWT.Selection, getItemListener());
widget = item;
String helpContextId = null;
try {
helpContextId = commandService.getHelpContextId(command
.getCommand().getId());
} catch (NotDefinedException e) {
// No helpContextId
}
IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench != null && helpContextId != null) {
workbench.getHelpSystem().setHelp(item, helpContextId);
}
update(null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar,
* int)
*/
public void fill(ToolBar parent, int index) {
if (command == null) {
return;
}
if (widget != null || parent == null) {
return;
}
ToolItem item = null;
if (index >= 0) {
item = new ToolItem(parent, style, index);
} else {
item = new ToolItem(parent, style);
}
item.setData(this);
item.addListener(SWT.Selection, getItemListener());
item.addListener(SWT.Dispose, getItemListener());
widget = item;
update(null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#update()
*/
public void update() {
update(null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#update(java.lang.String)
*/
public void update(String id) {
if (widget != null) {
if (widget instanceof MenuItem) {
MenuItem item = (MenuItem) widget;
String text = label;
if (text == null) {
if (command != null) {
try {
text = command.getCommand().getName();
} catch (NotDefinedException e) {
WorkbenchPlugin.log("Update item failed " //$NON-NLS-1$
+ getId(), e);
}
}
}
text = updateMnemonic(text);
String keyBindingText = null;
if (command != null) {
TriggerSequence[] bindings = bindingService
.getActiveBindingsFor(command);
if (bindings.length > 0) {
keyBindingText = bindings[0].format();
}
}
if (text != null) {
if (keyBindingText == null) {
item.setText(text);
} else {
item.setText(text + '\t' + keyBindingText);
}
}
updateIcons();
if (item.getSelection() != checkedState) {
item.setSelection(checkedState);
}
boolean shouldBeEnabled = isEnabled();
if (item.getEnabled() != shouldBeEnabled) {
item.setEnabled(shouldBeEnabled);
}
} else if (widget instanceof ToolItem) {
ToolItem item = (ToolItem) widget;
if (icon != null) {
updateIcons();
} else if (label != null) {
item.setText(label);
}
if (tooltip != null)
item.setToolTipText(tooltip);
else {
String text = label;
if (text == null) {
if (command != null) {
try {
text = command.getCommand().getName();
} catch (NotDefinedException e) {
WorkbenchPlugin.log("Update item failed " //$NON-NLS-1$
+ getId(), e);
}
}
}
if (text != null) {
item.setToolTipText(text);
}
}
if (item.getSelection() != checkedState) {
item.setSelection(checkedState);
}
boolean shouldBeEnabled = isEnabled();
if (item.getEnabled() != shouldBeEnabled) {
item.setEnabled(shouldBeEnabled);
}
}
}
}
private String updateMnemonic(String s) {
if (mnemonic==null || s==null) {
return s;
}
int idx = s.indexOf(mnemonic);
if (idx==-1) {
return s;
}
return s.substring(0, idx) + '&' + s.substring(idx);
}
private void handleWidgetDispose(Event event) {
if (event.widget == widget) {
widget.removeListener(SWT.Selection, getItemListener());
widget.removeListener(SWT.Dispose, getItemListener());
widget = null;
disposeOldImages();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#dispose()
*/
public void dispose() {
if (elementRef != null) {
commandService.unregisterElement(elementRef);
elementRef = null;
}
if (commandListener != null) {
command.getCommand().removeCommandListener(commandListener);
commandListener = null;
}
command = null;
commandService = null;
disposeOldImages();
super.dispose();
}
private void disposeOldImages() {
if (localResourceManager != null) {
localResourceManager.dispose();
localResourceManager = null;
}
}
private Listener getItemListener() {
if (menuItemListener == null) {
menuItemListener = new Listener() {
public void handleEvent(Event event) {
switch (event.type) {
case SWT.Dispose:
handleWidgetDispose(event);
break;
case SWT.Selection:
if (event.widget != null) {
handleWidgetSelection(event);
}
break;
}
}
};
}
return menuItemListener;
}
private void handleWidgetSelection(Event event) {
// Special check for ToolBar dropdowns...
if (openDropDownMenu(event))
return;
if ((style & (SWT.TOGGLE | SWT.CHECK)) != 0) {
if (event.widget instanceof ToolItem) {
checkedState = ((ToolItem)event.widget).getSelection();
} else if (event.widget instanceof MenuItem) {
checkedState = ((MenuItem)event.widget).getSelection();
}
}
try {
handlerService.executeCommand(command, event);
} catch (ExecutionException e) {
WorkbenchPlugin.log("Failed to execute item " //$NON-NLS-1$
+ getId(), e);
} catch (NotDefinedException e) {
WorkbenchPlugin.log("Failed to execute item " //$NON-NLS-1$
+ getId(), e);
} catch (NotEnabledException e) {
WorkbenchPlugin.log("Failed to execute item " //$NON-NLS-1$
+ getId(), e);
} catch (NotHandledException e) {
WorkbenchPlugin.log("Failed to execute item " //$NON-NLS-1$
+ getId(), e);
}
}
/**
* Determines if the selection was on the dropdown affordance and, if so,
* opens the drop down menu (populated using the same id as this item...
*
* @param event
* The SWT.Selection
event to be tested
*
* @return true
iff a drop down menu was opened
*/
private boolean openDropDownMenu(Event event) {
Widget item = event.widget;
if (item != null) {
int style = item.getStyle();
if ((style & SWT.DROP_DOWN) != 0) {
if (event.detail == 4) { // on drop-down button
ToolItem ti = (ToolItem) item;
final MenuManager menuManager = new MenuManager();
Menu menu = menuManager.createContextMenu(ti.getParent());
String helpContextId = null;
try {
helpContextId = commandService.getHelpContextId(command
.getCommand().getId());
} catch (NotDefinedException e) {
// No helpContextId
}
IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench != null && helpContextId != null) {
workbench.getHelpSystem().setHelp(menu, helpContextId);
}
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
String id = getId();
if (dropDownMenuOverride != null) {
id = dropDownMenuOverride;
}
menuService.populateContributionManager(
menuManager, "menu:" + id); //$NON-NLS-1$
}
});
// position the menu below the drop down item
Rectangle b = ti.getBounds();
Point p = ti.getParent().toDisplay(
new Point(b.x, b.y + b.height));
menu.setLocation(p.x, p.y); // waiting for SWT
// 0.42
menu.setVisible(true);
return true; // we don't fire the action
}
}
}
return false;
}
private void setIcon(ImageDescriptor desc) {
icon = desc;
updateIcons();
}
private void updateIcons() {
if (widget instanceof MenuItem) {
MenuItem item = (MenuItem) widget;
LocalResourceManager m = new LocalResourceManager(JFaceResources
.getResources());
item.setImage(icon == null ? null : m.createImage(icon));
disposeOldImages();
localResourceManager = m;
} else if (widget instanceof ToolItem) {
ToolItem item = (ToolItem) widget;
LocalResourceManager m = new LocalResourceManager(JFaceResources
.getResources());
item.setDisabledImage(disabledIcon == null ? null : m
.createImage(disabledIcon));
item.setHotImage(hoverIcon == null ? null : m
.createImage(hoverIcon));
item.setImage(icon == null ? null : m.createImage(icon));
disposeOldImages();
localResourceManager = m;
}
}
private void setText(String text) {
label = text;
update(null);
}
private void setChecked(boolean checked) {
if (checkedState == checked) {
return;
}
checkedState = checked;
if (widget instanceof MenuItem) {
((MenuItem) widget).setSelection(checkedState);
} else if (widget instanceof ToolItem) {
((ToolItem) widget).setSelection(checkedState);
}
}
private void setTooltip(String text) {
tooltip = text;
if (widget instanceof ToolItem) {
((ToolItem) widget).setToolTipText(text);
}
}
private void setDisabledIcon(ImageDescriptor desc) {
disabledIcon = desc;
updateIcons();
}
private void setHoverIcon(ImageDescriptor desc) {
hoverIcon = desc;
updateIcons();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#isEnabled()
*/
public boolean isEnabled() {
if (command != null) {
return command.getCommand().isEnabled();
}
return false;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy