Выполнение дополнительных функций при выборе внешнего контекстного меню в плагине Eclipse - PullRequest
1 голос
/ 05 августа 2020

Я создаю плагин Eclipse, в который хочу добавить некоторые задачи предварительной и постобработки, которые должны выполняться автоматически при запуске контекстного меню, это контекстное меню предоставляется сторонним плагином, поэтому это невозможно для меня, чтобы изменить его, есть ли в Eclipse механизм, который я могу использовать для перехвата вызова контекстного меню для выполнения некоторых задач до и после выполнения фактического контекстного меню?

1 Ответ

1 голос
/ 06 августа 2020

Кажется, что с EventManager, как упоминалось в моих комментариях к вопросу, он больше не работает.

Я создал New Project ... Plugin-Project → ... → Шаблон: вклад меню с использованием API 4.x и адаптированный HelloWorldHandler:

  @Execute
  public void execute( @Named( IServiceConstants.ACTIVE_SHELL ) final Shell s ) {

    //MessageDialog.openInformation(s, "E4 Information Dialog", "Hello world from a pure Eclipse 4 plug-in");

    final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    if ( window instanceof WorkbenchWindow ) {

      final MenuManager menu = ( (WorkbenchWindow) window ).getMenuManager();
      final Set<IContributionItem> result = new HashSet<>();
      collectContributions( menu, result );

      result.stream()
          .filter( ci -> ci.getId().equals( "about" ) )
          .forEach( ci -> {
            final IAction a = ( (ActionContributionItem) ci ).getAction();
            System.out.println( a.getDescription() );
            //((Action)a).addListenerObject(null);
            // The method addListenerObject(Object) from the type EventManager is not visible
          } );
    }
  }

  private void collectContributions( final MenuManager menu, final Set<IContributionItem> result ) {

    final IContributionItem[] items = menu.getItems();
    for ( final IContributionItem item2 : items ) {

      IContributionItem item = item2;

      if ( item instanceof SubContributionItem )
        item = ( (SubContributionItem) item ).getInnerItem();

      if ( item instanceof MenuManager )
        collectContributions( (MenuManager) item, result );
      else if ( item instanceof ActionContributionItem && item.isEnabled() )
        result.add( item );
    }
  }

Вывод

About Eclipse Platform

Итак, я могу получить Action по его идентификатору, но вопреки do c из Action и вопреки источнику, отображаемому с F3 в Eclipse (EventManagerAbstractActionAction) он не предоставляет методы EventManager s (« Метод addListenerObject (Object) из типа EventManager не отображается ») . Вероятно, поскольку do c последнего читает:

Предупреждение: Не используйте этот класс! Используйте ListenerList напрямую. См. ошибка 486067 .

AFAICS, если поставщик стороннего плагина не использует этот ListenerList и не предлагает addListener() в своем плагине, нас нет удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...