mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[vcs-log] show file names in diff preview for merged changes
This commit is contained in:
@@ -99,4 +99,5 @@ public interface DiffUserDataKeysEx extends DiffUserDataKeys {
|
||||
|
||||
Key<String> VCS_DIFF_LEFT_CONTENT_TITLE = Key.create("Diff.Left.Panel.Title");
|
||||
Key<String> VCS_DIFF_RIGHT_CONTENT_TITLE = Key.create("Diff.Right.Panel.Title");
|
||||
Key<String> VCS_DIFF_CENTER_CONTENT_TITLE = Key.create("Diff.Center.Panel.Title");
|
||||
}
|
||||
|
||||
+61
-41
@@ -19,9 +19,11 @@ import com.intellij.diff.chains.DiffRequestProducerException;
|
||||
import com.intellij.diff.requests.DiffRequest;
|
||||
import com.intellij.diff.requests.SimpleDiffRequest;
|
||||
import com.intellij.diff.util.DiffUserDataKeys;
|
||||
import com.intellij.diff.util.DiffUserDataKeysEx;
|
||||
import com.intellij.openapi.progress.ProcessCanceledException;
|
||||
import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.UserDataHolder;
|
||||
import com.intellij.openapi.vcs.FilePath;
|
||||
import com.intellij.openapi.vcs.FileStatus;
|
||||
@@ -35,10 +37,11 @@ import com.intellij.util.ThreeState;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProducer.getRequestTitle;
|
||||
import static com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProducer.getRevisionTitle;
|
||||
|
||||
public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvider {
|
||||
@NotNull
|
||||
@@ -60,43 +63,6 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
|
||||
return new MyProducer(presentable.getProject(), (MergedChange)presentable.getChange()).process(context, indicator);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static SimpleDiffRequest createRequest(@Nullable Project project,
|
||||
@NotNull Change leftChange,
|
||||
@NotNull Change rightChange,
|
||||
@NotNull UserDataHolder context,
|
||||
@NotNull ProgressIndicator indicator)
|
||||
throws DiffRequestProducerException {
|
||||
String requestTitle = getRequestTitle(leftChange);
|
||||
|
||||
ContentRevision leftRevision = leftChange.getBeforeRevision();
|
||||
ContentRevision centerRevision = leftChange.getAfterRevision();
|
||||
ContentRevision rightRevision = rightChange.getBeforeRevision();
|
||||
|
||||
if (leftRevision == null) {
|
||||
return createTwoSideRequest(project, centerRevision, rightRevision, requestTitle,
|
||||
ChangeDiffRequestProducer.MERGED_VERSION, ChangeDiffRequestProducer.SERVER_VERSION,
|
||||
context, indicator);
|
||||
}
|
||||
else if (rightRevision == null) {
|
||||
return createTwoSideRequest(project, leftRevision, centerRevision, requestTitle,
|
||||
ChangeDiffRequestProducer.YOUR_VERSION, ChangeDiffRequestProducer.MERGED_VERSION,
|
||||
context, indicator);
|
||||
}
|
||||
else if (centerRevision == null) {
|
||||
return createTwoSideRequest(project, leftRevision, rightRevision, requestTitle,
|
||||
ChangeDiffRequestProducer.YOUR_VERSION, ChangeDiffRequestProducer.SERVER_VERSION,
|
||||
context, indicator);
|
||||
}
|
||||
return new SimpleDiffRequest(requestTitle,
|
||||
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
|
||||
ChangeDiffRequestProducer.createContent(project, centerRevision, context, indicator),
|
||||
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
|
||||
getRevisionTitle(leftRevision, ChangeDiffRequestProducer.YOUR_VERSION),
|
||||
getRevisionTitle(centerRevision, ChangeDiffRequestProducer.MERGED_VERSION),
|
||||
getRevisionTitle(rightRevision, ChangeDiffRequestProducer.SERVER_VERSION));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static SimpleDiffRequest createTwoSideRequest(@Nullable Project project,
|
||||
@Nullable ContentRevision leftRevision,
|
||||
@@ -110,20 +76,38 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
|
||||
return new SimpleDiffRequest(requestTitle,
|
||||
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
|
||||
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
|
||||
getRevisionTitle(leftRevision, leftTitle),
|
||||
getRevisionTitle(rightRevision, rightTitle));
|
||||
leftTitle, rightTitle);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getRevisionTitle(@NotNull Map<Key, Object> context,
|
||||
@NotNull Key<String> key,
|
||||
@Nullable ContentRevision revision,
|
||||
@NotNull String defaultTitle) {
|
||||
String titleFromContext = (String)context.get(key);
|
||||
if (titleFromContext != null) return titleFromContext;
|
||||
return ChangeDiffRequestProducer.getRevisionTitle(revision, defaultTitle);
|
||||
}
|
||||
|
||||
public static class MyProducer implements ChangeDiffRequestChain.Producer {
|
||||
@Nullable private final Project myProject;
|
||||
@NotNull private final MergedChange myMergedChange;
|
||||
@NotNull private final Map<Key, Object> myContext;
|
||||
|
||||
public MyProducer(@Nullable Project project, @NotNull MergedChange mergedChange) {
|
||||
public MyProducer(@Nullable Project project,
|
||||
@NotNull MergedChange mergedChange,
|
||||
@NotNull Map<Key, Object> context) {
|
||||
myProject = project;
|
||||
myContext = context;
|
||||
assert mergedChange.getSourceChanges().size() == 2;
|
||||
myMergedChange = mergedChange;
|
||||
}
|
||||
|
||||
public MyProducer(@Nullable Project project,
|
||||
@NotNull MergedChange mergedChange) {
|
||||
this(project, mergedChange, Collections.emptyMap());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public DiffRequest process(@NotNull UserDataHolder context, @NotNull ProgressIndicator indicator)
|
||||
@@ -134,6 +118,42 @@ public class MergedChangeDiffRequestProvider implements ChangeDiffRequestProvide
|
||||
return request;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private SimpleDiffRequest createRequest(@Nullable Project project,
|
||||
@NotNull Change leftChange,
|
||||
@NotNull Change rightChange,
|
||||
@NotNull UserDataHolder context,
|
||||
@NotNull ProgressIndicator indicator)
|
||||
throws DiffRequestProducerException {
|
||||
String requestTitle = getRequestTitle(leftChange);
|
||||
|
||||
ContentRevision leftRevision = leftChange.getBeforeRevision();
|
||||
ContentRevision centerRevision = leftChange.getAfterRevision();
|
||||
ContentRevision rightRevision = rightChange.getBeforeRevision();
|
||||
|
||||
String leftTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_LEFT_CONTENT_TITLE, leftRevision,
|
||||
ChangeDiffRequestProducer.YOUR_VERSION);
|
||||
String centerTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_CENTER_CONTENT_TITLE, centerRevision,
|
||||
ChangeDiffRequestProducer.MERGED_VERSION);
|
||||
String rightTitle = getRevisionTitle(myContext, DiffUserDataKeysEx.VCS_DIFF_RIGHT_CONTENT_TITLE, rightRevision,
|
||||
ChangeDiffRequestProducer.SERVER_VERSION);
|
||||
|
||||
if (leftRevision == null) {
|
||||
return createTwoSideRequest(project, centerRevision, rightRevision, requestTitle, centerTitle, rightTitle, context, indicator);
|
||||
}
|
||||
else if (rightRevision == null) {
|
||||
return createTwoSideRequest(project, leftRevision, centerRevision, requestTitle, leftTitle, centerTitle, context, indicator);
|
||||
}
|
||||
else if (centerRevision == null) {
|
||||
return createTwoSideRequest(project, leftRevision, rightRevision, requestTitle, leftTitle, rightTitle, context, indicator);
|
||||
}
|
||||
return new SimpleDiffRequest(requestTitle,
|
||||
ChangeDiffRequestProducer.createContent(project, leftRevision, context, indicator),
|
||||
ChangeDiffRequestProducer.createContent(project, centerRevision, context, indicator),
|
||||
ChangeDiffRequestProducer.createContent(project, rightRevision, context, indicator),
|
||||
leftTitle, centerTitle, rightTitle);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
|
||||
@@ -47,8 +47,7 @@ import javax.swing.*;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import java.util.*;
|
||||
|
||||
import static com.intellij.diff.util.DiffUserDataKeysEx.VCS_DIFF_LEFT_CONTENT_TITLE;
|
||||
import static com.intellij.diff.util.DiffUserDataKeysEx.VCS_DIFF_RIGHT_CONTENT_TITLE;
|
||||
import static com.intellij.diff.util.DiffUserDataKeysEx.*;
|
||||
import static com.intellij.util.ObjectUtils.notNull;
|
||||
import static com.intellij.util.containers.ContainerUtil.getFirstItem;
|
||||
import static com.intellij.vcs.log.impl.MainVcsLogUiProperties.SHOW_CHANGES_FROM_PARENTS;
|
||||
@@ -261,16 +260,19 @@ class VcsLogChangesBrowser extends ChangesBrowserBase implements Disposable {
|
||||
|
||||
@Nullable
|
||||
public ChangeDiffRequestChain.Producer getDiffRequestProducer(@NotNull Object userObject, boolean forDiffPreview) {
|
||||
Map<Key, Object> context = ContainerUtil.newHashMap();
|
||||
if (userObject instanceof MergedChange) {
|
||||
MergedChange mergedChange = (MergedChange)userObject;
|
||||
if (mergedChange.getSourceChanges().size() == 2) {
|
||||
return new MergedChangeDiffRequestProvider.MyProducer(myProject, mergedChange);
|
||||
if (forDiffPreview) {
|
||||
putFilePathsIntoContext(mergedChange, context);
|
||||
}
|
||||
return new MergedChangeDiffRequestProvider.MyProducer(myProject, mergedChange, context);
|
||||
}
|
||||
}
|
||||
if (userObject instanceof Change) {
|
||||
Change change = (Change)userObject;
|
||||
|
||||
Map<Key, Object> context = ContainerUtil.newHashMap();
|
||||
if (forDiffPreview) {
|
||||
putFilePathsIntoContext(change, context);
|
||||
}
|
||||
@@ -293,6 +295,18 @@ class VcsLogChangesBrowser extends ChangesBrowserBase implements Disposable {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void putFilePathsIntoContext(@NotNull MergedChange change, @NotNull Map<Key, Object> context) {
|
||||
ContentRevision centerRevision = change.getAfterRevision();
|
||||
ContentRevision leftRevision = change.getSourceChanges().get(0).getBeforeRevision();
|
||||
ContentRevision rightRevision = change.getSourceChanges().get(1).getBeforeRevision();
|
||||
FilePath centerFile = centerRevision == null ? null : centerRevision.getFile();
|
||||
FilePath leftFile = leftRevision == null ? null : leftRevision.getFile();
|
||||
FilePath rightFile = rightRevision == null ? null : rightRevision.getFile();
|
||||
context.put(VCS_DIFF_CENTER_CONTENT_TITLE, getRevisionTitle(centerRevision, centerFile, null));
|
||||
context.put(VCS_DIFF_RIGHT_CONTENT_TITLE, getRevisionTitle(rightRevision, rightFile, centerFile));
|
||||
context.put(VCS_DIFF_LEFT_CONTENT_TITLE, getRevisionTitle(leftRevision, leftFile, centerFile == null ? rightFile : centerFile));
|
||||
}
|
||||
|
||||
private static void putFilePathsIntoContext(@NotNull Change change, @NotNull Map<Key, Object> context) {
|
||||
ContentRevision afterRevision = change.getAfterRevision();
|
||||
ContentRevision beforeRevision = change.getBeforeRevision();
|
||||
|
||||
Reference in New Issue
Block a user