diff --git a/python/src/META-INF/plugin.xml b/python/src/META-INF/plugin.xml
index afae9974faf8..db61d652cdaa 100644
--- a/python/src/META-INF/plugin.xml
+++ b/python/src/META-INF/plugin.xml
@@ -20,8 +20,6 @@
-
-
@@ -31,5 +29,10 @@
+
+
+
+
+
diff --git a/python/src/com/jetbrains/python/run/PythonConfigurationType.java b/python/src/com/jetbrains/python/run/PythonConfigurationType.java
index 8066ac76ae69..b4c1714288c7 100644
--- a/python/src/com/jetbrains/python/run/PythonConfigurationType.java
+++ b/python/src/com/jetbrains/python/run/PythonConfigurationType.java
@@ -3,8 +3,9 @@ package com.jetbrains.python.run;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.RunConfiguration;
-import com.intellij.openapi.util.IconLoader;
+import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.IconLoader;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -14,6 +15,16 @@ import javax.swing.*;
* @author yole
*/
public class PythonConfigurationType implements ConfigurationType {
+ public static PythonConfigurationType getInstance() {
+ for(ConfigurationType configType: Extensions.getExtensions(CONFIGURATION_TYPE_EP)) {
+ if (configType instanceof PythonConfigurationType) {
+ return (PythonConfigurationType) configType;
+ }
+ }
+ assert false;
+ return null;
+ }
+
private Icon _icon = IconLoader.getIcon("/com/jetbrains/python/python.png");
private static class PythonConfigurationFactory extends ConfigurationFactory {
@@ -47,10 +58,4 @@ public class PythonConfigurationType implements ConfigurationType {
public String getId() {
return "PythonConfigurationType";
}
-
- public void initComponent() {
- }
-
- public void disposeComponent() {
- }
}
diff --git a/python/src/com/jetbrains/python/run/PythonRunConfiguration.java b/python/src/com/jetbrains/python/run/PythonRunConfiguration.java
index 9697a9ddfb6d..e2131e23f440 100644
--- a/python/src/com/jetbrains/python/run/PythonRunConfiguration.java
+++ b/python/src/com/jetbrains/python/run/PythonRunConfiguration.java
@@ -13,20 +13,18 @@ import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.util.DefaultJDOMExternalizer;
-import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMExternalizable;
-import com.intellij.openapi.util.WriteExternalException;
+import com.intellij.openapi.util.*;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jdom.Element;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @author yole
*/
-public class PythonRunConfiguration extends RunConfigurationBase {
+public class PythonRunConfiguration extends RunConfigurationBase implements LocatableConfiguration {
public String SCRIPT_NAME;
public String PARAMETERS;
public String WORKING_DIRECTORY;
@@ -102,4 +100,16 @@ public class PythonRunConfiguration extends RunConfigurationBase {
public void setEnvs(final Map envs) {
myEnvs = envs;
}
+
+ public boolean isGeneratedName() {
+ return Comparing.equal(getName(), suggestedName());
+ }
+
+ public String suggestedName() {
+ String name = new File(SCRIPT_NAME).getName();
+ if (name.endsWith(".py")) {
+ return name.substring(0, name.length()-3);
+ }
+ return name;
+ }
}
diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java
new file mode 100644
index 000000000000..7a87caf40d9a
--- /dev/null
+++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java
@@ -0,0 +1,44 @@
+package com.jetbrains.python.run;
+
+import com.intellij.execution.Location;
+import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl;
+import com.intellij.execution.junit.RuntimeConfigurationProducer;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.openapi.project.Project;
+import com.jetbrains.python.PythonFileType;
+
+/**
+ * @author yole
+ */
+public class PythonRunConfigurationProducer extends RuntimeConfigurationProducer implements Cloneable {
+ private PsiFile mySourceFile = null;
+
+ public PythonRunConfigurationProducer() {
+ super(PythonConfigurationType.getInstance());
+ }
+
+ public PsiElement getSourceElement() {
+ return mySourceFile;
+ }
+
+ protected RunnerAndConfigurationSettingsImpl createConfigurationByElement(final Location location, final ConfigurationContext context) {
+ mySourceFile = location.getPsiElement().getContainingFile();
+ if (mySourceFile == null || mySourceFile.getFileType() != PythonFileType.INSTANCE) {
+ return null;
+ }
+
+ final Project project = mySourceFile.getProject();
+ RunnerAndConfigurationSettingsImpl settings = cloneTemplateConfiguration(project, context);
+ PythonRunConfiguration configuration = (PythonRunConfiguration) settings.getConfiguration();
+ configuration.SCRIPT_NAME = mySourceFile.getVirtualFile().getPath();
+ configuration.setName(configuration.suggestedName());
+ copyStepsBeforeRun(project, configuration);
+ return settings;
+ }
+
+ public int compareTo(final Object o) {
+ return 0; //To change body of implemented methods use File | Settings | File Templates.
+ }
+}