You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Eclipse RCP的Properties视图各标签添加Compare右键菜单

问题描述

我已经实现了一个“Compare...”右键菜单,其子菜单是偏好设置中配置的工具(比如Beyond Compare),用于在Project Explorer视图中比较自定义文件,且仅在该视图树结构的特定文件选中时显示,对应的plugin.xml配置如下:

<extension
         point="org.eclipse.ui.menus">
       <menuContribution
             allPopups="true"
             locationURI="popup:org.eclipse.ui.popup.any?after=additions">
          <menu
                id="compareMenu"
                label="Compare..."
                tooltip="Compare the selected with other file">
             <separator
                   name="compareGroup"
                   visible="false">
             </separator>
          </menu>
       </menuContribution>
</extension>

我的应用的Properties视图通过如下方式配置了多个标签:

<extension
          point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
       <propertyTabs
             contributorId="org.eclipse.ui.navigator.ProjectExplorer">
          <propertyTab
                afterTab="CommonNavigator.tab.Resource"
                category="resource"
                id="com.ui.revisionInfoTab"
                label="Revision Info">
          </propertyTab>
          <propertyTab
                afterTab="com.ui.revisionInfoTab"
                category="resource"
                id="com.ui.revisionChangesTab"
                label="Revision Changes">
          </propertyTab>
          <propertyTab
                afterTab="com.ui.revisionChangesTab"
                category="resource"
                id="com.ui.allByParameterTab"
                label="All by Parameter">
          </propertyTab>
          <propertyTab
                afterTab="com.ui.allByParameterTab"
                category="resource"
                id="com.ui.allByRevisionTab"
                label="All by Revision">
          </propertyTab>
       </propertyTabs>
    </extension>

我希望在Properties视图的所有标签中添加相同的“Compare...”菜单及其动态子菜单,且仅在该视图的特定选择下可见。

目前我尝试通过如下方式添加,但未成功显示菜单:

<extension
         point="org.eclipse.ui.menus">
       <menuContribution
             allPopups="true"
             locationURI="popup:org.eclipse.ui.popup.any?after=additions">
          <menu
                id="compareMenu"
                label="Compare..."
                tooltip="Compare the selected with other file">
             <separator
                   name="compareGroup"
                   visible="false">
             </separator>
          </menu>
       </menuContribution>
       <menuContribution
             locationURI="menu:org.eclipse.ui.views.PropertySheet">
          <menu
                id="compareMenu"
                label="Compare..."
                tooltip="Compare the selected file with another file">
             <separator
                   name="compareGroup"
                   visible="false">
             </separator>
          </menu>
       </menuContribution>

请问:

  • 该配置方式是否正确?
  • 是否需要为不同视图重复配置menuContribution的locationURI?
  • 我使用的locationURI是否正确?
  • 如何实现该菜单仅在Properties视图的特定选择下可见?

解决方案

1. 当前配置的问题

你的配置存在两个核心问题:

  • 重复菜单ID冲突:同一插件内不能存在两个ID相同的菜单(compareMenu),这会导致Eclipse菜单注册逻辑异常,最终菜单无法正常加载。
  • 错误的Properties视图位置URI:menu:org.eclipse.ui.views.PropertySheet指向的是Properties视图的顶部菜单栏,而非右键弹出菜单。要添加右键菜单,必须使用popup:开头的URI,并指定Properties视图的上下文ID。

2. locationURI的正确用法

不同视图需单独配置菜单贡献

是的,不同视图的菜单需要单独配置menuContribution,因为每个视图有独立的上下文环境和菜单位置规则。

Properties视图右键菜单的正确locationURI

Properties视图的右键弹出菜单上下文ID为org.eclipse.ui.views.PropertySheet,正确的locationURI格式为:

popup:org.eclipse.ui.views.PropertySheet?after=additions

该URI表示将菜单添加到Properties视图的右键菜单中,放置在additions组之后的位置。

3. 修正后的菜单配置

修改plugin.xml中的菜单贡献部分,确保菜单ID唯一(或复用已有菜单并通过可见性控制显示),同时使用正确的locationURI:

方式1:独立配置Properties视图菜单

<extension point="org.eclipse.ui.menus">
    <!-- 保留原Project Explorer的菜单贡献 -->
    <menuContribution allPopups="true" locationURI="popup:org.eclipse.ui.popup.any?after=additions">
        <menu id="compareMenu" label="Compare..." tooltip="Compare the selected with other file">
            <separator name="compareGroup" visible="false"/>
        </menu>
    </menuContribution>
    
    <!-- Properties视图的独立菜单贡献 -->
    <menuContribution locationURI="popup:org.eclipse.ui.views.PropertySheet?after=additions">
        <menu id="compareMenuPropertySheet" label="Compare..." tooltip="Compare the selected file with another file">
            <separator name="compareGroupPropertySheet" visible="false"/>
        </menu>
    </menuContribution>
</extension>

方式2:复用已有菜单(推荐)

通过reference标签复用已定义的菜单,避免重复代码:

<extension point="org.eclipse.ui.menus">
    <menuContribution allPopups="true" locationURI="popup:org.eclipse.ui.popup.any?after=additions">
        <menu id="compareMenu" label="Compare..." tooltip="Compare the selected with other file">
            <separator name="compareGroup" visible="false"/>
        </menu>
    </menuContribution>
    
    <!-- 引用已有菜单到Properties视图右键 -->
    <menuContribution locationURI="popup:org.eclipse.ui.views.PropertySheet?after=additions">
        <reference id="compareMenu">
            <!-- 此处添加Properties视图专属的可见性条件 -->
        </reference>
    </menuContribution>
</extension>

4. 实现特定选择下的菜单可见性

使用visibleWhen元素结合Eclipse表达式语言,判断选中对象的类型或属性,控制菜单显示。

示例1:仅选中自定义文件类型时显示

假设你的自定义文件类型为com.ui.MyCustomFile,配置如下:

<menu id="compareMenuPropertySheet" label="Compare..." tooltip="Compare the selected file with another file">
    <separator name="compareGroupPropertySheet" visible="false"/>
    <visibleWhen>
        <with variable="selection">
            <iterate ifEmpty="false">
                <instanceof value="com.ui.MyCustomFile"/>
            </iterate>
        </with>
    </visibleWhen>
</menu>

示例2:结合Properties视图上下文判断

同时验证当前活动视图为Properties视图,且选中对象符合要求:

<visibleWhen>
    <and>
        <!-- 判断当前活动视图是Properties视图 -->
        <with variable="activePartId">
            <equals value="org.eclipse.ui.views.PropertySheet"/>
        </with>
        <!-- 判断选中对象为自定义文件类型 -->
        <with variable="selection">
            <iterate ifEmpty="false">
                <instanceof value="com.ui.MyCustomFile"/>
            </iterate>
        </with>
    </and>
</visibleWhen>

动态子菜单的可见性

如果子菜单是从偏好设置动态加载的,需要在子菜单的贡献配置中添加对应的visibleWhen条件,或在代码逻辑中控制子菜单的显示状态。

内容的提问来源于stack exchange,提问作者Freelancer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:44:53