class WorkspaceController implements Initializable {
    
    private final ObservableList<PropertyEditor.Item> properties;

    @Inject public UserInterfaceComponent ui;
    @Inject public EventComponent events;
    @Inject public PropertyEditorComponent editors;

    @FXML private TitledPane workspace;
    @FXML private ScrollPane scrollpane;

    public WorkspaceController() {
        this.properties = FXCollections.observableArrayList();
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {<FILL_FUNCTION_BODY>}

    private ListChangeListener<TreeItem<DocumentProperty>> treeItemListChangeListener() {
        return change -> {
            properties.clear();

            if (!change.getList().isEmpty()) {
                final TreeItem<DocumentProperty> treeItem = change.getList().get(0);

                if (treeItem != null) {
                    final DocumentProperty property = treeItem.getValue();
                    final HasNameProperty withName = (HasNameProperty) property;

                    final String extraInfo = Cast.cast(property, ColumnProperty.class)
                        .map(ColumnProperty::findDatabaseType)
                        .map(Class::getSimpleName)
                        .map(s -> "(" + s + ")")
                        .orElse("");

                    workspace.textProperty().bind(
                        Bindings.createStringBinding(() -> String.format(
                            "Settings for database %s '%s' %s",
                            type(withName),
                            withName.getName(),
                            extraInfo
                        ), withName.nameProperty())
                    );

                    editors.getUiVisibleProperties(treeItem.getValue())
                        .forEachOrdered(properties::add);
                }
            }
            @SuppressWarnings("unchecked")
            final ListChangeListener.Change<TreeItem<DocumentProperty>> changeCasted = (ListChangeListener.Change<TreeItem<DocumentProperty>>) change;
            events.notify(new TreeSelectionChange(changeCasted, properties));
        };
    }

    private String type(HasNameProperty withName) {
        if (withName instanceof Table) {
            return ((Table) withName).isView() ? "view" : "table";
        } else {
            return withName.mainInterface().getSimpleName().toLowerCase();
        }
    }
}

        final PropertySheet sheet = new PropertySheet(properties);
        ui.getSelectedTreeItems().addListener(treeItemListChangeListener());
        scrollpane.setContent(sheet);
        Bindings.bindContentBidirectional(ui.getProperties(), properties);
    
<no_super_class>