mirror of
https://github.com/chylex/IntelliJ-Keyboard-Master.git
synced 2025-10-15 23:39:37 +02:00
Compare commits
2 Commits
5c7e20fd78
...
46657f2f7e
Author | SHA1 | Date | |
---|---|---|---|
46657f2f7e
|
|||
48b342644b
|
@@ -6,7 +6,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "com.chylex.intellij.keyboardmaster"
|
group = "com.chylex.intellij.keyboardmaster"
|
||||||
version = "0.6.3"
|
version = "0.6.4"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
@@ -1,19 +0,0 @@
|
|||||||
package com.chylex.intellij.keyboardmaster.feature.vimNavigation
|
|
||||||
|
|
||||||
import com.chylex.intellij.keyboardmaster.feature.vimNavigation.components.VimListNavigation
|
|
||||||
import com.intellij.ui.UiInterceptors.PersistentUiInterceptor
|
|
||||||
import com.intellij.ui.awt.RelativePoint
|
|
||||||
import com.intellij.ui.popup.AbstractPopup
|
|
||||||
import com.intellij.ui.popup.list.ListPopupImpl
|
|
||||||
|
|
||||||
internal object PopupInterceptor : PersistentUiInterceptor<AbstractPopup>(AbstractPopup::class.java) {
|
|
||||||
override fun shouldIntercept(component: AbstractPopup): Boolean {
|
|
||||||
if (component is ListPopupImpl && VimNavigation.isEnabled) {
|
|
||||||
VimListNavigation.install(component.list, component)
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun doIntercept(component: AbstractPopup, owner: RelativePoint?) {}
|
|
||||||
}
|
|
@@ -6,11 +6,15 @@ import com.chylex.intellij.keyboardmaster.feature.vimNavigation.components.VimTa
|
|||||||
import com.chylex.intellij.keyboardmaster.feature.vimNavigation.components.VimTreeNavigation
|
import com.chylex.intellij.keyboardmaster.feature.vimNavigation.components.VimTreeNavigation
|
||||||
import com.intellij.ide.ui.UISettings
|
import com.intellij.ide.ui.UISettings
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.ui.UiInterceptors
|
import com.intellij.openapi.ui.getUserData
|
||||||
|
import com.intellij.openapi.ui.popup.util.PopupUtil
|
||||||
|
import com.intellij.openapi.ui.putUserData
|
||||||
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.util.ui.StartupUiUtil
|
import com.intellij.util.ui.StartupUiUtil
|
||||||
import java.awt.AWTEvent
|
import java.awt.AWTEvent
|
||||||
import java.awt.event.FocusEvent
|
import java.awt.event.FocusEvent
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
import javax.swing.JComponent
|
||||||
import javax.swing.JList
|
import javax.swing.JList
|
||||||
import javax.swing.JTable
|
import javax.swing.JTable
|
||||||
import javax.swing.JTree
|
import javax.swing.JTree
|
||||||
@@ -18,6 +22,8 @@ import javax.swing.KeyStroke
|
|||||||
import javax.swing.UIManager
|
import javax.swing.UIManager
|
||||||
|
|
||||||
object VimNavigation {
|
object VimNavigation {
|
||||||
|
private val KEY_INSTALLED = Key.create<Boolean>("KeyboardMaster-VimNavigation-Installed")
|
||||||
|
|
||||||
private val isEnabledFlag = AtomicBoolean(false)
|
private val isEnabledFlag = AtomicBoolean(false)
|
||||||
private var originalPopupBindings: Array<*>? = null
|
private var originalPopupBindings: Array<*>? = null
|
||||||
|
|
||||||
@@ -28,7 +34,6 @@ object VimNavigation {
|
|||||||
val disposable = ApplicationManager.getApplication().getService(PluginDisposableService::class.java)
|
val disposable = ApplicationManager.getApplication().getService(PluginDisposableService::class.java)
|
||||||
|
|
||||||
StartupUiUtil.addAwtListener(AWTEvent.FOCUS_EVENT_MASK, disposable, ::handleEvent)
|
StartupUiUtil.addAwtListener(AWTEvent.FOCUS_EVENT_MASK, disposable, ::handleEvent)
|
||||||
UiInterceptors.registerPersistent(disposable, PopupInterceptor)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setEnabled(enabled: Boolean) {
|
fun setEnabled(enabled: Boolean) {
|
||||||
@@ -66,9 +71,19 @@ object VimNavigation {
|
|||||||
private fun handleEvent(event: AWTEvent) {
|
private fun handleEvent(event: AWTEvent) {
|
||||||
if (event is FocusEvent && event.id == FocusEvent.FOCUS_GAINED && isEnabled) {
|
if (event is FocusEvent && event.id == FocusEvent.FOCUS_GAINED && isEnabled) {
|
||||||
when (val source = event.source) {
|
when (val source = event.source) {
|
||||||
is JList<*> -> VimListNavigation.install(source)
|
is JList<*> -> installTo(source, VimListNavigation::install)
|
||||||
is JTree -> VimTreeNavigation.install(source)
|
is JTree -> installTo(source, VimTreeNavigation::install)
|
||||||
is JTable -> VimTableNavigation.install(source)
|
is JTable -> installTo(source, VimTableNavigation::install)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <T : JComponent> installTo(component: T, installer: (T) -> Unit) {
|
||||||
|
if (component.getUserData(KEY_INSTALLED) == null) {
|
||||||
|
component.putUserData(KEY_INSTALLED, true)
|
||||||
|
|
||||||
|
if (PopupUtil.getPopupContainerFor(component) == null) {
|
||||||
|
installer(component)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user