@@ -47,6 +47,7 @@ import javax.swing.event.PopupMenuListener
47
47
private data class ConfigurableParameters (
48
48
var isPluginEnabled : Boolean ,
49
49
var usingUart : Boolean ,
50
+ var enableManualEditing : Boolean ,
50
51
var filterManufacturers : Boolean ,
51
52
var portName : String ,
52
53
var webReplIp : String ,
@@ -81,6 +82,7 @@ internal class MpyConfigurable(private val project: Project) :
81
82
ConfigurableParameters (
82
83
isPluginEnabled = isPluginEnabled,
83
84
usingUart = usingUart,
85
+ enableManualEditing = enableManualEditing,
84
86
filterManufacturers = filterManufacturers,
85
87
portName = if (portName.isNullOrBlank()) EMPTY_PORT_NAME_TEXT else portName.toString(),
86
88
webReplIp = webReplIp ? : DEFAULT_WEBREPL_IP ,
@@ -105,6 +107,7 @@ internal class MpyConfigurable(private val project: Project) :
105
107
private lateinit var serialRadioButton: Cell <JBRadioButton >
106
108
private lateinit var webReplRadioButton: Cell <JBRadioButton >
107
109
110
+ private lateinit var enableManualEditingCheckbox: Cell <JBCheckBox >
108
111
private lateinit var filterManufacturersCheckBox: Cell <JBCheckBox >
109
112
private lateinit var portSelectComboBox: Cell <ComboBox <String >>
110
113
@@ -137,6 +140,18 @@ internal class MpyConfigurable(private val project: Project) :
137
140
}
138
141
139
142
indent {
143
+ row {
144
+ enableManualEditingCheckbox = checkBox(" Edit port manually" )
145
+ .bindSelected(parameters::enableManualEditing)
146
+ .applyToComponent {
147
+ addActionListener {
148
+ val comboBox = portSelectComboBox.component
149
+ comboBox.isEditable = isSelected
150
+ comboBox.revalidate()
151
+ comboBox.repaint()
152
+ }
153
+ }
154
+ }
140
155
row {
141
156
filterManufacturersCheckBox = checkBox(" Filter out devices with unknown manufacturers" )
142
157
.bindSelected(parameters::filterManufacturers)
@@ -150,7 +165,7 @@ internal class MpyConfigurable(private val project: Project) :
150
165
{ parameters.portName = it.takeIf { ! it.isNullOrBlank() } ? : EMPTY_PORT_NAME_TEXT }
151
166
)
152
167
.applyToComponent {
153
- isEditable = false
168
+ isEditable = parameters.enableManualEditing
154
169
selectedItem = parameters.portName
155
170
156
171
addPopupMenuListener(object : PopupMenuListener {
@@ -161,6 +176,30 @@ internal class MpyConfigurable(private val project: Project) :
161
176
override fun popupMenuWillBecomeInvisible (e : PopupMenuEvent ? ) {}
162
177
override fun popupMenuCanceled (e : PopupMenuEvent ? ) {}
163
178
})
179
+
180
+ // Add listener to detect typing changes in the editor
181
+ val editorComponent = editor.editorComponent
182
+ if (editorComponent is javax.swing.JTextField ) {
183
+ editorComponent.document.addDocumentListener(object :
184
+ javax.swing.event.DocumentListener {
185
+ override fun insertUpdate (e : javax.swing.event.DocumentEvent ? ) =
186
+ updateModel()
187
+
188
+ override fun removeUpdate (e : javax.swing.event.DocumentEvent ? ) =
189
+ updateModel()
190
+
191
+ override fun changedUpdate (e : javax.swing.event.DocumentEvent ? ) =
192
+ updateModel()
193
+
194
+ private fun updateModel () {
195
+ val text = editorComponent.text
196
+ if (text != parameters.portName) {
197
+ parameters.portName = text
198
+ settingsPanel.validateAll()
199
+ }
200
+ }
201
+ })
202
+ }
164
203
}
165
204
}
166
205
}.visibleIf(serialRadioButton.selected)
@@ -339,6 +378,7 @@ internal class MpyConfigurable(private val project: Project) :
339
378
340
379
settings.state.isPluginEnabled = isPluginEnabled
341
380
settings.state.usingUart = usingUart
381
+ settings.state.enableManualEditing = enableManualEditing
342
382
settings.state.filterManufacturers = filterManufacturers
343
383
settings.state.portName = portName.takeUnless { it == EMPTY_PORT_NAME_TEXT }
344
384
0 commit comments