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;
});
}