diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUserDataKeysEx.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUserDataKeysEx.java index b6e8b2614435..1c1c58c3f2e3 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUserDataKeysEx.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUserDataKeysEx.java @@ -99,4 +99,5 @@ public interface DiffUserDataKeysEx extends DiffUserDataKeys { Key VCS_DIFF_LEFT_CONTENT_TITLE = Key.create("Diff.Left.Panel.Title"); Key VCS_DIFF_RIGHT_CONTENT_TITLE = Key.create("Diff.Right.Panel.Title"); + Key VCS_DIFF_CENTER_CONTENT_TITLE = Key.create("Diff.Center.Panel.Title"); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MergedChangeDiffRequestProvider.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MergedChangeDiffRequestProvider.java index c8b1c1b9ae08..0576a63b5c6a 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MergedChangeDiffRequestProvider.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MergedChangeDiffRequestProvider.java @@ -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 context, + @NotNull Key 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 myContext; - public MyProducer(@Nullable Project project, @NotNull MergedChange mergedChange) { + public MyProducer(@Nullable Project project, + @NotNull MergedChange mergedChange, + @NotNull Map 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() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/VcsLogChangesBrowser.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/VcsLogChangesBrowser.java index 89429c9b95e8..0ba8f6883e8e 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/VcsLogChangesBrowser.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/VcsLogChangesBrowser.java @@ -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 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 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 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 context) { ContentRevision afterRevision = change.getAfterRevision(); ContentRevision beforeRevision = change.getBeforeRevision();