2012-08-29 2 views
3

모든 프로젝트 파일 (IFile)을 읽기 전용 상태로로드하는 Eclipse 플러그인을 개발 중입니다. 사용자가 JavaEditor에 뭔가를 쓰기 시작할 때Eclipse 플러그인 IFile 읽기 전용 속성 변경

 ResourceAttributes resAttr = new ResourceAttributes(); 
     resAttr.setReadOnly(true); 
     classFile.setResourceAttributes(resAttr); 

는 이제 메시지 상자가 표시됩니다

File ABC.java is read-only. Do you wish to make it writable? 

내가 읽기 전용하면 안되는 파일이 있기 때문에 사용자가 답변을 캡처 할 .

IElementChangedListener를 구현하기 위해 IFile 읽기 전용 속성이 변경되었는지 여부를 알 수 없습니다.

class SinfoniaCloudElementChangedListener implements IElementChangedListener { 

@Override 
public void elementChanged(ElementChangedEvent event) { 
    Activator.logInfo("SinfoniaCloudElementChangedListener - elementChanged"); 
    try { 
    handleDelta(event.getDelta()); 
    } catch (JavaModelException e) { 
    Activator.logError("Error handling delta for ElementChangeListener. ", e); 
    } 
} 

private void handleDelta(IJavaElementDelta delta) throws JavaModelException { 
    IJavaElement element = delta.getElement(); 
    if (element instanceof ICompilationUnit) { 
    IJavaProject project = element.getJavaProject(); 
    if (project.getElementName().equals(SinfoniaProject.getProjectName(true)) == false) { 
     return; 
    } 

    ICompilationUnit cu = (ICompilationUnit) element; 
    for (IType type : cu.getAllTypes()) { 
     if (type != IType.CLASS_FILE) 
     continue; 

     switch (delta.getKind()) { 
     case IJavaElementDelta.CHANGED: 
      Activator.logInfo("CHANGED - Element:" + cu.getElementName()); 
      // ????????????????????????????? 
      break; 
      default: 
      // do nothing 
      break; 
     } 
    } 
    } 
    for (IJavaElementDelta child : delta.getAffectedChildren()) { 
    handleDelta(child); 
    } 
} 
} 

감사합니다.

앤드류 제안 IElementChangedListener으로 당

==

그러나 나는하여 IResource 읽기 전용 속성이 변경 아닌지 확인하는 방법을 모르는 여전히 해요, IResourceChangeListener로 대체했습니다.

class ABCResourceChangeListener implements IResourceChangeListener { 

@Override 
public void resourceChanged(IResourceChangeEvent event) { 
     IResource res = event.getResource(); 
     try { 
     switch (event.getType()) { 
      case IResourceChangeEvent.PRE_CLOSE: 
       System.out.print("Project "); 
       System.out.print(res.getFullPath()); 
       System.out.println(" is about to close."); 
       break; 
      case IResourceChangeEvent.PRE_DELETE: 
       System.out.print("Project "); 
       System.out.print(res.getFullPath()); 
       System.out.println(" is about to be deleted."); 
       break; 
      case IResourceChangeEvent.POST_CHANGE: 
       System.out.println("Resources have changed."); 
     event.getDelta().accept(new DeltaPrinter()); 
       break; 
      case IResourceChangeEvent.PRE_BUILD: 
       System.out.println("Build about to run."); 
       event.getDelta().accept(new DeltaPrinter()); 
       break; 
      case IResourceChangeEvent.POST_BUILD: 
       System.out.println("Build complete."); 
       event.getDelta().accept(new DeltaPrinter()); 
       break; 
     } 
    } catch (CoreException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 
} 

class DeltaPrinter implements IResourceDeltaVisitor { 
public boolean visit(IResourceDelta delta) { 
    IResource res = delta.getResource(); 
    switch (delta.getKind()) { 
    case IResourceDelta.ADDED: 
     System.out.print("Resource "); 
     System.out.print(res.getFullPath()); 
     System.out.println(" was added."); 
     break; 
    case IResourceDelta.REMOVED: 
     System.out.print("Resource "); 
     System.out.print(res.getFullPath()); 
     System.out.println(" was removed."); 
     break; 
    case IResourceDelta.CHANGED: 
     System.out.print("Resource "); 
     System.out.print(res.getFullPath()); 
     System.out.println(" has changed."); 
     int flags = delta.getFlags(); 
     if ((flags & IResourceDelta.CONTENT) != 0) { 
     System.out.println("--> Content Change"); 
     // ????????????????????????? 
     } 
     if ((flags & IResourceDelta.REPLACED) != 0) { 
     System.out.println("--> Content Replaced"); 
     } 
     if ((flags & IResourceDelta.MARKERS) != 0) { 
     System.out.println("--> Marker Change"); 
     IMarkerDelta[] markers = delta.getMarkerDeltas(); 
     // if interested in markers, check these deltas 
     for (int j=0; j<markers.length;j++) { 
      IMarkerDelta markerDelta = markers[j]; 
      if (markerDelta.isSubtypeOf(IMarker.SOURCE_ID)) { 
      switch (markerDelta.getKind()) { 
       case IResourceDelta.ADDED : 
       System.out.println("--> Marker Delta Added "); 
       break; 
       case IResourceDelta.REMOVED : 
       System.out.println("--> Marker Delta Removed "); 
       break; 
       case IResourceDelta.CHANGED: 
       System.out.println("--> Marker Delta Changed "); 
       break; 
      } 
      } 
     } 

     } 
     break; 
    } 
    return true; // visit the children 
} 
} 

답변

0

IElementChangedListener은 원하는 것이 아닙니다. IResourceChangeListener을 사용해야합니다. 청취자는 IResourceDelta을 청취합니다. IResourceDelta에는 원하는 것을 반환해야하는 getFlags()이라는 메서드가 있습니다.

자세한 내용은 javadoc의 IWorkspace.addResourceChangeListener(IResourceChangeListener, int)을 참조하십시오.

+0

안녕하세요, IElementChangedListener를 IResourceChangeListener로 변경 했으므로 getFlags 메서드를 가져오고 있습니다. 그러나 나는 아직도 IFile 읽기 전용 속성이 변경되었는지 여부를 확인하는 방법을 모르겠다. –

관련 문제