2012-08-29 45 views
3

我正在開發一個Eclipse Plugin,以只讀狀態加載所有項目文件(IFile)。Eclipse Plugin IFile只讀屬性更改

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

現在,當用戶開始在JavaEditor寫的東西會顯示一個消息框:

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

我想捕捉用戶的回答,因爲有一些不應該只讀一些文件。

爲了做到這一點,我已經實現了一個IElementChangedListener,但我不知道如果得到IFile只讀propery是否改變了。

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通過IResourceChangeListener代替,但我仍然不知道如何辨別如果IResource接口的只讀屬性更改與否。

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 s。 IResourceDelta有一個方法稱爲getFlags()應該返回你想要的。

有關更多信息,請參閱javadoc的IWorkspace.addResourceChangeListener(IResourceChangeListener, int)

+0

你好,所以我改變了IElementChangedListener到IResourceChangeListener,並且我得到了方法getFlags。不過,我仍然不知道如何找出IFile只讀屬性是否更改。 –