Skip to content

Commit 77a183e

Browse files
committed
8209788: Left/Right/Ctrl+A keys not working in editor of ComboBox if popup showing
Reviewed-by: kcr, fastegal
1 parent d10f948 commit 77a183e

File tree

6 files changed

+382
-60
lines changed

6 files changed

+382
-60
lines changed

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/BehaviorBase.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ protected void addDefaultMapping(InputMap<N> inputMap, Mapping<?>... newMapping)
8888

8989
for (Mapping<?> mapping : newMapping) {
9090
// check if a mapping already exists, and if so, do not add this mapping
91-
// TODO this is insufficient as we need to check entire InputMap hierarchy
91+
// TODO: JDK-8250807: this is insufficient as we need to check entire InputMap hierarchy
9292
// for (Mapping<?> existingMapping : existingMappings) {
9393
// if (existingMapping != null && existingMapping.equals(mapping)) {
9494
// return;
@@ -116,6 +116,7 @@ protected InputMap<N> createInputMap() {
116116
}
117117

118118
protected void removeMapping(Object key) {
119+
// TODO: JDK-8250807: Traverse the child maps of getInputMap() and remove the mapping from them.
119120
InputMap<?> inputMap = getInputMap();
120121
inputMap.lookupMapping(key).ifPresent(mapping -> {
121122
inputMap.getMappings().remove(mapping);

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/ComboBoxListViewBehavior.java

-46
Original file line numberDiff line numberDiff line change
@@ -26,55 +26,9 @@
2626
package com.sun.javafx.scene.control.behavior;
2727

2828
import javafx.scene.control.ComboBox;
29-
import javafx.scene.control.ComboBoxBase;
30-
import javafx.scene.control.SelectionModel;
31-
import com.sun.javafx.scene.control.inputmap.InputMap;
32-
33-
import static javafx.scene.input.KeyCode.DOWN;
34-
import static javafx.scene.input.KeyCode.UP;
3529

3630
public class ComboBoxListViewBehavior<T> extends ComboBoxBaseBehavior<T> {
37-
38-
/***************************************************************************
39-
* *
40-
* Constructors *
41-
* *
42-
**************************************************************************/
43-
44-
/**
45-
*
46-
*/
4731
public ComboBoxListViewBehavior(final ComboBox<T> comboBox) {
4832
super(comboBox);
49-
50-
// Add these bindings as a child input map, so they take precedence
51-
InputMap<ComboBoxBase<T>> comboBoxListViewInputMap = new InputMap<>(comboBox);
52-
comboBoxListViewInputMap.getMappings().addAll(
53-
new InputMap.KeyMapping(UP, e -> selectPrevious()),
54-
new InputMap.KeyMapping(DOWN, e -> selectNext())
55-
);
56-
addDefaultChildMap(getInputMap(), comboBoxListViewInputMap);
57-
}
58-
59-
/***************************************************************************
60-
* *
61-
* Key event handling *
62-
* *
63-
**************************************************************************/
64-
65-
private ComboBox<T> getComboBox() {
66-
return (ComboBox<T>) getNode();
67-
}
68-
69-
private void selectPrevious() {
70-
SelectionModel<T> sm = getComboBox().getSelectionModel();
71-
if (sm == null) return;
72-
sm.selectPrevious();
73-
}
74-
75-
private void selectNext() {
76-
SelectionModel<T> sm = getComboBox().getSelectionModel();
77-
if (sm == null) return;
78-
sm.selectNext();
7933
}
8034
}

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/ListViewBehavior.java

+19-12
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646

4747
import java.util.ArrayList;
4848
import java.util.List;
49+
import java.util.function.Predicate;
50+
import java.util.function.Supplier;
4951

5052
import static com.sun.javafx.scene.control.inputmap.InputMap.*;
5153
import static javafx.scene.input.KeyCode.*;
@@ -78,12 +80,19 @@ public ListViewBehavior(ListView<T> control) {
7880
listViewInputMap = createInputMap();
7981

8082
// add focus traversal mappings
81-
addDefaultMapping(listViewInputMap, FocusTraversalInputMap.getFocusTraversalMappings());
83+
Supplier<Boolean> isListViewOfComboBox =
84+
(Supplier<Boolean>) control.getProperties().get("editableComboBox");
85+
Predicate<KeyEvent> isInComboBox = e -> isListViewOfComboBox != null;
86+
Predicate<KeyEvent> isInEditableComboBox =
87+
e -> isListViewOfComboBox != null && isListViewOfComboBox.get();
88+
if (isListViewOfComboBox == null) {
89+
addDefaultMapping(listViewInputMap, FocusTraversalInputMap.getFocusTraversalMappings());
90+
}
8291
addDefaultMapping(listViewInputMap,
83-
new KeyMapping(HOME, e -> selectFirstRow()),
84-
new KeyMapping(END, e -> selectLastRow()),
85-
new KeyMapping(new KeyBinding(HOME).shift(), e -> selectAllToFirstRow()),
86-
new KeyMapping(new KeyBinding(END).shift(), e -> selectAllToLastRow()),
92+
new KeyMapping(new KeyBinding(HOME), e -> selectFirstRow(), isInEditableComboBox),
93+
new KeyMapping(new KeyBinding(END), e -> selectLastRow(), isInEditableComboBox),
94+
new KeyMapping(new KeyBinding(HOME).shift(), e -> selectAllToFirstRow(), isInComboBox),
95+
new KeyMapping(new KeyBinding(END).shift(), e -> selectAllToLastRow(), isInComboBox),
8796
new KeyMapping(new KeyBinding(PAGE_UP).shift(), e -> selectAllPageUp()),
8897
new KeyMapping(new KeyBinding(PAGE_DOWN).shift(), e -> selectAllPageDown()),
8998

@@ -98,9 +107,9 @@ public ListViewBehavior(ListView<T> control) {
98107
new KeyMapping(F2, e -> activate()),
99108
new KeyMapping(ESCAPE, e -> cancelEdit()),
100109

101-
new KeyMapping(new KeyBinding(A).shortcut(), e -> selectAll()),
102-
new KeyMapping(new KeyBinding(HOME).shortcut(), e -> focusFirstRow()),
103-
new KeyMapping(new KeyBinding(END).shortcut(), e -> focusLastRow()),
110+
new KeyMapping(new KeyBinding(A).shortcut(), e -> selectAll(), isInComboBox),
111+
new KeyMapping(new KeyBinding(HOME).shortcut(), e -> focusFirstRow(), isInComboBox),
112+
new KeyMapping(new KeyBinding(END).shortcut(), e -> focusLastRow(), isInComboBox),
104113
new KeyMapping(new KeyBinding(PAGE_UP).shortcut(), e -> focusPageUp()),
105114
new KeyMapping(new KeyBinding(PAGE_DOWN).shortcut(), e -> focusPageDown()),
106115

@@ -145,10 +154,9 @@ public ListViewBehavior(ListView<T> control) {
145154
new KeyMapping(new KeyBinding(DOWN).shortcut().shift(), e -> discontinuousSelectNextRow()),
146155
new KeyMapping(new KeyBinding(PAGE_UP).shortcut().shift(), e -> discontinuousSelectPageUp()),
147156
new KeyMapping(new KeyBinding(PAGE_DOWN).shortcut().shift(), e -> discontinuousSelectPageDown()),
148-
new KeyMapping(new KeyBinding(HOME).shortcut().shift(), e -> discontinuousSelectAllToFirstRow()),
149-
new KeyMapping(new KeyBinding(END).shortcut().shift(), e -> discontinuousSelectAllToLastRow())
157+
new KeyMapping(new KeyBinding(HOME).shortcut().shift(), e -> discontinuousSelectAllToFirstRow(), isInComboBox),
158+
new KeyMapping(new KeyBinding(END).shortcut().shift(), e -> discontinuousSelectAllToLastRow(), isInComboBox)
150159
);
151-
152160
addDefaultChildMap(listViewInputMap, verticalListInputMap);
153161

154162
// --- horizontal listview
@@ -198,7 +206,6 @@ public ListViewBehavior(ListView<T> control) {
198206
}
199207

200208

201-
202209
/***************************************************************************
203210
* *
204211
* Implementation of BehaviorBase API *

modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxListViewSkin.java

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.sun.javafx.scene.control.behavior.ComboBoxListViewBehavior;
3030

3131
import java.util.List;
32+
import java.util.function.Supplier;
3233

3334
import javafx.beans.InvalidationListener;
3435
import javafx.beans.WeakInvalidationListener;
@@ -504,6 +505,9 @@ private ListView<T> createListView() {
504505

505506
{
506507
getProperties().put("selectFirstRowByDefault", false);
508+
// editableComboBox property is used to intercept few Key inputs from this ListView,
509+
// so that those inputs get forwarded to editor of ComboBox .
510+
getProperties().put("editableComboBox", (Supplier<Boolean>) () -> getSkinnable().isEditable());
507511
}
508512

509513
@Override protected double computeMinHeight(double width) {

0 commit comments

Comments
 (0)