如何在Eclipse中订阅OpenProject事件?

Dan*_*lba 4 java eclipse eclipse-plugin eclipse-rcp

我正在开发一个Eclipse插件.

我一直在阅读如何在项目即将关闭时订阅获取通知,使用接口IResourceChangeListener并使用PRE_CLOSE事件类型.以下文本取自Eclipse帮助:

通知侦听器项目即将关闭.此事件可用于在项目关闭之前从项目的内存中表示(例如,会话属性)中提取和保存必要信息.(当项目关闭时,将处理内存中的表示).在此事件期间,工作空间已锁定(无资源可更新).该事件包含正在关闭的项目.

我没有找到如何在项目即将开启时收到通知.

Tat*_*ate 9

您可以创建自己IResourceChangeListener的delta并过滤delta类型IResourceDelta.OPEN,它只影响IProjects,并且在打开和关闭项目时都会触发:

public void resourceChanged(IResourceChangeEvent event) {
    if (event == null || event.getDelta() == null)
        return;
    event.getDelta().accept(new IResourceDeltaVisitor() {
        public boolean visit(IResourceDelta delta) throws CoreException {
            if (delta.getKind() == IResourceDelta.OPEN)
                final IResource resource = delta.getResource();
                if (!(resource instanceof IProject))
                    return;
               //do your stuff and check the project is opened or closed
        }
}
Run Code Online (Sandbox Code Playgroud)

有用的链接:http: //www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html

  • 这对Eclipse Indigo和Project Explorer不起作用.getKind()返回CHANGED,getFlag()返回0,getResource()返回WorkspaceRoot类的实例. (2认同)

AMi*_*sin 5

我知道这个问题已经得到了很好的回答,但是我想用一个有效的代码片段来更新它,以防任何人需要它.我在Eclipse Luna,Indigo和Kepler上进行了测试.

public void resourceChanged(final IResourceChangeEvent event) {
    if (event == null || event.getDelta() == null) {
        return;
    }

    try {
        event.getDelta().accept(new IResourceDeltaVisitor() {
            public boolean visit(final IResourceDelta delta) throws CoreException {
                IResource resource = delta.getResource();
                if (((resource.getType() & IResource.PROJECT) != 0)
                        && resource.getProject().isOpen()
                        && delta.getKind() == IResourceDelta.CHANGED
                        && ((delta.getFlags() & IResourceDelta.OPEN) != 0)) {

                    IProject project = (IProject)resource;
                    projectOpened(project);
                }
                return true;
            }
        });
    } catch (CoreException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)