mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-190466 diff: fix file order in diff from "Local Changes"
* read changes directly from ChangesListView instead of ChangeListManager
This commit is contained in:
@@ -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;
|
||||
|
||||
+7
-14
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user