在 Eclipse 插件中选择外部上下文菜单时执行额外功能
Execute extra functionality when selecting an external context menu in Eclipse plugin
我正在创建一个 Eclipse 插件,我想在其中添加一些需要在执行上下文菜单时自动执行的预处理和 post 处理任务,此上下文菜单由第三方提供插件所以我不可能修改它,Eclipse 是否有一种机制可以用来拦截对上下文菜单的调用以在实际上下文菜单执行之前和之后执行一些任务?
似乎 EventManager
,正如我对问题的评论中提到的,它不再起作用了。
我创建了一个新建 → 项目... → Plugin-Project → ... → 模板:使用 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
所以,我可以通过它的 ID 得到一个 Action
,但与 the doc of Action
相反,并且与在 Eclipse 中使用 F3 显示的源代码相反(EventManager
← AbstractAction
← Action
) 它不公开 EventManager
s 方法 (EventManager 类型的方法 addListenerObject(Object) 不可见").可能是因为后者的文档是这样写的:
Warning: Do not use this class! Use ListenerList
directly. See bug 486067.
AFAICS 如果 third-party 插件的供应商不使用此 ListenerList
并在他的插件中提供 addListener()
我们就不走运了。
我正在创建一个 Eclipse 插件,我想在其中添加一些需要在执行上下文菜单时自动执行的预处理和 post 处理任务,此上下文菜单由第三方提供插件所以我不可能修改它,Eclipse 是否有一种机制可以用来拦截对上下文菜单的调用以在实际上下文菜单执行之前和之后执行一些任务?
似乎 EventManager
,正如我对问题的评论中提到的,它不再起作用了。
我创建了一个新建 → 项目... → Plugin-Project → ... → 模板:使用 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
所以,我可以通过它的 ID 得到一个 Action
,但与 the doc of Action
相反,并且与在 Eclipse 中使用 F3 显示的源代码相反(EventManager
← AbstractAction
← Action
) 它不公开 EventManager
s 方法 (EventManager 类型的方法 addListenerObject(Object) 不可见").可能是因为后者的文档是这样写的:
Warning: Do not use this class! Use
ListenerList
directly. See bug 486067.
AFAICS 如果 third-party 插件的供应商不使用此 ListenerList
并在他的插件中提供 addListener()
我们就不走运了。