[英]Eclipse Plugin IFile read-only property change
I'm developing a Eclipse Plugin that loads all the project files (IFile) in read-only status. 我正在开发一个Eclipse插件,它以只读状态加载所有项目文件(IFile)。
ResourceAttributes resAttr = new ResourceAttributes();
resAttr.setReadOnly(true);
classFile.setResourceAttributes(resAttr);
Now when the user starts writing something in the JavaEditor a message box is displayed: 现在,当用户开始在JavaEditor中编写内容时,将显示一个消息框:
File ABC.java is read-only. Do you wish to make it writable?
I want to capture the users answer because there are some files that shouldn't be read-only. 我想捕获用户的答案,因为有些文件不应该是只读的。
In order to do that I have implemented a IElementChangedListener, but I don't know how to get if the IFile read-only propery changed or not. 为了做到这一点,我已经实现了一个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);
}
}
}
Thank you. 谢谢。
== ==
As per Andrew suggestion the IElementChangedListener was replaced by IResourceChangeListener, however I'm still don't know how to identify if the IResource read-only property changed or not. 根据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
is not what you want. IElementChangedListener
不是你想要的。 You should be using an IResourceChangeListener
. 您应该使用
IResourceChangeListener
。 The listener listens for IResourceDelta
s. 侦听器侦听
IResourceDelta
。 IResourceDelta
has a method called getFlags()
that should return what you want. IResourceDelta
有一个名为getFlags()
的方法,它应该返回你想要的东西。
See the javadoc for IWorkspace.addResourceChangeListener(IResourceChangeListener, int)
for more information. 有关更多信息
IWorkspace.addResourceChangeListener(IResourceChangeListener, int)
请参阅IWorkspace.addResourceChangeListener(IResourceChangeListener, int)
的javadoc。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.