protected void uiDataSnapshotForSelection()

in android-navigator/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java [270:370]


  protected void uiDataSnapshotForSelection(@NotNull DataSink sink,
                                            Object @NotNull [] selectedUserObjects,
                                            @Nullable Object[] singleSelectedPathUserObjects) {
    super.uiDataSnapshotForSelection(sink, selectedUserObjects, singleSelectedPathUserObjects);

    sink.lazy(DELETE_ELEMENT_PROVIDER, () -> {
      Object o = (selectedUserObjects.length != 1) ? null : getValueFromNode(selectedUserObjects[0]);
      if (o instanceof PsiDirectory) {
        VirtualFile directory = ((PsiDirectory)o).getVirtualFile();
        // Do not allow folder to be deleted if the folder is the root project folder.
        // See https://code.google.com/p/android/issues/detail?id=212522
        if (isTopModuleDirectoryOrParent(directory)) {
          return new NoOpDeleteProvider();
        }
      }
      return null;
    });

    sink.lazy(PlatformCoreDataKeys.MODULE, () -> {
      Object value = (selectedUserObjects.length != 1) ? null : getValueFromNode(selectedUserObjects[0]);
      return value instanceof PackageElement o ? o.getModule() :
             value instanceof AndroidFacet o ? o.getModule() :
             null;
    });

    sink.lazy(VIRTUAL_FILE, () -> {
      Object value = (selectedUserObjects.length != 1) ? null : getValueFromNode(selectedUserObjects[0]);
      if (!(value instanceof PackageElement packageElement)) {
        return null;
      }
      Module m = packageElement.getModule();
      if (m == null) return null;
      PsiDirectory[] folders = packageElement.getPackage().getDirectories(GlobalSearchScope.moduleScope(m));
      if (folders.length > 0) {
        return folders[0].getVirtualFile();
      }
      else {
        return null;
      }
    });

    sink.lazy(VIRTUAL_FILE_ARRAY, () -> {
      NodeDescriptor selectedDescriptor =
        (selectedUserObjects.length != 1) ? null : ObjectUtils.tryCast(selectedUserObjects[0], NodeDescriptor.class);
      if (selectedDescriptor instanceof FileGroupNode) {
        List<PsiFile> files = ((FileGroupNode)selectedDescriptor).getFiles();
        if (!files.isEmpty()) {
          List<VirtualFile> virtualFiles = new ArrayList<>(files.size());
          for (PsiFile file : files) {
            if (file.isValid()) {
              virtualFiles.add(file.getVirtualFile());
            }
          }
          return virtualFiles.toArray(VirtualFile.EMPTY_ARRAY);
        }
      }

      if (selectedDescriptor instanceof FolderGroupNode) {
        List<PsiDirectory> directories = ((FolderGroupNode)selectedDescriptor).getFolders();
        if (!directories.isEmpty()) {
          List<VirtualFile> virtualFiles = new ArrayList<>(directories.size());
          for (PsiDirectory directory : directories) {
            if (directory.isValid()) {
              virtualFiles.add(directory.getVirtualFile());
            }
          }
          return virtualFiles.toArray(VirtualFile.EMPTY_ARRAY);
        }
      }
      return null;
    });

    sink.lazy(PSI_ELEMENT, () -> {
      Object value = (selectedUserObjects.length != 1) ? null : getValueFromNode(selectedUserObjects[0]);
      if (value instanceof PsiElement o) {
        return o;
      }
      else if (value instanceof List<?> l) {
        if (!l.isEmpty() && l.get(0) instanceof PsiElement o) {
          return o;
        }
      }

      NodeDescriptor<?> selectedDescriptor =
        (selectedUserObjects.length != 1) ? null : ObjectUtils.tryCast(selectedUserObjects[0], NodeDescriptor.class);
      if (selectedDescriptor instanceof FileGroupNode o) {
        List<PsiFile> files = o.getFiles();
        if (!files.isEmpty()) {
          return files.get(0);
        }
      }

      if (selectedDescriptor instanceof FolderGroupNode o) {
        List<PsiDirectory> directories = o.getFolders();
        if (!directories.isEmpty()) {
          return directories.get(0);
        }
      }
      return null;
    });
  }