Python execute in console: added support of python debug console.
authorDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Wed, 2 Mar 2011 15:20:02 +0000 (18:20 +0300)
committerDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Thu, 3 Mar 2011 12:23:39 +0000 (15:23 +0300)
platform/lang-api/src/com/intellij/execution/ui/RunContentManager.java
platform/lang-impl/lang-impl.iml
platform/lang-impl/src/com/intellij/execution/ExecutionHelper.java
platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java
platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java

index 6439cdc0cf7420720a150f34defecb0abc1a30ed..57feb6317fcc7566aa0f18c4cdd9d85630451642 100644 (file)
@@ -19,6 +19,7 @@ import com.intellij.execution.Executor;
 import com.intellij.execution.process.ProcessHandler;
 import com.intellij.openapi.actionSystem.DataContext;
 import com.intellij.openapi.actionSystem.DataKey;
+import com.intellij.openapi.wm.ToolWindow;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -61,4 +62,7 @@ public interface RunContentManager {
   void removeRunContentListener(RunContentListener listener);
 
   void addRunContentListener(RunContentListener myContentListener, Executor executor);
+
+  @Nullable
+  ToolWindow getToolWindowByDescriptor(@NotNull RunContentDescriptor descriptor);
 }
\ No newline at end of file
index f4a1f09a92ba923a180cc09cd6d2a5b92e1117ad..7bc18547561fc02a413abe68d0121d7a170ce043 100644 (file)
@@ -20,6 +20,7 @@
     <orderEntry type="module" module-name="usageView" exported="" />
     <orderEntry type="library" name="Guava" level="project" />
     <orderEntry type="library" scope="TEST" name="Mocks" level="project" />
+    <orderEntry type="module" module-name="xdebugger-api" />
   </component>
 </module>
 
index 9642213cc6446aaa18f0d6af818af566702fc7ad..3f1ed57e0600fac40340c09010760a1d0e2e6085 100644 (file)
@@ -17,6 +17,7 @@
 package com.intellij.execution;
 
 import com.google.common.collect.Lists;
+import com.intellij.execution.executors.DefaultDebugExecutor;
 import com.intellij.execution.executors.DefaultRunExecutor;
 import com.intellij.execution.process.OSProcessHandler;
 import com.intellij.execution.process.ProcessHandler;
@@ -44,6 +45,7 @@ import com.intellij.openapi.wm.ToolWindowManager;
 import com.intellij.ui.components.JBList;
 import com.intellij.ui.content.Content;
 import com.intellij.ui.content.ContentFactory;
+import com.intellij.ui.content.ContentManager;
 import com.intellij.ui.content.MessageView;
 import com.intellij.util.Consumer;
 import com.intellij.util.Function;
