我在Eclipse插件(在Indigo上开发)中有一个处理程序,我希望每次保存文本编辑器中的Java文件(或理想情况下打开)时运行该处理程序。据我所知,有两种方法可以实现这一目标:
CommandService
API编程。plugin.xml
我已经尝试了这两个。方法1是这样的:
public class Activator extends AbstractUIPlugin {
@Override
public void start(final BundleContext context) throws Exception {
super.start(context);
ICommandService commandService = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
commandService.addExecutionListener(new MyListener());
plugin = this;
}
...
}
public class MyListener implements IExecutionListener {
@Override
public void postExecuteSuccess(final String commandId, final Object returnValue) {
System.out.println("PostEventSuccess:" + commandId);
}
@Override
public void preExecute(final String commandId, final ExecutionEvent event) {}
@Override
public void notHandled(String commandId, NotHandledException exception) {}
@Override
public void postExecuteFailure(String commandId, ExecutionException exception) {}
}
和方法2.像这样:
<extension point="org.eclipse.ui.handlers">
<handler
commandId="org.eclipse.ui.file.save"
class="mypackage.MyHandler">
<activeWhen>
<with variable="activeWorkbenchWindow">
<instanceof value="org.eclipse.ui.IWorkbenchWindow"/>
</with>
</activeWhen>
</handler>
</extension>
方法1.根本不运行我的监听器。方法2.工作,执行处理程序,但我的处理程序似乎替换默认处理程序。当用户尝试保存文件时,我的处理程序会运行,但文件不会被保存。处理程序本身似乎很好(我通过创建一个运行它的菜单项来测试它。)
方法1.现在是否已弃用或我是否错误地实施了该服务?如何获取方法2.保存文件?可以从我的处理程序运行默认处理程序吗?
答案 0 :(得分:2)
这两个没有区别,只是一个是程序化的而另一个是声明性的。我认为定义命令处理程序是错误的,因为它处理命令执行而不是仅通知命令已执行。你的第一种方法看起来很好,但是你的代码在插件被激活之前不会被执行,这会在你的包中的第一个类加载时懒得发生。 Eclipse中有一种解决方法:为org.eclipse.ui.startup
扩展点做出贡献。制作例如您的Activator
类工具IStartup
,您可以使用空实现 - 唯一的一点是让框架从您的包中加载任何类。