将自定义删除处理程序贡献给项目资源管理器上下文菜单

时间:2016-02-19 10:15:27

标签: eclipse eclipse-plugin

在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);
}

他们都没有产生预期的效果,所以现在我被卡住了。

如何为自定义导航器提供delete命令的自定义实现,该命令也会对键绑定做出反应?

更新

我已经能够使用以下命令注册删除命令:

<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声明中的条件相匹配。

但是,它并不在我希望“删除”的位置。行动,但在一般&#39;具有运行方式贡献的区域等。这可能是由menuLocation的{​​{1}}值引起的,但我不确定正确的值是什么。

2 个答案:

答案 0 :(得分:0)

以编程方式注册命令的正确方法是覆盖fillContextMenu方法:

@Override
public void fillContextMenu(IMenuManager menu) {

    super.fillContextMenu(menu);
    if ( deleteAction != null ) {
        menu.appendToGroup(ICommonMenuConstants.GROUP_EDIT, renameAction);
    }
}

答案 1 :(得分:0)

要以声明方式注册命令,除了删除命令的handler之外,还必须注册menuContribution/command

<extension
    point="org.eclipse.ui.menus">
    <menuContribution
       locationURI="popup:org.eclipse.ui.popup.any?after=group.edit">
       <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>

需要注意的一些要点:

  1. locationURI指定?after=group.edit。该部分很重要,因为group.edit是菜单的ID,通常包含删除/复制/粘贴操作
  2. visibleWhen必须与命令中声明的内容完全匹配。我错误地仅使用adapt标记,但必须将其包含在iterate标记内。我似乎记得这是因为IStructuredSelection正在根据标准进行验证
  3. 感谢Rüdiger Herrmann指导我找到正确的答案。另请参阅How to add items in popup menu?,其中包含有价值的信息。