2

通常,在编辑器中,可以提供一个上下文菜单(在 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);

我想做类似的事情,但在对话框中。

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

甚至可以通过扩展点为对话框中的控件提供菜单吗?

4

3 回答 3

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));
于 2012-04-27T07:36:37.617 回答
0

我已经设法在首选项对话框的自定义表格控件中显示上下文菜单(我也在视图中使用)。

在我的 ViewPart 我有方法:

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

    return myView;
}

在我的 RCP 应用程序中,视图始终可见,因此该方法永远不应返回 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 可能不是最好的主意,但它很简单并且有效。

于 2014-02-25T12:11:06.213 回答
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名称在哪里,并且是.ViewPartactiveViewerTableViewer

如果你能做到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));
}
于 2012-04-26T18:48:00.227 回答