繁体   English   中英

在 Eclipse 插件中选择外部上下文菜单时执行额外功能

[英]Execute extra functionality when selecting an external context menu in Eclipse plugin

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

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

我创建了一个NewProject...Plugin-Project →... → Template: Menu 使用 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 );
    }
  }

Output

About Eclipse Platform

所以,我可以通过它的 ID 获得一个Action ,但与Action的文档相反,并且与在 Eclipse ( EventManagerAbstractActionAction )中用F3显示的源相反,它不公开EventManager的方法(“方法 addListenerObject(Object)从类型 EventManager 是不可见的“)。 可能是因为后者的文档中写道:

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

AFAICS 如果第三方插件的供应商不使用此ListenerList并在他的插件中提供addListener()我们不走运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM