IWorkspace workspace = ResourcesPlugin.getWorkspace();资源的修改由插件里API提供方法,最常见的就是创建、挎贝、移动、删除、内容的修改。这些改变资源的方法按如下的规律执行:
IResourceChangeListener listener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
System.out.println("Something changed!");
}
};
workspace.addResourceChangeListener(listener);
//... some time later one ...
workspace.removeResourceChangeListener(listener);
* This method changes resources; these changes will be reported
* in a subsequent resource change event.
复合资源操作
在这种机制下将触发将resource change event发布到所有的listener里;还有一种情况就是,如果一个操作包含在另一个操作内的话,这个操作将没有必要发出通知,而要等到最高层次的操作完成以后,对listener的通知才会发出。这就是复合操作的事件通知机制,见如下示例代码:
IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProject project = workspace.getRoot().getProject("My Project");
IWorkspaceRunnable operation = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
int fileCount = 10;
project.create(null);
project.open(null);
for (int i = 0; i < fileCount; i++) {
IFile file = project.getFile("File" + i);
file.create(null, IResource.NONE, null);
}
}
};
workspace.run(operation, null);
资源内容的改变
在IResourceEvnet里最重要的两个鸟就是 event type 和 resource delta。event type是一个int类型的,用来表明自己的类型;另外那个是IResourceDelta是实例,它是树型结构的,(就叫上它修改树吧),与资源里的树型结构相对应,记录每一个资源节点的改变,具体的内容如下:
- The resource it corresponds to.
- The kind of modification (added, removed, or changed).
- The precise nature of the change (the change flags).
- A summary of what markers changed on the resource.
- Deltas for any added, removed, or changed children.
其中IResourceDelta.getFlags()可以得到每一个修改的标记。
(例子和标记内容见引用文章)http://www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html
当然还包括一些其它的事件,可以通过IWorkspace.addResourceChangeListener.IResourceChangeListener, int)加入到workspace里,int可以是POST_CHANGE、PRE_DELETE等,包含修改树的事件有:POST_CHANGE, PRE_BUILD,POST_BUILD。
要点:
性能。listener里作的任何动作不要太占资源,比如:对服务器进行连接、访问I/O之类操作;关于这点的理解可以看看Observer模型。如果实在不行的话,你就把这些操作放到另一个后台线程里去;或者要不选一个其它方便时间来做。
当然IResourceDetla也同样提供了一些高效的方法来用,见下
IResourceDelta.accept(IResourceDeltaVisitor)
IResourceDelta.findMember(IPath)
IResourceChangeEvent.findMarkerDeltas
线程安全。最重要的是要明白资源可能会任何一个线程里被改动,所以在你的listener里加入线程的时候你必须做好线程同步工作。如果涉及到SWT的话那么要使用org.eclipse.swt.widgets.Display类里的syncExec和asyncExec方法。