如何在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

