Coverage Summary for Class: ActionListComponent (ru.eda.plgn.bizgen.plugin.ui)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| ActionListComponent |
0%
(0/7)
|
0%
(0/6)
|
0%
(0/17)
|
0%
(0/80)
|
| ActionListComponent$Companion |
|
| ActionListComponent$reset$1 |
0%
(0/2)
|
0%
(0/4)
|
0%
(0/9)
|
0%
(0/43)
|
| Total |
0%
(0/9)
|
0%
(0/10)
|
0%
(0/26)
|
0%
(0/123)
|
package ru.eda.plgn.bizgen.plugin.ui
import com.intellij.openapi.actionSystem.ActionToolbarPosition
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.ui.Messages.showYesNoDialog
import com.intellij.ui.CheckBoxList
import com.intellij.ui.CheckBoxListListener
import com.intellij.ui.ListUtil
import com.intellij.ui.ToolbarDecorator.createDecorator
import com.intellij.ui.dsl.builder.Align
import com.intellij.ui.dsl.builder.panel
import com.intellij.util.ui.JBUI
import ru.eda.plgn.bizgen.plugin.actions.BizGenSelectedActionEvent
import ru.eda.plgn.bizgen.plugin.actions.GeneratorActionService
import ru.eda.plgn.bizgen.plugin.di.getBizGenService
import ru.eda.plgn.bizgen.plugin.settings.AppActionSettingsService
import ru.eda.plgn.bizgen.plugin.settings.AppActionSettingsService.Direction
import ru.eda.plgn.bizgen.plugin.settings.model.BizGenAppSettings.ActionSettingsView
import javax.swing.JPanel
import javax.swing.event.ListSelectionListener
/**
* Компонент, который отвечает за отображение доступных генераторов с возможностью:
* - Изменение порядка отображения их в списке действий в редакторе
* - Включением\отключением их из списка отображения действий в редакторе
* - Отправляет событие в шину какой именно генератор выбран
* - Предоставляет возможность сбросить настройки списка генераторов до значения по умолчанию
*/
class AppActionsSettingComponent {
/**
* Создание компонента отображения доступных генераторов.
*
* @return созданный компонент
*/
fun createComponent(): JPanel = panel {
val actionListComponent = ActionListComponent().apply {
addListSelectionListener(selectionListener(this))
}
// панель, которая включает основные действия со списком
val decoratedPanel = createDecorator(actionListComponent)
.setToolbarPosition(ActionToolbarPosition.TOP)
.setPanelBorder(JBUI.Borders.empty())
.setScrollPaneBorder(JBUI.Borders.empty())
.disableAddAction()
.disableRemoveAction()
.setMoveUpAction { _ -> actionListComponent.moveUpOrDown(true) }
.setMoveDownAction { _ -> actionListComponent.moveUpOrDown(false) }
.addExtraAction(actionListComponent.reset())
.createPanel()
row {
cell(decoratedPanel)
.align(Align.FILL)
.resizableColumn()
}.resizableRow()
}
private fun selectionListener(checkBoxList: CheckBoxList<String>): ListSelectionListener = ListSelectionListener { event ->
// обработка идёт только финального события
if (!event.valueIsAdjusting) {
val selectedIndex = checkBoxList.selectedIndex
val actionSetting = getBizGenService<AppActionSettingsService>().findByPosition(selectedIndex) ?: return@ListSelectionListener
val generatorAction = getBizGenService<GeneratorActionService>().findActionById(actionSetting.id) ?: return@ListSelectionListener
BizGenSelectedActionEvent.publish(generatorAction)
}
}
}
private class ActionListComponent : CheckBoxList<String>(listener) {
private val availableActions: List<ActionSettingsView> = getBizGenService<AppActionSettingsService>().getActionSettings()
init {
fillByActions()
}
fun fillByActions(actions: List<ActionSettingsView> = availableActions) {
clear()
actions.forEach { action ->
addItem(action.id, action.description, action.active)
}
}
fun moveUpOrDown(isUp: Boolean) {
val service = getBizGenService<AppActionSettingsService>()
val direction = if (isUp) Direction.UP else Direction.DOWN
if (service.moveTo(selectedIndex, direction)) {
if (isUp) ListUtil.moveSelectedItemsUp(this) else ListUtil.moveSelectedItemsDown(this)
}
}
fun reset(): AnAction = object : AnAction("Reset") {
override fun actionPerformed(e: AnActionEvent) {
showYesNoDialog(
"Вы уверены, что хотите сбросить настройки до значений по умолчанию?",
"Сброс Настроек",
Messages.getInformationIcon()
).takeIf { it == Messages.YES }?.let {
clear()
fillByActions(getBizGenService<AppActionSettingsService>().restoreByDefault())
}
}
}
companion object {
private val listener: CheckBoxListListener = CheckBoxListListener { index, value ->
getBizGenService<AppActionSettingsService>().changeActivity(index, value)
}
}
}