マーカーの削除の検知

IMarkerが、ユーザの操作とかIResource#deleteMarkersとかで
削除されたときを知る方法。


通知してもらえるようにするには、IResourceChangeListenerを
しかければよい。


ResourcesPlugin.getWorkspace().addResourceChangeListener(new HogeListener());

// こっちでもOK。というかこっちの方がいいのかも。
// ResourcesPlugin.getWorkspace().addResourceChangeListener(
// new HogeListener(), IResourceChangeEvent.POST_CHANGE);


で、IResourceChangeListener#resourceChangedで、
IResourceDeltaVisitorによって情報を取得する。


public void resourceChanged(IResourceChangeEvent event) {
try {
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {

if (delta.getKind() == IResourceDelta.CHANGED
&& (delta.getFlags() & IResourceDelta.MARKERS) != 0) {

IMarkerDelta[] markersDelta = delta.getMarkerDeltas();
for (int i = 0; i < markersDelta.length; i++) {
if (markersDelta[i].getKind() == IResourceDelta.REMOVED) {
IMarker marker = markersDelta[i].getMarker();
// ・・・
}
}
}
return false;
}
});
} catch (CoreException e) {
e.printStackTrace();
}
}
マーカーの削除の場合、resource deltaの種別はIResourceDelta.CHANGED
になって、IMarkerDeltaの種別がIResourceDelta.REMOVEDとなる。
ここで、3時間くらい無駄にハマったのは気のせい。




IResourceChangeListenerは、マーカーでなくとも、リソースの作成・削除とかも通知する。
というか、こっちでの使われ方がメインっぽいなぁ。
詳しくはヘルプの「Resources overview>Modifying the workspace>Tracking resource changes」あたり。