java - 在 Eclipse 插件中选择外部上下文菜单时执行额外功能
问题描述
我正在创建一个 Eclipse 插件,我想在其中添加一些需要在执行上下文菜单时自动执行的预处理和后处理任务,这个上下文菜单是由第三方插件提供的,所以我不可能修改一下,Eclipse 是否有一种机制可以用来拦截对上下文菜单的调用,以在执行实际上下文菜单之前和之后执行一些任务?
解决方案
正如我在对该问题的评论中提到的那样,它似乎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) 不可见”)。可能是因为后者的文档中写道:F3EventManager
AbstractAction
Action
EventManager
警告:不要使用这个类!直接使用
ListenerList
。请参阅错误 486067。
AFAICS 如果第三方插件的供应商不使用它ListenerList
并addListener()
在他的插件中提供一个我们不走运。
推荐阅读
- javascript - 基于其他字段值的 Mongoose 动态模式类型
- nic - 关于 XDP_redirect 方法的问题
- reactjs - 将道具传递给组件时,如何添加第 n 个子属性?
- angular - 分享 Facebook、Linkedin 或 Twitter (Angular) 时,什么都不会被刮掉
- java - 线程“主”java.lang.UnsatisfiedLinkError 中的 Rocksaw JNI_Exception:java.library.path 中没有 Rocksaw
- javascript - 为什么通过 Javascript 的 Grid-Area 被多次插入?
- amazon-web-services - 在 aws 粘合作业中仅使用 2 列中的 1 个分区列作为下推谓词
- tfs - 在后台运行 powershell 命令
- machine-learning - 为什么函数 .view(batch_size,-1) 给出相同的输出?
- html - 单击输入时避免在文本区域中丢失“SELECTED TEXT”