Eclipse插件以编程方式启用/禁用菜单项

时间:2013-09-01 22:49:24

标签: eclipse eclipse-plugin runtime menuitem

我正在编写一个扩展 AbstractDebugView 的eclipse插件。

我的插件有一个上下文菜单项,一个下拉菜单项和一个工具栏菜单项。与这些菜单项关联的操作是我创建的类( CopyAction ),它扩展了 org.eclipse.jface.action.Action

public class CopyAction extends Action {
    private String text;
    private String toolTipText;
    private boolean enabled;
    private ImageDescriptor imageDescriptor;
    ...    
    public CopyAction() {
        text = "Copy";
        toolTipText = "Copy Action";
        enabled = false;
        imageDescriptor = ...;
    }
    ...
    @Override
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
    @Override
    public boolean isEnabled() {
        return enabled;
    }    
    ...
}

请注意,默认情况下我的操作已被禁用(启用= false)。

在我的插件主视图类中,我创建并向每个菜单添加复制操作:

public class MyDebugView extends AbstractDebugView {
    CopyAction copyAction;
    ...
    @Override
    protected Viewer createViewer(Composite parent) {
        // do some stuff to create the viewer content
        createActions();
        fillLocalPullDown();
        ...
    }
    @Override
    protected void createActions() {
        copyAction = new CopyAction();
    }   
    private void fillLocalPullDown() {
        IActionBars bars = getViewSite().getActionBars();
        bars.getMenuManager().add(copyAction);
    }
    @Override
    protected void fillContextMenu(IMenuManager manager) {
        manager.add(copyAction);
    }   
    @Override
    protected void configureToolBar(IToolBarManager manager) {
        manager.add(copyAction));
    }    
}

到目前为止,一切都很有效。当我测试我的插件时,我可以看到上下文菜单,工具栏菜单和下拉菜单。

所有菜单项都被禁用,正如我所料,因为 CopyAction 的构造函数设置为enabled = false;

我想要做的是在我的插件视图中选择已更改时启用菜单项(恰好是 TreeViewer )。在树选择的回调中,我执行以下操作:

private class MySelectionChangedListener implements ISelectionChangedListener {
    public void selectionChanged(SelectionChangedEvent event) {
        // determine if the copy action should be enabled
        ...
        copyAction.setEnabled(true)
    }
}

我遇到的问题是即使我在 copyAction 上将enabled设置为true,菜单项也不会启用。

我怀疑发生了什么,即使我将enabled属性设置为true也没有任何反应,因为菜单需要通知属性已更改。 是否有一些方法我必须调用强制菜单管理器更新自己,从而检查复制操作的启用属性?

====

我一直在思考我编写插件的方式,并研究如何在Eclipse插件中添加/启用/禁用菜单项的互联网。我见过的几乎所有示例都使用 plugin.xml 来添加菜单贡献,而不是以编程方式执行。 (大多数也使用命令,而不是动作。)我还看到了使用在 plugin.xml 中配置的属性测试器启用/禁用/隐藏/显示菜单的位置。

我是否应该放弃我现在正在做的事情,并使用插件描述符和属性测试人员来做?我讨厌抛弃我迄今为止所做的所有工作,但对我来说更重要的是做正确而不是花时间大惊小怪。

1 个答案:

答案 0 :(得分:1)

添加一个IMenuListener,在上下文菜单即将显示时启用上下文菜单操作:

    menuManager = new MenuManager();
    menuManager.setRemoveAllWhenShown(true);
    menuManager.addMenuListener(new IMenuListener() {
        public void menuAboutToShow(IMenuManager m) {
            contextMenuAboutToShow(m);
        }
    });
...

然后:

protected void contextMenuAboutToShow(IMenuManager m) {
    copyAction.setEnabled(copyAction.isEnabled());
    menuManager.add(copyAction);
    ...
}