diff --git a/platform/execution-impl/src/com/intellij/execution/multilaunch/design/actions/EditExecutableAction.kt b/platform/execution-impl/src/com/intellij/execution/multilaunch/design/actions/EditExecutableAction.kt index 35d1d1ad9e01..a3d83b37c1cd 100644 --- a/platform/execution-impl/src/com/intellij/execution/multilaunch/design/actions/EditExecutableAction.kt +++ b/platform/execution-impl/src/com/intellij/execution/multilaunch/design/actions/EditExecutableAction.kt @@ -1,35 +1,20 @@ package com.intellij.execution.multilaunch.design.actions -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.ui.awt.RelativePoint -import com.intellij.execution.multilaunch.execution.executables.Executable -import com.intellij.execution.multilaunch.design.ExecutableRow -import com.intellij.execution.multilaunch.design.popups.ExecutableSelectionPopupFactory import com.intellij.idea.ActionsBundle +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent class EditExecutableAction : ManageExecutableAction(ActionsBundle.message("action.multilaunch.EditExecutableAction.text")) { - override fun actionPerformed(e: AnActionEvent) { - val project = e.project ?: return - val configuration = e.configuration ?: return - val viewModel = e.executablesViewModel ?: return - val popupBounds = e.popupBounds ?: return + override fun getActionUpdateThread() = ActionUpdateThread.EDT + + override fun update(e: AnActionEvent) { val editableRow = e.editableRow ?: return + e.presentation.isEnabledAndVisible = editableRow.executable?.supportsEditing ?: false + } - fun handleChosen(executables: List) { - executables.filterNotNull().forEach { executable -> - val newRow = ExecutableRow(executable, editableRow.condition, editableRow.disableDebugging) - viewModel.replaceRow(editableRow, newRow) - } - } - - val existingExecutables = viewModel.rows.mapNotNull { it?.executable } - ExecutableSelectionPopupFactory - .getInstance(project) - .createPopup(configuration, existingExecutables, false, ::handleChosen) - .apply { - setMinimumSize(popupBounds.size) - show(RelativePoint(popupBounds.location)) - } + override fun actionPerformed(e: AnActionEvent) { + val editableRow = e.editableRow ?: return + editableRow.executable?.performEdit() } } diff --git a/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/Executable.kt b/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/Executable.kt index 667e14e0fefc..2837bcddb644 100644 --- a/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/Executable.kt +++ b/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/Executable.kt @@ -18,8 +18,10 @@ abstract class Executable( open suspend fun cancel() {} open val beforeExecuteTasks: List = emptyList() - open val supportsDebugging: Boolean = false + open val supportsEditing: Boolean = false + + open fun performEdit() {} /** * May return null if executable is without configurable parameters. diff --git a/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/impl/RunConfigurationExecutableManager.kt b/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/impl/RunConfigurationExecutableManager.kt index 0f13d4448e34..979613dd977f 100644 --- a/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/impl/RunConfigurationExecutableManager.kt +++ b/platform/execution-impl/src/com/intellij/execution/multilaunch/execution/executables/impl/RunConfigurationExecutableManager.kt @@ -5,22 +5,25 @@ import com.intellij.execution.compound.CompoundRunConfiguration import com.intellij.execution.configurations.RunConfiguration import com.intellij.execution.configurations.WrappingRunConfiguration import com.intellij.execution.executors.DefaultRunExecutor +import com.intellij.execution.impl.EditConfigurationsDialog import com.intellij.execution.impl.ExecutionManagerImpl -import com.intellij.execution.process.ProcessAdapter -import com.intellij.execution.process.ProcessEvent -import com.intellij.execution.runners.ExecutionUtil -import com.intellij.execution.runners.ProgramRunner -import com.intellij.execution.ui.RunContentDescriptor -import com.intellij.openapi.components.Service -import com.intellij.openapi.components.service -import com.intellij.openapi.project.Project -import com.jetbrains.rd.util.lifetime.Lifetime +import com.intellij.execution.impl.RunConfigurationSelector import com.intellij.execution.multilaunch.MultiLaunchConfiguration import com.intellij.execution.multilaunch.execution.BeforeExecuteTask import com.intellij.execution.multilaunch.execution.ExecutionMode import com.intellij.execution.multilaunch.execution.executables.Executable import com.intellij.execution.multilaunch.execution.executables.ExecutableTemplate import com.intellij.execution.multilaunch.state.ExecutableSnapshot +import com.intellij.execution.process.ProcessAdapter +import com.intellij.execution.process.ProcessEvent +import com.intellij.execution.runners.ExecutionUtil +import com.intellij.execution.runners.ProgramRunner +import com.intellij.execution.ui.RunContentDescriptor +import com.intellij.ide.DataManager +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import com.jetbrains.rd.util.lifetime.Lifetime import com.intellij.openapi.ui.MessageType import com.intellij.openapi.util.text.HtmlBuilder import com.intellij.openapi.util.text.HtmlChunk @@ -65,12 +68,19 @@ class RunConfigurationExecutableManager(private val project: Project) : Executab .map { BeforeRunTaskProvider.getProvider(project, it.providerId)?.name ?: it.providerId.toString()} .map { BeforeExecuteTask(it) } - override val supportsDebugging: Boolean - get() = true + override val supportsDebugging = true + override val supportsEditing = true override fun saveAttributes(snapshot: ExecutableSnapshot) {} override fun loadAttributes(snapshot: ExecutableSnapshot) {} + override fun performEdit() { + val dialog = EditConfigurationsDialog.findInstanceFromFocus() ?: return + val dialogContext = DataManager.getInstance().getDataContext(dialog.getPreferredFocusedComponent()) + val selector = RunConfigurationSelector.KEY.getData(dialogContext) ?: return + selector.select(settings.configuration) + } + override suspend fun execute(mode: ExecutionMode, lifetime: Lifetime): RunContentDescriptor? { val executor = when (mode) { ExecutionMode.Run -> DefaultRunExecutor.getRunExecutorInstance()