6.9 eclipse资源改变通知机制

添加和移除监听器:

 1    IWorkspace workspace = ResourcesPlugin.getWorkspace();
 2    IResourceChangeListener listener = new IResourceChangeListener() {
 3       public void resourceChanged(IResourceChangeEvent event) {
 4          System.out.println("Something changed!");
 5       }
 6    };
 7    workspace.addResourceChangeListener(listener);
 8 
 9    //... some time later one ...
10    workspace.removeResourceChangeListener(listener);

IResourceChangeEvent:

Event Type

PRE_CHANGE,POST_CHANGE,PRE_BUILD,POST_BUILD,PRE_CLOSE,POST_CLOSE,PRE_DELETE,POST_DELETE

IresourceDelta

IresourceDelta.getKind()

    IResourceDelta.ADDED

    IResourceDelta.REMOVED

    IResourceDelta.CHANGED

IresourceDelta.getFlags()

    IResourceDelta.CONTENT

    IResourceDelta.REPLACED

    IResourceDelta.REMOVED

    IResourceDelta.MOVED_FROM

IresourceDelta.getMovedFromPath()

    IResourceDelta.MOVED_TO

IresourceDelta.getMovedToPath()

    IResourceDelta.MARKERS      

(IMarkerDelta[] markers = delta.getMarkerDeltas())

使用IResourceDelta.findMember(IPath)可以快速定位到我们关注的IresourceDelta,而不必按树状结构依次向下通知。IresourceDelta.accept(IResourceDeltaVistor)来访问我们关心的ResourceDeltaVistor树的分支。

Sample:

 1 public class DocIndexUpdater implements IResourceChangeListener {
 2       private TableViewer table; //assume this gets initialized somewhere
 3       private static final IPath DOC_PATH = new Path("MyProject/doc");
 4       public void resourceChanged(IResourceChangeEvent event) {
 5          //we are only interested in POST_CHANGE events
 6          if (event.getType() != IResourceChangeEvent.POST_CHANGE)
 7             return;
 8          IResourceDelta rootDelta = event.getDelta();
 9          //get the delta, if any, for the documentation directory
10          IResourceDelta docDelta = rootDelta.findMember(DOC_PATH);
11          if (docDelta == null)
12             return;
13          final ArrayList changed = new ArrayList();
14          IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
15             public boolean visit(IResourceDelta delta) {
16                //only interested in changed resources (not added or removed)
17                if (delta.getKind() != IResourceDelta.CHANGED)
18                   return true;
19                //only interested in content changes
20                if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)
21                   return true;
22                IResource resource = delta.getResource();
23                //only interested in files with the "txt" extension
24                if (resource.getType() == IResource.FILE &&
25               "txt".equalsIgnoreCase(resource.getFileExtension())) {
26                   changed.add(resource);
27                }
28                return true;
29             }
30          };
31          try {
32             docDelta.accept(visitor);
33          } catch (CoreException e) {
34             //open error dialog with syncExec or print to plugin log file
35          }
36          //nothing more to do if there were no changed text files
37          if (changed.size() == 0)
38             return;
39          //post this update to the table
40          Display display = table.getControl().getDisplay();
41          if (!display.isDisposed()) {
42             display.asyncExec(new Runnable() {
43                public void run() {
44                   //make sure the table still exists
45                   if (table.getControl().isDisposed())
46                      return;
47                   table.update(changed.toArray(), null);
48                }
49             });
50          }
51       }
52    }

 

 

posted @ 2014-06-10 17:25  behappylee  阅读(353)  评论(0编辑  收藏  举报