private Cell createPlaceholder()

in projectional/src/main/java/jetbrains/jetpad/projectional/cell/BaseProjectionalSynchronizer.java [669:726]


    private Cell createPlaceholder() {
      final TextCell placeHolder = new TextCell();
      placeHolder.addTrait(new DerivedCellTrait() {
        @Override
        protected CellTrait getBase(Cell cell) {
          return TextEditing.validTextEditing(Validators.equalsTo(""));
        }

        @Override
        public void onKeyPressedLowPriority(Cell cell, KeyEvent event) {
          handlePlaceholderKeyPress(event);
          if (event.isConsumed()) return;

          super.onKeyPressedLowPriority(cell, event);
        }

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

              @Override
              public Runnable set(SourceItemT target) {
                Runnable runnable;
                if (target == null) {
                  placeHolder.text().set("");
                  runnable = Runnables.EMPTY;
                } else {
                  runnable = insertItem(target);
                }
                return runnable;
              }
            });
          }

          if (spec == TextEditing.EAGER_COMPLETION) {
            return myEagerCompletion;
          }

          return super.get(cell, spec);
        }
      });
      String placeholderText =  myPlaceholderText != null ? myPlaceholderText : "<empty>";

      Cell result;
      //todo this is tmp hack
      if (myTarget instanceof IndentCell) {
        result = CellFactory.indent(placeHolder, CellFactory.placeHolder(placeHolder, placeholderText));
      } else {
        result = CellFactory.horizontal(placeHolder, CellFactory.placeHolder(placeHolder, placeholderText));
      }
      result.set(PositionHandler.PROPERTY, placeHolder.get(PositionHandler.PROPERTY));
      return result;
    }