Eclipse RCP: один обработчик видит поставщика источника, другой нет - PullRequest
0 голосов
/ 08 июля 2011

У меня есть несколько плагинов, где команды должны быть отключены, когда пользователь не вошел в систему. Это делается через 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 ]

1 голос
/ 09 июля 2011

Конфликт между определениями обработчиков в <command defaultHandler=... и <handler .... После удаления атрибута defaultHandler все работает нормально.

1 голос
/ 08 июля 2011

Точка расширения выглядит хорошо.

Тогда возникает очевидный вопрос: как реализован обработчик?Я видел множество случаев - особенно во время обучения плагинов Eclipse, но также и вне этого - когда обработчик делает не подкласс org.eclipse.core.commands.AbstractHandler, но реализуется снизу вверх ... Проблемным методом является1006 *, который по умолчанию возвращает false - что означает, что обработчик никогда не включается.Унаследованный метод от AbstractHandler делает правильные вещи ...

...