向视图添加菜单操作
Adding a Menu Action to a view
我想在我的视图中添加一个菜单操作,例如 Eclipse 控制台中的这个:
我设法做了一些非常相似的事情。从我想要在菜单上执行的两个操作,其中一个与 MenuCreator 相关联,但这样做会将此操作设置为最上面的操作,或者在其他操作中换言之,带有打开菜单的箭头的那个,而且,当我单击它时,它没有打开菜单,而是从操作中启动 运行 方法中的代码。
我想要控制台操作的确切行为,我想要菜单上的 2 个操作和顶部的小图标来打开此菜单。我该怎么做?
目前的代码:
private void createToolBar() {
IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
actionNovaDespesa = new OpenNewDespesa();
actionNovaDespesa.setMenuCreator(new CustomActionMenu());
toolBar.add(actionNovaDespesa);
}
public class CustomActionMenu implements IMenuCreator {
private Menu menu;
public Menu getMenu(Control parent) {
menu = new Menu(parent);
MenuItem menuItemColaboradores = new MenuItem(menu, SWT.PUSH);
menuItemColaboradores.setText(LabelVARS.DESPESA_COLABORADOR);
menuItemColaboradores.setImage(Activator.getImageDescriptor(IconVARS.TOOLBAR_UTILIZADOR).createImage());
menuItemColaboradores.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
new OpenNewDespesaColaborador().run();
}
});
return menu;
}
public void dispose() {
if(menu != null) {
menu.dispose();
menu = null;
}
}
public Menu getMenu(Menu parent) {
return null;
}
}
您需要使菜单实现 IAction
以及 IMenuCreator
。类似于:
class DropDownAction extends Action implements IMenuCreator
{
private Menu menu;
DropDownAction()
{
super("Name", IAction.AS_DROP_DOWN_MENU);
setImageDescriptor(... image descriptor for button);
setMenuCreator(this);
}
@Override
public void dispose()
{
if (menu != null) {
menu.dispose();
menu = null;
}
}
@Override
public void runWithEvent(final Event event)
{
if (event.widget instanceof ToolItem)
{
final ToolItem toolItem = (ToolItem)event.widget;
final Control control = toolItem.getParent();
final Menu menu = getMenu(control);
final Rectangle bounds = toolItem.getBounds();
final Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
menu.setLocation(control.toDisplay(topLeft));
menu.setVisible(true);
}
}
@Override
public Menu getMenu(final Control parent)
{
if (menu != null) {
menu.dispose();
}
menu = new Menu(parent);
// TODO add your menu items
return menu;
}
@Override
public Menu getMenu(final Menu parent)
{
return null;
}
}
我想在我的视图中添加一个菜单操作,例如 Eclipse 控制台中的这个:
我设法做了一些非常相似的事情。从我想要在菜单上执行的两个操作,其中一个与 MenuCreator 相关联,但这样做会将此操作设置为最上面的操作,或者在其他操作中换言之,带有打开菜单的箭头的那个,而且,当我单击它时,它没有打开菜单,而是从操作中启动 运行 方法中的代码。
我想要控制台操作的确切行为,我想要菜单上的 2 个操作和顶部的小图标来打开此菜单。我该怎么做?
目前的代码:
private void createToolBar() {
IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
actionNovaDespesa = new OpenNewDespesa();
actionNovaDespesa.setMenuCreator(new CustomActionMenu());
toolBar.add(actionNovaDespesa);
}
public class CustomActionMenu implements IMenuCreator {
private Menu menu;
public Menu getMenu(Control parent) {
menu = new Menu(parent);
MenuItem menuItemColaboradores = new MenuItem(menu, SWT.PUSH);
menuItemColaboradores.setText(LabelVARS.DESPESA_COLABORADOR);
menuItemColaboradores.setImage(Activator.getImageDescriptor(IconVARS.TOOLBAR_UTILIZADOR).createImage());
menuItemColaboradores.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
new OpenNewDespesaColaborador().run();
}
});
return menu;
}
public void dispose() {
if(menu != null) {
menu.dispose();
menu = null;
}
}
public Menu getMenu(Menu parent) {
return null;
}
}
您需要使菜单实现 IAction
以及 IMenuCreator
。类似于:
class DropDownAction extends Action implements IMenuCreator
{
private Menu menu;
DropDownAction()
{
super("Name", IAction.AS_DROP_DOWN_MENU);
setImageDescriptor(... image descriptor for button);
setMenuCreator(this);
}
@Override
public void dispose()
{
if (menu != null) {
menu.dispose();
menu = null;
}
}
@Override
public void runWithEvent(final Event event)
{
if (event.widget instanceof ToolItem)
{
final ToolItem toolItem = (ToolItem)event.widget;
final Control control = toolItem.getParent();
final Menu menu = getMenu(control);
final Rectangle bounds = toolItem.getBounds();
final Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
menu.setLocation(control.toDisplay(topLeft));
menu.setVisible(true);
}
}
@Override
public Menu getMenu(final Control parent)
{
if (menu != null) {
menu.dispose();
}
menu = new Menu(parent);
// TODO add your menu items
return menu;
}
@Override
public Menu getMenu(final Menu parent)
{
return null;
}
}