@@ -22,6 +22,7 @@ import com.intellij.openapi.roots.ModuleRootManager
2222import com.intellij.openapi.roots.ModuleRootModificationUtil
2323import com.intellij.openapi.roots.ModuleSourceOrderEntry
2424import com.intellij.openapi.roots.ui.configuration.ClasspathEditor
25+ import com.intellij.openapi.roots.ui.configuration.ComboBoxWithSeparators
2526import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable
2627import com.intellij.openapi.ui.ComboBox
2728import com.intellij.openapi.ui.DialogPanel
@@ -194,12 +195,12 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
194195 private val codegenLanguages = createComboBox(CodegenLanguage .values())
195196 private val testFrameworks = createComboBox(TestFramework .allItems.toTypedArray())
196197
197- private val modelSpringConfigs = (
198- listOf (NO_SPRING_CONFIGURATION_OPTION ) +
199- model.getSortedSpringConfigurationClasses() +
200- model.getSpringXMLConfigurationFiles()
201- ).toTypedArray( )
202- private val springConfig = createComboBox (modelSpringConfigs)
198+ private val modelSpringConfigs = setOf (
199+ null to listOf (NO_SPRING_CONFIGURATION_OPTION ),
200+ " Java-based configurations " to model.getSortedSpringConfigurationClasses(),
201+ " XML-based configurations " to model.getSpringXMLConfigurationFiles()
202+ )
203+ private val springConfig = createComboBoxWithSeparatorsForSpringConfigs (modelSpringConfigs)
203204
204205 private val mockStrategies = createComboBox(MockStrategyApi .values())
205206 private val staticsMocking = JCheckBox (" Mock static methods" )
@@ -240,27 +241,27 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
240241 }
241242 }
242243
243- private fun <T > createComboBox (values : Array <T >): ComboBox <T > {
244- val comboBoxWidth = 300
245- val maxComboBoxElementLength = 50
246- return object : ComboBox <T >(DefaultComboBoxModel (values), comboBoxWidth) {}.also {
247- it.renderer = object : DefaultListCellRenderer () {
248- override fun getListCellRendererComponent (
249- list : JList <* >? ,
250- value : Any? ,
251- index : Int ,
252- isSelected : Boolean ,
253- cellHasFocus : Boolean
254- ): Component {
255- val label =
256- super .getListCellRendererComponent(list, value, index, isSelected, cellHasFocus)
257- text = StringUtil .trimMiddle(value.toString(), maxComboBoxElementLength)
258- return label
244+ private fun <T > createComboBoxWithSeparatorsForSpringConfigs (
245+ separatorToValues : Collection <Pair <T ?, Collection <T >>>,
246+ width : Int = 300
247+ ): ComboBoxWithSeparators <T > {
248+ val comboBox = object : ComboBoxWithSeparators <T >() {}.apply {
249+ fun wrapInEntryModel (value : T ) = object : ComboBoxWithSeparators <T >.EntryModel <T >(value) {
250+ override fun getPresentableText (): String = value.toString()
251+ }
252+
253+ setMinimumAndPreferredWidth(width)
254+ separatorToValues.forEach { (separator, values) ->
255+ if (values.isEmpty()) return @forEach
256+ separator?.let { addItem(Separator (it.toString())) }
257+ values.forEach { value ->
258+ addItem(wrapInEntryModel(value))
259259 }
260260 }
261261 }
262- }
263262
263+ return comboBox
264+ }
264265
265266 private fun createHelpLabel (commonTooltip : String? = null) = JBLabel (AllIcons .General .ContextHelp ).apply {
266267 if (! commonTooltip.isNullOrEmpty()) toolTipText = commonTooltip
@@ -341,7 +342,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
341342 " Otherwise, mock nothing. Mockito will be installed, if you don't have one." )
342343 )
343344 }.enableIf(ComboBoxPredicate (springConfig) {
344- model.projectType != ProjectType .Spring || springConfig.item == NO_SPRING_CONFIGURATION_OPTION
345+ model.projectType != ProjectType .Spring || springConfig.item.getItem() == NO_SPRING_CONFIGURATION_OPTION
345346 })
346347 row { component(staticsMocking)}
347348 row {
@@ -580,9 +581,9 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
580581 model.testSourceRoot?.apply { model.updateSourceRootHistory(this .toNioPath().toString()) }
581582
582583 model.typeReplacementApproach =
583- when (springConfig.item) {
584+ when (springConfig.item.getItem() ) {
584585 NO_SPRING_CONFIGURATION_OPTION -> TypeReplacementApproach .DoNotReplace
585- else -> TypeReplacementApproach .ReplaceIfPossible (springConfig.item)
586+ else -> TypeReplacementApproach .ReplaceIfPossible (springConfig.item.getItem().toString() )
586587 }
587588
588589 val settings = model.project.service<Settings >()
@@ -1023,7 +1024,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
10231024 }
10241025
10251026 springConfig.addActionListener { _ ->
1026- val isSpringConfigSelected = springConfig.item != NO_SPRING_CONFIGURATION_OPTION
1027+ val isSpringConfigSelected = springConfig.item.getItem() != NO_SPRING_CONFIGURATION_OPTION
10271028 if (isSpringConfigSelected) {
10281029 // Here mock strategy gains more meaning in Spring Projects.
10291030 // We use OTHER_CLASSES strategy combined with type replacement being enabled.
@@ -1114,10 +1115,6 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
11141115 // We check for > 1 because there is already extra-dummy NO_SPRING_CONFIGURATION_OPTION option
11151116 springConfig.isEnabled = model.projectType == ProjectType .Spring
11161117 && modelSpringConfigs.size > 1
1117-
1118- if (! springConfig.isEnabled) {
1119- springConfig.item = NO_SPRING_CONFIGURATION_OPTION
1120- }
11211118 }
11221119
11231120 private fun staticsMockingConfigured (): Boolean {
0 commit comments