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

Eclipse插件以编程方式启用/禁用菜单项,eclipse,eclipse-plugin,runtime,menuitem,Eclipse,Eclipse Plugin,Runtime,Menuitem,我正在编写一个扩展AbstractDebugView的eclipse插件 我的插件有一个上下文菜单项、一个下拉菜单项和一个工具栏菜单项。与这些菜单项关联的操作是I类创建的(CopyAction),它扩展了org.eclipse.jface.action.action public类CopyAction扩展了动作{ 私有字符串文本; 私有字符串工具脚本; 启用私有布尔值; 私有图像描述符; ... 公共版权行动{ text=“复制”; toolTipText=“复制操作”; 启用=错误;

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

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

public类CopyAction扩展了动作{
私有字符串文本;
私有字符串工具脚本;
启用私有布尔值;
私有图像描述符;
...    
公共版权行动{
text=“复制”;
toolTipText=“复制操作”;
启用=错误;
图像描述符=。。。;
}
...
@凌驾
已启用公共void集(已启用布尔值){
this.enabled=已启用;
}
@凌驾
公共布尔值isEnabled(){
返回启用;
}    
...
}
请注意,默认情况下,我的操作处于禁用状态(enabled=false)

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

公共类MyDebugView扩展了AbstractDebugView{
CopyAction CopyAction;
...
@凌驾
受保护的查看器createViewer(复合父级){
//做一些事情来创建查看器内容
createActions();
fillLocalPullDown();
...
}
@凌驾
受保护的void createActions(){
copyAction=新建copyAction();
}   
私有void fillLocalPullDown(){
IActionBars=getViewSite().getActionBars();
bar.getMenuManager().add(copyAction);
}
@凌驾
受保护的void fillContextMenu(IMenuManager){
添加(copyAction);
}   
@凌驾
受保护的无效配置工具栏(IToolBarManager){
添加(copyAction));
}    
}
到目前为止,一切都很顺利。当我测试插件时,我可以看到上下文菜单、工具栏菜单和下拉菜单

所有菜单项都被禁用,正如我所期望的,因为CopyAction集合的构造函数enabled=false

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

私有类MySelectionChangedListener实现了ISelectionChangedListener{
公共作废selectionChanged(SelectionChangedEvent事件){
//确定是否应启用复制操作
...
copyAction.setEnabled(true)
}
}
我遇到的问题是,即使我在copyAction上将enabled设置为true,菜单项也不会变为enabled

我怀疑发生了什么,即使我将enabled属性设置为true,也不会发生任何事情,因为需要通知菜单属性已更改。 是否需要调用某种方法来强制菜单管理器更新自己,从而检查复制操作的enabled属性

====

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


我应该放弃我现在做事情的方式,用插件描述符和属性测试仪来做吗?我不想放弃我到目前为止所做的所有工作,但对我来说,正确地完成工作比花时间大惊小怪更重要。

添加一个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);
    ...
}

添加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);
    ...
}