diff --git a/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationFactory.java b/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationFactory.java index cf46e6df8675..47de30958e90 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationFactory.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationFactory.java @@ -104,11 +104,24 @@ public abstract class ConfigurationFactory { public void configureBeforeRunTaskDefaults(Key providerID, BeforeRunTask task) { } + /** + * @deprecated Use {@link RunConfigurationSingletonPolicy} + */ + @Deprecated public boolean isConfigurationSingletonByDefault() { - return false; + return getSingletonPolicy() != RunConfigurationSingletonPolicy.MULTIPLE_INSTANCE; } + /** + * @deprecated Use {@link RunConfigurationSingletonPolicy} + */ + @Deprecated public boolean canConfigurationBeSingleton() { - return true; // Configuration may be marked as singleton by default + return getSingletonPolicy() != RunConfigurationSingletonPolicy.SINGLE_INSTANCE_ONLY; + } + + @NotNull + public RunConfigurationSingletonPolicy getSingletonPolicy() { + return RunConfigurationSingletonPolicy.SINGLE_INSTANCE; } } diff --git a/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationTypeBase.kt b/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationTypeBase.kt index 64bf31d3a500..21ae5f861866 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationTypeBase.kt +++ b/platform/lang-api/src/com/intellij/execution/configurations/ConfigurationTypeBase.kt @@ -10,6 +10,19 @@ import javax.swing.Icon private val EMPTY_FACTORIES = arrayOf() +enum class RunConfigurationSingletonPolicy { + SINGLE_INSTANCE, + MULTIPLE_INSTANCE, + SINGLE_INSTANCE_ONLY, + MULTIPLE_INSTANCE_ONLY; + + val isPolicyConfigurable: Boolean + get() = this != SINGLE_INSTANCE_ONLY && this != MULTIPLE_INSTANCE_ONLY + + val isSingleton: Boolean + get() = this == SINGLE_INSTANCE || this == SINGLE_INSTANCE_ONLY +} + abstract class ConfigurationTypeBase protected constructor(private val id: String, private val displayName: String, description: String? = null, private val icon: NotNullLazyValue?) : ConfigurationType { companion object { @JvmStatic diff --git a/platform/lang-api/src/com/intellij/execution/configurations/UnknownConfigurationType.java b/platform/lang-api/src/com/intellij/execution/configurations/UnknownConfigurationType.java index ddc7dc19f6b0..8c86814ed902 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/UnknownConfigurationType.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/UnknownConfigurationType.java @@ -5,7 +5,6 @@ import com.intellij.execution.ExecutionBundle; import com.intellij.icons.AllIcons; import com.intellij.openapi.project.Project; import com.intellij.util.LazyUtil; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; public final class UnknownConfigurationType extends ConfigurationTypeBase { @@ -22,10 +21,11 @@ public final class UnknownConfigurationType extends ConfigurationTypeBase { return new UnknownRunConfiguration(this, project); } - @Contract(pure = true) + @NotNull @Override - public boolean canConfigurationBeSingleton() { - return false; + public RunConfigurationSingletonPolicy getSingletonPolicy() { + // in any case you cannot run UnknownConfigurationType + return RunConfigurationSingletonPolicy.SINGLE_INSTANCE_ONLY; } }); } diff --git a/platform/lang-impl/src/com/intellij/execution/compound/CompoundRunConfigurationType.java b/platform/lang-impl/src/com/intellij/execution/compound/CompoundRunConfigurationType.java index 2a8d3c33e719..d13ec8809321 100644 --- a/platform/lang-impl/src/com/intellij/execution/compound/CompoundRunConfigurationType.java +++ b/platform/lang-impl/src/com/intellij/execution/compound/CompoundRunConfigurationType.java @@ -1,10 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.compound; -import com.intellij.execution.configurations.ConfigurationFactory; -import com.intellij.execution.configurations.ConfigurationTypeBase; -import com.intellij.execution.configurations.ConfigurationTypeUtil; -import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.configurations.*; import com.intellij.icons.AllIcons; import com.intellij.openapi.project.Project; import com.intellij.ui.LayeredIcon; @@ -32,14 +29,10 @@ public final class CompoundRunConfigurationType extends ConfigurationTypeBase { return "Compound Run Configuration"; } + @NotNull @Override - public boolean isConfigurationSingletonByDefault() { - return true; - } - - @Override - public boolean canConfigurationBeSingleton() { - return false; + public RunConfigurationSingletonPolicy getSingletonPolicy() { + return RunConfigurationSingletonPolicy.SINGLE_INSTANCE_ONLY; } }); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt index fd9b3bc27723..69ffdf4a7116 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt @@ -260,7 +260,7 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi val configuration = factory.createTemplateConfiguration(project, this) val template = RunnerAndConfigurationSettingsImpl(this, configuration, isTemplate = true, - isSingleton = factory.isConfigurationSingletonByDefault) + isSingleton = factory.singletonPolicy.isSingleton) if (configuration is UnknownRunConfiguration) { configuration.isDoNotStore = true } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt index e64003625eae..510f365a4b53 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt @@ -53,7 +53,7 @@ enum class RunConfigurationLevel { class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(val manager: RunManagerImpl, private var _configuration: RunConfiguration? = null, private var isTemplate: Boolean = false, - private var isSingleton: Boolean = false, + private var isSingleton: Boolean = true, var level: RunConfigurationLevel = RunConfigurationLevel.WORKSPACE) : Cloneable, RunnerAndConfigurationSettings, Comparable, SerializableScheme { companion object { @JvmStatic @@ -181,12 +181,12 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(val manager: wasSingletonSpecifiedExplicitly = false if (isTemplate) { - isSingleton = factory.isConfigurationSingletonByDefault + isSingleton = factory.singletonPolicy.isSingleton } else { val singletonStr = element.getAttributeValue(SINGLETON) if (singletonStr.isNullOrEmpty()) { - isSingleton = factory.isConfigurationSingletonByDefault + isSingleton = factory.singletonPolicy.isSingleton } else { wasSingletonSpecifiedExplicitly = true @@ -258,7 +258,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(val manager: if (!isActivateToolWindowBeforeRun) { element.setAttribute(ACTIVATE_TOOLWINDOW_BEFORE_RUN, "false") } - if (wasSingletonSpecifiedExplicitly || isSingleton != factory.isConfigurationSingletonByDefault) { + if (wasSingletonSpecifiedExplicitly || isSingleton != factory.singletonPolicy.isSingleton) { element.setAttribute(SINGLETON, isSingleton.toString()) } if (isTemporary) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.form b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.form index 7ee68c3aeae8..67427f3ccc2d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.form +++ b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.form @@ -95,7 +95,7 @@ - + diff --git a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java index ee94b3e7955a..9ce9ca261214 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java @@ -48,7 +48,7 @@ public final class SingleConfigurationConfigurable { } @NotNull - @Nls String getName(); @NotNull diff --git a/platform/platform-resources-en/src/messages/ExecutionBundle.properties b/platform/platform-resources-en/src/messages/ExecutionBundle.properties index b0ef90d1aa9d..0953b09fe905 100644 --- a/platform/platform-resources-en/src/messages/ExecutionBundle.properties +++ b/platform/platform-resources-en/src/messages/ExecutionBundle.properties @@ -311,7 +311,7 @@ show.swing.inspector=&Enable capturing form snapshots show.swing.inspector.disabled=&Enable capturing form snapshots (requires JRE 5.0 or higher) before.run.property.make=Make run.configuration.store.place.option=&Share -run.configuration.singleton=Single &instance only +run.configuration.singleton=Allow multiple &instances run.configuration.default.type.description=configuration #GeneralCommandLine diff --git a/plugins/devkit/devkit-core/src/gradle/GradleIntellijPluginFrameworkSupportProvider.java b/plugins/devkit/devkit-core/src/gradle/GradleIntellijPluginFrameworkSupportProvider.java index 4c9b39f207e0..a2c5715c9868 100644 --- a/plugins/devkit/devkit-core/src/gradle/GradleIntellijPluginFrameworkSupportProvider.java +++ b/plugins/devkit/devkit-core/src/gradle/GradleIntellijPluginFrameworkSupportProvider.java @@ -191,7 +191,6 @@ public class GradleIntellijPluginFrameworkSupportProvider extends GradleFramewor settings.setTaskNames(Collections.singletonList(":runIde")); settings.setExternalProjectPath(contentRootPath); } - configuration.setSingleton(true); runManager.addConfiguration(configuration); runManager.setSelectedConfiguration(configuration); } diff --git a/plugins/devkit/devkit-core/src/run/PluginConfigurationType.java b/plugins/devkit/devkit-core/src/run/PluginConfigurationType.java index 101898efe62e..05cd4bf2edb0 100644 --- a/plugins/devkit/devkit-core/src/run/PluginConfigurationType.java +++ b/plugins/devkit/devkit-core/src/run/PluginConfigurationType.java @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.idea.devkit.run; import com.intellij.diagnostic.VMOptions; @@ -47,11 +45,6 @@ public class PluginConfigurationType implements ConfigurationType { return ModuleUtil.hasModulesOfType(project, PluginModuleType.getInstance()); } - @Override - public boolean isConfigurationSingletonByDefault() { - return true; - } - @Override public RunConfiguration createConfiguration(String name, RunConfiguration template) { PluginRunConfiguration pluginRunConfiguration = (PluginRunConfiguration)template; diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java index 7b1f9aab1992..bb09e9d49cfd 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java @@ -1,3 +1,4 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.ipnb.configuration; import com.intellij.execution.RunManager; @@ -408,8 +409,6 @@ public final class IpnbConnectionManager implements ProjectComponent, Disposable final IpnbRunConfiguration configuration = (IpnbRunConfiguration)configurationSettings.getConfiguration(); configuration.setHost(IpnbConfigurationEditor.DEFAULT_HOST); configuration.setPort(IpnbConfigurationEditor.DEFAULT_PORT); - configurationSettings.setSingleton(true); - ExecutionUtil.runConfiguration(configurationSettings, DefaultRunExecutor.getRunExecutorInstance()); } else { diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/run/IpnbRunConfigurationType.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/run/IpnbRunConfigurationType.java index e3825b2610f8..f46c6e929a39 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/run/IpnbRunConfigurationType.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/run/IpnbRunConfigurationType.java @@ -50,11 +50,6 @@ public class IpnbRunConfigurationType implements ConfigurationType { super(type); } - @Override - public boolean isConfigurationSingletonByDefault() { - return true; - } - @Override @NotNull public RunConfiguration createTemplateConfiguration(@NotNull Project project) { diff --git a/python/openapi/src/com/jetbrains/python/run/PyRunConfigurationFactory.java b/python/openapi/src/com/jetbrains/python/run/PyRunConfigurationFactory.java index d63aec9d8954..4d4d9b190eb9 100644 --- a/python/openapi/src/com/jetbrains/python/run/PyRunConfigurationFactory.java +++ b/python/openapi/src/com/jetbrains/python/run/PyRunConfigurationFactory.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.jetbrains.python.run; import com.intellij.execution.RunnerAndConfigurationSettings; @@ -33,10 +19,9 @@ public abstract class PyRunConfigurationFactory { * * @param module the module in the context of which the script is run. * @param scriptName the path to the script file. - * @param singleton if true, the "Check no other instances are running" option will be set for the run configuration. * @return the settings of the created run configuration. */ - public abstract PythonRunConfigurationParams createPythonScriptRunConfiguration(Module module, String scriptName, boolean singleton); + public abstract PythonRunConfigurationParams createPythonScriptRunConfiguration(Module module, String scriptName); public abstract RunnerAndConfigurationSettings createRunConfiguration(Module module, ConfigurationFactory factory); } diff --git a/python/src/com/jetbrains/python/run/PyRunConfigurationFactoryImpl.java b/python/src/com/jetbrains/python/run/PyRunConfigurationFactoryImpl.java index 4121cdfcf724..33c42ab465d4 100644 --- a/python/src/com/jetbrains/python/run/PyRunConfigurationFactoryImpl.java +++ b/python/src/com/jetbrains/python/run/PyRunConfigurationFactoryImpl.java @@ -14,9 +14,8 @@ import org.jetbrains.annotations.NotNull; */ public class PyRunConfigurationFactoryImpl extends PyRunConfigurationFactory { @Override - public PythonRunConfigurationParams createPythonScriptRunConfiguration(Module module, String scriptName, boolean singleton) { + public PythonRunConfigurationParams createPythonScriptRunConfiguration(Module module, String scriptName) { RunnerAndConfigurationSettings settings = createRunConfiguration(module, PythonConfigurationType.getInstance().getFactory()); - settings.setSingleton(singleton); PythonRunConfigurationParams configuration = (PythonRunConfigurationParams)settings.getConfiguration(); configuration.setScriptName(scriptName); return configuration;