From 1e83b27d151b1bd24316afb6edecdc37fffe865d Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 11 Aug 2014 11:28:20 +0200 Subject: [PATCH] Fix Execute selection in console for toolwindow. --- python/src/META-INF/pycharm-core.xml | 4 +- python/src/META-INF/python-core.xml | 2 +- ...ion.java => PyExecuteSelectionAction.java} | 54 ++++++++++++++----- .../console}/PythonConsoleToolWindow.java | 9 ++-- .../PythonConsoleToolWindowFactory.java | 3 +- .../PythonToolWindowConsoleRunner.java | 4 +- 6 files changed, 52 insertions(+), 24 deletions(-) rename python/src/com/jetbrains/python/actions/{ExecuteInConsoleAction.java => PyExecuteSelectionAction.java} (79%) rename python/{ide/src/com/jetbrains/python => src/com/jetbrains/python/console}/PythonConsoleToolWindow.java (95%) rename python/{ide/src/com/jetbrains/python => src/com/jetbrains/python/console}/PythonConsoleToolWindowFactory.java (93%) rename python/{ide/src/com/jetbrains/python => src/com/jetbrains/python/console}/PythonToolWindowConsoleRunner.java (96%) diff --git a/python/src/META-INF/pycharm-core.xml b/python/src/META-INF/pycharm-core.xml index f91b34a31078..4732ad084b32 100644 --- a/python/src/META-INF/pycharm-core.xml +++ b/python/src/META-INF/pycharm-core.xml @@ -26,7 +26,7 @@ - com.jetbrains.python.PythonConsoleToolWindow + com.jetbrains.python.console.PythonConsoleToolWindow @@ -84,7 +84,7 @@ + factoryClass="com.jetbrains.python.console.PythonConsoleToolWindowFactory" secondary="false"/> diff --git a/python/src/META-INF/python-core.xml b/python/src/META-INF/python-core.xml index 1ca4d81c3b88..292237aac6ac 100644 --- a/python/src/META-INF/python-core.xml +++ b/python/src/META-INF/python-core.xml @@ -654,7 +654,7 @@ diff --git a/python/src/com/jetbrains/python/actions/ExecuteInConsoleAction.java b/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java similarity index 79% rename from python/src/com/jetbrains/python/actions/ExecuteInConsoleAction.java rename to python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java index be45f85163c3..cb5fbceb27d3 100644 --- a/python/src/com/jetbrains/python/actions/ExecuteInConsoleAction.java +++ b/python/src/com/jetbrains/python/actions/PyExecuteSelectionAction.java @@ -15,7 +15,12 @@ */ package com.jetbrains.python.actions; +import com.google.common.base.Function; +import com.google.common.base.Predicates; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.Lists; import com.intellij.execution.ExecutionHelper; +import com.intellij.execution.console.LanguageConsoleView; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.actionSystem.*; @@ -25,22 +30,28 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; +import com.intellij.ui.content.Content; import com.intellij.util.Consumer; import com.intellij.util.NotNullFunction; import com.jetbrains.python.console.PyCodeExecutor; +import com.jetbrains.python.console.PydevConsoleRunner; +import com.jetbrains.python.console.PythonConsoleToolWindow; +import com.jetbrains.python.console.PythonConsoleToolWindowFactory; import com.jetbrains.python.psi.PyFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -public class ExecuteInConsoleAction extends AnAction { +public class PyExecuteSelectionAction extends AnAction { public static final String EXECUTE_SELECTION_IN_CONSOLE = "Execute Selection in Console"; - public ExecuteInConsoleAction() { + public PyExecuteSelectionAction() { super(EXECUTE_SELECTION_IN_CONSOLE); } @@ -183,6 +194,21 @@ public class ExecuteInConsoleAction extends AnAction { } private static Collection getConsoles(Project project) { + PythonConsoleToolWindow toolWindow = PythonConsoleToolWindow.getInstance(project); + + if (toolWindow != null) { + ToolWindow tw = toolWindow.getToolWindow(); + return FluentIterable.from(Lists.newArrayList(tw.getContentManager().getContents())) + .transform(new Function() { + @Override + public RunContentDescriptor apply(@Nullable Content input) { + return input != null ? input.getUserData(PythonConsoleToolWindow.CONTENT_DESCRIPTOR) : null; + } + }).filter( + Predicates.notNull()).toList(); + } + + return ExecutionHelper.findRunningConsole(project, new NotNullFunction() { @NotNull @Override @@ -211,16 +237,20 @@ public class ExecuteInConsoleAction extends AnAction { private static void startConsole(final Project project, final Consumer consumer, Module context) { - //TODO - //PydevConsoleRunner runner = PydevConsoleRunner.runPythonConsole(project, context); - //runner.addConsoleListener(new PydevConsoleRunner.ConsoleListener() { - // @Override - // public void handleConsoleInitialized(LanguageConsoleView consoleView) { - // if (consoleView instanceof PyCodeExecutor) { - // consumer.consume((PyCodeExecutor)consoleView); - // } - // } - //}); + ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(PythonConsoleToolWindowFactory.ID); + + + PydevConsoleRunner runner = PydevConsoleRunner.runPythonConsole(project, context, toolWindow != null ? PythonConsoleToolWindow + .toolWindowConsole(toolWindow) + : PydevConsoleRunner.factory()); + runner.addConsoleListener(new PydevConsoleRunner.ConsoleListener() { + @Override + public void handleConsoleInitialized(LanguageConsoleView consoleView) { + if (consoleView instanceof PyCodeExecutor) { + consumer.consume((PyCodeExecutor)consoleView); + } + } + }); } private static boolean canFindConsole(AnActionEvent e) { diff --git a/python/ide/src/com/jetbrains/python/PythonConsoleToolWindow.java b/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java similarity index 95% rename from python/ide/src/com/jetbrains/python/PythonConsoleToolWindow.java rename to python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java index cca9913ffc11..53d3b14c114c 100644 --- a/python/ide/src/com/jetbrains/python/PythonConsoleToolWindow.java +++ b/python/src/com/jetbrains/python/console/PythonConsoleToolWindow.java @@ -1,9 +1,10 @@ -package com.jetbrains.python; +package com.jetbrains.python.console; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.SimpleToolWindowPanel; +import com.intellij.openapi.util.Key; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; @@ -11,8 +12,6 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerListener; import com.intellij.openapi.wm.impl.content.ToolWindowContentUi; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; -import com.jetbrains.python.console.PyConsoleType; -import com.jetbrains.python.console.PydevConsoleRunner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,6 +24,7 @@ import java.util.Map; * @author traff */ public class PythonConsoleToolWindow { + public static final Key CONTENT_DESCRIPTOR = Key.create("CONTENT_DESCRIPTOR"); private final Project myProject; @@ -119,10 +119,11 @@ public class PythonConsoleToolWindow { private static void resetContent(RunContentDescriptor contentDescriptor, SimpleToolWindowPanel panel, Content content) { panel.setContent(contentDescriptor.getComponent()); - //panel.addFocusListener(createFocusListener(toolWindow)); content.setComponent(panel); content.setPreferredFocusableComponent(contentDescriptor.getComponent()); + + content.putUserData(CONTENT_DESCRIPTOR, contentDescriptor); } private static FocusListener createFocusListener(final ToolWindow toolWindow) { diff --git a/python/ide/src/com/jetbrains/python/PythonConsoleToolWindowFactory.java b/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.java similarity index 93% rename from python/ide/src/com/jetbrains/python/PythonConsoleToolWindowFactory.java rename to python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.java index ddf0c1e6cb13..0840976151c3 100644 --- a/python/ide/src/com/jetbrains/python/PythonConsoleToolWindowFactory.java +++ b/python/src/com/jetbrains/python/console/PythonConsoleToolWindowFactory.java @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python; +package com.jetbrains.python.console; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; -import com.jetbrains.python.console.PydevConsoleRunner; import org.jetbrains.annotations.NotNull; /** diff --git a/python/ide/src/com/jetbrains/python/PythonToolWindowConsoleRunner.java b/python/src/com/jetbrains/python/console/PythonToolWindowConsoleRunner.java similarity index 96% rename from python/ide/src/com/jetbrains/python/PythonToolWindowConsoleRunner.java rename to python/src/com/jetbrains/python/console/PythonToolWindowConsoleRunner.java index f9255c45c1e1..bcf805bc3dd1 100644 --- a/python/ide/src/com/jetbrains/python/PythonToolWindowConsoleRunner.java +++ b/python/src/com/jetbrains/python/console/PythonToolWindowConsoleRunner.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python; +package com.jetbrains.python.console; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -26,8 +26,6 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.content.Content; -import com.jetbrains.python.console.PyConsoleType; -import com.jetbrains.python.console.PydevConsoleRunner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable;