private void handleTargetKeyPress()

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();
          }
        }
      });
    }
  }