diff: migration from old API - support onOkRunnable

This commit is contained in:
Aleksey Pivovarov
2018-07-13 19:41:43 +03:00
parent 1c91e69130
commit f069a3699b
2 changed files with 27 additions and 43 deletions
@@ -17,14 +17,15 @@ 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.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.BinaryDiffTool;
import com.intellij.openapi.diff.impl.external.DiffManagerImpl;
import com.intellij.openapi.diff.impl.external.FrameDiffTool;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.WindowWrapper;
import org.jetbrains.annotations.NotNull;
@@ -39,16 +40,36 @@ public class MigrateDiffTool implements DiffTool {
@Override
public void show(DiffRequest request) {
com.intellij.diff.requests.DiffRequest newRequest = MigrateToNewDiffUtil.convertRequest(request);
WindowWrapper.Mode mode = FrameDiffTool.shouldOpenDialog(request.getHints()) ? WindowWrapper.Mode.MODAL : WindowWrapper.Mode.FRAME;
DiffManager.getInstance().showDiff(request.getProject(), newRequest, new DiffDialogHints(mode));
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.setCenterPanel(diffPanel.getComponent());
builder.setPreferredFocusComponent(diffPanel.getPreferredFocusedComponent());
builder.setTitle(request.getWindowTitle());
builder.setDimensionServiceKey(request.getGroupKey());
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;
if (request.getContents().length != 2) return false;
if (request.getOnOkRunnable() != null) return false;
if (!DiffManagerImpl.INTERNAL_DIFF.canShow(request) && !BinaryDiffTool.INSTANCE.canShow(request)) return false;
return true;
}
@@ -1,17 +1,12 @@
package com.intellij.openapi.vcs.changes.actions.migrate;
import com.intellij.diff.DiffContentFactory;
import com.intellij.diff.chains.DiffRequestProducer;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.requests.ErrorDiffRequest;
import com.intellij.diff.requests.SimpleDiffRequest;
import com.intellij.openapi.diff.SimpleContent;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -20,22 +15,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.intellij.openapi.util.text.StringUtil.notNullize;
import static com.intellij.util.ObjectUtils.assertNotNull;
public class MigrateToNewDiffUtil {
@NotNull
public static DiffRequest convertRequest(@NotNull com.intellij.openapi.diff.DiffRequest oldRequest) {
DiffRequest request = convertRequestFair(oldRequest);
if (request != null) return request;
return new ErrorDiffRequest(new MyDiffRequestProducer(oldRequest), "Can't convert from old-style request");
}
@Nullable
private static DiffRequest convertRequestFair(@NotNull com.intellij.openapi.diff.DiffRequest oldRequest) {
if (oldRequest.getOnOkRunnable() != null) return null;
com.intellij.openapi.diff.DiffContent[] contents = oldRequest.getContents();
String[] titles = oldRequest.getContentTitles();
List<DiffContent> newContents = new ArrayList<>(contents.length);
@@ -65,25 +49,4 @@ public class MigrateToNewDiffUtil {
return factory.create(project, document, oldContent.getContentType());
}
}
private static class MyDiffRequestProducer implements DiffRequestProducer {
@NotNull private final com.intellij.openapi.diff.DiffRequest myRequest;
public MyDiffRequestProducer(@NotNull com.intellij.openapi.diff.DiffRequest request) {
myRequest = request;
}
@NotNull
@Override
public String getName() {
return notNullize(myRequest.getWindowTitle());
}
@NotNull
@Override
public DiffRequest process(@NotNull UserDataHolder context, @NotNull ProgressIndicator indicator)
throws ProcessCanceledException {
return new ErrorDiffRequest(this, "Can't convert from old-style request");
}
}
}