向视图添加菜单操作

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;
    }
  }