On Mon, 7 Sep 2020 13:33:48 GMT, Ambarish Rapte <ara...@openjdk.org> wrote:

>> The issue occurs because the key events are consumed by the `ListView` in 
>> `Popup`, which displays the items.
>> This is a regression of 
>> [JDK-8077916](https://bugs.openjdk.java.net/browse/JDK-8077916). This change 
>> aadded several
>> `KeyMapping`s for focus traversals to `ListView`, which consume the `Left`, 
>> `Right` and `Ctrl+A` key events.
>> Fix:
>> 1. Remove the four focus traversal arrow `KeyMapping`s from 
>> `ListViewBehavior`.
>> 2. Add the `Ctrl + A` `KeyMapping` to `ListViewBehavior` only if the 
>> `ListView`'s selection mode is set to
>> `SelectionMode.MULTIPLE`.  `ComboBox` uses the `ListView` with 
>> `SelectionMode.SINGLE` mode.
>> Change unrelated to fix:
>> `ComboBoxListViewBehavior` adds `KeyMapping` for `Up` and `Down` keys, which 
>> are not invoked when the `ComboBox` popup
>> is showing. When the popup is shown, the Up and Down key events are handled 
>> by the `ListView` and the `KeyMapping` code
>> from `ComboBoxListViewBehavior` does not get executed. These KeyMapping are 
>> removed. However this change is not needed
>> for the fix. But this seems to be dead code.   Verification:
>> Added new unit tests to verify the change.
>> Also verified that the behavior ListView behaves same before and after this 
>> change.
>
> Ambarish Rapte has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   rename tests

Fix looks fine and indeed pretty :) Verified tests failing before and after the 
fix.

Left some minor comments inline.

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

> 85:         Predicate<KeyEvent> pIsInComboBox = e -> isListViewOfComboBox != 
> null;
> 86:         Predicate<KeyEvent> pIsInEditableComboBox =
> 87:                 e -> isListViewOfComboBox != null && 
> isListViewOfComboBox.get();

nit-pick about naming: I think we don't use (crippled) hungarian notation, or 
do we? If we don't, the leading "p"
should be removed, isIn/Editable/Combo is expressive enough (and no need to 
differentiate by type of functional
interface, IMO)

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

> 507:                 getProperties().put("selectFirstRowByDefault", false);
> 508:                 getProperties().put("editableComboBoxEditor", 
> (Supplier<Boolean>) () ->
> getSkinnable().isEditable()); 509:             }

nit-pick about naming: it's the editable state of the combo (vs. the editable 
state of the editor) that's in the center
of interest, so maybe rename the key to express that? Like "editableComboBox"?

Another thingy (which I think is a bit under-used in the fx code-base;) - how 
about a code comment to why this marker
is added and which collaborator is using it?

modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java
 line 1347:

> 1345:         final ComboBox<String> cb = new 
> ComboBox<>(FXCollections.observableArrayList("a", "b", "c"));
> 1346:         cb.setEditable(true);
> 1347:         StageLoader sl = new StageLoader(cb);

shouldn't there be an analogous functional test for not-editable combo? There 
are both functional and low-level for
editable, but only low-level for not editable.

modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java
 line 1514:

> 1512:         return 
> ((KeyMapping)mappings.get(i)).getInterceptor().test(null);
> 1513:     }
> 1514:

his throws an NPE without the fix - which makes the test using this method 
still fail (good!), but a bit unspecific for
my taste. A slight re-organisation of the helpers might help: move the asserts 
down instead of returning a boolean.

modules/javafx.controls/src/test/java/test/javafx/scene/control/ListViewTest.java
 line 2083:

> 2081:     private boolean testInterceptor(ObservableList<?> mappings, 
> KeyBinding binding) {
> 2082:         int i = mappings.indexOf(new KeyMapping(binding, null));
> 2083:         return 
> ((KeyMapping)mappings.get(i)).getInterceptor().test(null);

same as for ComboBoxTest

-------------

Changes requested by fastegal (Committer).

PR: https://git.openjdk.java.net/jfx/pull/172

Reply via email to