vcs: Implemented "Delete" action for unversioned files and changes in commit dialog

This commit is contained in:
Konstantin Kolosovsky
2016-04-20 18:10:19 +03:00
parent 546a2fd1dd
commit 5f176262f2
3 changed files with 45 additions and 17 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author max
@@ -169,22 +170,31 @@ public class ChangesUtil {
return result;
}
public static VirtualFile[] getFilesFromChanges(final Collection<Change> changes) {
ArrayList<VirtualFile> files = new ArrayList<VirtualFile>();
for (Change change : changes) {
final ContentRevision afterRevision = change.getAfterRevision();
if (afterRevision != null) {
FilePath filePath = afterRevision.getFile();
VirtualFile file = filePath.getVirtualFile();
if (file == null || !file.isValid()) {
file = LocalFileSystem.getInstance().refreshAndFindFileByPath(filePath.getPath());
}
if (file != null && file.isValid()) {
files.add(file);
}
}
@NotNull
public static VirtualFile[] getFilesFromChanges(@NotNull Collection<Change> changes) {
return VfsUtilCore.toVirtualFileArray(getAfterRevisionsFiles(changes));
}
@NotNull
public static List<VirtualFile> getAfterRevisionsFiles(@NotNull Collection<Change> changes) {
return changes.stream()
.map(Change::getAfterRevision)
.filter(Objects::nonNull)
.map(ContentRevision::getFile)
.map(ChangesUtil::refreshAndFind)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
@Nullable
private static VirtualFile refreshAndFind(@NotNull FilePath filePath) {
VirtualFile file = filePath.getVirtualFile();
if (file == null || !file.isValid()) {
file = LocalFileSystem.getInstance().refreshAndFindFileByPath(filePath.getPath());
}
return VfsUtilCore.toVirtualFileArray(files);
return file != null && file.isValid() ? file : null;
}
public static Navigatable[] getNavigatableArray(final Project project, final VirtualFile[] selectedFiles) {
@@ -17,11 +17,13 @@ package com.intellij.openapi.vcs.changes.ui;
import com.intellij.diff.DiffDialogHints;
import com.intellij.diff.util.DiffUserDataKeysEx;
import com.intellij.ide.DeleteProvider;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.CheckboxAction;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.actions.VirtualFileDeleteProvider;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.AbstractVcs;
@@ -31,6 +33,7 @@ import com.intellij.openapi.vcs.VcsDataKeys;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vcs.changes.actions.diff.ShowDiffAction;
import com.intellij.openapi.vcs.changes.actions.diff.ShowDiffContext;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
@@ -73,6 +76,7 @@ public abstract class ChangesBrowserBase<T> extends JPanel implements TypeSafeDa
public static DataKey<ChangesBrowserBase> DATA_KEY = DataKey.create("com.intellij.openapi.vcs.changes.ui.ChangesBrowser");
private AnAction myDiffAction;
private final VirtualFile myToSelect;
@NotNull private final DeleteProvider myDeleteProvider = new VirtualFileDeleteProvider();
public void setChangesToDisplay(final List<T> changes) {
myChangesToDisplay = changes;
@@ -220,6 +224,9 @@ public abstract class ChangesBrowserBase<T> extends JPanel implements TypeSafeDa
else if (UNVERSIONED_FILES_DATA_KEY.equals(key)) {
sink.put(UNVERSIONED_FILES_DATA_KEY, getVirtualFiles(myViewer.getSelectionPaths(), ChangesBrowserNode.UNVERSIONED_FILES_TAG));
}
else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.equals(key)) {
sink.put(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, myDeleteProvider);
}
}
public void select(List<T> changes) {
@@ -439,9 +446,14 @@ public abstract class ChangesBrowserBase<T> extends JPanel implements TypeSafeDa
@NotNull
public abstract List<Change> getAllChanges();
@NotNull
private VirtualFile[] getSelectedFiles() {
final List<Change> changes = getSelectedChanges();
return ChangesUtil.getFilesFromChanges(changes);
Set<VirtualFile> result = ContainerUtil.newHashSet();
result.addAll(ChangesUtil.getAfterRevisionsFiles(getSelectedChanges()));
result.addAll(getVirtualFiles(myViewer.getSelectionPaths(), null));
return VfsUtilCore.toVirtualFileArray(result);
}
public AnAction getDiffAction() {
@@ -87,6 +87,7 @@ public class MultipleChangeListBrowser extends ChangesBrowserBase<Object> {
private void setupRebuildListForActions() {
ActionManager actionManager = ActionManager.getInstance();
final AnAction moveAction = actionManager.getAction(IdeActions.MOVE_TO_ANOTHER_CHANGE_LIST);
final AnAction deleteAction = actionManager.getAction("ChangesView.DeleteUnversioned.From.Dialog");
actionManager.addAnActionListener(new AnActionListener.Adapter() {
@Override
@@ -94,6 +95,10 @@ public class MultipleChangeListBrowser extends ChangesBrowserBase<Object> {
if (moveAction.equals(action)) {
rebuildList();
}
else if (deleteAction.equals(action)) {
ChangeListManager.getInstance(myProject)
.invokeAfterUpdate(() -> rebuildList(), InvokeAfterUpdateMode.SYNCHRONOUS_CANCELLABLE, "Delete files", null);
}
}
}, this);
}
@@ -310,6 +315,7 @@ public class MultipleChangeListBrowser extends ChangesBrowserBase<Object> {
});
if (Registry.is("vcs.unversioned.files.in.commit")) {
toolBarGroup.add(ActionManager.getInstance().getAction("ChangesView.AddUnversioned.From.Dialog"));
toolBarGroup.add(ActionManager.getInstance().getAction("ChangesView.DeleteUnversioned.From.Dialog"));
toolBarGroup.add(ActionManager.getInstance().getAction("ChangesView.Ignore"));
}
RollbackDialogAction rollback = new RollbackDialogAction();