如何在Eclipse中监听项目删除?

3
我有一个带有增量构建器的项目。构建器会将所有资源及其更改的模型表示写入,前提是该项目具有特定性质。这个功能运行地相当好。但是如果整个项目从工作区中删除,增量构建器将不会被调用。最佳方法是创建什么样的事件处理程序?
我知道我可以创建一个 `IResourceChangeListener` 并将其附加到具有我的本质的所有项目上。但是那样我必须在 IDE 启动时启动我的插件,这样会很麻烦。
那么,捕获 "项目已删除" 事件的最佳方法是什么?
2个回答

7

您可以使用IResourceChangeListener来接收有关工作区更改的通知。 IResourceChangelistener API非常灵活,可以为您提供有关许多不同类型的更改的更改信息。以下是一个示例,演示如何特别使用它来检测项目删除。

public class ProjectDeletionListenerManager implements IResourceChangeListener {

    public interface ProjectDeletionListener {
        void projectAboutToBeDeleted(IProject project);
    }

    private IWorkspace workspace;
    private ProjectDeletionListener listener;

    public ProjectDeletionListenerManager(ProjectDeletionListener listener) {
        this.workspace = ResourcesPlugin.getWorkspace();
        this.listener = listener;
        this.workspace.addResourceChangeListener(this, 
                IResourceChangeEvent.PRE_DELETE);
    }

    @Override
    public void resourceChanged(IResourceChangeEvent event) {
        IResource rsrc = event.getResource();
        if (rsrc instanceof IProject) {
            listener.projectAboutToBeDeleted((IProject) rsrc);
        }
    }

    public void dispose() {
        if (listener!=null) {
            workspace.removeResourceChangeListener(this);
            listener = null;
        }
    }

}

注意:代码片段基于这个代码

2

IResourceChangeListener 是实现这一功能的方法。你不需要将其附加到项目上,它会始终对所有更改进行调用。

你可以使用 org.eclipse.ui.startup 扩展点来在 Eclipse 启动时启动插件。


但这不是被反对的吗?这会在启动时加载整个项目。我希望有一个更优雅的解决方案。 - manuel
我知道IResourceChangeListener是要使用的东西。实际上,我在寻找一个更精确的答案。IResourceChangeListener是一个非常多才多艺的瑞士军刀。我总是需要查找/确定如何将其缩小到我感兴趣的更改事件。所以让我贡献一下这个代码片段吧 :-) - Kris
@Kris修改答案并不合适,尽管有机器审核员批准了它。如果您想展示示例代码,请添加自己的答案。 - greg-449
其实我本来想这么做的,但后来我觉得改进现有的被接受答案可能会更好。但是如果你坚持要“拥有”你的答案,我就不会修改或尝试改进它。 - Kris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接