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