Плагин Eclipse: динамически отключать / включать действие из главной панели меню

#java #eclipse #eclipse-plugin #eclipse-indigo #eclipse-pde

#java #eclipse #eclipse-плагин #eclipse-indigo #eclipse-pde

Вопрос:

РЕДАКТИРОВАТЬ: РЕШЕНО

Фон

Я внедрил плагин eclipse (на indigo, 3.7.2), который предоставляет новый значок в строке меню.

Это новое действие полностью инициализируется через несколько секунд после запуска eclipse (некоторые файлы конфигурации загружены из моего репозитория maven).

Я пытаюсь отключить это действие, пока мой активатор не завершит инициализацию.

Что я ищу

Перед инициализацией

Отключено

После инициализации

Включено

Что я уже сделал

Я добавил тест включения для своего действия. Мое действие будет включено, только если мой плагин активирован.

 <extension
     point="org.eclipse.ui.actionSets">
  <actionSet
        label="Action Set"
        visible="true"
        id="com.eclipse.plugins.extarcheytpe.actionSet">
     <action
           class="com.eclipse.plugins.extarchetype.actions.ShortcutsAction"
           icon="src/main/resources/icons/generic_box_16x16.png"
           id="com.eclipse.plugins.extarcheytpe.actions.ShortcutsAction"
           label="Shortcuts List"
           style="pulldown"
           toolbarPath="Shortcuts"
           tooltip="Shortcuts">
        <enablement>
           <pluginState
                 id="com.eclipse.plugins.extarchetype"
                 value="activated">
           </pluginState>
        </enablement>
     </action>
  </actionSet>
</extension>

[...]

<extension
      point="org.eclipse.ui.startup">
   <startup
          class="com.eclipse.plugins.extarchetype.Startup">
   </startup>
</extension>
  

Я определил класс запуска, где метод ignite () инициализирует конфигурацию моего плагина :

 public class Startup implements org.eclipse.ui.IStartup{

    @Override
    public void earlyStartup() {
            try {
                Activator.getDefault().ignite();
                Activator.getDefault().setChanged();
                Activator.getDefault().notifyObservers();
            } catch (Exception e) {
                e.printStackTrace();
            }       
    }

}
  

Я реализовал шаблон проектирования наблюдения между моим действием и моим активатором (для уведомления об окончании инициализации).

 public class ShortcutsAction extends Action implements
        IWorkbenchWindowPulldownDelegate, IMenuCreator, IObserver {

    private IAction action;
    private Menu menu;
    public boolean enabled = false;

    public ShortcutsAction() {
        super();
        Activator.getDefault().addObserver(this);
    }

    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        // Change action object instance at first selection
        if (action != this.action) {
            this.action = action;
        }
        // If property enabled is true, enable this action
        if (enabled) {
            action.setEnabled(true);
        } else {
            action.setEnabled(false);
        }
    }

    [...]

    @Override
    public void update(IObservable obs, Object obj) {
        this.enabled = true;
        ConsoleHandler.logInfo("Shortcut enabled");
        action.setEnabled(true);
    }
}
  

Заключение

Я получил то, что искал :

  1. При загрузке мое действие отключено
  2. Поскольку мой плагин инициализирован, мое действие включено

Спасибо.

Ответ №1:

<objectState> и <objectClass> проверяйте состояние и класс выбранных в данный момент объектов, а не класс обработчика действий.

Я думаю, вам пришлось бы использовать <systemProperty> для проверки установленного вами свойства. Или используйте selectionChanged метод для включения IAction .

selectionChanged Метод является частью IActionDelegate интерфейса, с помощью которого вы косвенно реализуете IWorkbenchWindowPulldownDelegate :

 public void selectionChanged(IAction action, ISelection selection)
  

action Параметр — это фактическое действие, вызов action.setEnabled(true) для включения действия.

Комментарии:

1. Спасибо, Грег, за твой ответ.

2. Не могли бы вы дать мне более подробную информацию о методе SelectionChanged, пожалуйста?

3. Хорошо, я попытался использовать метод SelectionChanged. Это работает, только если я выбираю что-то в проводнике пакетов. Но я хочу «автоматически» включить мое действие, когда мой активатор уведомит об окончании инициализации, не требуя от пользователя ничего делать.

4. С помощью Грега я нашел способ реализовать свои потребности. Смотрите первый пост, чтобы узнать, как это сделать.