From 417acc3842f60951123448cdb6ba4eababceb3f7 Mon Sep 17 00:00:00 2001 From: Elizaveta Shashkova Date: Fri, 16 Mar 2018 18:43:40 +0300 Subject: [PATCH] Fix focus requesting when starting Python Console and debug (PY-26156) --- .../actions/PyExecuteSelectionAction.java | 37 +++++++++++-------- .../python/console/PydevConsoleRunner.java | 4 +- .../console/PydevConsoleRunnerFactory.java | 2 +- .../console/PydevConsoleRunnerImpl.java | 16 +++++--- .../console/PythonConsoleToolWindow.java | 6 ++- .../console/PythonConsoleToolWindowFactory.kt | 3 +- .../python/console/PythonConsoleView.java | 3 +- .../PythonDebugLanguageConsoleView.java | 4 +- .../run/PythonScriptCommandLineState.java | 2 +- .../env/python/console/PyConsoleTask.java | 2 +- 10 files changed, 48 insertions(+), 31 deletions(-) diff --git a/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java b/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java index f86b04c0de23..ec31d3a52415 100644 --- a/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java +++ b/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java @@ -106,9 +106,9 @@ public class PyExecuteSelectionAction extends AnAction { public static void showConsoleAndExecuteCode(@NotNull final AnActionEvent e, @Nullable final String selectionText) { final Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); Project project = e.getProject(); - Module module = e.getData(LangDataKeys.MODULE); + final boolean requestFocusToConsole = selectionText == null; - findCodeExecutor(e, codeExecutor -> executeInConsole(codeExecutor, selectionText, editor), editor, project, module); + findCodeExecutor(e, codeExecutor -> executeInConsole(codeExecutor, selectionText, editor), editor, project, requestFocusToConsole); } private static String getLineUnderCaret(Editor editor) { @@ -143,7 +143,7 @@ public class PyExecuteSelectionAction extends AnAction { Presentation presentation = e.getPresentation(); boolean enabled = false; - if (editor != null && isPython(editor)) { + if (isPython(editor)) { String text = getSelectionText(editor); if (text != null) { presentation.setText(EXECUTE_SELECTION_IN_CONSOLE); @@ -178,7 +178,9 @@ public class PyExecuteSelectionAction extends AnAction { } private static void selectConsole(@NotNull DataContext dataContext, @NotNull Project project, - @NotNull final Consumer consumer, @Nullable Editor editor) { + @NotNull final Consumer consumer, + @Nullable Editor editor, + boolean requestFocusToConsole) { Collection consoles = getConsoles(project); ExecutionHelper @@ -193,8 +195,14 @@ public class PyExecuteSelectionAction extends AnAction { ContentManager contentManager = currentSession.getUI().getContentManager(); Content content = contentManager.findContent("Console"); contentManager.setSelectedContent(content); - if (editor != null) { - IdeFocusManager.findInstance().requestFocus(editor.getContentComponent(), true); + // It's necessary to request focus again after tab selection + if (requestFocusToConsole) { + ((PythonDebugLanguageConsoleView)console).getPydevConsoleView().requestFocus(); + } + else { + if (editor != null) { + IdeFocusManager.findInstance().requestFocus(editor.getContentComponent(), true); + } } } } @@ -239,23 +247,22 @@ public class PyExecuteSelectionAction extends AnAction { } public static void findCodeExecutor(@NotNull AnActionEvent e, - @NotNull Consumer consumer, - @Nullable Editor editor, - @Nullable Project project, - @Nullable Module module) { + @NotNull Consumer consumer, + @Nullable Editor editor, + @Nullable Project project, + boolean requestFocusToConsole) { if (project != null) { if (canFindConsole(e)) { - selectConsole(e.getDataContext(), project, consumer, editor); + selectConsole(e.getDataContext(), project, consumer, editor, requestFocusToConsole); } else { - startConsole(project, consumer, module); + startConsole(project, consumer); } } } private static void startConsole(final Project project, - final Consumer consumer, - Module context) { + final Consumer consumer) { final PythonConsoleToolWindow toolWindow = PythonConsoleToolWindow.getInstance(project); if (toolWindow != null && toolWindow.getConsoleContentDescriptors().size() > 0) { @@ -282,7 +289,7 @@ public class PyExecuteSelectionAction extends AnAction { } } }); - runner.run(); + runner.run(false); } } diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java index f7ac76f58ccc..0fa5eb09dd29 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java @@ -225,9 +225,9 @@ public interface PydevConsoleRunner { void open(); - void runSync(); + void runSync(boolean requestEditorFocus); - void run(); + void run(boolean requestEditorFocus); PydevConsoleCommunication getPydevConsoleCommunication(); diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunnerFactory.java b/python/src/com/jetbrains/python/console/PydevConsoleRunnerFactory.java index 3c6925667f75..9cb073f19452 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunnerFactory.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunnerFactory.java @@ -67,7 +67,7 @@ public class PydevConsoleRunnerFactory extends PythonConsoleRunnerFactory { if (runner instanceof PydevConsoleRunnerImpl) { ((PydevConsoleRunnerImpl)runner).setConsoleTitle(title); } - runner.run(); + runner.run(true); }; return createConsoleRunner(project, sdk, workingDir, envs, PyConsoleType.PYTHON, settingsProvider, rerunAction, setupFragment); diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java b/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java index 87ccdc4732dc..e90f3210ea28 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java @@ -233,17 +233,17 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner { @Override public void open() { PythonConsoleToolWindow toolWindow = PythonConsoleToolWindow.getInstance(myProject); - if (toolWindow != null) { + if (toolWindow != null && toolWindow.isInitialized()) { toolWindow.getToolWindow().activate(() -> { }, true); } else { - runSync(); + runSync(true); } } @Override - public void runSync() { + public void runSync(boolean requestEditorFocus) { myPorts = findAvailablePorts(myProject, myConsoleType); assert myPorts != null; @@ -259,6 +259,9 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner { public void run(@NotNull final ProgressIndicator indicator) { indicator.setText("Connecting to console..."); connect(myStatementsToExecute); + if (requestEditorFocus) { + myConsoleView.requestFocus(); + } } }); } @@ -270,7 +273,7 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner { @Override - public void run() { + public void run(boolean requestEditorFocus) { TransactionGuard.submitTransaction(myProject, () -> FileDocumentManager.getInstance().saveAllDocuments()); myPorts = findAvailablePorts(myProject, myConsoleType); @@ -288,6 +291,9 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner { try { initAndRun(generalCommandLine); connect(myStatementsToExecute); + if (requestEditorFocus) { + myConsoleView.requestFocus(); + } } catch (final Exception e) { LOG.warn("Error running console", e); @@ -941,7 +947,7 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner { public void actionPerformed(AnActionEvent e) { PydevConsoleRunner runner = PythonConsoleRunnerFactory.getInstance().createConsoleRunner(e.getData(CommonDataKeys.PROJECT), e.getData(LangDataKeys.MODULE)); - runner.run(); + runner.run(true); } } diff --git a/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java b/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java index d3c5987f91b6..1eec8f0f70f5 100644 --- a/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java +++ b/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java @@ -75,6 +75,10 @@ public class PythonConsoleToolWindow { } } + public boolean isInitialized() { + return myInitialized; + } + private void doInit(@NotNull final ToolWindow toolWindow) { myInitialized = true; @@ -92,7 +96,7 @@ public class PythonConsoleToolWindow { boolean visible = window.isVisible(); if (visible && toolWindow.getContentManager().getContentCount() == 0) { PydevConsoleRunner runner = PythonConsoleRunnerFactory.getInstance().createConsoleRunner(myProject, null); - runner.run(); + runner.run(true); } } } diff --git a/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.kt b/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.kt index 5179228976ea..19baf9aadeb1 100644 --- a/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.kt +++ b/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.kt @@ -15,7 +15,6 @@ */ package com.jetbrains.python.console -import com.intellij.execution.console.LanguageConsoleView import com.intellij.openapi.application.TransactionGuard import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project @@ -29,7 +28,7 @@ class PythonConsoleToolWindowFactory : ToolWindowFactory, DumbAware { override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { val runner = PythonConsoleRunnerFactory.getInstance().createConsoleRunner(project, null) - TransactionGuard.submitTransaction(project, Runnable { runner.runSync() }); + TransactionGuard.submitTransaction(project, Runnable { runner.runSync(true) }); } companion object { diff --git a/python/src/com/jetbrains/python/console/PythonConsoleView.java b/python/src/com/jetbrains/python/console/PythonConsoleView.java index 89e308911500..b43e7386f68f 100644 --- a/python/src/com/jetbrains/python/console/PythonConsoleView.java +++ b/python/src/com/jetbrains/python/console/PythonConsoleView.java @@ -206,7 +206,8 @@ public class PythonConsoleView extends LanguageConsoleImpl implements Observable @Override public void requestFocus() { - IdeFocusManager.findInstance().requestFocus(getConsoleEditor().getContentComponent(), true); + myInitialized.doWhenDone(() -> + IdeFocusManager.getGlobalInstance().requestFocus(getConsoleEditor().getContentComponent(), true)); } @Override diff --git a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java index 8eff46188572..1a8a06411a05 100644 --- a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java +++ b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java @@ -102,9 +102,9 @@ public class PythonDebugLanguageConsoleView extends DuplexConsoleView console.requestFocus()); } - - IdeFocusManager.findInstance().requestFocus(console.getConsoleEditor().getContentComponent(), true); } } diff --git a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java index 8025e4285db1..20cddc54d197 100644 --- a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java @@ -128,7 +128,7 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { settingsProvider, setupFragment); runner.setEnableAfterConnection(false); - runner.runSync(); + runner.runSync(true); // runner.getProcessHandler() would be null if execution error occurred if (runner.getProcessHandler() == null) { return null; diff --git a/python/testSrc/com/jetbrains/env/python/console/PyConsoleTask.java b/python/testSrc/com/jetbrains/env/python/console/PyConsoleTask.java index 1ce735f5c266..c72d2257a15d 100644 --- a/python/testSrc/com/jetbrains/env/python/console/PyConsoleTask.java +++ b/python/testSrc/com/jetbrains/env/python/console/PyConsoleTask.java @@ -188,7 +188,7 @@ public class PyConsoleTask extends PyExecutionFixtureTestTask { } }); - consoleRunner.run(); + consoleRunner.run(true); waitFor(myConsoleInitSemaphore);