首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Eclipse 插件開發深度指南:菜單功能全解析與三大擴展點實戰

     編輯:Java 相關知識

Eclipse 菜單體系概覽

Eclipse 提供三大類菜單,覆蓋不同交互場景:

  • 主菜單:頂層菜單欄,建議複用現有菜單(如 Search)而非新增頂級菜單,避免冗餘。
  • 視圖/編輯器菜單:包含視圖下拉菜單與工具欄菜單,常用操作置於工具欄。
  • 上下文菜單:右鍵彈出,根據選中對象動態變化,靈活性最高。

三大擴展點機制對比

擴展點別名核心特點適用菜單類型
org.eclipse.ui.commandsCommands 方式界面表現與實現分離:Command → MenuContribution(locationURI) → Handler。推薦新開發使用。全部
org.eclipse.ui.actionSetsActions 方式表現與實現耦合在 Action 中,舊插件常用。需理解 menubarPath/toolbarPath 路徑語法。主菜單、視圖菜單
org.eclipse.ui.popupMenuspopupMenus 方式專門針對上下文菜單,通過 objectClass 綁定目標對象類型。上下文菜單

Commands 方式深度解析(推薦標準)

三步驟創建菜單項

  1. 定義 Command 與 Category(org.eclipse.ui.commands):邏輯分組管理。
  2. 指定顯示位置(org.eclipse.ui.menus):通過 locationURI 精確定位。
    • 主菜單:menu:org.eclipse.ui.main.menu?after=additions
    • 主工具欄:toolbar:org.eclipse.ui.main.toolbar?after=additions
    • 視圖下拉菜單:menu:viewId?after=additions
    • 視圖工具欄:toolbar:viewId?after=additions
    • 上下文菜單:popup:viewId?after=additions 或 popup:org.eclipse.ui.popup.any?after=additions(全局)
    • 嵌入現有菜單:menu:org.eclipse.search.menu?dialogGroup
  3. 綁定實現類(org.eclipse.ui.handlers):Handler 類實現 IHandler 接口。

完整 plugin.xml 示例

<extension point="org.eclipse.ui.commands">
  <category id="com.free.menu.category" name="Menu Example"/>
  <command categoryId="com.free.menu.category" id="com.free.menu.commands.jokeCommand" name="Joke Command"/>
  <command categoryId="com.free.menu.category" id="com.free.menu.commands.angryCommand" name="Angry Command"/>
</extension>

<extension point="org.eclipse.ui.menus">
  <menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=additions">
    <menu id="com.free.menu.MenuExample" label="Menu Example">
      <command commandId="com.free.menu.commands.jokeCommand" style="push"/>
      <command commandId="com.free.menu.commands.angryCommand" style="push"/>
    </menu>
  </menuContribution>
  <menuContribution locationURI="menu:com.free.menu.view.MenuExplorer?after=additions">
    <command commandId="com.free.menu.commands.jokeCommand" icon="icons/searchres.gif" style="push">
      <visibleWhen checkEnabled="false">...</visibleWhen> <!-- 選中 Person 類型時顯示 -->
    </command>
  </menuContribution>
  <menuContribution locationURI="popup:com.free.menu.view.MenuExplorer?after=additions">
    <command commandId="com.free.menu.commands.jokeCommand" icon="icons/searchres.gif" style="push"/>
    <command commandId="com.free.menu.commands.angryCommand" style="push"/>
  </menuContribution>
</extension>

<extension point="org.eclipse.ui.handlers">
  <handler class="com.free.menu.actions.JokeCommand" commandId="com.free.menu.commands.jokeCommand">
    <enabledWhen><count value="2"/></enabledWhen> <!-- 僅選中 2 個對象時啟用 -->
  </handler>
  <handler class="com.free.menu.actions.AngryCommand" commandId="com.free.menu.commands.angryCommand"/>
</extension>

Actions 與 popupMenus 方式要點

Actions 方式

通過 org.eclipse.ui.actionSets,Action 類實現 IWorkbenchWindowActionDelegate。menubarPath 指定位置(如 org.eclipse.search.menu/dialogGroup),toolbarPath 指定工具欄位置。enablesFor="+" 表示選中至少一個對象啟用。

popupMenus 方式

通過 org.eclipse.ui.popupMenus,objectContribution 的 objectClass 綁定目標類型(如 IResource、IGraphicalEditPart、自定義 Model 類)。Action 實現 IObjectActionDelegate。支持 visibility 和 enablement 通過 objectState 根據模型屬性值動態控制顯示/啟用。

菜單動態控制機制

  • Commands:visibleWhen 控制顯隱,enabledWhen/activeWhen 控制啟用/禁用。
  • Actions:enablement 控制啟用/禁用。
  • popupMenus:objectContribution 的 visibility/enablement 或 Action 級別的 enablement。

高級場景:GMF 編輯器中可擴展 org.eclipse.gmf.runtime.common.ui.services.action.actionFilterProviders,實現 AbstractActionFilterProvider 的 testAttribute 方法,無需模型實現 IActionFilter。

綜合實戰:Menu Example 視圖

示例創建「Menu Example」視圖,集成三種擴展點方式:

  • Commands:主菜單、視圖下拉/工具欄/上下文菜單,含 visibleWhen(選中 Person 顯示)與 enabledWhen(選中 2 個啟用)。
  • Actions:向 Search 主菜單添加 SmileAction。
  • popupMenus:針對 IResource 全局上下文菜單,針對 Person 類型上下文菜單(含 firstName/lastName 屬性過濾)。

視圖代碼中 hookContextMenu() 註冊上下文菜單,viewMenuAction() 通過 IMenuManager.update() 程序化刷新菜單狀態。模型類 Person 實現 IActionFilter.testAttribute() 支持屬性級可見性控制。

最佳實踐建議

  1. 新開發優先使用 Commands 方式,職責分離清晰,擴展性最強。
  2. 合理規劃 locationURI,善用 ?after=additions 等位置參數控制排序。
  3. 充分利用 visibleWhen/enabledWhen 表達式實現聲明式動態控制,減少程序化代碼。
  4. 避免在主菜單添加過多頂級項目,優先擴展現有語義分組。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved