diff: migration from old API - support MergeRequest

This commit is contained in:
Aleksey Pivovarov
2018-07-13 19:42:16 +03:00
parent 1f685f0a85
commit 14faa862a3
4 changed files with 80 additions and 37 deletions
@@ -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 {
@@ -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?
@@ -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;
@@ -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<String> contents = ContainerUtil.list(leftContent.getText(), mergeVersion.getOriginalText(), rightContent.getText());
Document document = mergeContent.getDocument();
String windowTitle = request.getWindowTitle();
List<String> titles = Arrays.asList(request.getContentTitles());
Consumer<MergeResult> 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);
}
}