key multiple selectionsupport. So, I decided to fix this problem.
The problem
At first I was thinking about overriding callActionForEvent(e:KeyEvent):Void method in com.sun.javafx.scene.control.behavior.ListViewBehavior, but I've found out that it's not so simple. After applying a new behavior for a ListView in ListViewSkin like this:class ListSkin extends ListViewSkin {
override var behavior = ListBehavior{}
...
}
The ListView stops scrolling up/down if I use keys for navigation. I was thinking about putting some parameters in ListBehavior, but still no luck.Workaround
As for workaround you'll need to put some extra code in MultiSelectListView classoverride var onKeyPressed = function(e:KeyEvent):Void {
if ((e.code == KeyCode.VK_UP) or (e.code == KeyCode.VK_DOWN)
or (e.code == KeyCode.VK_PAGE_DOWN) or (e.code == KeyCode.VK_PAGE_UP)
or (e.code == KeyCode.VK_HOME) or (e.code == KeyCode.VK_END)) {
if (not e.controlDown and not e.shiftDown) {
delete selectedIndexes;
}
}
if (e.controlDown and e.code == KeyCode.VK_SPACE) {
def index:Integer = (e.node as List).focusedIndex;
if (-1 == Sequences.indexOf(selectedIndexes, index)) {
insert index into selectedIndexes;
} else {
delete index from selectedIndexes;
if (index == selectedIndex) select(selectedIndexes[0]);
}
}
}
As a result
- So, now you are able to use Ctrl+Space to add new selected items or remove old items from selection.
- If you use keys such as: HOME, END, PAGE_UP, PAGE_DOWN, UP or DOWN without holding a Ctrl button multiple selection will be lost(I think it's user expected behavior :) )
- I didn't do anything with
Shift
key. So, it does nothing.
Small fix
The ListView by Jonathan Giles has a small bug, it's also about using keys for selecting items. In MultiSelectListCellBehavior class, he has a case for deselecting all previously selected items.public class MultiSelectListCellBehavior extends ListCellBehavior {
...
override function mouseReleased(e) {
...
} else {
delete listView.selectedIndexes;
insert row into listView.selectedIndexes;
listView.focus(row);
}
}
}
As you can see in the end he used listView.focus(row); for selecting an item, but this stuff wont wok correctly. If you made some selection with the help of keys you'll get at least two selected items. So, I think it's better to use listView.select(row); instead.Have a nice code :)
