summaryrefslogtreecommitdiff
path: root/src/main/kotlin/me/kyren223/trident/ui/TridentMappingsMenu.kt
blob: 79f1df8bcbd4820624c55770709bd0af13f56c5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package me.kyren223.trident.ui

import com.intellij.openapi.editor.EditorSettings
import com.intellij.openapi.editor.LogicalPosition
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.ui.EditorTextField
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.state.mode.Mode
import me.kyren223.trident.data.SettingsState
import me.kyren223.trident.utils.TridentMappings
import me.kyren223.trident.utils.setEditorMode
import java.awt.event.FocusEvent
import java.awt.event.FocusListener
import javax.swing.JComponent

class TridentMappingsMenu(private val content: String) : DialogWrapper(true) {
    private lateinit var editor: EditorTextField

    init {
        val settings = SettingsState.instance.state
        this.title = "Trident Mappings"
        setSize(settings.width, settings.height)
        super.init()
    }

    override fun createCenterPanel(): JComponent {
        editor = EditorTextField(this.content)
        editor.setOneLineMode(false)
        editor.addSettingsProvider {
            it.setFontSize(SettingsState.instance.fontSize)
            it.isInsertMode = false
            it.caretModel.moveToLogicalPosition(LogicalPosition(0, 0))
            it.settings.isLineNumbersShown = true
            it.settings.lineNumerationType = EditorSettings.LineNumerationType.ABSOLUTE
        }

        editor.addFocusListener(object : FocusListener {
            override fun focusGained(e: FocusEvent?) {
                val editor = editor.editor!!.vim
                setEditorMode(editor, Mode.NORMAL())
            }

            override fun focusLost(e: FocusEvent?) { /* Do nothing */ }
        })

        return editor
    }

    override fun getPreferredFocusedComponent(): JComponent {
        return this.editor
    }

    override fun doOKAction() {
        save()
        super.doOKAction()
    }

    override fun doCancelAction() {
        save()
        super.doCancelAction()
    }

    private fun save() {
        map = editor.text.split("\n")
            .map { entry -> entry.split("=") }
            .filter { entry -> entry.size == 2 }
            .associate { it[0] to it[1] }
    }

    override fun createSouthPanel(): JComponent? {
        return null
    }

    companion object {
        var map: Map<String, String>? = null
        fun open(project: Project) {
            val content = TridentMappings.get(project).entries
                .joinToString("\n") { "${it.key}=${it.value}" }
            val menu = TridentMappingsMenu(content)
            menu.show()
            map?.let { TridentMappings.set(project, it) }
            map = null
        }
    }
}