static void setupResDirectoryChoices()

in aswb/src/com/google/idea/blaze/android/resources/actions/BlazeCreateResourceUtils.java [53:161]


  static void setupResDirectoryChoices(
      Project project,
      @Nullable VirtualFile contextFile,
      JBLabel resDirLabel,
      ComboboxWithBrowseButton resDirComboAndBrowser) {
    // Reset the item list before filling it back up.
    resDirComboAndBrowser.getComboBox().removeAllItems();
    BlazeProjectData blazeProjectData =
        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
    if (blazeProjectData != null) {
      BlazeAndroidSyncData syncData =
          blazeProjectData.getSyncState().get(BlazeAndroidSyncData.class);
      if (syncData != null) {
        ImmutableCollection<TargetKey> rulesRelatedToContext = null;
        File fileFromContext = null;
        if (contextFile != null) {
          fileFromContext = VfsUtilCore.virtualToIoFile(contextFile);
          rulesRelatedToContext =
              SourceToTargetMap.getInstance(project).getRulesForSourceFile(fileFromContext);
          if (rulesRelatedToContext.isEmpty()) {
            rulesRelatedToContext = null;
          }
        }

        ArtifactLocationDecoder artifactLocationDecoder =
            blazeProjectData.getArtifactLocationDecoder();

        // Sort:
        // - contextFile/res if contextFile is a directory,
        //   to optimize the right click on directory case, or the "closest" string
        //   match to the contextFile from the res directories known to blaze
        // - the rest of the direct dirs, then transitive dirs of the context rules,
        //   then any known res dir in the project
        //   as a backup, in alphabetical order.
        Set<File> resourceDirs = Sets.newTreeSet();
        Set<File> transitiveDirs = Sets.newTreeSet();
        Set<File> allResDirs = Sets.newTreeSet();
        for (AndroidResourceModule androidResourceModule :
            syncData.importResult.androidResourceModules) {

          Collection<File> resources =
              OutputArtifactResolver.resolveAll(
                  project, artifactLocationDecoder, androidResourceModule.resources);

          Collection<File> transitiveResources =
              OutputArtifactResolver.resolveAll(
                  project, artifactLocationDecoder, androidResourceModule.transitiveResources);

          // labelsRelatedToContext should include deps,
          // but as a first pass we only check the rules themselves
          // for resources. If we come up empty, then have anyResDir as a backup.
          allResDirs.addAll(transitiveResources);

          if (rulesRelatedToContext != null
              && !rulesRelatedToContext.contains(androidResourceModule.targetKey)) {
            continue;
          }
          resourceDirs.addAll(resources);
          transitiveDirs.addAll(transitiveResources);
        }
        // No need to show some directories twice.
        transitiveDirs.removeAll(resourceDirs);

        JComboBox resDirCombo = resDirComboAndBrowser.getComboBox();
        // Allow the user to browse and overwrite some of the entries,
        // in case our inference is wrong.
        resDirCombo.setEditable(true);
        // Optimize the right-click on a non-res directory (consider res directory right under that)
        // After the use confirms the choice, a directory will be created if it is missing.
        if (fileFromContext != null && fileFromContext.isDirectory()) {
          File closestDirToContext = new File(fileFromContext.getPath(), "res");
          resDirCombo.setSelectedItem(closestDirToContext);
        } else {
          // If we're not completely sure, let people know there are options
          // via the placeholder text, and put the most likely on top.
          String placeHolder = PLACEHOLDER_TEXT;
          resDirCombo.addItem(placeHolder);
          resDirCombo.setSelectedItem(placeHolder);
          if (fileFromContext != null) {
            File closestDirToContext =
                findClosestDirToContext(fileFromContext.getPath(), resourceDirs);
            closestDirToContext =
                closestDirToContext != null
                    ? closestDirToContext
                    : findClosestDirToContext(fileFromContext.getPath(), transitiveDirs);
            if (closestDirToContext != null) {
              resDirCombo.addItem(closestDirToContext);
              resourceDirs.remove(closestDirToContext);
              transitiveDirs.remove(closestDirToContext);
            }
          }
        }
        if (!resourceDirs.isEmpty() || !transitiveDirs.isEmpty()) {
          for (File resourceDir : resourceDirs) {
            resDirCombo.addItem(resourceDir);
          }
          for (File resourceDir : transitiveDirs) {
            resDirCombo.addItem(resourceDir);
          }
        } else {
          for (File resourceDir : allResDirs) {
            resDirCombo.addItem(resourceDir);
          }
        }
        resDirComboAndBrowser.setVisible(true);
        resDirLabel.setVisible(true);
      }
    }
  }