Eclipse插件,我怎么知道IResourceDeltaVisitor何时结束处理树节点?

时间:2011-10-18 22:38:53

标签: eclipse eclipse-plugin

我编写了一个Eclipse插件,它基本上允许程序员从Project Explorer中选择一个Java源代码,通过选择相应的DropDown菜单选项,它将根据所选的一个创建一个接口.java文件。 一切正常,但现在我需要编写工作的更新部分。 更新要求很简单,我需要监听更改并确定已修改生成接口的源并重新创建接口文件。 为此,我编写了一个实现IResourceChangeListener接口的类。 该课程如下:

public class DTOChangeListener implements IResourceChangeListener {
    private List<UpdatedUnit> updatedUnits;



    public DTOChangeListener() {
        super();
        this.updatedUnits=new ArrayList<UpdatedUnit>();
    }

    @Override
    public void resourceChanged(IResourceChangeEvent event) {
        try{
            if(event.getType() == IResourceChangeEvent.POST_CHANGE){
                  event.getDelta().accept(this.buildVisitor());
            }
        }catch(CoreException ex){
               ex.printStackTrace();
        }

    }

    protected IResourceDeltaVisitor buildVisitor(){
        IResourceDeltaVisitor result=new IResourceDeltaVisitor() {

        @Override
        public boolean visit(IResourceDelta resDelta) throws CoreException    {
               String resName=resDelta.getResource().getName();
               if(resName==null || resName.equals("")){
                     return true;
               }
               String[] splits=resName.split("\\.");
               String name = splits[0];
               if(name.contains("PropertyAccess")){
                    return false;
               }
               String interfaceName=name + "PropertyAccess";
               String interfaceFile=interfaceName + ".java";
               IResource res=resDelta.getResource();
               if((res instanceof IFolder) || (res instanceof IProject)){
               // Avoid Folder & Project Nodes
                   return true;
               }
               IProject project=res.getProject();
               if(project!=null){
                  if(project.isNatureEnabled("org.eclipse.jdt.core.javanature")){
                     IJavaElement element=JavaCore.create(res);
                     if(element instanceof ICompilationUnit){
                        ICompilationUnit unit=(ICompilationUnit)element;
                        IPath path=res.getProjectRelativePath().removeLastSegments(1);
                        IResource propertyAccess=project.findMember(path.append(interfaceFile));
                        if(propertyAccess!=null){
                           UpdatedUnit updatedUnit=new UpdatedUnit(project, path, unit);
                           updatedUnits.add(updatedUnit);
                           return false;
                        }
                     }
                  }
               }
               return true;
        }
      };
      return result;
    }

    public List<UpdatedUnit> getUpdatedUnits() {
           return updatedUnits;
    }
}

我将监听器添加到工作区,现在问题是:

如何知道updatedUnits列表何时完成以便使用我自己的代码处理列表? 对这个问题的一个正确答案是,不要担心:

event.getData().accept(this.buildVisitor());

将阻止访客完成访问。 但至少没有像它那样记录在案。

任何想法都将不胜感激。 在此先感谢。

丹尼尔

1 个答案:

答案 0 :(得分:1)

除非记录在块中,否则会阻止。