terminal: move focus back to the editor on Escape (IDEA-116221)

This commit is contained in:
Sergey Simonchik
2019-03-25 19:36:26 +03:00
parent 8eccc6d429
commit ebd3186b30
3 changed files with 53 additions and 18 deletions
@@ -76,6 +76,7 @@ public class JBTerminalPanel extends TerminalPanel implements FocusListener, Ter
};
private final JBTerminalSystemSettingsProviderBase mySettingsProvider;
private final TerminalEscapeKeyListener myEscapeKeyListener;
private List<AnAction> myActionsToSkip;
@@ -91,6 +92,7 @@ public class JBTerminalPanel extends TerminalPanel implements FocusListener, Ter
addFocusListener(this);
mySettingsProvider.addListener(this);
myEscapeKeyListener = new TerminalEscapeKeyListener(this);
}
private static void registerKeymapActions(final TerminalPanel terminalPanel) {
@@ -157,6 +159,11 @@ public class JBTerminalPanel extends TerminalPanel implements FocusListener, Ter
return false;
}
@Override
public void handleKeyEvent(@NotNull KeyEvent e) {
myEscapeKeyListener.handleKeyEvent(e);
super.handleKeyEvent(e);
}
@Override
protected void setupAntialiasing(Graphics graphics) {
@@ -23,7 +23,6 @@ import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.SearchTextField;
import com.intellij.ui.components.JBScrollBar;
import com.intellij.ui.components.JBScrollPane;
@@ -55,7 +54,6 @@ import java.awt.event.KeyListener;
import java.util.List;
public class JBTerminalWidget extends JediTermWidget implements Disposable {
private Project myProject;
private final JBTerminalSystemSettingsProviderBase mySettingsProvider;
private JBTerminalWidgetListener myListener;
@@ -75,7 +73,6 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
JBTerminalSystemSettingsProviderBase settingsProvider,
Disposable parent) {
super(columns, lines, settingsProvider);
myProject = project;
mySettingsProvider = settingsProvider;
setName("terminal");
@@ -161,20 +158,6 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
myListener.showTabs();
return true;
}).withMnemonicKey(KeyEvent.VK_T).withEnabledSupplier(() -> myListener != null));
if (!mySettingsProvider.overrideIdeShortcuts()) {
actions
.add(new TerminalAction("EditorEscape", new KeyStroke[]{KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)}, input -> {
if (!myTerminalPanel.getTerminalTextBuffer().isUsingAlternateBuffer()) {
if (myProject != null) {
ToolWindowManager.getInstance(myProject).activateEditorComponent();
}
return true;
}
else {
return false;
}
}).withHidden(true));
}
actions.add(new TerminalAction("Close Session", mySettingsProvider.getCloseSessionKeyStrokes(), input -> {
myListener.onSessionClosed();
return true;
@@ -184,7 +167,6 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
@Override
public void dispose() {
myProject = null;
close();
}
@@ -0,0 +1,46 @@
// Copyright 2000-2019 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.terminal;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindowManager;
import com.jediterm.terminal.ui.TerminalPanel;
import org.jetbrains.annotations.NotNull;
import java.awt.event.KeyEvent;
/**
* Moves focus to editor on Escape key pressed, similarly to {@link com.intellij.openapi.wm.impl.InternalDecorator#init}.
* Respects ESC+F/ESC+B and other combinations with ESC.
*/
public class TerminalEscapeKeyListener {
private final TerminalPanel myTerminalPanel;
private boolean myEscapePressed = false;
public TerminalEscapeKeyListener(@NotNull TerminalPanel terminalPanel) {
myTerminalPanel = terminalPanel;
}
public void handleKeyEvent(@NotNull KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
myEscapePressed = e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getModifiers() == 0;
}
else if (e.getID() == KeyEvent.KEY_RELEASED) {
if (myEscapePressed && e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getModifiers() == 0) {
performIdeEscapeAction();
}
myEscapePressed = false;
}
}
private void performIdeEscapeAction() {
if (!myTerminalPanel.getTerminalTextBuffer().isUsingAlternateBuffer()) {
Project project = DataManager.getInstance().getDataContext(myTerminalPanel).getData(CommonDataKeys.PROJECT);
if (project != null && !project.isDisposed()) {
// Repeat logic of InternalDecorator#init from 8cf12b35fe3e44a32622f52a151ed2bf8880faba
ToolWindowManager.getInstance(project).activateEditorComponent();
}
}
}
}