terminal: migrate Cloud to new TerminalWidget API; use new terminal UI for local terminal only (IDEA-314771)

GitOrigin-RevId: a017febc29f89fbb2002496b133dd9fd42706b6d
This commit is contained in:
Sergey Simonchik
2023-03-08 17:15:22 +00:00
committed by intellij-monorepo-bot
parent 3a16fbea3d
commit 384e0f55da
3 changed files with 16 additions and 38 deletions
@@ -175,9 +175,6 @@ public abstract class AbstractTerminalRunner<T extends Process> {
}
protected @NotNull TerminalWidget createShellTerminalWidget(@NotNull Disposable parent, @NotNull ShellStartupOptions startupOptions) {
if (Registry.is("ide.experimental.ui.new.terminal", false)) {
return new TerminalWidgetImpl(myProject, mySettingsProvider, parent);
}
return new ShellTerminalWidget(myProject, mySettingsProvider, parent).asNewWidget();
}
@@ -7,6 +7,7 @@ import com.intellij.execution.configuration.EnvironmentVariablesData;
import com.intellij.execution.process.*;
import com.intellij.execution.wsl.WslPath;
import com.intellij.ide.impl.TrustedProjects;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PathMacroManager;
@@ -15,6 +16,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
@@ -35,6 +37,7 @@ import kotlin.jvm.functions.Function0;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.terminal.exp.TerminalWidgetImpl;
import org.jetbrains.plugins.terminal.util.TerminalEnvironment;
import java.io.File;
@@ -158,6 +161,14 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess
return envs;
}
@Override
protected @NotNull TerminalWidget createShellTerminalWidget(@NotNull Disposable parent, @NotNull ShellStartupOptions startupOptions) {
if (Registry.is("ide.experimental.ui.new.terminal", false)) {
return new TerminalWidgetImpl(myProject, getSettingsProvider(), parent);
}
return super.createShellTerminalWidget(parent, startupOptions);
}
private static void setupWslEnv(@NotNull Map<String, String> userEnvs, @NotNull Map<String, String> resultEnvs) {
String wslEnv = userEnvs.keySet().stream().map(name -> name + "/u").collect(Collectors.joining(":"));
if (wslEnv.isEmpty()) return;
@@ -4,24 +4,18 @@ package org.jetbrains.plugins.terminal.cloud;
import com.intellij.openapi.project.Project;
import com.intellij.remoteServer.agent.util.log.TerminalListener.TtyResizeHandler;
import com.intellij.remoteServer.impl.runtime.log.TerminalHandlerBase;
import com.intellij.terminal.JBTerminalPanel;
import com.intellij.terminal.JBTerminalWidget;
import com.intellij.terminal.ui.TerminalWidget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.terminal.ShellStartupOptions;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Objects;
public class TerminalHandlerImpl extends TerminalHandlerBase {
private final JBTerminalWidget myTerminalWidget;
private final JBTerminalPanel myTerminalPanel;
private final KeyAdapter myCopyActionKeyListener;
private final TerminalWidget myTerminalWidget;
public TerminalHandlerImpl(@NotNull String presentableName,
@NotNull Project project,
@@ -36,11 +30,8 @@ public class TerminalHandlerImpl extends TerminalHandlerBase {
CloudTerminalRunner terminalRunner =
new CloudTerminalRunner(project, presentableName, process, handlerBoundLater, deferTerminalSessionUntilFirstShown);
TerminalWidget widget = terminalRunner.startShellTerminalWidget(project, new ShellStartupOptions.Builder().build(),
deferTerminalSessionUntilFirstShown);
myTerminalWidget = Objects.requireNonNull(JBTerminalWidget.asJediTermWidget(widget));
myTerminalPanel = myTerminalWidget.getTerminalPanel();
myCopyActionKeyListener = new MyCopyActionKeyListener();
myTerminalWidget = terminalRunner.startShellTerminalWidget(this, new ShellStartupOptions.Builder().build(),
deferTerminalSessionUntilFirstShown);
}
@Override
@@ -53,31 +44,10 @@ public class TerminalHandlerImpl extends TerminalHandlerBase {
return myTerminalWidget.getPreferredFocusableComponent();
}
@Override
public void dispose() {
super.dispose();
myTerminalPanel.removeCustomKeyListener(myCopyActionKeyListener);
}
@Override
public void close() {
myTerminalWidget.getTerminalDisplay().setCursorVisible(false);
myTerminalWidget.stop();
// workaround for unexpected removing key listener from terminal panel, even if panel not disposed
myTerminalPanel.addCustomKeyListener(myCopyActionKeyListener);
myTerminalWidget.setCursorVisible(false);
Objects.requireNonNull(myTerminalWidget.getTtyConnector()).close();
super.close();
}
private class MyCopyActionKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
var copyActionName = myTerminalWidget.getSettingsProvider().getCopyActionPresentation().getName();
myTerminalPanel.getActions().stream().filter(a -> a.getName().equals(copyActionName)).findFirst().ifPresent(a -> {
if (a.matches(e) && a.isEnabled(e)) {
a.actionPerformed(e);
}
});
}
}
}