EDU-380 Merge PyDebugFileLineMarkerProvider and PyExecuteFileLineMarkerProvider
authorliana.bakradze <liana.bakradze@jetbrains.com>
Wed, 19 Aug 2015 16:16:22 +0000 (19:16 +0300)
committerliana.bakradze <liana.bakradze@jetbrains.com>
Wed, 19 Aug 2015 16:16:22 +0000 (19:16 +0300)
there is no need in additional actions at all, because there are created in ExecutorRegistry for every executor

python/edu/src/META-INF/PyCharmEduPlugin.xml
python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFile.java [new file with mode: 0644]
python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFileAction.java [deleted file]
python/edu/src/com/jetbrains/python/edu/PyDebugFileLineMarkerProvider.java [deleted file]
python/edu/src/com/jetbrains/python/edu/PyEduUtils.java [deleted file]
python/edu/src/com/jetbrains/python/edu/PyExecuteFileExtensionPoint.java
python/edu/src/com/jetbrains/python/edu/PyExecuteFileLineMarkerProvider.java
python/edu/src/com/jetbrains/python/edu/PyRunConfigurationForFileAction.java [deleted file]
python/edu/src/com/jetbrains/python/edu/PyRunCurrentFileAction.java [deleted file]
python/edu/src/com/jetbrains/python/edu/debugger/PyEduDebugExecutor.java

index a1724898ccfdcaff4e4ca087367dbe817f11cdcc..b1dfd7039a3ddfbf28d42740a7550e8127a200bd 100644 (file)
   </extensionPoints>
 
   <extensions defaultExtensionNs="com.intellij">
-      <codeInsight.lineMarkerProvider language="Python" implementationClass="com.jetbrains.python.edu.PyDebugFileLineMarkerProvider"/>
       <codeInsight.lineMarkerProvider language="Python" implementationClass="com.jetbrains.python.edu.PyExecuteFileLineMarkerProvider"/>
       <programRunner implementation="com.jetbrains.python.edu.debugger.PyEduDebugRunner"/>
       <executor implementation="com.jetbrains.python.edu.debugger.PyEduDebugExecutor" order="first,after run"/>
       <consoleInputFilterProvider implementation="com.jetbrains.python.edu.debugger.PyEduConsoleInputFilterProvider"/>
   </extensions>
+  <extensions defaultExtensionNs="Edu">
+    <executeFile implementation="com.jetbrains.python.edu.PyDebugCurrentFile"/>
+  </extensions>
 
   <actions>
     <group overrides="true" class="com.intellij.openapi.actionSystem.EmptyActionGroup" id="ToolsMenu"/>
     <action overrides="true" class="com.intellij.openapi.actionSystem.EmptyAction" id="NewHtmlFile"/>
 
 
-    <group id="PyRunMenu">
-      <action id="runCurrentFile" class="com.jetbrains.python.edu.PyRunCurrentFileAction"/>
-      <add-to-group group-id="RunMenu" anchor="first"/>
-    </group>
-
-
   </actions>
 </idea-plugin>
