Динамическая метка всплывающего окна в разработке плагина eclipse

Я хочу создать простой плагин eclipse, который делает: Когда вы щелкаете правой кнопкой мыши проект Java, он отображает всплывающее меню, в котором есть элемент с меткой «N файлов Java, найденных в этом проекте», где «N» - количество файлов .

У меня есть идея, что я могу обновить метку в «selectionChanged»:

public class CountAction implements IObjectActionDelegate {
    public void selectionChanged(IAction action, ISelection selection) {
        action.setText(countJavaFiles());
    }
}

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

Я потратил много времени на это, но не решил. Помогите мне, пожалуйста.


person Freewind    schedule 09.07.2011    source источник


Ответы (2)


Альтернативой статье, предложенной @kett_chup, является использование IElementUpdater. Просто

  • ваш handler должен реализовать IElementUpdater
  • handler.updateElement((UIElement element, Map parameters) должен установить желаемый текст с помощью element.setText("new text") - этот новый текст будет отображаться в меню и на панелях инструментов.
  • всякий раз, когда вам нужно / вы хотите обновить текст команды, используйте ICommandService.refreshElements(String commandId, Map filter) с вашим конкретным идентификатором команды - глобальная служба команд обычно в порядке

Интерфейс IElementUpdater также можно использовать для изменения отмеченного состояния — для команд с style=toggle — а также значков и всплывающей подсказки.

person Tonny Madsen    schedule 09.07.2011
comment
Я последовал ответу @kett_chup, и он работает. Мне очень интересен ваш ответ, но я не понимаю, как его реализовать. Например, handler здесь, а MyHandler там? Нужны ли другие вещи (CompoundContributionItem, команда)? - person Freewind; 10.07.2011

Наконец, я нашел очень простой способ реализовать это:

Мне не нужно менять свой код (приведенный пример кода), но мне нужно добавить небольшой класс startup:

import org.eclipse.ui.IStartup;

public class MyStartUp implements IStartup {

    @Override
    public void earlyStartup() {
        // Initial the action
        new CountAction();
    }
}

И добавьте следующее к plugin.xml:

<extension
     point="org.eclipse.ui.startup">
  <startup
        class="myplugin.MyStartUp">
  </startup>

This MyStartUp will load an instance of that action at startup, then selectionChanged will be invoked each time when I right-click the projects or files.

person Freewind    schedule 15.07.2011