2011-10-05 7 views
4

이클립스 플러그인을 개발 중입니다.Eclipse에서 OpenProject 이벤트를 구독하는 방법은 무엇입니까?

프로젝트를 닫을 때 알림을받는 방법, 인터페이스 IResourceChangeListener을 사용하고 PRE_CLOSE 이벤트 유형을 사용하는 방법을 읽었습니다. 다음 텍스트는 Eclipse help에서 가져온 것입니다.

프로젝트가 닫힐 예정임을 청취자에게 알립니다. 이 이벤트 은 닫히기 전에 프로젝트의 메모리 내 표현 (예 : 세션 속성)에서 의 필요한 정보를 추출하고 저장하는 데 사용할 수 있습니다. 프로젝트가 닫히면 메모리 내 표현이 삭제됩니다. 이 이벤트 동안 작업 영역이 잠겨 있습니다 ( 업데이트 할 수 없음). 이벤트에 프로젝트가 닫힙니다.

프로젝트가 열릴 때 알림을받는 방법을 찾지 못했습니다.

답변

8

당신은 당신의 자신의 IResourceChangeListener를 만들 만 IProjects에 영향을 IResourceDelta.OPEN에 의해 델타의 종류를 필터링하고, 해고있어 수 모두 프로젝트를 열고 닫을 때 :

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

이클립스 인디고와 프로젝트 탐색기에서는 작동하지 않습니다. 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

관련 문제