Skip to content

Commit b6d1958

Browse files
committed
HotKey can set focus
- Fix AbstractView to return focus info for hotkey handler - TerminalUI sets focus from returned key handling for hotkeys - Fixes #881
1 parent edddc0b commit b6d1958

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

spring-shell-core/src/main/java/org/springframework/shell/component/view/TerminalUI.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ private void handleKeyEvent(KeyEvent event) {
273273
if (handler != null) {
274274
KeyHandlerResult result = handler.handle(KeyHandler.argsOf(event));
275275
if (result.consumed()) {
276+
if (result.focus() != null) {
277+
setFocus(result.focus());
278+
}
276279
return;
277280
}
278281
}

spring-shell-core/src/main/java/org/springframework/shell/component/view/control/AbstractView.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,16 +189,18 @@ public KeyHandler getHotKeyHandler() {
189189
log.trace("getHotKeyHandler() {}", this);
190190
KeyHandler handler = args -> {
191191
KeyEvent event = args.event();
192+
View view = null;
192193
boolean consumed = false;
193194
Integer key = event.key();
194195
if (key != null) {
195196
KeyBindingValue keyBindingValue = getHotKeyBindings().get(key);
196197
if (keyBindingValue != null) {
198+
view = this;
197199
consumed = dispatchKeyRunCommand(event, keyBindingValue);
198200
}
199201

200202
}
201-
return KeyHandler.resultOf(event, consumed, null);
203+
return KeyHandler.resultOf(event, consumed, view);
202204
};
203205
return handler;
204206
}

spring-shell-core/src/test/java/org/springframework/shell/component/view/control/AbstractViewTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ protected KeyHandlerResult handleKeyEvent(View view, KeyEvent key) {
106106
return view.getKeyHandler().handle(KeyHandler.argsOf(key));
107107
}
108108

109+
protected KeyHandlerResult handleHotKey(View view, Integer key) {
110+
return handleHotKeyEvent(view, KeyEvent.of(key));
111+
}
112+
113+
protected KeyHandlerResult handleHotKeyEvent(View view, KeyEvent key) {
114+
return view.getHotKeyHandler().handle(KeyHandler.argsOf(key));
115+
}
116+
109117
protected MouseEvent mouseClick(int x, int y) {
110118
return MouseEvent.of(x, y, MouseEvent.Type.Released | MouseEvent.Button.Button1);
111119
}

spring-shell-core/src/test/java/org/springframework/shell/component/view/control/MenuBarViewTests.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
*/
1616
package org.springframework.shell.component.view.control;
1717

18+
import org.junit.jupiter.api.BeforeEach;
1819
import org.junit.jupiter.api.Nested;
1920
import org.junit.jupiter.api.Test;
2021

2122
import org.springframework.shell.component.view.control.MenuBarView.MenuBarItem;
2223
import org.springframework.shell.component.view.control.MenuView.MenuItem;
24+
import org.springframework.shell.component.view.event.KeyEvent;
2325
import org.springframework.shell.component.view.event.KeyEvent.Key;
26+
import org.springframework.shell.component.view.event.KeyHandler.KeyHandlerResult;
2427
import org.springframework.shell.component.view.event.MouseEvent;
2528
import org.springframework.shell.component.view.event.MouseHandler;
2629
import org.springframework.shell.component.view.event.MouseHandler.MouseHandlerResult;
@@ -58,6 +61,46 @@ void hotkeys() {
5861
}
5962
}
6063

64+
@Nested
65+
class Events {
66+
67+
MenuBarView view;
68+
69+
@BeforeEach
70+
void setup() {
71+
MenuItem menuItem = new MenuView.MenuItem("sub1");
72+
MenuBarItem menuBarItem = new MenuBarView.MenuBarItem("menu1", new MenuView.MenuItem[] { menuItem });
73+
menuBarItem.setHotKey(Key.q);
74+
view = new MenuBarView(new MenuBarView.MenuBarItem[] { menuBarItem });
75+
view.setRect(0, 0, 10, 10);
76+
configure(view);
77+
}
78+
79+
@Test
80+
void mouseClickGetsFocus() {
81+
MouseEvent click = mouseClick(0, 0);
82+
MouseHandlerResult result = view.getMouseHandler().handle(MouseHandler.argsOf(click));
83+
assertThat(result).isNotNull().satisfies(r -> {
84+
assertThat(r.event()).isEqualTo(click);
85+
assertThat(r.consumed()).isTrue();
86+
assertThat(r.focus()).isEqualTo(view);
87+
assertThat(r.capture()).isEqualTo(view);
88+
});
89+
}
90+
91+
@Test
92+
void hotKeyGetsFocus() {
93+
KeyHandlerResult result = handleHotKey(view, KeyEvent.Key.q);
94+
95+
assertThat(result).isNotNull().satisfies(r -> {
96+
assertThat(r.event()).isNotNull();
97+
assertThat(r.consumed()).isTrue();
98+
assertThat(r.focus()).isEqualTo(view);
99+
});
100+
}
101+
102+
}
103+
61104
@Nested
62105
class Styling {
63106

0 commit comments

Comments
 (0)