@@ -177,11 +179,11 @@ public class ExecutionHelper {
   public static Collection<RunContentDescriptor> findRunningConsole(final Project project,
                                                                     @NotNull final NotNullFunction<RunContentDescriptor, Boolean> descriptorMatcher) {
     final ExecutionManager executionManager = ExecutionManager.getInstance(project);
-    final ToolWindow runToolWindow =
-      ToolWindowManager.getInstance(project).getToolWindow(DefaultRunExecutor.getRunExecutorInstance().getId());
-    if (runToolWindow != null && runToolWindow.isVisible()) {
-      final RunContentDescriptor selectedContent = executionManager.getContentManager().getSelectedContent();
-      if (selectedContent != null) {
+
+    final RunContentDescriptor selectedContent = executionManager.getContentManager().getSelectedContent();
+    if (selectedContent != null) {
+      final ToolWindow toolWindow = ExecutionManager.getInstance(project).getContentManager().getToolWindowByDescriptor(selectedContent);
+      if (toolWindow != null && toolWindow.isVisible()) {
         if (descriptorMatcher.fun(selectedContent)) {
           return Collections.singletonList(selectedContent);
         }
@@ -212,8 +214,8 @@ public class ExecutionHelper {
   }
 
   public static void selectContentDescriptor(final @NotNull Editor editor,
-                                                             @NotNull Collection<RunContentDescriptor> consoles,
-                                                             String selectDialogTitle, final Consumer<RunContentDescriptor> descriptorConsumer) {
+                                             @NotNull Collection<RunContentDescriptor> consoles,
+                                             String selectDialogTitle, final Consumer<RunContentDescriptor> descriptorConsumer) {
     if (consoles.size() == 1) {
       RunContentDescriptor descriptor = consoles.iterator().next();
       descriptorConsumer.consume(descriptor);
@@ -251,9 +253,21 @@ public class ExecutionHelper {
     }
   }
 
-  private static void descriptorToFront(Editor editor, RunContentDescriptor descriptor) {
-    ExecutionManager.getInstance(editor.getProject()).getContentManager()
-      .toFrontRunContent(DefaultRunExecutor.getRunExecutorInstance(), descriptor);
+  private static void descriptorToFront(final Editor editor, final RunContentDescriptor descriptor) {
+    final Project project = editor.getProject();
+    ApplicationManager.getApplication().invokeLater(new Runnable() {
+      public void run() {
+        final ToolWindow toolWindow = ExecutionManager.getInstance(project).getContentManager().getToolWindowByDescriptor(descriptor);
+
+        if (toolWindow != null) {
+          toolWindow.show(null);
+
+          final ContentManager contentManager = toolWindow.getContentManager();
+
+          contentManager.setSelectedContent(descriptor.getAttachedContent());
+        }
+      }
+    });
   }
 
   public static class RailsErrorViewPanel extends NewErrorTreeViewPanel {
index d649cb12e87528438475f5e139b462c50ffe15d5..6e515189466440d7989e4895ddb2eddf302664e5 100644 (file)
@@ -246,6 +246,15 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider {
     return AnAction.EMPTY_ARRAY;
   }
 
+  public void addTextToCurrentEditor(final String text) {
+    ApplicationManager.getApplication().runWriteAction(new Runnable() {
+      public void run() {
+        getCurrentEditor().getDocument().insertString(0, text);
+      }
+    });
+    queueUiUpdate(true);
+  }
+
   private static void setupEditorDefault(EditorEx editor) {
     editor.getContentComponent().setFocusCycleRoot(false);
     editor.setHorizontalScrollbarVisible(false);
index f17846a7ea431b287f388fd734dcd92dc05aac32..e5ff575e3b90dd198d2fd162d71bb5d47a9943d2 100644 (file)
@@ -58,7 +58,8 @@ import javax.swing.*;
 import java.util.*;
 
 public class RunContentManagerImpl implements RunContentManager, Disposable {
-  public static final Topic<RunContentWithExecutorListener> RUN_CONTENT_TOPIC = Topic.create("Run Content", RunContentWithExecutorListener.class);
+  public static final Topic<RunContentWithExecutorListener> RUN_CONTENT_TOPIC =
+    Topic.create("Run Content", RunContentWithExecutorListener.class);
   public static final Key<Boolean> ALWAYS_USE_DEFAULT_STOPPING_BEHAVIOUR_KEY = Key.create("ALWAYS_USE_DEFAULT_STOPPING_BEHAVIOUR_KEY");
   private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ui.RunContentManagerImpl");
   private static final Key<RunContentDescriptor> DESCRIPTOR_KEY = new Key<RunContentDescriptor>("Descriptor");
@@ -132,16 +133,18 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
     final ContentManager contentManager = toolWindow.getContentManager();
     class MyDataProvider implements DataProvider {
       private int myInsideGetData = 0;
+
       public Object getData(String dataId) {
-        myInsideGetData ++;
+        myInsideGetData++;
         try {
-          if(PlatformDataKeys.HELP_ID.is(dataId)) {
+          if (PlatformDataKeys.HELP_ID.is(dataId)) {
             return executor.getHelpId();
           }
           else {
             return myInsideGetData == 1 ? DataManager.getInstance().getDataContext(contentManager.getComponent()).getData(dataId) : null;
           }
-        } finally {
+        }
+        finally {
           myInsideGetData--;
         }
       }
@@ -251,14 +254,14 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
   }
 
   public void showRunContent(@NotNull final Executor executor, final RunContentDescriptor descriptor) {
-    if(ApplicationManager.getApplication().isUnitTestMode()) return;
+    if (ApplicationManager.getApplication().isUnitTestMode()) return;
 
-    final ContentManager contentManager  = getContentManagerForRunner(executor);
+    final ContentManager contentManager = getContentManagerForRunner(executor);
     RunContentDescriptor oldDescriptor = chooseReuseContentForDescriptor(contentManager, descriptor);
 
     final Content content;
 
-    if(oldDescriptor != null) {
+    if (oldDescriptor != null) {
       content = oldDescriptor.getAttachedContent();
       getSyncPublisher().contentRemoved(oldDescriptor, executor);
       oldDescriptor.dispose(); // is of the same category, can be reused
@@ -322,12 +325,12 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
 
   @Nullable
   public RunContentDescriptor getReuseContent(final Executor requestor, DataContext dataContext) {
-    if(ApplicationManager.getApplication().isUnitTestMode()) return null;
+    if (ApplicationManager.getApplication().isUnitTestMode()) return null;
     return getReuseContent(requestor, GenericProgramRunner.CONTENT_TO_REUSE_DATA_KEY.getData(dataContext));
   }
 
   public RunContentDescriptor getReuseContent(Executor requestor, @Nullable RunContentDescriptor contentToReuse) {
-    if(ApplicationManager.getApplication().isUnitTestMode()) return null;
+    if (ApplicationManager.getApplication().isUnitTestMode()) return null;
     if (contentToReuse != null) return contentToReuse;
 
     final ContentManager contentManager = getContentManagerForRunner(requestor);
@@ -339,14 +342,15 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
   }
 
   public void showRunContent(@NotNull final Executor info, RunContentDescriptor descriptor, RunContentDescriptor contentToReuse) {
-    if(contentToReuse != null) {
+    if (contentToReuse != null) {
       descriptor.setAttachedContent(contentToReuse.getAttachedContent());
     }
     showRunContent(info, descriptor);
   }
 
   @Nullable
-  private static RunContentDescriptor chooseReuseContentForDescriptor(final ContentManager contentManager, final RunContentDescriptor descriptor) {
+  private static RunContentDescriptor chooseReuseContentForDescriptor(final ContentManager contentManager,
+                                                                      final RunContentDescriptor descriptor) {
     Content content = null;
     if (descriptor != null) {
       if (descriptor.isContentReuseProhibited()) {
@@ -399,10 +403,23 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
     }
   }
 
-  public static RunContentDescriptor getRunContentDescriptorByContent(final Content content) {
+  @Nullable
+  public static RunContentDescriptor getRunContentDescriptorByContent(@NotNull final Content content) {
     return content.getUserData(DESCRIPTOR_KEY);
   }
 
+
+  @Override
+  @Nullable
+  public ToolWindow getToolWindowByDescriptor(@NotNull final RunContentDescriptor descriptor) {
+    for (Map.Entry<String, ContentManager> entry : myToolwindowIdToContentManagerMap.entrySet()) {
+      if (getRunContentByDescriptor(entry.getValue(), descriptor) != null) {
+        return ToolWindowManager.getInstance(myProject).getToolWindow(entry.getKey());
+      }
+    }
+    return null;
+  }
+
   @Nullable
   private static Content getRunContentByDescriptor(final ContentManager contentManager, final RunContentDescriptor descriptor) {
     final Content[] contents = contentManager.getContents();
@@ -614,15 +631,15 @@ public class RunContentManagerImpl implements RunContentManager, Disposable {
             }
           }
         });
-        
+
         final ProgressIndicator progressIndicator = ProgressManager.getInstance().getProgressIndicator();
 
         if (progressIndicator != null) {
           progressIndicator.setText(ExecutionBundle.message("waiting.for.vm.detach.progress.text"));
           ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
             public void run() {
-              while(true) {
-                if(progressIndicator.isCanceled() || !progressIndicator.isRunning()) {
+              while (true) {
+                if (progressIndicator.isCanceled() || !progressIndicator.isRunning()) {
                   semaphore.up();
                   break;
                 }