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