2014-10-07 52 views
6

如何正确区分IResourceChangeListener内部是否通过ResourcePlugin.getWorkspace().addResourceChangeListener(...)添加了项目已删除/重命名?IResourceChangeEvent - 如何识别项目删除/重命名

通过尝试,似乎IResourceChangeEvent.getDelta() -> IResourceDelta将是答案。

Eclipse API

后 - 事实上任意创建,删除和修改 对一个或多个资源的批次报告表示为分层 资源增量。事件类型是POST_CHANGE,getDelta返回 分层增量。资源增量以根工作区 为根。这些事件在一组 资源发生变化并且无论是否启用自动构建都会发生后向相关方广播。 在通知这些 事件期间,工作区将被关闭以进行更改。在此事件周期中报告的增量在为此类事件注册的所有 听众中是相同的。

编辑:加入我的发现至今

所以,Event.getType()POST_CHANGE并需要有两种

  • 包含一个孩子IResourceDelta具有getKind() == REMOVED的缺失增量,而德尔塔getResource().getType() == PROJECT,以便我们知道这是一个项目 (这IResourceDelta应该不会有任何孩子)

  • 包含两个孩子IResourceDeltagetKind() == REMOVEDgetKind() == ADDED,也getResource().getType() == PROJECT,而那些IResourceDelta一个getDelta()不包含儿童三角洲(我观察到,当一个文件被重命名/删除,IProject资源所属的一那就是父母的第一排子女Delta ...)

有人可以证实这个假设吗?是否真的有必要对孩子进行树深度搜索,以了解事件是否是项目重命名/删除或文件/文件夹?

回答

1
  • ,你需要通过 ResourcePlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE)

  • 添加资源改变监听器在你的听众,使用IResourceDeltaVisitor通过 event.getDelta().accept(...)

  • 参观者参观三角洲所有的变化应该看纳入项目REMOVED

  • 如果您期待要 去除é项目,并使用相同的名称创建(如发生在文件&文件夹 期间建立的事件),那么除了REMOVED,也是用这个方法查找 REPLACED三角洲

+1

,我将如何识别项目重命名? – 2014-11-11 15:06:44

+0

我和Vlad有同样的问题。如何识别重命名事件? – 2c00L 2015-05-11 13:16:57

+0

找到了答案:http://stackoverflow.com/questions/30170492/how-to-use-an-iresourcechangelistener-to-detect-a-file-rename-and-set-the-editor?lq=1 – chani 2016-05-30 08:10:39