在Eclipse插件中实现处理程序

时间:2012-04-20 20:47:12

标签: java eclipse eclipse-plugin eclipse-indigo

我在Eclipse插件(在Indigo上开发)中有一个处理程序,我希望每次保存文本编辑器中的Java文件(或理想情况下打开)时运行该处理程序。据我所知,有两种方法可以实现这一目标:

  1. 通过CommandService API编程。
  2. 使用plugin.xml
  3. 中的配置

    我已经尝试了这两个。方法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.保存文件?可以从我的处理程序运行默认处理程序吗?

1 个答案:

答案 0 :(得分:2)

这两个没有区别,只是一个是程序化的而另一个是声明性的。我认为定义命令处理程序是错误的,因为它处理命令执行而不是仅通知命令已执行。你的第一种方法看起来很好,但是你的代码在插件被激活之前不会被执行,这会在你的包中的第一个类加载时懒得发生。 Eclipse中有一种解决方法:为org.eclipse.ui.startup扩展点做出贡献。制作例如您的Activator类工具IStartup,您可以使用空实现 - 唯一的一点是让框架从您的包中加载任何类。