如何在Eclipse中订阅OpenProject事件?
我正在开发一个Eclipse插件。如何在Eclipse中订阅OpenProject事件?
我一直在阅读如何在项目即将关闭时使用接口IResourceChangeListener和使用PRE_CLOSE
事件类型来订阅通知。以下文字取自Eclipse help:
通知监听器一个项目即将关闭。此事件 可用于在关闭之前从项目 的 内存中表示(例如会话属性)中提取并保存必要的信息。 (当一个项目关闭时,内存中的 表示被丢弃)。在此活动期间,工作空间被锁定(没有资源可以更新 )。该事件包含正在关闭的项目 。
我没有找到如何在项目即将打开时得到通知。
您可以创建自己的IResourceChangeListener
和IResourceDelta.OPEN
,这不仅影响到IProjects过滤那种三角洲,它的发射都打开和关闭项目时:
public void resourceChanged(IResourceChangeEvent event) {
if (event == null || event.getDelta() == null)
return;
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getKind() == IResourceDelta.OPEN)
final IResource resource = delta.getResource();
if (!(resource instanceof IProject))
return;
//do your stuff and check the project is opened or closed
}
}
有用的链接: http://www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html
IResourceChangeEvent
是POST_CHANGE
和相关IResourceDelta
种类是IResourceDelta.CHANGED
和标志包括IResourceDelta.OPEN
。
我知道这个问题已经很长时间了,但我想用一个有效的代码片段来更新它,以防万一有人需要它。我在Eclipse Luna,Indigo和Kepler上进行了测试。
public void resourceChanged(final IResourceChangeEvent event) {
if (event == null || event.getDelta() == null) {
return;
}
try {
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(final IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (((resource.getType() & IResource.PROJECT) != 0)
&& resource.getProject().isOpen()
&& delta.getKind() == IResourceDelta.CHANGED
&& ((delta.getFlags() & IResourceDelta.OPEN) != 0)) {
IProject project = (IProject)resource;
projectOpened(project);
}
return true;
}
});
} catch (CoreException e) {
e.printStackTrace();
}
}
你节省了我的时间,完美的作品。谢谢。 – Lidia
完美的作品。谢谢!! –
这对于Eclipse Indigo和Project Explorer不起作用。 getKind()返回CHANGED,getFlag()返回0,getResource()返回WorkspaceRoot类的一个实例。 –
@schnikow我也遇到过,但第一个三角洲的孩子是项目。对于访问者来说,当'resource instanceof IWorkspaceRoot'时,它必须返回true。 – clockworkgeek