Skip to content

Commit 5f9ac9c

Browse files
committed
Convert LocalLambdaRunSettingsEditorPanel to Kotlin and fix #955
1 parent adf0ce1 commit 5f9ac9c

File tree

2 files changed

+172
-181
lines changed

2 files changed

+172
-181
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/execution/local/LocalLambdaRunSettingsEditorPanel.java

-181
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package software.aws.toolkits.jetbrains.services.lambda.execution.local
4+
5+
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
6+
import com.intellij.openapi.project.Project
7+
import com.intellij.openapi.ui.ComboBox
8+
import com.intellij.openapi.ui.TextComponentAccessor
9+
import com.intellij.openapi.ui.TextFieldWithBrowseButton
10+
import com.intellij.ui.IdeBorderFactory
11+
import com.intellij.ui.SortedComboBoxModel
12+
import com.intellij.util.ui.JBUI
13+
import com.intellij.util.ui.UIUtil
14+
import org.jetbrains.yaml.YAMLFileType
15+
import software.amazon.awssdk.services.lambda.model.Runtime
16+
import software.aws.toolkits.core.utils.tryOrNull
17+
import software.aws.toolkits.jetbrains.services.cloudformation.Function
18+
import software.aws.toolkits.jetbrains.services.lambda.LambdaWidgets.lambdaMemory
19+
import software.aws.toolkits.jetbrains.services.lambda.LambdaWidgets.lambdaTimeout
20+
import software.aws.toolkits.jetbrains.services.lambda.execution.LambdaInputPanel
21+
import software.aws.toolkits.jetbrains.services.lambda.sam.SamTemplateUtils.findFunctionsFromTemplate
22+
import software.aws.toolkits.jetbrains.services.lambda.validOrNull
23+
import software.aws.toolkits.jetbrains.ui.EnvironmentVariablesTextField
24+
import software.aws.toolkits.jetbrains.ui.HandlerPanel
25+
import software.aws.toolkits.jetbrains.ui.ProjectFileBrowseListener
26+
import software.aws.toolkits.jetbrains.ui.SliderPanel
27+
import software.aws.toolkits.jetbrains.utils.ui.addQuickSelect
28+
import software.aws.toolkits.jetbrains.utils.ui.find
29+
import software.aws.toolkits.resources.message
30+
import java.awt.event.ActionEvent
31+
import java.io.File
32+
import java.util.Comparator
33+
import java.util.function.Consumer
34+
import javax.swing.DefaultComboBoxModel
35+
import javax.swing.JCheckBox
36+
import javax.swing.JComboBox
37+
import javax.swing.JPanel
38+
import javax.swing.SwingUtilities
39+
40+
class LocalLambdaRunSettingsEditorPanel(private val project: Project) {
41+
lateinit var panel: JPanel
42+
lateinit var handlerPanel: HandlerPanel
43+
lateinit var environmentVariables: EnvironmentVariablesTextField
44+
private lateinit var runtimeModel: SortedComboBoxModel<Runtime>
45+
lateinit var runtime: JComboBox<Runtime>
46+
lateinit var lambdaInput: LambdaInputPanel
47+
lateinit var useTemplate: JCheckBox
48+
lateinit var function: JComboBox<Function>
49+
private lateinit var functionModels: DefaultComboBoxModel<Function>
50+
lateinit var templateFile: TextFieldWithBrowseButton
51+
lateinit var lambdaInputPanel: JPanel
52+
lateinit var timeoutSlider: SliderPanel
53+
lateinit var memorySlider: SliderPanel
54+
lateinit var invalidator: JCheckBox
55+
56+
var lastSelectedRuntime: Runtime? = null
57+
58+
private fun createUIComponents() {
59+
handlerPanel = HandlerPanel(project)
60+
lambdaInput = LambdaInputPanel(project)
61+
functionModels = DefaultComboBoxModel()
62+
function = ComboBox(functionModels)
63+
function.addActionListener { updateComponents() }
64+
runtimeModel = SortedComboBoxModel(compareBy(Comparator.naturalOrder()) { it: Runtime -> it.toString() })
65+
runtime = ComboBox(runtimeModel)
66+
environmentVariables = EnvironmentVariablesTextField()
67+
timeoutSlider = lambdaTimeout()
68+
memorySlider = lambdaMemory()
69+
}
70+
71+
init {
72+
lambdaInputPanel.border = IdeBorderFactory.createTitledBorder(message("lambda.input.label"), false, JBUI.emptyInsets())
73+
useTemplate.addActionListener { e: ActionEvent? -> updateComponents() }
74+
templateFile.textField.addQuickSelect(useTemplate, Runnable { updateComponents() })
75+
templateFile.addActionListener(
76+
ProjectFileBrowseListener(
77+
project,
78+
templateFile,
79+
FileChooserDescriptorFactory.createSingleFileDescriptor(YAMLFileType.YML),
80+
TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT
81+
) {
82+
setTemplateFile(it.canonicalPath)
83+
}
84+
)
85+
runtime.addActionListener { e: ActionEvent? ->
86+
val index = runtime.selectedIndex
87+
if (index < 0) {
88+
lastSelectedRuntime = null
89+
return@addActionListener
90+
}
91+
val selectedRuntime = runtime.getItemAt(index)
92+
if (selectedRuntime == lastSelectedRuntime) return@addActionListener
93+
lastSelectedRuntime = selectedRuntime
94+
handlerPanel.setRuntime(selectedRuntime)
95+
}
96+
updateComponents()
97+
}
98+
99+
private fun updateComponents() {
100+
val handler = handlerPanel.handler
101+
handlerPanel.isEnabled = !useTemplate.isSelected
102+
runtime.isEnabled = !useTemplate.isSelected
103+
templateFile.isEnabled = useTemplate.isSelected
104+
timeoutSlider.setEnabled(!useTemplate.isSelected)
105+
memorySlider.setEnabled(!useTemplate.isSelected)
106+
if (useTemplate.isSelected) {
107+
handler.background = UIUtil.getComboBoxDisabledBackground()
108+
handler.foreground = UIUtil.getComboBoxDisabledForeground()
109+
if (functionModels.selectedItem is Function) {
110+
val selected = functionModels.selectedItem as Function
111+
handler.text = selected.handler()
112+
val memorySize = selected.memorySize()
113+
val timeout = selected.timeout()
114+
if (memorySize != null) {
115+
memorySlider.value = memorySize
116+
}
117+
if (timeout != null) {
118+
timeoutSlider.value = timeout
119+
}
120+
val runtime = Runtime.fromValue(tryOrNull { selected.runtime() })
121+
runtimeModel.selectedItem = runtime.validOrNull
122+
function.isEnabled = true
123+
}
124+
} else {
125+
handler.background = UIUtil.getTextFieldBackground()
126+
handler.foreground = UIUtil.getTextFieldForeground()
127+
function.setEnabled(false)
128+
}
129+
}
130+
131+
fun setTemplateFile(file: String?) {
132+
if (file == null) {
133+
templateFile.text = ""
134+
updateFunctionModel(emptyList(), false)
135+
} else {
136+
templateFile.text = file
137+
val functions = findFunctionsFromTemplate(
138+
project, File(file)
139+
)
140+
updateFunctionModel(functions, false)
141+
}
142+
}
143+
144+
private fun updateFunctionModel(functions: List<Function>, selectSingle: Boolean) {
145+
functionModels.removeAllElements()
146+
function.isEnabled = functions.isNotEmpty()
147+
functions.forEach(Consumer { anObject: Function -> functionModels.addElement(anObject) })
148+
if (selectSingle && functions.size == 1) {
149+
functionModels.setSelectedItem(functions[0])
150+
} else {
151+
function.setSelectedIndex(-1)
152+
}
153+
updateComponents()
154+
}
155+
156+
fun selectFunction(logicalFunctionName: String?) {
157+
if (logicalFunctionName == null) return
158+
val function = functionModels.find { f: Function -> f.logicalName == logicalFunctionName }
159+
if (function != null) {
160+
functionModels.selectedItem = function
161+
updateComponents()
162+
}
163+
}
164+
165+
fun setRuntimes(runtimes: List<Runtime>?) {
166+
runtimeModel.setAll(runtimes)
167+
}
168+
169+
fun invalidateConfiguration() {
170+
SwingUtilities.invokeLater { invalidator.isSelected = !invalidator.isSelected }
171+
}
172+
}

0 commit comments

Comments
 (0)