public void handleKey()

in projectional/src/main/java/jetbrains/jetpad/projectional/generic/CollectionEditor.java [88:171]


  public void handleKey(ViewT cell, KeyEvent event) {
    int index = myViews.indexOf(cell);
    boolean isHome = isHome(cell);
    boolean isEnd = isEnd(cell);

    if (myCanCreateNew) {
      if (event.is(KeyStrokeSpecs.INSERT_AFTER) && isHome) {
        myItems.add(index, newItem());
        if (!isEmpty(index)) {
          selectOnCreation(index);
        } else if (isEmpty(index + 1) && index + 1 == myViews.size() - 1) {
          int numEmptyLinesBefore = getNumEmptyLinesBefore(index);
          if ((index == 0 || numEmptyLinesBefore >= myNumAllowedEmptyLines) && addAfterParent()) {
            myItems.remove(index + 1);
            myItems.remove(index);
            for (int i = 0; i < numEmptyLinesBefore; i++) {
              myItems.remove(index - 1 - i);
            }
          }
        }
        event.consume();
        return;
      }

      if (event.is(KeyStrokeSpecs.INSERT_AFTER) && !isHome) {
        if (isEnd || !trySplit(index, event)) {
          myItems.add(index + 1, newItem());
          selectOnCreation(index + 1);
        }
        event.consume();
        return;
      }

      if (event.is(KeyStrokeSpecs.INSERT_BEFORE)) {
        if (isHome || isEnd || !trySplit(index, event)) {
          int i = isEnd && !isHome ? index + 1 : index;
          myItems.add(i, newItem());
          selectOnCreation(i);
        }
        event.consume();
        return;
      }
    }

    if (event.is(Key.BACKSPACE) && isHome && index > 0 && (isEmpty(index) == isEmpty(index - 1) || !isEmpty(index))) {
      if (!tryJoin(index - 1, index, SplitJoinHandler.JoinDirection.BACKWARD)) {
        myItems.remove(index - 1);
      }
      event.consume();
      return;
    }

    if (event.is(Key.BACKSPACE) && index > 0 && isEmpty(index) && !isEmpty(index - 1)) {
      myItems.remove(index);
      selectEnd(index - 1);
      event.consume();
      return;
    }

    if (event.is(Key.DELETE) && isEnd && !isLast(index) && (isEmpty(index) == isEmpty(index + 1) || !isEmpty(index))) {
      if (!tryJoin(index, index + 1, SplitJoinHandler.JoinDirection.FORWARD)) {
        myItems.remove(index + 1);
      }
      event.consume();
      return;
    }

    if (isSimpleDeleteEvent(event) && myForDeletion.get() != myItems.get(index) && !isEmpty(index)) {
      myForDeletion.set(myItems.get(index));
      event.consume();
      return;
    }

    if (isDeleteEvent(event)) {
      if (myReplaceWithNewOnDelete.apply(myViews.get(index))) {
        myItems.set(index, newItem());
        selectHome(index);
      } else {
        myItems.remove(index);
        selectAfterClear(index);
      }
      event.consume();
    }
  }