diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index e8b5b679c9cd..d574e097a9d6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -275,6 +275,11 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi } } + public void refreshImmediately() { + myRepaintAlarm.cancelAllRequests(); + refreshView(); + } + private void refreshView() { if (myDisposed || !myProject.isInitialized() || ApplicationManager.getApplication().isUnitTestMode()) return; if (!ProjectLevelVcsManager.getInstance(myProject).hasActiveVcss()) return; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffFromLocalChangesActionProvider.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffFromLocalChangesActionProvider.java index 31f0361b0102..994b96e8fe8e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffFromLocalChangesActionProvider.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ShowDiffFromLocalChangesActionProvider.java @@ -26,7 +26,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.ui.ChangeDiffRequestChain; -import com.intellij.openapi.vcs.changes.ui.ChangesComparator; import com.intellij.openapi.vcs.changes.ui.ChangesListView; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; @@ -74,7 +73,6 @@ public class ShowDiffFromLocalChangesActionProvider implements AnActionExtension List changes = view.getSelectedChanges().collect(toList()); List unversioned = view.getSelectedUnversionedFiles().collect(toList()); - boolean isFlatten = view.isShowFlatten(); final boolean needsConversion = checkIfThereAreFakeRevisions(project, changes); @@ -83,15 +81,16 @@ public class ShowDiffFromLocalChangesActionProvider implements AnActionExtension // but we can only rely on callback after refresh ChangeListManager.getInstance(project).invokeAfterUpdate( () -> { + ((ChangesViewManager)ChangesViewManager.getInstance(project)).refreshImmediately(); List actualChanges = loadFakeRevisions(project, changes); - showDiff(project, actualChanges, unversioned, isFlatten); + showDiff(project, actualChanges, unversioned, view); }, InvokeAfterUpdateMode.BACKGROUND_CANCELLABLE, ActionsBundle.actionText(IdeActions.ACTION_SHOW_DIFF_COMMON), ModalityState.current()); } else { - showDiff(project, changes, unversioned, isFlatten); + showDiff(project, changes, unversioned, view); } } @@ -126,16 +125,11 @@ public class ShowDiffFromLocalChangesActionProvider implements AnActionExtension private static void showDiff(@NotNull Project project, @NotNull List changes, @NotNull List unversioned, - boolean isFlatten) { - ChangeListManagerImpl changeListManager = ChangeListManagerImpl.getInstanceImpl(project); - + @NotNull ChangesListView changesView) { if (changes.size() == 1 && unversioned.isEmpty()) { // show all changes from this changelist Change selectedChange = changes.get(0); - ChangeList changeList = changeListManager.getChangeList(selectedChange); - if (changeList != null) { - List changelistChanges = new ArrayList<>(changeList.getChanges()); - ContainerUtil.sort(changelistChanges, ChangesComparator.getInstance(isFlatten)); - + List changelistChanges = changesView.getAllChangesFromSameChangelist(selectedChange); + if (changelistChanges != null) { int selectedIndex = ContainerUtil.indexOf(changelistChanges, (Condition)it -> { return ChangeListChange.HASHING_STRATEGY.equals(selectedChange, it); }); @@ -151,8 +145,7 @@ public class ShowDiffFromLocalChangesActionProvider implements AnActionExtension if (unversioned.size() == 1 && changes.isEmpty()) { // show all unversioned changes VirtualFile selectedFile = unversioned.get(0); - List allUnversioned = changeListManager.getUnversionedFiles(); - ContainerUtil.sort(allUnversioned, ChangesComparator.getVirtualFileComparator(isFlatten)); + List allUnversioned = changesView.getUnversionedFiles().collect(toList()); showUnversionedDiff(project, ListSelection.create(allUnversioned, selectedFile)); return; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java index bdc2967ee2f1..aa8975c447e8 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesListView.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; @@ -363,6 +364,18 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, DnDAw return getRoot().getObjectsUnderStream(Change.class); } + @Nullable + public List getAllChangesFromSameChangelist(@NotNull Change change) { + DefaultMutableTreeNode node = TreeUtil.findNodeWithObject(getRoot(), change); + while (node != null) { + if (node instanceof ChangesBrowserChangeListNode) { + return ((ChangesBrowserChangeListNode)node).getAllChangesUnder(); + } + node = (DefaultMutableTreeNode)node.getParent(); + } + return null; + } + @NotNull public Stream getSelectedChanges() { return getChanges(myProject, getSelectionPaths());