我正在编写一个扩展 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 中配置的属性测试器启用/禁用/隐藏/显示菜单的位置。
我是否应该放弃我现在正在做的事情,并使用插件描述符和属性测试人员来做?我讨厌抛弃我迄今为止所做的所有工作,但对我来说更重要的是做正确而不是花时间大惊小怪。
答案 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);
...
}