如何在Eclipse中订阅OpenProject事件?

问题描述:

我正在开发一个Eclipse插件。如何在Eclipse中订阅OpenProject事件?

我一直在阅读如何在项目即将关闭时使用接口IResourceChangeListener和使用PRE_CLOSE事件类型来订阅通知。以下文字取自Eclipse help

通知监听器一个项目即将关闭。此事件 可用于在关闭之前从项目 的 内存中表示(例如会话属性)中提取并保存必要的信息。 (当一个项目关闭时,内存中的 表示被丢弃)。在此活动期间,工作空间被锁定(没有资源可以更新 )。该事件包含正在关闭的项目 。

我没有找到如何在项目即将打开时得到通知。

您可以创建自己的IResourceChangeListenerIResourceDelta.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 
     } 
} 

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

+0

完美的作品。谢谢!! –

+2

这对于Eclipse Indigo和Project Explorer不起作用。 getKind()返回CHANGED,getFlag()返回0,getResource()返回WorkspaceRoot类的一个实例。 –

+1

@schnikow我也遇到过,但第一个三角洲的孩子是项目。对于访问者来说,当'resource instanceof IWorkspaceRoot'时,它必须返回true。 – clockworkgeek

IResourceChangeEventPOST_CHANGE和相关IResourceDelta种类是IResourceDelta.CHANGED和标志包括IResourceDelta.OPEN

我知道这个问题已经很长时间了,但我想用一个有效的代码片段来更新它,以防万一有人需要它。我在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(); 
    } 
} 
+0

你节省了我的时间,完美的作品。谢谢。 – Lidia