Команда меню Eclipse RCP отображается как активная, хотя команда не включена - PullRequest
0 голосов
/ 11 ноября 2011

У меня странная проблема с командами меню.

Я хочу сделать команду меню, которая активна в одних условиях, но неактивна в других (например, команда закрытия активна, когда конкретный объект открыт, но неактивна, когда такого объекта нет)

Я испробовал две стратегии:

  • переопределяет метод обработчика isEnabled(), чтобы содержать логику, которая должна сообщать ему, активна ли команда или нет

  • расширение AbstractSourceProvider, которое слушает состояние и изменяет предоставленную переменную.

В обоих подходах код работает нормально, вклад в меню активируется и деактивируется. Однако, и это проблема, она делает это, только если я переключаюсь на другое приложение (alt tab на что-то другое) и переключаю обратно. Если этого не сделать, только команда становится неактивной, но вклад в меню по-прежнему показывает ее как активную, в результате чего 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, пытаясь определить проблему, но ничего не смог найти.

Кто-то еще сталкивался с этим и нашел обходной путь?

Спасибо, Михай

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

org.eclipse.ui.menus элементы команды поддерживают только visibleWhen, но не activeWhen (поскольку команда будет включена или обработана, элемент меню просто ссылается на команду).

org.eclipse.ui.handlers поддерживает activeWhen (который определяет , если обработчик может быть активен в данной точке) и enabledWhen (который будет отвечать, что обработчики включили состояние на основе включённое выражение).

0 голосов
/ 14 ноября 2011

Хорошо, так что я нашел обходной путь. Насколько я могу судить, это Eclipse Bug. В некоторых случаях он запускает обновление метки в зависимости от состояния соответствующей команды (если команда отключена, поэтому метка должна быть), как при сворачивании окна, но в некоторых случаях это не так, например, когда вы просто вызываете меню после команды был отключен.

Таким образом, временное решение состоит в том, чтобы вручную запустить заполнение меню. Это можно сделать с помощью следующего фрагмента кода:

    public static void refillAllActionBars() {
        IWorkbench workbench = PlatformUI.getWorkbench();
        WorkbenchWindow ww = (WorkbenchWindow)workbench.getActiveWorkbenchWindow();

        ww.fillActionBars(ActionBarAdvisor.FILL_STATUS_LINE);
}

Много слежки за тремя строками кода: (

...