Eclipse 插件越裝越多,菜單/工具欄/右鍵菜單被無關項目佔滿。本文提供三種層層遞進的精簡方案:聲明式過濾、Activities 機制屏蔽、運行時動態啟用/禁用。
利用 org.eclipse.ui.popupMenus 的 objectContribution 替代無條件 action,通過 nameFilter、objectClass 限定顯示條件。
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="my.example.objectContribution"
nameFilter="*example*"
objectClass="java.io.File">
<action class="my.example.MyAction" id="my.example.MyAction" label="Exe" menubarPath="additional"/>
</objectContribution>
</extension>
僅當選中資源路徑含 "example" 或對象 toString() 含關鍵字時顯示。
定義 activity + activityPatternBinding,匹配目標擴展 ID(格式:pluginId/localId),將其標記為 disabled。預設 activity 為 disabled,匹配的擴展自動隱藏。
<extension point="org.eclipse.ui.activities">
<activity id="my.example.activity" name="WizardActivity"/>
<activityPatternBinding activityId="my.example.activity" pattern="my\.example/mywizard"/>
</extension>
pattern 支援正則,可批量屏蔽。
根據業務標誌位(如 licence、用戶角色)運行時切換:
IWorkbenchActivitySupport support = PlatformUI.getWorkbench().getActivitySupport();
IActivityManager manager = support.getActivityManager();
Set<String> enabled = new HashSet<>(manager.getEnabledActivityIds());
if (flag == 1) {
if (enabled.add("my.example.activity")) support.setEnabledActivityIds(enabled);
} else {
if (enabled.remove("my.example.activity")) support.setEnabledActivityIds(enabled);
}
實現「有許可證顯示高級功能、無許可證隱藏」等動態 UI 需求。
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| plugin.xml 條件 | 靜態、基於選中對象類型/名稱 | 聲明式、無代碼、性能最好 | 無法動態運行時切換 |
| Activities 屏蔽 | 需屏蔽第三方插件擴展、批量管理 | 不改第三方代碼、支援正則批量 | 靜態、需預先知道擴展 ID |
| 代碼動態控制 | 運行時根據業務狀態顯示/隱藏 | 完全動態、可綁定許可/角色 | 需編寫啟動代碼、輕微性能開銷 |