summaryrefslogtreecommitdiff
path: root/src/main/kotlin/me/kyren223/trident/ui/TridentMappingsMenu.kt
blob: a84b561ad604807efd6f72412ea2e050a8a6dcc4 (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
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
        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() {
        val map = editor.text.split("\n")
            .map { entry -> entry.split("=") }
            .filter { entry -> entry.size == 2 }
            .associate { it[0] to it[1] }
        TridentMappings.set(editor.project, map)
    }

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

    companion object {
        fun open(project: Project) {
            val content = TridentMappings.get(project).entries
                .joinToString("\n") { "${it.key}=${it.value}" }
            val menu = TridentMappingsMenu(content)
            menu.show()
        }
    }
}