mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
feat: shortcut key prediction (#126)
This commit is contained in:
@@ -12,9 +12,9 @@ import org.apache.commons.lang3.StringUtils
|
|||||||
import org.jdesktop.swingx.action.ActionManager
|
import org.jdesktop.swingx.action.ActionManager
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import java.awt.KeyEventDispatcher
|
import java.awt.KeyEventDispatcher
|
||||||
import java.awt.KeyEventPostProcessor
|
|
||||||
import java.awt.KeyboardFocusManager
|
import java.awt.KeyboardFocusManager
|
||||||
import java.awt.event.KeyEvent
|
import java.awt.event.KeyEvent
|
||||||
|
import javax.swing.JComponent
|
||||||
import javax.swing.JDialog
|
import javax.swing.JDialog
|
||||||
import javax.swing.KeyStroke
|
import javax.swing.KeyStroke
|
||||||
|
|
||||||
@@ -23,15 +23,13 @@ class KeymapManager private constructor() : Disposable {
|
|||||||
companion object {
|
companion object {
|
||||||
private val log = LoggerFactory.getLogger(KeymapManager::class.java)
|
private val log = LoggerFactory.getLogger(KeymapManager::class.java)
|
||||||
|
|
||||||
const val PROCESS_GLOBAL_KEYMAP = "PROCESS_GLOBAL_KEYMAP"
|
|
||||||
|
|
||||||
fun getInstance(): KeymapManager {
|
fun getInstance(): KeymapManager {
|
||||||
return ApplicationScope.forApplicationScope()
|
return ApplicationScope.forApplicationScope()
|
||||||
.getOrCreate(KeymapManager::class) { KeymapManager() }
|
.getOrCreate(KeymapManager::class) { KeymapManager() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val myKeyEventPostProcessor = MyKeyEventPostProcessor()
|
private val keymapKeyEventDispatcher = KeymapKeyEventDispatcher()
|
||||||
private val myKeyEventDispatcher = MyKeyEventDispatcher()
|
private val myKeyEventDispatcher = MyKeyEventDispatcher()
|
||||||
private val database get() = Database.getDatabase()
|
private val database get() = Database.getDatabase()
|
||||||
private val keymaps = linkedMapOf<String, Keymap>()
|
private val keymaps = linkedMapOf<String, Keymap>()
|
||||||
@@ -39,7 +37,7 @@ class KeymapManager private constructor() : Disposable {
|
|||||||
private val keyboardFocusManager by lazy { KeyboardFocusManager.getCurrentKeyboardFocusManager() }
|
private val keyboardFocusManager by lazy { KeyboardFocusManager.getCurrentKeyboardFocusManager() }
|
||||||
|
|
||||||
init {
|
init {
|
||||||
keyboardFocusManager.addKeyEventPostProcessor(myKeyEventPostProcessor)
|
keyboardFocusManager.addKeyEventDispatcher(keymapKeyEventDispatcher)
|
||||||
keyboardFocusManager.addKeyEventDispatcher(myKeyEventDispatcher)
|
keyboardFocusManager.addKeyEventDispatcher(myKeyEventDispatcher)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -97,12 +95,26 @@ class KeymapManager private constructor() : Disposable {
|
|||||||
database.removeKeymap(name)
|
database.removeKeymap(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class MyKeyEventPostProcessor : KeyEventPostProcessor {
|
private inner class KeymapKeyEventDispatcher : KeyEventDispatcher {
|
||||||
override fun postProcessKeyEvent(e: KeyEvent): Boolean {
|
|
||||||
// 只处理 PRESSED 和 带有 modifiers 键的事件
|
override fun dispatchKeyEvent(e: KeyEvent): Boolean {
|
||||||
if (!e.isConsumed && e.id == KeyEvent.KEY_PRESSED && e.modifiersEx != 0) {
|
if (e.isConsumed || e.id != KeyEvent.KEY_PRESSED || e.modifiersEx == 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val keyStroke = KeyStroke.getKeyStrokeForEvent(e)
|
||||||
|
val component = e.source
|
||||||
|
|
||||||
|
if (component is JComponent) {
|
||||||
|
// 如果这个键已经被组件注册了,那么忽略
|
||||||
|
if (component.getConditionForKeyStroke(keyStroke) != JComponent.UNDEFINED_CONDITION) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
val shortcuts = getActiveKeymap()
|
val shortcuts = getActiveKeymap()
|
||||||
val actionIds = shortcuts.getActionIds(KeyShortcut(KeyStroke.getKeyStrokeForEvent(e)))
|
val actionIds = shortcuts.getActionIds(KeyShortcut(keyStroke))
|
||||||
if (actionIds.isEmpty()) {
|
if (actionIds.isEmpty()) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -128,7 +140,6 @@ class KeymapManager private constructor() : Disposable {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -163,7 +174,7 @@ class KeymapManager private constructor() : Disposable {
|
|||||||
|
|
||||||
|
|
||||||
override fun dispose() {
|
override fun dispose() {
|
||||||
keyboardFocusManager.removeKeyEventPostProcessor(myKeyEventPostProcessor)
|
keyboardFocusManager.removeKeyEventDispatcher(keymapKeyEventDispatcher)
|
||||||
keyboardFocusManager.removeKeyEventDispatcher(myKeyEventDispatcher)
|
keyboardFocusManager.removeKeyEventDispatcher(myKeyEventDispatcher)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user