mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
terminal: move focus back to the editor on Escape (IDEA-116221)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user