2011-10-05 105 views
4

我正在開發一個Eclipse插件。如何在Eclipse中訂閱OpenProject事件?

我一直在閱讀如何在項目即將關閉時使用接口IResourceChangeListener和使用PRE_CLOSE事件類型來訂閱通知。以下文字取自Eclipse help

通知監聽器一個項目即將關閉。此事件 可用於在關閉之前從項目 的 內存中表示(例如會話屬性)中提取並保存必要的信息。 (當一個項目關閉時,內存中的 表示被丟棄)。在此活動期間,工作空間被鎖定(沒有資源可以更新 )。該事件包含正在關閉的項目 。

我沒有找到如何在項目即將打開時得到通知。

回答

8

您可以創建自己的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

4

IResourceChangeEventPOST_CHANGE和相關IResourceDelta種類是IResourceDelta.CHANGED和標誌包括IResourceDelta.OPEN

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(); 
    } 
} 
+0

你節省了我的時間,完美的作品。謝謝。 – Lidia