在Eclipse中,如何在对话框中为控件提供上下文/弹出菜单?

时间:2012-04-26 18:17:57

标签: eclipse-plugin eclipse-rcp jface

通常,在编辑器中,可以使用以下内容提供上下文菜单(在org.eclipse.ui.menus扩展名中声明)。

MenuManager menuManager = new MenuManager();
Control menuParent = ... ;//some Control in the editor
Menu contextMenu = menuManager.createContextMenu(menuParent);
menuParent.setMenu(contextMenu);
getEditorSite().registerContextMenu(CONTEXT_MENU_ID, menuManager, getMySelectionProvider(), false);

我想在Dialog中做类似的事情。

显然,我的谷歌搜索技能今天缺乏,因为我似乎找不到任何东西,只有一个人在DZone上问同样的事情而没有成功。

是否可以通过扩展点将菜单提供给对话框中的控件?

3 个答案:

答案 0 :(得分:8)

使用IMenuService工作台窗口:

IMenuService mSvc = (IMenuService) window.getService(IMenuService.class);
MenuManager mgr = new MenuManager();
mSvc.populateContributionManager(mgr, "popup:my.dialog.menu");
control.setMenu(mgr.createContextMenu(control));

答案 1 :(得分:0)

以下是我为ViewPart所做的事情。我不知道它是否适用于Dialog

protected void createContextMenu() {
    MenuManager menuMgr = new MenuManager("#PopupMenu");
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(new IMenuListener() {
        public void menuAboutToShow(IMenuManager m) {
            WorkAssignmentView.this.fillContextMenu(m);
        }
    });
    Menu menu = menuMgr.createContextMenu(activeViewer.getControl());
    activeViewer.getControl().setMenu(menu);
    getSite().registerContextMenu(menuMgr, activeViewer);
}

其中WorkAssignmentView是我的ViewPart课程的名称,activeViewerTableViewer

如果您可以执行control.getControl().setMenu(menu);,那么您应该可以将其用作模型。

这是填充上下文菜单的方法。

protected void fillContextMenu(IMenuManager menuMgr) {

    WorkAssignmentViewRow[] row = this.getSelectedAssignments();

    menuMgr.add(addAction);

        if (status.equals(WorkAssignmentViewRow.ACTIVE)) {
            menuMgr.add(new Separator());
            menuMgr.add(modifyAction);
            menuMgr.add(changeAction);
            menuMgr.add(new Separator());
            menuMgr.add(deleteAction);
            menuMgr.add(new Separator());
            menuMgr.add(whoIsModifyingAction);
            menuMgr.add(new Separator());
            menuMgr.add(displayAction);
            menuMgr.add(displayFullAction);
            menuMgr.add(new Separator());
            menuMgr.add(updateAction);
            menuMgr.add(commitAction);
            menuMgr.add(new Separator());
            menuMgr.add(developmentMoveAction);
            menuMgr.add(new Separator());
            menuMgr.add(testMoveAction);
            menuMgr.add(new Separator());
            menuMgr.add(productionMoveAction);
            menuMgr.add(displayProductionAction);
            menuMgr.add(new Separator());
        } else if (status.equals(WorkAssignmentViewRow.INACTIVE)){
            menuMgr.add(new Separator());
            menuMgr.add(changeAction);
            menuMgr.add(new Separator());
            menuMgr.add(deleteAction);
            menuMgr.add(new Separator());
            menuMgr.add(displayAction);
            menuMgr.add(displayFullAction);
            menuMgr.add(new Separator());
        } else {
            menuMgr.add(new Separator());
            menuMgr.add(displayAction);
            menuMgr.add(displayFullAction);
            menuMgr.add(new Separator());
        }

    menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}

答案 2 :(得分:0)

我设法在自定义表格中显示上下文菜单(我也在View中使用) 在“首选项”对话框中进行控制。

在我的ViewPart中,我有方法:

public static MyView getView() {
    MyView myView = (MyView) 
    Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().
    getActivePage().findView(MyView.ID);

    return myView;
}

在我的RCP应用程序中,视图始终可见,因此该方法永远不应该 return null。

然后在我的偏好页面的ctor中,在对话框中打开:

    m_viewPart = MyView.getView();

在首选项页面中创建控件时,我会注册上下文菜单 我的ViewPart:

    Control control = new ...
    MenuManager menuManager = new MenuManager();
    Menu menu = menuManager.createContextMenu(control);
    control.setMenu(menu);
    viewPart.getSite().registerContextMenu("si.test.myCtxMenu", 
                                           menuManager, 
                                           selectionProvider);

在对话框中注册组件的上下文菜单可能不是最好的主意 到ViewPart,但它很简单并且有效。