vcs: Refactored "ScheduleForAdditionAction"

This commit is contained in:
Konstantin Kolosovsky
2016-08-04 22:37:12 +03:00
parent cac05bda38
commit b7312266fe
3 changed files with 28 additions and 57 deletions
@@ -42,6 +42,7 @@ import com.intellij.openapi.vcs.roots.VcsRootDetector;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -683,6 +684,11 @@ public class VcsUtil {
return items == null || !items.findAny().isPresent();
}
@NotNull
public static <T> Stream<T> notNullize(@Nullable Stream<T> items) {
return ObjectUtils.notNull(items, Stream.empty());
}
@NotNull
public static <T> Stream<T> toStream(@Nullable T... items) {
return items == null ? Stream.empty() : Stream.of(items);
@@ -45,16 +45,15 @@ import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ThreeState;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import com.intellij.vcsUtil.RollbackUtil;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.stream.Stream;
import static com.intellij.openapi.ui.Messages.getQuestionIcon;
import static com.intellij.openapi.ui.Messages.showYesNoDialog;
@@ -84,9 +83,8 @@ public class RollbackAction extends AnAction implements DumbAware {
private static boolean hasReversibleFiles(@NotNull AnActionEvent e) {
ChangeListManager manager = ChangeListManager.getInstance(e.getRequiredData(CommonDataKeys.PROJECT));
Set<VirtualFile> modifiedWithoutEditing = ContainerUtil.newHashSet(manager.getModifiedWithoutEditing());
Stream<VirtualFile> fileStream = ObjectUtils.notNull(e.getData(VcsDataKeys.VIRTUAL_FILE_STREAM), Stream.empty());
return fileStream.anyMatch(
return VcsUtil.notNullize(e.getData(VcsDataKeys.VIRTUAL_FILE_STREAM)).anyMatch(
file -> manager.haveChangesUnder(file) != ThreeState.NO || manager.isFileAffected(file) || modifiedWithoutEditing.contains(file));
}
@@ -38,30 +38,33 @@ import com.intellij.openapi.vcs.changes.ui.ChangesBrowserBase;
import com.intellij.openapi.vcs.changes.ui.ChangesListView;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Consumer;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.intellij.vcsUtil.VcsUtil.isEmpty;
import static com.intellij.vcsUtil.VcsUtil.notNullize;
public class ScheduleForAdditionAction extends AnAction implements DumbAware {
public void update(@NotNull AnActionEvent e) {
final boolean enabled = thereAreUnversionedFiles(e);
boolean enabled = e.getProject() != null && !isEmpty(getUnversionedFiles(e, e.getProject()));
e.getPresentation().setEnabled(enabled);
final String place = e.getPlace();
if (ActionPlaces.ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION.equals(place) || ActionPlaces.CHANGES_VIEW_POPUP.equals(place) ) {
if (ActionPlaces.ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION.equals(e.getPlace()) ||
ActionPlaces.CHANGES_VIEW_POPUP.equals(e.getPlace())) {
e.getPresentation().setVisible(enabled);
}
}
public void actionPerformed(@NotNull AnActionEvent e) {
addUnversioned(e.getRequiredData(CommonDataKeys.PROJECT), getUnversionedFiles(e), this::isStatusForAddition,
e.getData(ChangesBrowserBase.DATA_KEY));
Project project = e.getRequiredData(CommonDataKeys.PROJECT);
List<VirtualFile> unversionedFiles = getUnversionedFiles(e, project).collect(Collectors.toList());
addUnversioned(project, unversionedFiles, this::isStatusForAddition, e.getData(ChangesBrowserBase.DATA_KEY));
}
public static boolean addUnversioned(@NotNull Project project,
@@ -90,51 +93,21 @@ public class ScheduleForAdditionAction extends AnAction implements DumbAware {
return result;
}
private boolean thereAreUnversionedFiles(AnActionEvent e) {
if (!VcsUtil.isEmpty(e.getData(ChangesListView.UNVERSIONED_FILES_DATA_KEY))) {
return true;
}
VirtualFile[] files = getFromSelection(e);
Project project = e.getData(CommonDataKeys.PROJECT);
if (files == null || project == null) {
return false;
}
ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
FileStatusManager fileStatusManager = FileStatusManager.getInstance(project);
for (VirtualFile file : files) {
if (isFileUnversioned(file, vcsManager, fileStatusManager)) {
return true;
}
}
return false;
}
@NotNull
private List<VirtualFile> getUnversionedFiles(final AnActionEvent e) {
Stream<VirtualFile> unversionedFilesStream = e.getData(ChangesListView.UNVERSIONED_FILES_DATA_KEY);
List<VirtualFile> unversionedFiles = unversionedFilesStream != null ? unversionedFilesStream.collect(Collectors.toList()) : null;
if (unversionedFiles != null && !unversionedFiles.isEmpty()) {
return unversionedFiles;
}
final VirtualFile[] files = getFromSelection(e);
final Project project = e.getData(CommonDataKeys.PROJECT);
if (files == null || project == null) {
return Collections.emptyList();
}
private Stream<VirtualFile> getUnversionedFiles(@NotNull AnActionEvent e, @NotNull Project project) {
ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
FileStatusManager fileStatusManager = FileStatusManager.getInstance(project);
unversionedFiles = new ArrayList<VirtualFile>();
for (VirtualFile file : files) {
if (isFileUnversioned(file, vcsManager, fileStatusManager)) {
unversionedFiles.add(file);
}
}
return unversionedFiles;
boolean hasExplicitUnversioned = !isEmpty(e.getData(ChangesListView.UNVERSIONED_FILES_DATA_KEY));
return hasExplicitUnversioned
? e.getRequiredData(ChangesListView.UNVERSIONED_FILES_DATA_KEY)
: notNullize(e.getData(VcsDataKeys.VIRTUAL_FILE_STREAM))
.filter(file -> isFileUnversioned(file, vcsManager, fileStatusManager));
}
private boolean isFileUnversioned(@NotNull VirtualFile file,
@NotNull ProjectLevelVcsManager vcsManager, @NotNull FileStatusManager fileStatusManager) {
@NotNull ProjectLevelVcsManager vcsManager,
@NotNull FileStatusManager fileStatusManager) {
AbstractVcs vcs = vcsManager.getVcsFor(file);
return vcs != null && !vcs.areDirectoriesVersionedItems() && file.isDirectory() ||
isStatusForAddition(fileStatusManager.getStatus(file));
@@ -143,10 +116,4 @@ public class ScheduleForAdditionAction extends AnAction implements DumbAware {
protected boolean isStatusForAddition(FileStatus status) {
return status == FileStatus.UNKNOWN;
}
@Nullable
private static VirtualFile[] getFromSelection(AnActionEvent e) {
return CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(e.getDataContext());
}
}