Java Eclipse插件IFile只读属性更改
我正在开发一个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
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只读属性是否更改。