8432cee578427c000e540c0a4cf571670d9869a2
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / lineMarker / ExecutorAction.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.execution.lineMarker
17
18 import com.intellij.execution.Executor
19 import com.intellij.execution.ExecutorRegistry
20 import com.intellij.execution.actions.*
21 import com.intellij.execution.configurations.LocatableConfiguration
22 import com.intellij.execution.impl.RunManagerImpl
23 import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl
24 import com.intellij.ide.DataManager
25 import com.intellij.openapi.actionSystem.ActionManager
26 import com.intellij.openapi.actionSystem.AnAction
27 import com.intellij.openapi.actionSystem.AnActionEvent
28 import com.intellij.openapi.actionSystem.DataContext
29 import com.intellij.openapi.util.Key
30
31 /**
32  * @author Dmitry Avdeev
33  */
34 class ExecutorAction private constructor(private val myOrigin: AnAction,
35                                          private val myExecutor: Executor,
36                                          private val myOrder: Int) : AnAction() {
37
38   init {
39     copyFrom(myOrigin)
40   }
41
42   companion object {
43     private val CONFIGURATION_CACHE = Key.create<List<ConfigurationFromContext>>("ConfigurationFromContext")
44
45     fun getActions(order: Int): Array<AnAction> {
46       return ExecutorRegistry.getInstance().registeredExecutors.map {
47         ExecutorAction(ActionManager.getInstance().getAction(it.contextActionId), it, order)
48       }.toTypedArray()
49     }
50
51     private fun getConfigurations(dataContext: DataContext): List<ConfigurationFromContext> {
52       var result = DataManager.getInstance().loadFromDataContext(dataContext, CONFIGURATION_CACHE)
53       if (result == null) {
54         result = calcConfigurations(dataContext)
55         DataManager.getInstance().saveInDataContext(dataContext, CONFIGURATION_CACHE, result)
56       }
57       return result
58     }
59
60     private fun calcConfigurations(dataContext: DataContext): List<ConfigurationFromContext> {
61       val context = ConfigurationContext.getFromContext(dataContext)
62       if (context.location == null) {
63         return emptyList()
64       }
65       return RunConfigurationProducer.getProducers(context.project).mapNotNull {
66         val configuration = it.createLightConfiguration(context) ?: return@mapNotNull null
67         val settings = RunnerAndConfigurationSettingsImpl(RunManagerImpl.getInstanceImpl(context.project), configuration, false)
68         ConfigurationFromContextImpl(it, settings, context.psiLocation)
69       }
70     }
71   }
72
73   override fun update(e: AnActionEvent) {
74     val name = getActionName(e.dataContext, myExecutor)
75     e.presentation.isVisible = name != null
76     e.presentation.text = name
77   }
78
79   override fun actionPerformed(e: AnActionEvent) {
80     myOrigin.actionPerformed(e)
81   }
82
83   private fun getActionName(dataContext: DataContext, executor: Executor): String? {
84     val list = getConfigurations(dataContext)
85     if (list.isEmpty()) {
86       return null
87     }
88     val configuration = list[if (myOrder < list.size) myOrder else 0]
89     val actionName = BaseRunConfigurationAction.suggestRunActionName(configuration.configuration as LocatableConfiguration)
90     return executor.getStartActionText(actionName)
91   }
92 }