IDEA-190466 diff: fix file order in diff from "Local Changes"

* read changes directly from ChangesListView instead of ChangeListManager
This commit is contained in:
Aleksey Pivovarov
2018-05-04 19:51:46 +03:00
parent 947a46c3e4
commit cf4792aed2
3 changed files with 25 additions and 14 deletions
@@ -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;
@@ -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<Change> changes = view.getSelectedChanges().collect(toList());
List<VirtualFile> 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<Change> 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<Change> changes,
@NotNull List<VirtualFile> 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<Change> changelistChanges = new ArrayList<>(changeList.getChanges());
ContainerUtil.sort(changelistChanges, ChangesComparator.getInstance(isFlatten));
List<Change> changelistChanges = changesView.getAllChangesFromSameChangelist(selectedChange);
if (changelistChanges != null) {
int selectedIndex = ContainerUtil.indexOf(changelistChanges, (Condition<Change>)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<VirtualFile> allUnversioned = changeListManager.getUnversionedFiles();
ContainerUtil.sort(allUnversioned, ChangesComparator.getVirtualFileComparator(isFlatten));
List<VirtualFile> allUnversioned = changesView.getUnversionedFiles().collect(toList());
showUnversionedDiff(project, ListSelection.create(allUnversioned, selectedFile));
return;
}
@@ -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<Change> 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<Change> getSelectedChanges() {
return getChanges(myProject, getSelectionPaths());