【问题标题】:Contributing a custom delete handler to the project explorer context menu为项目资源管理器上下文菜单提供自定义删除处理程序
【发布时间】: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() 被调用了吗?

标签: eclipse eclipse-plugin


【解决方案1】:

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

@Override
public void fillContextMenu(IMenuManager menu) {

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

【讨论】:

    【解决方案2】:

    要以声明方式注册命令,除了删除命令的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 正在根据标准进行验证

    感谢Rüdiger Herrmann 引导我找到正确的答案。另请参阅How to add items in popup menu?,其中包含有价值的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多