开发者

Eclipse RCP: one handler sees source provider, another doesn't

I have several plugins where commands need to be disabled when the user isn't logged in. This is done via an ISourceProvider. In one plugin.xml I have:

<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>

This works fine; the correct command is visible all the time. In another plugin, which depends on this one, I have

<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
        all开发者_如何学PythonPopups="false"
        locationURI="toolbar:arm.views.alarms">
     <command
           commandId="arm.alarms.commands.request_more_alarms"
           style="push">
     </command>
  </menuContribution>
</extension>

And this command is disabled all the time. What's going wrong?


The extension point stuff looks fine.

The obvious question is then: how is the handler implemented? I have seen numerous cases - especially during Eclipse plug-in training, but also outside this - where the handler does not sub-class org.eclipse.core.commands.AbstractHandler but is implemented bottom-up... The problematic method is isEnabled() which by default returns false - which of cause means the handler is never enabled. The inherited method from AbstractHandler does the right thing...


There is a conflict between handler definitions in <command defaultHandler=... and <handler .... After removing the defaultHandler attribute, it works fine.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