Eclipse RCP:一个处理程序看到源提供程序,另一个不看

时间:2011-07-08 14:17:14

标签: eclipse-rcp

我有几个插件,当用户没有登录时需要禁用命令。这是通过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>

此命令始终处于禁用状态。出了什么问题?

2 个答案:

答案 0 :(得分:1)

扩展点的东西看起来很好。

显而易见的问题是:处理程序是如何实现的?我见过很多案例 - 特别是在Eclipse插件培训期间,但也在此之外 - 处理程序子类org.eclipse.core.commands.AbstractHandler但是自下而上实现...有问题方法是isEnabled(),默认情况下返回false - 这意味着从不启用处理程序。来自AbstractHandler的继承方法做了正确的事......

答案 1 :(得分:1)

<command defaultHandler=...<handler ...中的处理程序定义之间存在冲突。删除defaultHandler属性后,它可以正常工作。