From 14faa862a3f28173c7cc3d56f9ea609410ce76e7 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Sat, 14 Oct 2017 00:58:39 +0300 Subject: [PATCH] diff: migration from old API - support MergeRequest --- .../diff/impl/mergeTool/MergeRequestImpl.java | 7 +- .../diff/impl/mergeTool/MergeVersion.java | 4 + .../actions/migrate/MigrateDiffTool.java | 75 ++++++++++--------- .../actions/migrate/MigrateToNewDiffUtil.java | 31 ++++++++ 4 files changed, 80 insertions(+), 37 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java index 4d091dc0e3a7..0ac2066e7fe2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java @@ -136,7 +136,7 @@ public class MergeRequestImpl extends MergeRequest { } @Nullable - private MergeContent getMergeContent() { + public MergeContent getMergeContent() { if (myDiffContents[1] instanceof MergeContent) { return (MergeContent)myDiffContents[1]; } @@ -266,6 +266,11 @@ public class MergeRequestImpl extends MergeRequest { public void restoreOriginalContent() { myTarget.restoreOriginalContent(myProject); } + + @NotNull + public MergeVersion getMergeVersion() { + return myTarget; + } } private static class AllResolvedListener implements ChangeCounter.Listener, Runnable { diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java index b9cfc6bbcd6d..22af32714759 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java @@ -68,6 +68,10 @@ public interface MergeVersion { myOriginalText = originalText; } + public String getOriginalText() { + return myOriginalText; + } + @Override public Document createWorkingDocument(final Project project) { //TODO[ik]: do we really need to create copy here? diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateDiffTool.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateDiffTool.java index 948d748b2887..ea9b721e6b81 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateDiffTool.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateDiffTool.java @@ -1,32 +1,21 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.vcs.changes.actions.migrate; import com.intellij.diff.DiffDialogHints; import com.intellij.diff.DiffManager; import com.intellij.diff.DiffRequestPanel; +import com.intellij.diff.InvalidDiffRequestException; +import com.intellij.diff.merge.MergeRequest; import com.intellij.openapi.Disposable; import com.intellij.openapi.diff.DiffRequest; import com.intellij.openapi.diff.DiffTool; import com.intellij.openapi.diff.DiffViewer; -import com.intellij.openapi.diff.MergeRequest; import com.intellij.openapi.diff.impl.external.FrameDiffTool; +import com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl; import com.intellij.openapi.ui.DialogBuilder; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.WindowWrapper; +import com.intellij.openapi.ui.ex.MessagesEx; import org.jetbrains.annotations.NotNull; import java.awt.*; @@ -39,39 +28,53 @@ public class MigrateDiffTool implements DiffTool { @Override public void show(DiffRequest request) { - com.intellij.diff.requests.DiffRequest newRequest = MigrateToNewDiffUtil.convertRequest(request); - - Runnable onOkRunnable = request.getOnOkRunnable(); - if (onOkRunnable == null) { - WindowWrapper.Mode mode = FrameDiffTool.shouldOpenDialog(request.getHints()) ? WindowWrapper.Mode.MODAL : WindowWrapper.Mode.FRAME; - DiffManager.getInstance().showDiff(request.getProject(), newRequest, new DiffDialogHints(mode)); + if (isMergeRequest(request)) { + try { + MergeRequest newRequest = MigrateToNewDiffUtil.convertMergeRequest((MergeRequestImpl)request); + DiffManager.getInstance().showMerge(request.getProject(), newRequest); + } + catch (InvalidDiffRequestException e) { + MessagesEx.error(request.getProject(), e.getMessage()).showNow(); + } } else { - DialogBuilder builder = new DialogBuilder(request.getProject()); - DiffRequestPanel diffPanel = DiffManager.getInstance().createRequestPanel(request.getProject(), builder, builder.getWindow()); - diffPanel.setRequest(newRequest); + com.intellij.diff.requests.DiffRequest newRequest = MigrateToNewDiffUtil.convertRequest(request); - builder.setCenterPanel(diffPanel.getComponent()); - builder.setPreferredFocusComponent(diffPanel.getPreferredFocusedComponent()); - builder.setTitle(request.getWindowTitle()); - builder.setDimensionServiceKey(request.getGroupKey()); + Runnable onOkRunnable = request.getOnOkRunnable(); + if (onOkRunnable == null) { + WindowWrapper.Mode mode = FrameDiffTool.shouldOpenDialog(request.getHints()) ? WindowWrapper.Mode.MODAL : WindowWrapper.Mode.FRAME; + DiffManager.getInstance().showDiff(request.getProject(), newRequest, new DiffDialogHints(mode)); + } + else { + DialogBuilder builder = new DialogBuilder(request.getProject()); + DiffRequestPanel diffPanel = DiffManager.getInstance().createRequestPanel(request.getProject(), builder, builder.getWindow()); + diffPanel.setRequest(newRequest); - builder.setOkOperation(() -> { - builder.getDialogWrapper().close(DialogWrapper.OK_EXIT_CODE); - onOkRunnable.run(); - }); + builder.setCenterPanel(diffPanel.getComponent()); + builder.setPreferredFocusComponent(diffPanel.getPreferredFocusedComponent()); + builder.setTitle(request.getWindowTitle()); + builder.setDimensionServiceKey(request.getGroupKey()); - boolean useNonModal = request.getHints().contains(DiffTool.HINT_SHOW_NOT_MODAL_DIALOG); - builder.showModal(!useNonModal); + builder.setOkOperation(() -> { + builder.getDialogWrapper().close(DialogWrapper.OK_EXIT_CODE); + onOkRunnable.run(); + }); + + boolean useNonModal = request.getHints().contains(DiffTool.HINT_SHOW_NOT_MODAL_DIALOG); + builder.showModal(!useNonModal); + } } } @Override public boolean canShow(DiffRequest request) { - if (request instanceof MergeRequest) return false; return request.getContents().length == 2 || request.getContents().length == 3; } + private static boolean isMergeRequest(com.intellij.openapi.diff.DiffRequest request) { + return request instanceof MergeRequestImpl && ((MergeRequestImpl)request).getMergeContent() != null; + } + @Override public DiffViewer createComponent(String title, DiffRequest request, Window window, @NotNull Disposable parentDisposable) { return null; diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java index 2d239f3115fd..0f7329b6c3b3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java @@ -1,13 +1,22 @@ package com.intellij.openapi.vcs.changes.actions.migrate; import com.intellij.diff.DiffContentFactory; +import com.intellij.diff.DiffRequestFactory; +import com.intellij.diff.InvalidDiffRequestException; import com.intellij.diff.contents.DiffContent; +import com.intellij.diff.merge.MergeRequest; +import com.intellij.diff.merge.MergeResult; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.requests.SimpleDiffRequest; import com.intellij.openapi.diff.SimpleContent; +import com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl; +import com.intellij.openapi.diff.impl.mergeTool.MergeVersion; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Consumer; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,4 +58,26 @@ public class MigrateToNewDiffUtil { return factory.create(project, document, oldContent.getContentType()); } } + + @NotNull + public static MergeRequest convertMergeRequest(@NotNull MergeRequestImpl request) throws InvalidDiffRequestException { + MergeRequestImpl.MergeContent mergeContent = assertNotNull(request.getMergeContent()); + MergeVersion.MergeDocumentVersion mergeVersion = (MergeVersion.MergeDocumentVersion)mergeContent.getMergeVersion(); + + com.intellij.openapi.diff.SimpleContent leftContent = (SimpleContent)request.getContents()[0]; + com.intellij.openapi.diff.SimpleContent rightContent = (SimpleContent)request.getContents()[2]; + List contents = ContainerUtil.list(leftContent.getText(), mergeVersion.getOriginalText(), rightContent.getText()); + + Document document = mergeContent.getDocument(); + + String windowTitle = request.getWindowTitle(); + List titles = Arrays.asList(request.getContentTitles()); + + Consumer callback = result -> { + request.setResult(result == MergeResult.CANCEL ? DialogWrapper.CANCEL_EXIT_CODE : DialogWrapper.OK_EXIT_CODE); + }; + + return DiffRequestFactory.getInstance().createMergeRequest(request.getProject(), mergeContent.getContentType(), document, contents, + windowTitle, titles, callback); + } }