there is no need in additional actions at all, because there are created in ExecutorRegistry for every executor
</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>
--- /dev/null
+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());
+ }
+}
+
+++ /dev/null
-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());
- }
-}
+++ /dev/null
-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));
- }
- }
- }
-}
+++ /dev/null
-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);
- }
-}
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();
}
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;
@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>() {
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;
}
}
}
+
+ 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);
+ }
}
+++ /dev/null
-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);
-}
+++ /dev/null
-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());
- }
-}
@NotNull
@Override
public String getStartActionText() {
- return "Step Through ";
+ return "Step Through";
}
}