in projectional/src/main/java/jetbrains/jetpad/projectional/selection/SelectionSupport.java [208:348]
private void handleTargetKeyPress(final KeyEvent event) {
if (event.is(KeyStrokeSpecs.SELECT_AFTER)) {
runSelectionAction(new Runnable() {
@Override
public void run() {
if (isLowerPrioritySelection()) return;
Cell currentCell = currentCell();
if (currentCell == null) return;
int currentIndex = myTargetList.indexOf(currentCell);
ItemT currentItem = mySource.get(currentIndex);
boolean consumed = false;
if (!Positions.isEndPosition(currentCell) && !isCurrentCompletelySelected()) {
if (!mySelectedItems.contains(currentItem)) {
mySelectedItems.add(currentItem);
resetFocusAndScrollTo(currentIndex, false).run();
} else {
if (myDirection == Direction.FORWARD) {
resetFocusAndScrollTo(currentIndex, false).run();
} else {
mySelectedItems.remove(currentItem);
if (currentIndex == myTargetList.size() - 1) {
resetFocusAndScrollTo(currentIndex, false).run();
} else {
resetFocusAndScrollTo(currentIndex + 1, true).run();
}
}
}
consumed = true;
} else {
int focusIndex = -1;
boolean focusOnFirst = true;
if (!mySelectedItems.contains(currentItem) && (Positions.isOnePosition(currentCell) || hasLowerPrioritySelection(currentCell))) {
mySelectedItems.add(currentItem);
focusIndex = currentIndex;
focusOnFirst = false;
consumed = true;
}
if (currentIndex < myTargetList.size() - 1) {
ItemT nextItem = mySource.get(currentIndex + 1);
if (mySelectedItems.contains(nextItem)) {
mySelectedItems.remove(currentItem);
focusIndex = currentIndex + 1;
} else {
mySelectedItems.add(nextItem);
focusIndex = currentIndex + 1;
focusOnFirst = false;
}
consumed = true;
}
if (focusIndex != -1) {
resetFocusAndScrollTo(focusIndex, focusOnFirst).run();
}
}
if (consumed) {
if (myDirection == null) {
myDirection = Direction.FORWARD;
}
event.consume();
}
}
});
}
if (event.is(KeyStrokeSpecs.SELECT_BEFORE)) {
runSelectionAction(new Runnable() {
@Override
public void run() {
if (isLowerPrioritySelection()) return;
Cell currentCell = currentCell();
if (currentCell == null) return;
int currentIndex = myTargetList.indexOf(currentCell);
ItemT currentItem = mySource.get(currentIndex);
boolean consumed = false;
if (!Positions.isHomePosition(currentCell) && !isCurrentCompletelySelected()) {
if (!mySelectedItems.contains(currentItem)) {
mySelectedItems.add(0, currentItem);
resetFocusAndScrollTo(currentIndex, true).run();
} else {
if (myDirection == Direction.BACKWARD) {
resetFocusAndScrollTo(currentIndex, true).run();
} else {
mySelectedItems.remove(currentItem);
if (currentIndex == 0) {
resetFocusAndScrollTo(currentIndex, true).run();
} else {
resetFocusAndScrollTo(currentIndex - 1, false).run();
}
}
}
consumed = true;
} else {
int focusIndex = -1;
boolean focusOnFirst = true;
if (!mySelectedItems.contains(currentItem) && (Positions.isOnePosition(currentCell) || hasLowerPrioritySelection(currentCell))) {
mySelectedItems.add(0, currentItem);
focusIndex = currentIndex;
consumed = true;
}
if (currentIndex > 0) {
ItemT prevItem = mySource.get(currentIndex - 1);
if (mySelectedItems.contains(prevItem)) {
mySelectedItems.remove(currentItem);
focusIndex = currentIndex - 1;
focusOnFirst = false;
} else {
mySelectedItems.add(0, prevItem);
focusIndex = currentIndex - 1;
}
consumed = true;
}
if (focusIndex != -1) {
resetFocusAndScrollTo(focusIndex, focusOnFirst).run();
}
}
if (consumed) {
if (myDirection == null) {
myDirection = Direction.BACKWARD;
}
event.consume();
}
}
});
}
}