Java Eclipse插件IFile只读属性更改

Java Eclipse插件IFile只读属性更改,java,eclipse-plugin,Java,Eclipse Plugin,我正在开发一个Eclipse插件,它以只读状态加载所有项目文件(IFile) ResourceAttributes resAttr = new ResourceAttributes(); resAttr.setReadOnly(true); classFile.setResourceAttributes(resAttr); 现在,当用户开始在JavaEditor中写入内容时,会显示一个消息框: File ABC.java is read-only

我正在开发一个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);
  }
 }
}
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
}
}
多谢各位

==

根据Andrew的建议,IElementChangedListener已被IResourceChangeListener替换,但是我仍然不知道如何确定IResource只读属性是否已更改

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);
  }
 }
}
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
}
}
类ABCResourceChangeListener实现IResourceChangeListener{ @凌驾 public void resourceChanged(IResourceChangeEvent事件){ IResource res=event.getResource(); 试一试{ 开关(event.getType()){ 案例IResourceChangeEvent.PRE_关闭: 系统输出打印(“项目”); System.out.print(res.getFullPath()); System.out.println(“即将关闭”); 打破 案例IResourceChangeEvent.PRE_删除: 系统输出打印(“项目”); System.out.print(res.getFullPath()); System.out.println(“即将被删除”); 打破 案例IResourceChangeEvent.POST\u更改: System.out.println(“资源已更改”); event.getDelta().accept(新的DeltaPrinter()); 打破 案例IResourceChangeEvent.PRE_构建: System.out.println(“构建即将运行”); event.getDelta().accept(新的DeltaPrinter()); 打破 案例IResourceChangeEvent.POST_生成: System.out.println(“构建完成”); event.getDelta().accept(新的DeltaPrinter()); 打破 } }捕获(COREE){ //TODO自动生成的捕捉块 e、 printStackTrace(); } } } 类DeltaPrinter实现IResourceDeltaVisitor{ 公共布尔访问(IResourceDelta){ IResource res=delta.getResource(); 开关(delta.getKind()){ 案例IResourceDelta.ADDED: 系统输出打印(“资源”); System.out.print(res.getFullPath()); System.out.println(“已添加”); 打破 案例IResourceDelta.REMOVED: 系统输出打印(“资源”); System.out.print(res.getFullPath()); System.out.println(“已删除”); 打破 案例IResourceDelta.CHANGED: 系统输出打印(“资源”); System.out.print(res.getFullPath()); System.out.println(“已更改”); int flags=delta.getFlags(); 如果((标志和IResourceDelta.CONTENT)!=0){ System.out.println(“-->Content Change”); // ????????????????????????? } 如果((标志和IResourceDelta.REPLACED)!=0){ System.out.println(“-->替换内容”); } 如果((标志和IResourceDelta.MARKERS)!=0){ System.out.println(“-->Marker Change”); IMarkerDelta[]markers=delta.getMarkerDeltas(); //如果对标记感兴趣,请检查这些增量
for(int j=0;j
IElementChangedListener
不是您想要的。您应该使用
IResourceChangeListener
。侦听器侦听
IResourceDelta
s。
IResourceDelta
有一个名为
getFlags()
的方法,该方法将返回您想要的内容


有关更多信息,请参见javadoc for
IWorkspace.addResourceChangeListener(IResourceChangeListener,int)

您好,因此我将IElementChangedListener更改为IResourceChangeListener,并获得了方法getFlags。但是我仍然不知道如何确定IFile只读属性是否更改。