diff --git a/src/main/java/com/maddyhome/idea/vim/extension/hints/HintGenerator.kt b/src/main/java/com/maddyhome/idea/vim/extension/hints/HintGenerator.kt index 2de6dbccb5..bbb488525c 100644 --- a/src/main/java/com/maddyhome/idea/vim/extension/hints/HintGenerator.kt +++ b/src/main/java/com/maddyhome/idea/vim/extension/hints/HintGenerator.kt @@ -8,6 +8,8 @@ package com.maddyhome.idea.vim.extension.hints +import com.intellij.openapi.editor.impl.EditorComponentImpl +import com.intellij.openapi.wm.impl.status.TextPanel import com.intellij.ui.treeStructure.Tree import java.awt.Component import java.awt.Point @@ -73,11 +75,16 @@ private fun collectTargets( val location = location + (accessible.location ?: return) accessible.size?.let { size -> - if (accessible.isShowing && (component.isClickable() || component is Tree)) { + if (accessible.isShowing && (component.isClickable() || component is Tree || component is TextPanel)) { targets[component].let { // For some reason, the same component may appear multiple times in the accessible tree. if (it == null || it.depth > depth) { - targets[component] = HintTarget(component, location, size, depth) + targets[component] = HintTarget(component, location, size, depth).apply { + action = when (component) { + is Tree, is EditorComponentImpl -> ({ component.requestFocusInWindow() }) + else -> HintTarget::clickCenter + } + } } } } diff --git a/src/main/java/com/maddyhome/idea/vim/extension/hints/HintTarget.kt b/src/main/java/com/maddyhome/idea/vim/extension/hints/HintTarget.kt index dc851d5dcf..ef32f86de3 100644 --- a/src/main/java/com/maddyhome/idea/vim/extension/hints/HintTarget.kt +++ b/src/main/java/com/maddyhome/idea/vim/extension/hints/HintTarget.kt @@ -11,10 +11,29 @@ package com.maddyhome.idea.vim.extension.hints import java.awt.Dimension import java.awt.Point import java.awt.Rectangle +import java.awt.Robot +import java.awt.event.InputEvent import javax.accessibility.Accessible internal data class HintTarget(val component: Accessible, val location: Point, val size: Dimension, val depth: Int) { var hint: String = "" val bounds: Rectangle get() = Rectangle(location, size) + + /** + * The action to execute when the hint is selected. + * + * @return `true` if the action succeeded, `false` otherwise + */ + var action: Function1 = { false } + fun action() = action(this) + + fun clickCenter(): Boolean { + val robot = Robot() + val locationOnScreen = component.accessibleContext?.accessibleComponent?.locationOnScreen ?: return false + robot.mouseMove(locationOnScreen.x + bounds.width / 2, locationOnScreen.y + bounds.height / 2) + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK) + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK) + return true + } } diff --git a/src/main/java/com/maddyhome/idea/vim/extension/hints/ToggleHintsAction.kt b/src/main/java/com/maddyhome/idea/vim/extension/hints/ToggleHintsAction.kt index 597fed49f7..0d5465531a 100644 --- a/src/main/java/com/maddyhome/idea/vim/extension/hints/ToggleHintsAction.kt +++ b/src/main/java/com/maddyhome/idea/vim/extension/hints/ToggleHintsAction.kt @@ -78,9 +78,7 @@ class ToggleHintsAction : DumbAwareToggleAction() { ShortcutDispatcher("hints", targets.associateBy { it.hint.lowercase() }, { target -> popup.closeOk(null) alarm.cancelAllRequests() - target.component.accessibleContext?.apply { - if (accessibleAction?.doAccessibleAction(0) == null && !accessibleComponent.isFocusTraversable) return@apply - accessibleComponent.requestFocus() + if (target.action()) { highlight.setTarget(target) alarm.addRequest({ highlight.setTarget(null) }, highlightDuration) }