public void build(boolean computeSubtypes) {

    JavaModelManager manager = JavaModelManager.getJavaModelManager();
    try {
      // optimize access to zip files while building hierarchy
      manager.cacheZipFiles();

      if (this.hierarchy.focusType == null || computeSubtypes) {
        IProgressMonitor typeInRegionMonitor =
            this.hierarchy.progressMonitor == null
                ? null
                : new SubProgressMonitor(this.hierarchy.progressMonitor, 30);
        HashMap allOpenablesInRegion = determineOpenablesInRegion(typeInRegionMonitor);
        this.hierarchy.initialize(allOpenablesInRegion.size());
        IProgressMonitor buildMonitor =
            this.hierarchy.progressMonitor == null
                ? null
                : new SubProgressMonitor(this.hierarchy.progressMonitor, 70);
        createTypeHierarchyBasedOnRegion(allOpenablesInRegion, buildMonitor);
        ((RegionBasedTypeHierarchy) this.hierarchy).pruneDeadBranches();
      } else {
        this.hierarchy.initialize(1);
        this.buildSupertypes();
      }
    } finally {
      manager.flushZipFiles();
    }
  }