【发布时间】:2016-02-20 00:26:57
【问题描述】:
在一个 Eclipse 插件中,我有一个自定义的 org.eclipse.ui.navigator.navigatorContent 扩展。我正在尝试提供自定义删除处理程序。以前我使用的是org.eclipse.ui.popupMenus 扩展点和objectContribution/action,但由于Eclipse bug #329979: [Key Bindings] Support keybinding of objectContributions,它不支持键绑定。
我尝试了几种方法:
为删除命令定义处理程序
<extension
point="org.eclipse.ui.handlers">
<handler
commandId="org.eclipse.ui.edit.delete"
class="org.apache.sling.ide.eclipse.ui.actions.JcrNodeDeleteHandler">
<activeWhen>
<adapt type="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode"/>
</activeWhen>
</handler>
</extension>
在我的 actionProvider 中注册自定义删除操作
我已经为我的自定义 navigatorContent 注册了一个 actionProvider。
<actionProvider
class="org.apache.sling.ide.eclipse.ui.nav.PackageExplorerOpenActionProvider"
id="org.apache.sling.ide.eclipse.ui.nav.actions.OpenActions"
overrides="org.eclipse.jdt.ui.navigator.actions.OpenActions">
<enablement>
<instanceof value="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode"/>
</enablement>
</actionProvider>
然后我在那个 ActionProvider 中注册了这个动作
@Override
public void fillActionBars(IActionBars actionBars) {
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId() ,deleteAction);
}
它们都没有产生预期的效果,所以现在我被卡住了。
如何为我的自定义导航器提供删除命令的自定义实现,该导航器也对键绑定做出反应?
更新
我已经能够使用以下命令注册删除命令:
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="popup:org.eclipse.ui.popup.any?after=additions">
<command
commandId="org.eclipse.ui.edit.delete"
icon="icons/ovr16/delete_obj.gif"
mnemonic="D"
label="Delete">
<visibleWhen
checkEnabled="false">
<iterate ifEmpty="false">
<adapt
type="org.apache.sling.ide.eclipse.ui.nav.model.JcrNode">
</adapt>
</iterate>
</visibleWhen>
</command>
</menuContribution>
</extension>
请务必注意,visibleWhen 条件必须与 handler 声明中的条件匹配。
但是,它不在我期望的“删除”操作所在的位置,而是在具有 Run As 贡献等的“常规”区域中。这可能是由于 menuLocation 的值是 popup:org.eclipse.ui.popup.any?after=additions,但我不确定正确的值是多少。
【问题讨论】:
-
您是否看过使用
org.eclipse.ltk.core.refactoring.deleteParticipants扩展点参与所有删除。 -
@greg-449 - 你有一个关于如何使用它的例子吗?目前我不依赖 ltk,我的主要问题是“删除”操作菜单甚至不存在
-
为
org.eclipse.ui.edit.delete定义一个处理程序应该可以工作。您是在导航器扩展中明确贡献命令还是从其他地方(内置)贡献?您是否尝试使用与activeWhen相同的条件添加enabledWhen? -
@RüdigerHerrmann - 查看我的更新 - actionProvider 由 contentNavigator 提供。我不确定你对贡献命令的意思 - 我只为它定义一个处理程序。我应该做点别的吗?另请参阅我的回复,我能够以编程方式解决问题,但我仍在寻找一种声明方式。
-
很抱歉给您带来了困惑。
actionProvider是我的意思 明确贡献,与删除命令由其他人(例如 JDT)贡献并且您只提供处理程序相反。如果您只声明处理程序,究竟会发生什么?上下文菜单中是否有删除项?是你的吗?键绑定什么都不做,对吧?但是HandlerProxy::execute()被调用了吗?