我有几个插件,当用户没有登录时需要禁用命令。这是通过ISourceProvider完成的。在一个plugin.xml中,我有:
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="menu:org.eclipse.ui.main.menu">
<menu
id="menus.arm"
label="%menu.label"
mnemonic="%menu.mnemonic">
<command
commandId="ru.focusmedia.odp.arm.commands.login"
style="push">
<visibleWhen
checkEnabled="false">
<with
variable="arm.variables.loggedIn">
<equals
value="false">
</equals>
</with>
</visibleWhen>
</command>
<command
commandId="ru.focusmedia.odp.arm.commands.logout"
style="push">
<visibleWhen
checkEnabled="false">
<with
variable="arm.variables.loggedIn">
<equals
value="true">
</equals>
</with>
</visibleWhen>
</command>
<command
commandId="org.eclipse.ui.file.exit"
label="%command.label"
style="push"
tooltip="%command.tooltip">
</command>
</menu>
<menu
id="menus.help"
label="%menu.label.0"
mnemonic="%menu.mnemonic.0">
<command
commandId="org.eclipse.ui.help.aboutAction"
label="%command.label.0"
style="push"
tooltip="%command.tooltip.0">
</command>
</menu>
</menuContribution>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
defaultHandler="ru.focusmedia.odp.arm.login.LogoutHandler"
id="ru.focusmedia.odp.arm.commands.logout"
name="%command.name.logout">
</command>
<command
defaultHandler="ru.focusmedia.odp.arm.login.LoginHandler"
id="ru.focusmedia.odp.arm.commands.login"
name="%command.name.login">
</command>
</extension>
<extension
point="org.eclipse.ui.services">
<sourceProvider
provider="ru.focusmedia.odp.arm.login.LoginStateSourceProvider">
<variable
name="arm.variables.loggedIn"
priorityLevel="workbench">
</variable>
</sourceProvider>
</extension>
这很好用;正确的命令始终可见。在另一个依赖于这个插件的插件中,我有
<extension
point="org.eclipse.ui.commands">
<command
defaultHandler="ru.focusmedia.odp.arm.alarms.RequestMoreAlarmsHandler"
id="arm.alarms.commands.request_more_alarms"
name="Request more alarms">
</command>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
class="ru.focusmedia.odp.arm.alarms.RequestMoreAlarmsHandler"
commandId="arm.alarms.commands.request_more_alarms">
<enabledWhen>
<with
variable="arm.variables.loggedIn">
<equals
value="true">
</equals>
</with>
</enabledWhen>
</handler>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="toolbar:arm.views.alarms">
<command
commandId="arm.alarms.commands.request_more_alarms"
style="push">
</command>
</menuContribution>
</extension>
此命令始终处于禁用状态。出了什么问题?
答案 0 :(得分:1)
扩展点的东西看起来很好。
显而易见的问题是:处理程序是如何实现的?我见过很多案例 - 特别是在Eclipse插件培训期间,但也在此之外 - 处理程序不子类org.eclipse.core.commands.AbstractHandler
但是自下而上实现...有问题方法是isEnabled()
,默认情况下返回false
- 这意味着从不启用处理程序。来自AbstractHandler
的继承方法做了正确的事......
答案 1 :(得分:1)
<command defaultHandler=...
和<handler ...
中的处理程序定义之间存在冲突。删除defaultHandler
属性后,它可以正常工作。