diff --git a/python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFile.java b/python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFile.java
new file mode 100644 (file)
index 0000000..f9f9a68
--- /dev/null
@@ -0,0 +1,16 @@
+package com.jetbrains.python.edu;
+
+import com.intellij.execution.actions.RunContextAction;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.jetbrains.python.edu.debugger.PyEduDebugExecutor;
+import org.jetbrains.annotations.Nullable;
+
+public class PyDebugCurrentFile implements PyExecuteFileExtensionPoint {
+
+  @Nullable
+  @Override
+  public AnAction getRunAction() {
+    return new RunContextAction(PyEduDebugExecutor.getInstance());
+  }
+}
+
diff --git a/python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFileAction.java b/python/edu/src/com/jetbrains/python/edu/PyDebugCurrentFileAction.java
deleted file mode 100644 (file)
index bd9373f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.jetbrains.python.edu;
-
-import com.intellij.execution.RunnerAndConfigurationSettings;
-import com.intellij.execution.runners.ExecutionUtil;
-import com.intellij.icons.AllIcons;
-import com.jetbrains.python.edu.debugger.PyEduDebugExecutor;
-
-public class PyDebugCurrentFileAction extends PyRunConfigurationForFileAction {
-
-  public PyDebugCurrentFileAction() {
-    getTemplatePresentation().setIcon(AllIcons.Actions.StartDebugger);
-  }
-
-  @Override
-  protected String getConfigurationType() {
-    return "Debug";
-  }
-
-  @Override
-  protected void runConfiguration(RunnerAndConfigurationSettings configuration) {
-    ExecutionUtil.runConfiguration(configuration, PyEduDebugExecutor.getInstance());
-  }
-}
diff --git a/python/edu/src/com/jetbrains/python/edu/PyDebugFileLineMarkerProvider.java b/python/edu/src/com/jetbrains/python/edu/PyDebugFileLineMarkerProvider.java
deleted file mode 100644 (file)
index 94edd56..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.jetbrains.python.edu;
-
-import com.intellij.codeHighlighting.Pass;
-import com.intellij.codeInsight.daemon.GutterIconNavigationHandler;
-import com.intellij.codeInsight.daemon.LineMarkerInfo;
-import com.intellij.codeInsight.daemon.LineMarkerProvider;
-import com.intellij.execution.actions.ConfigurationContext;
-import com.intellij.icons.AllIcons;
-import com.intellij.ide.DataManager;
-import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.markup.GutterIconRenderer;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.util.PsiUtilBase;
-import com.intellij.util.Function;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.awt.event.MouseEvent;
-import java.util.Collection;
-import java.util.List;
-
-public class PyDebugFileLineMarkerProvider implements LineMarkerProvider {
-  @Nullable
-  @Override
-  public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
-    return null;
-  }
-
-  @Override
-  public void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull Collection<LineMarkerInfo> result) {
-     for (final PsiElement element : elements) {
-      if (PyEduUtils.isFirstCodeLine(element)) {
-        result.add(new LineMarkerInfo<PsiElement>(element, element.getTextRange(), AllIcons.Actions.StartDebugger,
-                                                  Pass.UPDATE_OVERRIDEN_MARKERS,
-                                                  new Function<PsiElement, String>() {
-                                                    @Override
-                                                    public String fun(PsiElement e) {
-                                                      return "Debug '" + e.getContainingFile().getName() + "'";
-                                                    }
-                                                  }, new GutterIconNavigationHandler<PsiElement>() {
-          @Override
-          public void navigate(MouseEvent e, PsiElement elt) {
-            final Editor editor = PsiUtilBase.findEditor(elt);
-            assert editor != null;
-            ConfigurationContext configurationContext =
-              ConfigurationContext.getFromContext(DataManager.getInstance().getDataContext(editor.getComponent()));
-            new PyDebugCurrentFileAction().run(configurationContext);
-          }
-        }, GutterIconRenderer.Alignment.RIGHT));
-      }
-    }
-  }
-}
diff --git a/python/edu/src/com/jetbrains/python/edu/PyEduUtils.java b/python/edu/src/com/jetbrains/python/edu/PyEduUtils.java
deleted file mode 100644 (file)
index bdc0d40..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.jetbrains.python.edu;
-
-import com.intellij.psi.PsiComment;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiWhiteSpace;
-import com.jetbrains.python.psi.PyFile;
-import com.jetbrains.python.psi.PyImportStatement;
-import com.jetbrains.python.psi.PyStatement;
-
-public class PyEduUtils {
-  public static boolean isFirstCodeLine(PsiElement element) {
-    return element instanceof PyStatement &&
-           element.getParent() instanceof PyFile &&
-           !isNothing(element) &&
-           nothingBefore(element);
-  }
-
-  private static boolean nothingBefore(PsiElement element) {
-    element = element.getPrevSibling();
-    while (element != null) {
-      if (!isNothing(element)) {
-        return false;
-      }
-      element = element.getPrevSibling();
-    }
-
-    return true;
-  }
-
-  private static boolean isNothing(PsiElement element) {
-    return (element instanceof PsiComment) || (element instanceof PyImportStatement) || (element instanceof PsiWhiteSpace);
-  }
-}
index 7f5a077c2650d557cf778b778cfc3258b049b844..d0c54fe86b3b8d8eaf3757e2f3a61f0530ea2286 100644 (file)
@@ -17,13 +17,13 @@ package com.jetbrains.python.edu;
 
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.extensions.ExtensionPointName;
-import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public interface PyExecuteFileExtensionPoint {
 
   ExtensionPointName<PyExecuteFileExtensionPoint> EP_NAME = ExtensionPointName.create("Edu.executeFile");
 
-  @NotNull
+  @Nullable
   AnAction getRunAction();
 
 }
