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. + } +}