2016-02-19 39 views
1

在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聲明一場比賽是很重要的。

但是,它不設在那裏我會想到「刪除」操作是,但與運行方式的貢獻等「常規」區域,這可能是由於popup:org.eclipse.ui.popup.any?after=additionsmenuLocation價值,但我米不知道什麼是正確的價值。

+0

你看過使用'org.eclipse.ltk.core.refactoring.deleteParticipants'擴展點來參與所有的刪除。 –

+0

@ greg-449 - 你有一個關於如何使用它的例子嗎?目前我對ltk沒有依賴性,我的主要問題是「刪除」操作菜單甚至不存在 –

+0

定義'org.eclipse.ui.edit.delete'的處理程序應該可以工作。您是否明確地在您的導航器擴展中貢獻了該命令,還是從其他位置(內置)貢獻出來的?你是否嘗試在'activeWhen'中添加'enabledWhen'的條件相同? –

回答

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根據標準進行了驗證

感謝Rüdiger Herrmann指導我朝着正確的答案。另請參閱How to add items in popup menu?,其中有有價值的信息。

0

以編程寄存器的命令的正確的方法是重寫fillContextMenu方法:

@Override 
public void fillContextMenu(IMenuManager menu) { 

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