首页 > 解决方案 > 在 Eclipse 插件中选择外部上下文菜单时执行额外功能

问题描述

我正在创建一个 Eclipse 插件,我想在其中添加一些需要在执行上下文菜单时自动执行的预处理和后处理任务,这个上下文菜单是由第三方插件提供的,所以我不可能修改一下,Eclipse 是否有一种机制可以用来拦截对上下文菜单的调用,以在执行实际上下文菜单之前和之后执行一些任务?

标签: javaeclipseeclipse-plugineclipse-rcp

解决方案


正如我在对该问题的评论中提到的那样,它似乎EventManager不再起作用。

我创建了一个项目...插件项目→ ... →模板:使用 4.x API 的菜单贡献并改编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通过它的 ID 获得一个,但与Eclipse 中显示的文档Action( ←← )相反,它不公开s 方法(“来自 EventManager 类型的方法 addListenerObject(Object) 不可见”)。可能是因为后者的文档中写道:F3EventManagerAbstractActionActionEventManager

警告:不要使用这个类!直接使用ListenerList。请参阅错误 486067

AFAICS 如果第三方插件的供应商不使用它ListenerListaddListener()在他的插件中提供一个我们不走运。


推荐阅读