summaryrefslogtreecommitdiff
path: root/src/main/kotlin/me/kyren223/trident/ui/TridentListMenu.kt
blob: 45eaf7632afae944efe907991153dd671253b3d3 (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package me.kyren223.trident.ui

import com.intellij.openapi.editor.EditorSettings
import com.intellij.openapi.editor.LogicalPosition
import com.intellij.openapi.fileEditor.FileEditorManager
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.TridentList
import me.kyren223.trident.utils.injectEnterToSelectMapping
import java.awt.event.FocusEvent
import java.awt.event.FocusListener
import javax.swing.JComponent

class TridentListMenu(private val content: String) : DialogWrapper(true) {

    private lateinit var editor: EditorTextField

    init {
        this.title = "Trident List"
        val settings = SettingsState.instance
        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
            val lineNumber = if (SettingsState.instance.rememberLine) line else 0
            it.caretModel.moveToLogicalPosition(LogicalPosition(lineNumber, 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
                editor.mode = Mode.NORMAL()
//                setEditorMode(editor, Mode.NORMAL())
            }

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

        return editor
    }


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

    fun select() {
        doOKAction()
    }

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

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

    private fun save() {
        instance = null
        files = editor.text.split("\n")
        line = editor.editor?.caretModel?.logicalPosition?.line ?: 0
    }

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

    companion object {
        var instance: TridentListMenu? = null
        var files: List<String>? = null
        var line = 0
        fun open(project: Project) {
            val content = TridentList.get(project).joinToString("\n")
            instance = TridentListMenu(content)
            injectEnterToSelectMapping()
            val selected = instance!!.showAndGet()

            files?.let { TridentList.set(project, it) }
            files = null

            if (!selected) return
            val file = TridentList.select(project, line) ?: return
            FileEditorManager.getInstance(project).openFile(file, true)
        }
    }
}