index e22713dbfa26d0f326182398a7bd958238ddf002..c38577cb68844f1dce10d28255255ae142544bfc 100644 (file)
@@ -3,17 +3,21 @@ package com.jetbrains.python.edu;
 import com.intellij.codeHighlighting.Pass;
 import com.intellij.codeInsight.daemon.LineMarkerInfo;
 import com.intellij.codeInsight.daemon.LineMarkerProvider;
+import com.intellij.execution.actions.RunContextAction;
+import com.intellij.execution.executors.DefaultRunExecutor;
 import com.intellij.icons.AllIcons;
 import com.intellij.openapi.actionSystem.ActionGroup;
 import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.editor.markup.GutterIconRenderer;
-import com.intellij.openapi.ui.popup.ListPopup;
+import com.intellij.psi.PsiComment;
 import com.intellij.psi.PsiElement;
-import com.intellij.ui.popup.PopupFactoryImpl;
+import com.intellij.psi.PsiWhiteSpace;
 import com.intellij.util.Function;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.PyImportStatement;
+import com.jetbrains.python.psi.PyStatement;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -33,7 +37,8 @@ public class PyExecuteFileLineMarkerProvider implements LineMarkerProvider {
   @Override
   public void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull Collection<LineMarkerInfo> result) {
     for (PsiElement element : elements) {
-      if (PyEduUtils.isFirstCodeLine(element)) {
+      if (isFirstCodeLine(element)) {
+        final RunContextAction runAction = new RunContextAction(DefaultRunExecutor.getRunExecutorInstance());
         final LineMarkerInfo<PsiElement> markerInfo = new LineMarkerInfo<PsiElement>(
           element, element.getTextRange(), AllIcons.Actions.Execute, Pass.UPDATE_OVERRIDEN_MARKERS,
           new Function<PsiElement, String>() {
@@ -49,41 +54,21 @@ public class PyExecuteFileLineMarkerProvider implements LineMarkerProvider {
             return new LineMarkerGutterIconRenderer<PsiElement>(this){
               @Override
               public AnAction getClickAction() {
-
-                return new AnAction() {
-                  @Override
-                  public void actionPerformed(@NotNull AnActionEvent e) {
-                    final DefaultActionGroup group = new DefaultActionGroup();
-                    group.add(new PyRunCurrentFileAction());
-                    final PyExecuteFileExtensionPoint[] extensions =
-                      ApplicationManager.getApplication().getExtensions(PyExecuteFileExtensionPoint.EP_NAME);
-                    for (PyExecuteFileExtensionPoint extension : extensions) {
-                      final AnAction action = extension.getRunAction();
-                      action.update(e);
-                      if (e.getPresentation().isEnabled())
-                        group.add(action);
-                    }
-                    if (group.getChildrenCount() == 1) {
-                      new PyRunCurrentFileAction().actionPerformed(e);
-                    }
-                    else {
-                      final ListPopup popup =
-                        new PopupFactoryImpl().createActionGroupPopup(null, group, e.getDataContext(), false, false, false, null, 5);
-                      popup.showInBestPositionFor(e.getDataContext());
-                    }
-                  }
-                };
+                return runAction;
               }
 
               @Nullable
               @Override
               public ActionGroup getPopupMenuActions() {
                 final DefaultActionGroup group = new DefaultActionGroup();
-                group.add(new PyRunCurrentFileAction());
+                group.add(runAction);
                 final PyExecuteFileExtensionPoint[] extensions =
                   ApplicationManager.getApplication().getExtensions(PyExecuteFileExtensionPoint.EP_NAME);
                 for (PyExecuteFileExtensionPoint extension : extensions) {
                   final AnAction action = extension.getRunAction();
+                  if (action == null) {
+                    continue;
+                  }
                   group.add(action);
                 }
                 return group;
@@ -95,4 +80,27 @@ public class PyExecuteFileLineMarkerProvider implements LineMarkerProvider {
       }
     }
   }
+
+  private static boolean isFirstCodeLine(PsiElement element) {
+    return element instanceof PyStatement &&
+           element.getParent() instanceof PyFile &&
+           !isNothing(element) &&
+           nothingBefore(element);
+  }
+
+  private static boolean nothingBefore(PsiElement element) {
+    element = element.getPrevSibling();
+    while (element != null) {
+      if (!isNothing(element)) {
+        return false;
+      }
+      element = element.getPrevSibling();
+    }
+
+    return true;
+  }
+
+  private static boolean isNothing(PsiElement element) {
+    return (element instanceof PsiComment) || (element instanceof PyImportStatement) || (element instanceof PsiWhiteSpace);
+  }
 }
diff --git a/python/edu/src/com/jetbrains/python/edu/PyRunConfigurationForFileAction.java b/python/edu/src/com/jetbrains/python/edu/PyRunConfigurationForFileAction.java
deleted file mode 100644 (file)
index 8c42fe2..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.jetbrains.python.edu;
-
-import com.intellij.execution.Location;
-import com.intellij.execution.RunManagerEx;
-import com.intellij.execution.RunnerAndConfigurationSettings;
-import com.intellij.execution.actions.ConfigurationContext;
-import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.Presentation;
-import com.jetbrains.python.PythonFileType;
-import org.jetbrains.annotations.NotNull;
-
-public abstract class PyRunConfigurationForFileAction extends AnAction {
-
-  @Override
-  public void update(AnActionEvent e) {
-    Presentation presentation = e.getPresentation();
-    final ConfigurationContext context = ConfigurationContext.getFromContext(e.getDataContext());
-    if (context.findExisting() == null && context.getConfiguration() == null) {
-      return;
-    }
-    Location location = context.getLocation();
-    if (location != null && location.getPsiElement().getContainingFile() != null && location.getPsiElement().getContainingFile().getFileType() == PythonFileType.INSTANCE) {
-      presentation.setEnabled(true);
-      presentation.setText(getConfigurationType() + " '" + location.getPsiElement().getContainingFile().getName() + "'");
-    }
-  }
-
-  protected abstract String getConfigurationType();
-
-  @Override
-  public void actionPerformed(AnActionEvent e) {
-    final ConfigurationContext context = ConfigurationContext.getFromContext(e.getDataContext());
-
-    run(context);
-  }
-
-  public void run(@NotNull ConfigurationContext context) {
-    RunnerAndConfigurationSettings configuration = context.findExisting();
-    final RunManagerEx runManager = (RunManagerEx)context.getRunManager();
-    if (configuration == null) {
-      configuration = context.getConfiguration();
-      if (configuration == null) {
-        return;
-      }
-      runManager.setTemporaryConfiguration(configuration);
-    }
-    runManager.setSelectedConfiguration(configuration);
-
-    runConfiguration(configuration);
-  }
-
-  protected abstract void runConfiguration(RunnerAndConfigurationSettings configuration);
-}
diff --git a/python/edu/src/com/jetbrains/python/edu/PyRunCurrentFileAction.java b/python/edu/src/com/jetbrains/python/edu/PyRunCurrentFileAction.java
deleted file mode 100644 (file)
index 160bd75..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.jetbrains.python.edu;
-
-import com.intellij.execution.RunnerAndConfigurationSettings;
-import com.intellij.execution.executors.DefaultRunExecutor;
-import com.intellij.execution.runners.ExecutionUtil;
-import com.intellij.icons.AllIcons;
-
-/**
- * @author traff
- */
-public class PyRunCurrentFileAction extends PyRunConfigurationForFileAction {
-
-  public PyRunCurrentFileAction() {
-    getTemplatePresentation().setIcon(AllIcons.Actions.Execute);
-  }
-
-  @Override
-  protected String getConfigurationType() {
-    return "Run";
-  }
-
-  @Override
-  protected void runConfiguration(RunnerAndConfigurationSettings configuration) {
-    ExecutionUtil.runConfiguration(configuration, DefaultRunExecutor.getRunExecutorInstance());
-  }
-}
index fe9e573dd86f9b34aae817b7a7c6ea4d00c14e2c..4c05b0df8d175bcdb338319c3b74ea477c0777b8 100644 (file)
@@ -26,6 +26,6 @@ public class PyEduDebugExecutor extends DefaultDebugExecutor {
   @NotNull
   @Override
   public String getStartActionText() {
-    return "Step Through ";
+    return "Step Through";
   }
 }