Eclipse Plugin: включение действия на основе текущего выбора - PullRequest
2 голосов
/ 24 апреля 2010

Я использую точку расширения org.eclipse.ui.popupMenus для добавления подменю, действие которого ограничено следующим классом:

  public class MyAction implements IObjectActionDelegate {

     private Logic logic = Logic.getInstance(); // Singleton

     public void setActivePart(IAction a, IWorkbenchPart targetPart) {
        // Nothing here
     }

     public void run(IAction a) {      
        // Do something...
     }

     public void selectionChanged(IAction a, ISelection s) {
        a.setEnabled(logic.isEnabled(s));
     }
  }

Это действие работает правильно в большинстве случаев (включая вызов a.setEnabled() в selectionChanged()). Моя проблема в первый раз, когда мое действие вызывается. Метод selectionChanged вызывается только после , когда отображается элемент меню (а не когда пользователь сделал выбор), что означает, что вызов a.setEnabled() не окажет влияния

Есть ли какие-либо идеи о том, как заставить мое действие получать selectionChanged() уведомления даже до того, как оно началось?

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Eclipse использует так называемую ленивую активацию плагина, поэтому сначала он максимально извлекается из plugin.xml, а наблюдаемое вами поведение хорошо документировано в API. См. Этот связанный вопрос.

0 голосов
/ 24 апреля 2010

Слова в первый раз и после заставляют меня задуматься о проблеме синхронизации. Если инициализация Logic.getInstance() отложена, вы можете посмотреть на идиому Инициализация по требованию , также обсуждаемую в пункте 71 Effective Java .

...