2012-04-20 1 views
1

У меня есть обработчик плагина Eclipse (разработанный на Indigo), который я хочу запускать каждый раз, когда файл Java в текстовом редакторе сохраняется (или открывается, в идеале). Насколько я могу судить, существует два способа достижения этого:Реализация обработчиков в плагине Eclipse

  1. Программно с помощью API CommandService.
  2. Использование конфигурации в plugin.xml

Я попробовал оба из них. Метод 1, как это:

public class Activator extends AbstractUIPlugin { 
    @Override 
    public void start(final BundleContext context) throws Exception { 
     super.start(context); 
     ICommandService commandService = (ICommandService) PlatformUI 
       .getWorkbench().getService(ICommandService.class); 
     commandService.addExecutionListener(new MyListener()); 
     plugin = this; 
    } 
    ... 
} 

public class MyListener implements IExecutionListener { 
    @Override 
    public void postExecuteSuccess(final String commandId, final Object returnValue) { 
     System.out.println("PostEventSuccess:" + commandId); 
    } 

    @Override 
    public void preExecute(final String commandId, final ExecutionEvent event) {} 

    @Override 
    public void notHandled(String commandId, NotHandledException exception) {} 

    @Override 
    public void postExecuteFailure(String commandId, ExecutionException exception) {} 
} 

и 2. Метод, как это:

<extension point="org.eclipse.ui.handlers"> 
    <handler 
     commandId="org.eclipse.ui.file.save" 
     class="mypackage.MyHandler"> 
     <activeWhen> 
      <with variable="activeWorkbenchWindow"> 
       <instanceof value="org.eclipse.ui.IWorkbenchWindow"/> 
      </with> 
     </activeWhen> 
    </handler> 
</extension> 

Метод 1. не работает мой слушатель вообще. Способ 2. работает, поскольку обработчик выполняется, но мой обработчик, похоже, заменяет обработчик по умолчанию. Когда пользователь пытается сохранить файл, мой обработчик работает, но файл не сохраняется. Сам обработчик кажется прекрасным (я протестировал его, создав элемент меню, который его запускает).

Является ли метод 1. устаревшим сейчас или я неправильно выполнил эту услугу? Как получить метод 2. для сохранения файла? Можно ли запустить обработчик по умолчанию из моего обработчика?

+2

Эти два не отличаются только тем, что один программный и другой декларативный. Я думаю, что определение обработчика команд неверно, поскольку это * обрабатывает * выполнение команды, а не только уведомление о том, что команда была выполнена. Может быть, я выкопаю что-то по первому методу, который, кажется, выглядит из-за его внешнего вида. –

+0

Вы уверены, что ваш плагин был активирован, другими словами, действительно ли этот код запускался? –

+0

Хороший вопрос. Когда я помещаю некоторые инструкции 'println' в Activator и Listener, кажется, что этот код не запускается. Однако конфигурация указывает на правый класс «Activator». Очень странно. – snim2

ответ

2

Эти два не отличаются только тем, что один программный и другой декларативный. Я думаю, что определение обработчика ошибок неверно, поскольку это обрабатывает выполнение команды, а не только уведомление о том, что команда была выполнена. Ваш первый подход кажется прекрасным, но ваш код не выполняется, пока плагин не активирован, что происходит лениво, когда загружается первый класс из вашего пакета. В Eclipse есть обходное решение: внести вклад в точку расширения org.eclipse.ui.startup. Сделайте, например, ваш класс Activator класса IStartup, вы можете использовать пустую реализацию - единственное, что нужно сделать, чтобы платформа загружала любой класс из вашего пакета.

+0

Спасибо. Я удалил это из манифеста, но «Активатор» по-прежнему не загружает слушателя или даже запускает метод «start()»). – snim2

+1

Отредактирован ответ. Вам не нужно удалять эту строку ActivationPolicy для работы этого нового подхода. –

+0

Фантастический, спасибо! – snim2