菜单命令有一个奇怪的问题。
我想创建一个在某些条件下处于活动状态但在其他条件下处于非活动状态的菜单命令(例如:当特定实体打开时,close命令处于活动状态,但当没有此类实体时处于非活动状态)
我尝试过两种策略:
覆盖Handler的isEnabled()
方法,以包含应该告诉它该命令是否处于活动状态的逻辑
扩展侦听状态的AbstractSourceProvider
并更改提供的变量。
在这两种方法中,代码都正常,菜单贡献被激活并且deactivead。但是,这就是问题,只有当我切换到另一个应用程序(alt选项卡到其他应用程序)并切换回来时才会这样做。如果不这样做,切换只有命令变为非活动状态,但菜单贡献仍将其显示为活动状态,从而产生NotEnabledException
。
SourceProviderApproach
扩展点看起来像这样:
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu?before=window">
<menu
label="File">
<command
commandId="profile.close"
label="Close"
style="push">
<activeWhen
checkEnabled="false">
<with
variable="profile.gui.ActiveProfile">
<equals
value="active">
</equals>
</with>
</activeWhen>
</command>
</menuContribution>
</extension>
如果我将其更改为validWhen
一切正常,则会显示命令并相应地隐藏。但是,如果我将其切换到activeWhen
然后出现上述情况,我必须切换到另一个应用程序并返回,以使该菜单贡献显示为活动或非活动。
我还花了4个小时调试Eclipse代码,试图查明问题,但我找不到任何东西。
是否有其他人遇到此问题并找到了解决方法?
谢谢, 米哈伊
答案 0 :(得分:0)
org.eclipse.ui.menus 命令元素仅支持visibleWhen,not activeWhen(因为命令将被启用或处理,菜单项只是指一个命令)。
org.eclipse.ui.handlers 支持activeWhen(确定如果处理程序可以在给定点处于活动状态)和enabledWhen(将回答处理程序启用状态)基于enabledWhen表达式。)
答案 1 :(得分:-1)
好的,所以我找到了解决方法。 据我所知,这是一个Eclipse Bug。在某些情况下,它会根据底层关联命令状态触发标签更新(如果命令被禁用,标签也应该被禁用),例如最小化窗口时,但在某些情况下它不会,就像在命令后调用菜单一样已被禁用。
因此,临时解决方案是手动触发菜单的填充。这可以使用以下代码段完成:
public static void refillAllActionBars() {
IWorkbench workbench = PlatformUI.getWorkbench();
WorkbenchWindow ww = (WorkbenchWindow)workbench.getActiveWorkbenchWindow();
ww.fillActionBars(ActionBarAdvisor.FILL_STATUS_LINE);
}
大量窥探只有三行代码:(