diff --git a/platform/platform-resources-en/src/messages/VcsBundle.properties b/platform/platform-resources-en/src/messages/VcsBundle.properties
index 578b0763716f..e4dcda56cebe 100644
--- a/platform/platform-resources-en/src/messages/VcsBundle.properties
+++ b/platform/platform-resources-en/src/messages/VcsBundle.properties
@@ -362,11 +362,8 @@ patch.apply.already.applied=All of the changes in the specified patch are alread
patch.apply.partially.applied=Some of the changes in the specified patch were skipped because they are already contained in the code
patch.apply.success.applied.text=Patch successfully applied
patch.apply.command=apply patch
-shelve.changes.delete.confirm=Are you sure you want to delete the shelved changelist named ''{0}''? You will not be able to undo this operation.
-shelve.changes.delete.multiple.confirm=Are you sure you want to delete {0} shelved changelists? You will not be able to undo this operation.
-shelve.changes.delete.files.from.list=You are going to remove {0} file(s) from shelved changelist. Are you sure?
-shelve.changes.delete.files.from.list.title=Remove Files from Shelved Changelist
-shelvedChanges.delete.title=Delete Shelved Changelist
+shelve.changes.delete.items.confirm=You are going to remove {0}{1}{2}.
This action cannot be undone. Would you like to continue?
+shelvedChanges.delete.title=Delete Items from Shelf
create.patch.success.confirmation=Successfully created patch {0}
create.patch.partial.success.confirmation=Successfully created patch {0}. {1} of the selected files {1,choice,1#is|2#are} binary and {1,choice,1#was|2#were} not included in the patch.
patch.apply.error=Failed to apply patch for file {0}: {1}
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/UnshelvePatchDefaultExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/UnshelvePatchDefaultExecutor.java
index 8bd8099d8c40..083c1a3676c0 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/UnshelvePatchDefaultExecutor.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/UnshelvePatchDefaultExecutor.java
@@ -25,11 +25,9 @@ import com.intellij.openapi.vcs.changes.CommitContext;
import com.intellij.openapi.vcs.changes.LocalChangeList;
import com.intellij.openapi.vcs.changes.TransparentlyFailedValueI;
import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager;
-import com.intellij.openapi.vcs.changes.shelf.ShelvedBinaryFile;
import com.intellij.openapi.vcs.changes.shelf.ShelvedBinaryFilePatch;
import com.intellij.openapi.vcs.changes.shelf.ShelvedChangeList;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
@@ -43,14 +41,11 @@ public class UnshelvePatchDefaultExecutor extends ApplyPatchDefaultExecutor {
private static final Logger LOG = Logger.getInstance(UnshelvePatchDefaultExecutor.class);
@NotNull private final ShelvedChangeList myCurrentShelveChangeList;
- @NotNull private final List myBinaryShelvedPatches;
public UnshelvePatchDefaultExecutor(@NotNull Project project,
- @NotNull ShelvedChangeList changeList,
- @NotNull List binaryShelvedPatches) {
+ @NotNull ShelvedChangeList changeList) {
super(project);
myCurrentShelveChangeList = changeList;
- myBinaryShelvedPatches = binaryShelvedPatches;
}
@Override
@@ -74,26 +69,19 @@ public class UnshelvePatchDefaultExecutor extends ApplyPatchDefaultExecutor {
ShelveChangesManager shelveChangesManager = ShelveChangesManager.getInstance(myProject);
if (!shelveChangesManager.isRemoveFilesFromShelf()) return;
try {
- List textPatches = ContainerUtil.newArrayList(remaining);
- List remainingBinaries = ContainerUtil.newArrayList(myBinaryShelvedPatches);
+ List patches = ContainerUtil.newArrayList(remaining);
for (PatchApplier applier : appliers) {
- textPatches.addAll(applier.getRemainingPatches());
- remainingBinaries.removeAll(applier.getBinaryPatches());
+ patches.addAll(applier.getRemainingPatches());
}
- if (textPatches.isEmpty() && remainingBinaries.isEmpty()) {
+ if (patches.isEmpty()) {
shelveChangesManager.recycleChangeList(myCurrentShelveChangeList);
}
else {
- shelveChangesManager.saveRemainingPatches(myCurrentShelveChangeList, textPatches,
- ContainerUtil.mapNotNull(remainingBinaries, new Function() {
- @Override
- public ShelvedBinaryFile fun(FilePatch patch) {
- return patch instanceof ShelvedBinaryFilePatch
- ? ((ShelvedBinaryFilePatch)patch)
- .getShelvedBinaryFile()
- : null;
- }
- }), commitContext);
+ shelveChangesManager.saveRemainingPatches(myCurrentShelveChangeList, patches,
+ ContainerUtil.mapNotNull(patches, patch -> patch instanceof ShelvedBinaryFilePatch
+ ? ((ShelvedBinaryFilePatch)patch)
+ .getShelvedBinaryFile()
+ : null), commitContext);
}
}
catch (Exception e) {
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java
index e5336180fadc..a9afe70a5fb9 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java
@@ -759,31 +759,39 @@ public class ShelveChangesManager extends AbstractProjectComponent implements JD
}
public void saveRemainingPatches(final ShelvedChangeList changeList, final List remainingPatches,
- final List remainingBinaries, CommitContext commitContext) {
- final File newPatchDir = generateUniqueSchemePatchDir(changeList.DESCRIPTION, true);
- final File newPath = getPatchFileInConfigDir(newPatchDir);
+ final List remainingBinaries, CommitContext commitContext) {
+ ShelvedChangeList listCopy;
try {
- FileUtil.copy(new File(changeList.PATH), newPath);
+ listCopy = !changeList.isRecycled() ? createRecycledChangelist(changeList) : null;
}
catch (IOException e) {
// do not delete if cannot recycle
return;
}
- final ShelvedChangeList listCopy = new ShelvedChangeList(newPath.getAbsolutePath(), changeList.DESCRIPTION,
- new ArrayList(changeList.getBinaryFiles()));
- listCopy.markToDelete(changeList.isMarkedToDelete());
- listCopy.setName(newPatchDir.getName());
-
writePatchesToFile(myProject, changeList.PATH, remainingPatches, commitContext);
changeList.getBinaryFiles().retainAll(remainingBinaries);
changeList.clearLoadedChanges();
- recycleChangeList(listCopy, changeList);
- // all newly create ShelvedChangeList have to be added to SchemesManger as new scheme
- mySchemeManager.addNewScheme(listCopy, false);
+ if (listCopy != null) {
+ recycleChangeList(listCopy, changeList);
+ // all newly create ShelvedChangeList have to be added to SchemesManger as new scheme
+ mySchemeManager.addNewScheme(listCopy, false);
+ }
notifyStateChanged();
}
+ @Nullable
+ private ShelvedChangeList createRecycledChangelist(ShelvedChangeList changeList) throws IOException {
+ final File newPatchDir = generateUniqueSchemePatchDir(changeList.DESCRIPTION, true);
+ final File newPath = getPatchFileInConfigDir(newPatchDir);
+ FileUtil.copy(new File(changeList.PATH), newPath);
+ final ShelvedChangeList listCopy = new ShelvedChangeList(newPath.getAbsolutePath(), changeList.DESCRIPTION,
+ new ArrayList(changeList.getBinaryFiles()));
+ listCopy.markToDelete(changeList.isMarkedToDelete());
+ listCopy.setName(newPatchDir.getName());
+ return listCopy;
+ }
+
public void restoreList(@NotNull final ShelvedChangeList changeList) {
ShelvedChangeList list = mySchemeManager.findSchemeByName(changeList.getName());
if (list != null) {
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java
index 4dd82bb0e4c2..219d00b2b078 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java
@@ -14,12 +14,6 @@
* limitations under the License.
*/
-/*
- * Created by IntelliJ IDEA.
- * User: yole
- * Date: 23.11.2006
- * Time: 15:11:11
- */
package com.intellij.openapi.vcs.changes.shelf;
import com.intellij.CommonBundle;
@@ -27,7 +21,6 @@ import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager;
import com.intellij.ide.DeleteProvider;
import com.intellij.ide.actions.EditSourceAction;
-import com.intellij.ide.impl.TypeSafeDataProviderAdapter;
import com.intellij.ide.util.treeView.TreeState;
import com.intellij.lifecycle.PeriodicalTasksCloser;
import com.intellij.openapi.actionSystem.*;
@@ -85,6 +78,7 @@ import java.util.*;
import java.util.List;
import static com.intellij.util.FontUtil.spaceAndThinSpace;
+import static com.intellij.util.containers.ContainerUtil.notNullize;
public class ShelvedChangesViewManager implements ProjectComponent {
@@ -96,14 +90,14 @@ public class ShelvedChangesViewManager implements ProjectComponent {
private final Project myProject;
private final ShelfTree myTree;
private Content myContent = null;
- private final ShelvedChangeDeleteProvider myDeleteProvider = new ShelvedChangeDeleteProvider();
+ private final DeleteProvider myDeleteProvider = new MyShelveDeleteProvider();
private boolean myUpdatePending = false;
private Runnable myPostUpdateRunnable = null;
- public static DataKey SHELVED_CHANGELIST_KEY = DataKey.create("ShelveChangesManager.ShelvedChangeListData");
- public static DataKey SHELVED_RECYCLED_CHANGELIST_KEY = DataKey.create("ShelveChangesManager.ShelvedRecycledChangeListData");
- public static DataKey> SHELVED_CHANGE_KEY = DataKey.create("ShelveChangesManager.ShelvedChange");
- public static DataKey> SHELVED_BINARY_FILE_KEY = DataKey.create("ShelveChangesManager.ShelvedBinaryFile");
+ public static final DataKey SHELVED_CHANGELIST_KEY = DataKey.create("ShelveChangesManager.ShelvedChangeListData");
+ public static final DataKey SHELVED_RECYCLED_CHANGELIST_KEY = DataKey.create("ShelveChangesManager.ShelvedRecycledChangeListData");
+ public static final DataKey> SHELVED_CHANGE_KEY = DataKey.create("ShelveChangesManager.ShelvedChange");
+ public static final DataKey> SHELVED_BINARY_FILE_KEY = DataKey.create("ShelveChangesManager.ShelvedBinaryFile");
private static final Object ROOT_NODE_VALUE = new Object();
private DefaultMutableTreeNode myRoot;
private final Map, String> myMoveRenameInfo;
@@ -120,11 +114,7 @@ public class ShelvedChangesViewManager implements ProjectComponent {
bus.connect().subscribe(ShelveChangesManager.SHELF_TOPIC, new ChangeListener() {
public void stateChanged(ChangeEvent e) {
myUpdatePending = true;
- ApplicationManager.getApplication().invokeLater(new Runnable() {
- public void run() {
- updateChangesContent();
- }
- }, ModalityState.NON_MODAL);
+ ApplicationManager.getApplication().invokeLater(() -> updateChangesContent(), ModalityState.NON_MODAL);
}
});
myMoveRenameInfo = new HashMap, String>();
@@ -177,12 +167,7 @@ public class ShelvedChangesViewManager implements ProjectComponent {
LOG.error("Couldn't start loading shelved changes");
return;
}
- startupManager.registerPostStartupActivity(new Runnable() {
- @Override
- public void run() {
- updateChangesContent();
- }
- });
+ startupManager.registerPostStartupActivity(this::updateChangesContent);
}
public void projectClosed() {
@@ -240,7 +225,7 @@ public class ShelvedChangesViewManager implements ProjectComponent {
JPanel rootPanel = new JPanel(new BorderLayout());
rootPanel.add(toolbar.getComponent(), BorderLayout.WEST);
rootPanel.add(pane, BorderLayout.CENTER);
- DataManager.registerDataProvider(rootPanel, new TypeSafeDataProviderAdapter(myTree));
+ DataManager.registerDataProvider(rootPanel, myTree);
return rootPanel;
}
@@ -303,16 +288,14 @@ public class ShelvedChangesViewManager implements ProjectComponent {
}
public void activateView(final ShelvedChangeList list) {
- Runnable runnable = new Runnable() {
- public void run() {
- if (list != null) {
- TreeUtil.selectNode(myTree, TreeUtil.findNodeWithObject(myRoot, list));
- }
- myContentManager.setSelectedContent(myContent);
- ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(ChangesViewContentManager.TOOLWINDOW_ID);
- if (!window.isVisible()) {
- window.activate(null);
- }
+ Runnable runnable = () -> {
+ if (list != null) {
+ TreeUtil.selectNode(myTree, TreeUtil.findNodeWithObject(myRoot, list));
+ }
+ myContentManager.setSelectedContent(myContent);
+ ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(ChangesViewContentManager.TOOLWINDOW_ID);
+ if (!window.isVisible()) {
+ window.activate(null);
}
};
if (myUpdatePending) {
@@ -323,36 +306,37 @@ public class ShelvedChangesViewManager implements ProjectComponent {
}
}
- private class ShelfTree extends Tree implements TypeSafeDataProvider {
- public void calcData(DataKey key, DataSink sink) {
- if (key == SHELVED_CHANGELIST_KEY) {
+ private class ShelfTree extends Tree implements DataProvider {
+ @Nullable
+ @Override
+ public Object getData(@NonNls String dataId) {
+ if (SHELVED_CHANGELIST_KEY.is(dataId)) {
final Set changeLists = getSelectedLists(false);
if (changeLists.size() > 0) {
- sink.put(SHELVED_CHANGELIST_KEY, changeLists.toArray(new ShelvedChangeList[changeLists.size()]));
+ return changeLists.toArray(new ShelvedChangeList[changeLists.size()]);
}
}
- else if (key == SHELVED_RECYCLED_CHANGELIST_KEY) {
+ else if (SHELVED_RECYCLED_CHANGELIST_KEY.is(dataId)) {
final Set changeLists = getSelectedLists(true);
if (changeLists.size() > 0) {
- sink.put(SHELVED_RECYCLED_CHANGELIST_KEY, changeLists.toArray(new ShelvedChangeList[changeLists.size()]));
+ return changeLists.toArray(new ShelvedChangeList[changeLists.size()]);
}
}
- else if (key == SHELVED_CHANGE_KEY) {
- sink.put(SHELVED_CHANGE_KEY, TreeUtil.collectSelectedObjectsOfType(this, ShelvedChange.class));
+ else if (SHELVED_CHANGE_KEY.is(dataId)) {
+ return TreeUtil.collectSelectedObjectsOfType(this, ShelvedChange.class);
}
- else if (key == SHELVED_BINARY_FILE_KEY) {
- sink.put(SHELVED_BINARY_FILE_KEY, TreeUtil.collectSelectedObjectsOfType(this, ShelvedBinaryFile.class));
+ else if (SHELVED_BINARY_FILE_KEY.is(dataId)) {
+ return TreeUtil.collectSelectedObjectsOfType(this, ShelvedBinaryFile.class);
}
- else if (key == VcsDataKeys.HAVE_SELECTED_CHANGES) {
- sink.put(VcsDataKeys.HAVE_SELECTED_CHANGES, getSelectionCount() > 0);
- /*List shelvedChanges = TreeUtil.collectSelectedObjectsOfType(this, ShelvedChange.class);
- final List changeLists = TreeUtil.collectSelectedObjectsOfType(this, ShelvedChangeList.class);*/
- } else if (key == VcsDataKeys.CHANGES) {
+ else if (VcsDataKeys.HAVE_SELECTED_CHANGES.is(dataId)) {
+ return getSelectionCount() > 0;
+ }
+ else if (VcsDataKeys.CHANGES.is(dataId)) {
List shelvedChanges = TreeUtil.collectSelectedObjectsOfType(this, ShelvedChange.class);
final List shelvedBinaryFiles = TreeUtil.collectSelectedObjectsOfType(this, ShelvedBinaryFile.class);
- if (! shelvedChanges.isEmpty() || ! shelvedBinaryFiles.isEmpty()) {
+ if (!shelvedChanges.isEmpty() || !shelvedBinaryFiles.isEmpty()) {
final List changes = new ArrayList(shelvedChanges.size() + shelvedBinaryFiles.size());
for (ShelvedChange shelvedChange : shelvedChanges) {
changes.add(shelvedChange.getChange(myProject));
@@ -360,14 +344,14 @@ public class ShelvedChangesViewManager implements ProjectComponent {
for (ShelvedBinaryFile binaryFile : shelvedBinaryFiles) {
changes.add(binaryFile.createChange(myProject));
}
- sink.put(VcsDataKeys.CHANGES, changes.toArray(new Change[changes.size()]));
+ return changes.toArray(new Change[changes.size()]);
}
else {
final List changeLists = TreeUtil.collectSelectedObjectsOfType(this, ShelvedChangeList.class);
final List changes = new ArrayList();
- for(ShelvedChangeList changeList: changeLists) {
+ for (ShelvedChangeList changeList : changeLists) {
shelvedChanges = changeList.getChanges(myProject);
- for(ShelvedChange shelvedChange: shelvedChanges) {
+ for (ShelvedChange shelvedChange : shelvedChanges) {
changes.add(shelvedChange.getChange(myProject));
}
final List binaryFiles = changeList.getBinaryFiles();
@@ -375,12 +359,13 @@ public class ShelvedChangesViewManager implements ProjectComponent {
changes.add(file.createChange(myProject));
}
}
- sink.put(VcsDataKeys.CHANGES, changes.toArray(new Change[changes.size()]));
+ return changes.toArray(new Change[changes.size()]);
}
}
- else if (key == PlatformDataKeys.DELETE_ELEMENT_PROVIDER) {
- sink.put(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, myDeleteProvider);
- } else if (CommonDataKeys.NAVIGATABLE_ARRAY.equals(key)) {
+ else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
+ return myDeleteProvider;
+ }
+ else if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
List shelvedChanges = new ArrayList(TreeUtil.collectSelectedObjectsOfType(this, ShelvedChange.class));
final ArrayDeque navigatables = new ArrayDeque();
final List changeLists = TreeUtil.collectSelectedObjectsOfType(this, ShelvedChangeList.class);
@@ -388,7 +373,7 @@ public class ShelvedChangesViewManager implements ProjectComponent {
shelvedChanges.addAll(changeList.getChanges(myProject));
}
for (final ShelvedChange shelvedChange : shelvedChanges) {
- if (shelvedChange.getBeforePath() != null && ! FileStatus.ADDED.equals(shelvedChange.getFileStatus())) {
+ if (shelvedChange.getBeforePath() != null && !FileStatus.ADDED.equals(shelvedChange.getFileStatus())) {
final NavigatableAdapter navigatable = new NavigatableAdapter() {
@Override
public void navigate(boolean requestFocus) {
@@ -401,9 +386,9 @@ public class ShelvedChangesViewManager implements ProjectComponent {
navigatables.add(navigatable);
}
}
-
- sink.put(CommonDataKeys.NAVIGATABLE_ARRAY, navigatables.toArray(new Navigatable[navigatables.size()]));
+ return navigatables.toArray(new Navigatable[navigatables.size()]);
}
+ return null;
}
private Set getSelectedLists(final boolean recycled) {
@@ -531,58 +516,82 @@ public class ShelvedChangesViewManager implements ProjectComponent {
}
}
- private class MyChangeListDeleteProvider implements DeleteProvider {
- public void deleteElement(@NotNull DataContext dataContext) {
- //noinspection unchecked
- final List shelvedChangeLists = getLists(dataContext);
- if (shelvedChangeLists.isEmpty()) return;
- String message = (shelvedChangeLists.size() == 1)
- ? VcsBundle.message("shelve.changes.delete.confirm", shelvedChangeLists.get(0).DESCRIPTION)
- : VcsBundle.message("shelve.changes.delete.multiple.confirm", shelvedChangeLists.size());
- int rc = Messages.showOkCancelDialog(myProject, message, VcsBundle.message("shelvedChanges.delete.title"), CommonBundle.message("button.delete"), CommonBundle.getCancelButtonText(), Messages.getWarningIcon());
- if (rc != Messages.OK) return;
- for(ShelvedChangeList changeList: shelvedChangeLists) {
- ShelveChangesManager.getInstance(myProject).deleteChangeList(changeList);
- }
- }
+ private class MyShelveDeleteProvider implements DeleteProvider {
- public boolean canDeleteElement(@NotNull DataContext dataContext) {
- //noinspection unchecked
- return ! getLists(dataContext).isEmpty();
- }
-
- private List getLists(final DataContext dataContext) {
- final ShelvedChangeList[] shelved = SHELVED_CHANGELIST_KEY.getData(dataContext);
- final ShelvedChangeList[] recycled = SHELVED_RECYCLED_CHANGELIST_KEY.getData(dataContext);
-
- final List shelvedChangeLists = (shelved == null && recycled == null) ?
- Collections.emptyList() : new ArrayList();
- if (shelved != null) {
- ContainerUtil.addAll(shelvedChangeLists, shelved);
- }
- if (recycled != null) {
- ContainerUtil.addAll(shelvedChangeLists, recycled);
- }
- return shelvedChangeLists;
- }
- }
-
- private class MyChangesDeleteProvider implements DeleteProvider {
public void deleteElement(@NotNull DataContext dataContext) {
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null) return;
- final ShelvedChangeList[] shelved = SHELVED_CHANGELIST_KEY.getData(dataContext);
- if (shelved == null || (shelved.length != 1)) return;
- final List changes = SHELVED_CHANGE_KEY.getData(dataContext);
- final List binaryFiles = SHELVED_BINARY_FILE_KEY.getData(dataContext);
- final ShelvedChangeList list = shelved[0];
+ List shelvedListsToDelete = TreeUtil.collectSelectedObjectsOfType(myTree, ShelvedChangeList.class);
+ ArrayList shelvedListsFromChanges = ContainerUtil.newArrayList(getLists(dataContext));
+ // filter changes
+ shelvedListsFromChanges.removeAll(shelvedListsToDelete);
+ List changesToDelete =
+ getChangesNotInLists(shelvedListsToDelete, notNullize(SHELVED_CHANGE_KEY.getData(dataContext)));
+ List binariesToDelete =
+ getBinariesNotInLists(shelvedListsToDelete, notNullize(SHELVED_BINARY_FILE_KEY.getData(dataContext)));
- final String message = VcsBundle.message("shelve.changes.delete.files.from.list", (changes == null ? 0 : changes.size()) +
- (binaryFiles == null ? 0 : binaryFiles.size()));
- int rc = Messages.showOkCancelDialog(myProject, message, VcsBundle.message("shelve.changes.delete.files.from.list.title"), Messages.getWarningIcon());
+ int changeListSize = shelvedListsToDelete.size();
+ int fileListSize = binariesToDelete.size() + changesToDelete.size();
+ if (fileListSize == 0 && changeListSize == 0) return;
+
+ String message = VcsBundle.message("shelve.changes.delete.items.confirm", constructDeleteFilesInfoMessage(fileListSize),
+ changeListSize != 0 && fileListSize != 0 ? " and " : "",
+ constructShelvedListInfoMessage(changeListSize, ContainerUtil.getFirstItem(shelvedListsToDelete)));
+ int rc = Messages
+ .showOkCancelDialog(myProject, message, VcsBundle.message("shelvedChanges.delete.title"), CommonBundle.message("button.delete"),
+ CommonBundle.getCancelButtonText(), Messages.getWarningIcon());
if (rc != Messages.OK) return;
+ for (ShelvedChangeList changeList : shelvedListsToDelete) {
+ ShelveChangesManager.getInstance(myProject).deleteChangeList(changeList);
+ }
+ for (ShelvedChangeList list : shelvedListsFromChanges) {
+ removeChangesFromChangeList(project, list, changesToDelete, binariesToDelete);
+ }
+ }
+ private List getBinariesNotInLists(@NotNull List listsToDelete,
+ @NotNull List binaryFiles) {
+ List result = new ArrayList<>(binaryFiles);
+ for (ShelvedChangeList list : listsToDelete) {
+ result.removeAll(list.getBinaryFiles());
+ }
+ return result;
+ }
+
+ @NotNull
+ private List getChangesNotInLists(@NotNull List listsToDelete,
+ @NotNull List shelvedChanges) {
+ List result = new ArrayList<>(shelvedChanges);
+ for (ShelvedChangeList list : listsToDelete) {
+ result.removeAll(list.getChanges(myProject));
+ }
+ return result;
+ }
+
+ @NotNull
+ private String constructShelvedListInfoMessage(int size, @Nullable ShelvedChangeList first) {
+ if (size == 0) return "";
+ String message;
+ if (size == 1 && first != null) {
+ message = " one shelved changelist named [" + first.DESCRIPTION + "]";
+ }
+ else {
+ message = "" + size + " shelved " + StringUtil.pluralize("changelist", size) + "";
+ }
+ return message + " with all changes inside";
+ }
+
+ @NotNull
+ private String constructDeleteFilesInfoMessage(int size) {
+ if (size == 0) return "";
+ return "" + (size == 1 ? "one" : size) + StringUtil.pluralize(" file", size) + "";
+ }
+
+ private void removeChangesFromChangeList(@NotNull Project project,
+ @NotNull ShelvedChangeList list,
+ @NotNull List changes,
+ @NotNull List binaryFiles) {
final ArrayList oldBinaries = new ArrayList(list.getBinaryFiles());
final ArrayList oldChanges = new ArrayList(list.getChanges(project));
@@ -597,11 +606,9 @@ public class ShelvedChangesViewManager implements ProjectComponent {
patches.add(change.loadFilePatch(myProject, commitContext));
}
catch (IOException e) {
- //noinspection ThrowableInstanceNeverThrown
exceptions.add(new VcsException(e));
}
catch (PatchSyntaxException e) {
- //noinspection ThrowableInstanceNeverThrown
exceptions.add(new VcsException(e));
}
}
@@ -610,47 +617,28 @@ public class ShelvedChangesViewManager implements ProjectComponent {
if (! exceptions.isEmpty()) {
String title = list.DESCRIPTION == null ? "" : list.DESCRIPTION;
- title = title.substring(0, Math.min(10, list.DESCRIPTION.length()));
+ title = title.substring(0, Math.min(10, title.length()));
AbstractVcsHelper.getInstance(myProject).showErrors(exceptions, "Deleting files from '" + title + "'");
}
}
public boolean canDeleteElement(@NotNull DataContext dataContext) {
+ return !getLists(dataContext).isEmpty();
+ }
+
+ @NotNull
+ private List getLists(@NotNull final DataContext dataContext) {
final ShelvedChangeList[] shelved = SHELVED_CHANGELIST_KEY.getData(dataContext);
- if (shelved == null || (shelved.length != 1)) return false;
- final List changes = SHELVED_CHANGE_KEY.getData(dataContext);
- if (changes != null && (! changes.isEmpty())) return true;
- final List binaryFiles = SHELVED_BINARY_FILE_KEY.getData(dataContext);
- return (binaryFiles != null && (! binaryFiles.isEmpty()));
- }
- }
-
- private class ShelvedChangeDeleteProvider implements DeleteProvider {
- private final List myProviders;
-
- private ShelvedChangeDeleteProvider() {
- myProviders = Arrays.asList(new MyChangesDeleteProvider(), new MyChangeListDeleteProvider());
- }
-
- @Nullable
- private DeleteProvider selectDelegate(final DataContext dataContext) {
- for (DeleteProvider provider : myProviders) {
- if (provider.canDeleteElement(dataContext)) {
- return provider;
- }
+ final ShelvedChangeList[] recycled = SHELVED_RECYCLED_CHANGELIST_KEY.getData(dataContext);
+ if (shelved == null && recycled == null) return Collections.emptyList();
+ List shelvedChangeLists = ContainerUtil.newArrayList();
+ if (shelved != null) {
+ ContainerUtil.addAll(shelvedChangeLists, shelved);
}
- return null;
- }
-
- public void deleteElement(@NotNull DataContext dataContext) {
- final DeleteProvider delegate = selectDelegate(dataContext);
- if (delegate != null) {
- delegate.deleteElement(dataContext);
+ if (recycled != null) {
+ ContainerUtil.addAll(shelvedChangeLists, recycled);
}
- }
-
- public boolean canDeleteElement(@NotNull DataContext dataContext) {
- return selectDelegate(dataContext) != null;
+ return shelvedChangeLists;
}
}
}
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java
index b065382d8880..80d9d3cefb1f 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java
@@ -131,7 +131,7 @@ public class UnshelveWithDialogAction extends DumbAwareAction {
@NotNull ShelvedChangeList changeList,
@NotNull List binaryShelvedPatches,
@Nullable Change[] preselectedChanges) {
- super(project, new UnshelvePatchDefaultExecutor(project, changeList, binaryShelvedPatches),
+ super(project, new UnshelvePatchDefaultExecutor(project, changeList),
Collections.emptyList(), ApplyPatchMode.UNSHELVE,
patchFile, null, getPredefinedChangeList(changeList.DESCRIPTION, ChangeListManager.getInstance(project)), binaryShelvedPatches,
hasNotAllSelectedChanges(project, changeList, preselectedChanges) ? newArrayList(preselectedChanges) : null,