Multi-Launch: Redirect to specific configuration on 'Edit'

GitOrigin-RevId: 5043493a2de75c6a4a7abe1a1c561a582fd51c0d
This commit is contained in:
Andrii Rublov
2023-10-26 03:47:18 +02:00
committed by intellij-monorepo-bot
parent 67565ac18b
commit 6d40b840f4
3 changed files with 34 additions and 37 deletions

View File

@@ -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<Executable?>) {
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()
}
}

View File

@@ -18,8 +18,10 @@ abstract class Executable(
open suspend fun cancel() {}
open val beforeExecuteTasks: List<BeforeExecuteTask> = emptyList()
open val supportsDebugging: Boolean = false
open val supportsEditing: Boolean = false
open fun performEdit() {}
/**
* May return null if executable is without configurable parameters.

View File

@@ -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()