class NullableItem extends AbstractLabelTooltipItem {
    
    private static final String NULLABLE_TITLE = "Is Nullable";
    private static final String NULLABLE_TOOLTIP = "If this node can hold 'null'-values or not.";
    private static final String IMPLEMENTATION_TITLE = "If this node can hold 'null'-values or not.";
    private static final String IMPLEMENTATION_TOOLTIP = "How the nullable column should be implemented, either by " +
        "using an Optional or by using a wrapper class that can have " +
        "a null value.";


    private final Document document;
    private final BooleanProperty nullable;
    private final ObjectProperty<ImplementAs> implementation;
    
    public NullableItem(Document document, BooleanProperty nullable, ObjectProperty<ImplementAs> implementation) {
        super(
            NULLABLE_TITLE, 
            NULLABLE_TOOLTIP, 
            NO_DECORATOR
        );

        this.document       = requireNonNull(document);
        this.nullable       = requireNonNull(nullable);
        this.implementation = requireNonNull(implementation);
    }

    @Override
    protected Node createUndecoratedEditor() {<FILL_FUNCTION_BODY>}
    
}

        
        final CheckBox cbNull               = new CheckBox();
        final Node wrappedCb                = ItemUtil.lockDecorator(cbNull, document, ItemUtil.DATABASE_RELATION_TOOLTIP);
        final Label label                   = new Label(IMPLEMENTATION_TITLE);
        final ChoiceBox<ImplementAs> cbImpl = new ChoiceBox<>(
            observableArrayList(ImplementAs.values())
        );
        
        cbImpl.setTooltip(new Tooltip(IMPLEMENTATION_TOOLTIP));
        
        final HBox right = new HBox(label, cbImpl);
        final HBox left = new HBox(wrappedCb, right);
        
        left.setSpacing(16);
        right.setSpacing(8);
        right.setAlignment(Pos.CENTER);
        
        cbNull.selectedProperty().bindBidirectional(nullable);
        cbImpl.valueProperty().bindBidirectional(implementation);
        
        right.visibleProperty().bind(nullable);
        right.disableProperty().bind(nullable.not());
        
        return left;
    
<methods>public final javafx.scene.Node createEditor() ,public javafx.scene.Node createLabel() ,public final void onRemove() <variables>protected static final UnaryOperator<javafx.scene.Node> NO_DECORATOR,private final non-sealed UnaryOperator<javafx.scene.Node> editorDecorator,private final non-sealed java.lang.String label,private final non-sealed Map<ObservableValue<java.lang.Object>,ChangeListener<java.lang.Object>> listeners,private final non-sealed java.lang.String tooltip