1

我正在编写一个扩展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中配置的属性测试器启用/禁用/隐藏/显示菜单的位置。

我应该放弃我现在做事的方式并使用插件描述符和属性测试器来做吗?我讨厌扔掉我到目前为止所做的所有工作,但对我来说,正确地做这件事比花时间大惊小怪更重要。

4

1 回答 1

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);
    ...
}
于 2013-09-03T09:39:58.840 回答