簡體   English   中英

Eclipse插件IFile只讀屬性更改

[英]Eclipse Plugin IFile read-only property change

我正在開發一個Eclipse插件,它以只讀狀態加載所有項目文件(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只讀屬性發生了變化。

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);
  }
 }
}

謝謝。

==

根據Andrew的建議,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
}
}

IElementChangedListener不是你想要的。 您應該使用IResourceChangeListener 偵聽器偵聽IResourceDelta IResourceDelta有一個名為getFlags()的方法,它應該返回你想要的東西。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM