protected Registration doRegisterChild()

in projectional/src/main/java/jetbrains/jetpad/projectional/cell/ProjectionalObservableListSynchronizer.java [79:151]


  protected Registration doRegisterChild(final SourceItemT child, final Cell childCell) {
    return childCell.addTrait(new DerivedCellTrait() {
      @Override
      protected CellTrait getBase(Cell cell) {
        if (!(cell instanceof TextCell)) {
          return CompletionSupport.trait();
        }
        return CellTrait.EMPTY;
      }

      @Override
      public void onKeyPressedLowPriority(Cell cell, KeyEvent event) {
        try {
          if (getSelectedItems().size() <= 1) {
            keyPressedInChild(event);
          }
        } finally {
          if (event.isConsumed() && cell.isAttached()) {
            scrollToSelection();
          }
        }

        super.onKeyPressedLowPriority(cell, event);
      }

      @Override
      public Object get(Cell cell, CellTraitPropertySpec<?> spec) {
        if (spec == Completion.COMPLETION) {
          return getCurrentChildCompletion();
        }

        if (spec == ITEM_HANDLER && canCreateNewItem()) {
          return new ItemHandler() {
            @Override
            public Runnable addEmptyAfter() {
              int index = mySource.indexOf(child);
              final SourceItemT newItem = newItem();
              mySource.add(index + 1, newItem);
              return selectOnCreation(index + 1);
            }
          };
        }

        return super.get(cell, spec);
      }

      @Override
      public void onCellTraitEvent(Cell cell, CellTraitEventSpec<?> spec, Event event) {
        if (spec == Cells.BECAME_EMPTY && cell.get(ProjectionalSynchronizers.DELETE_ON_EMPTY)) {
          int index = getChildCells().indexOf(cell);
          if (index == -1) return;
          clear(mySource.subList(index, index + 1));
          event.consume();
          return;
        }

        super.onCellTraitEvent(cell, spec, event);
      }

      @Override
      public void onKeyTyped(Cell cell, KeyEvent event) {
        if (getSeparator() != null && getSeparator() == event.getKeyChar()) {
          int index = getChildCells().indexOf(cell);
          SourceItemT newItem = newItem();
          mySource.add(index + 1, newItem);
          selectOnCreation(index + 1).run();
          event.consume();
        }

        super.onKeyTyped(cell, event);
      }
    });
  }