public final void setRepresentativeName() {
    if (property == null) {
      return;
    }
    PropertyValue value = property.get();

    if (value == null) {
      setText(property.name());
    } else {
      if (value instanceof FromConfigurationPropertyValue) {
        String name = "";
        FromConfigurationPropertyValue fcpv = (FromConfigurationPropertyValue) value;
        Property confName =
            fcpv.getValue().get("name") == null
                ? fcpv.getValue().get("Name")
                : fcpv.getValue().get("name");
        if (confName != null) {
          name = " [" + (confName.get() == null ? "" : confName.get().stringValue()) + "]";
        }
        setText(fcpv.getValue().registeredName() + name);
      } else {
        setText("??? SOMETHING ???");
      }
    }
  }
  private void updateModelValue() {
    if (property.get() == null || !(property.get() instanceof FromConfigurationPropertyValue)) {
      try {
        String defaultName = (String) choiceBox.getItems().get(0);
        Configuration defaultValue = Registery.get().getConfiguration(defaultName);
        property.set(new FromConfigurationPropertyValue(defaultValue));
      } catch (Exception ex) {
        Logger.getLogger(ConfigurationPropertyEditor.class.getName()).log(Level.SEVERE, null, ex);
      }
    }

    FromConfigurationPropertyValue fcpv = (FromConfigurationPropertyValue) property.get();

    if (fcpv != null
        && fcpv.getValue()
            != null) { // in case property is a dummy (came from collection property editor)
      Class implementor = fcpv.getValue().configuredType();
      String className = Registery.get().getRegisteredClassName(implementor);
      Property temp = property;
      property = null;
      choiceBox.getSelectionModel().select(className);
      property = temp;
      if (parentCollection != null && choiceBox.getItems().size() <= 1) {
        setText(className);
      }
      confEditor.setModel(fcpv.getValue(), readOnly, filter);
    } else {
      choiceBox.getSelectionModel().select("NULL");
    }
  }
  private void extractImplementors(Property property) {
    if (this.property == property) {
      return;
    }
    this.property = null;
    Class pType = property.typeInfo().getType();
    Collection<Class> implementors = Registery.get().getImplementors(pType);
    choiceBox.getItems().clear();
    if (parentCollection == null) {
      choiceBox.getItems().add("NULL");
    }

    implementors.forEach(
        (i) -> choiceBox.getItems().add(Registery.get().getRegisteredClassName(i)));

    if (!readOnly && (parentCollection == null || implementors.size() > 1)) {
      editorVBox.getChildren().add(implementorsBorderPane);
    }
  }
  public ConfigurationPropertyEditor(ConfigurationEditor parent, Property collection) {
    this.parent = parent;
    this.parentCollection = collection;

    getStyleClass().add("configuration-property-editor");

    selected = new SimpleBooleanProperty(false);

    skinProperty()
        .addListener(
            (sp, o, n) -> {
              Node node = FXUtils.getTitledPaneTitleRegion(this);

              if (node != null) {
                node.addEventFilter(MouseEvent.MOUSE_RELEASED, eh -> eh.consume());
                node.addEventFilter(
                    MouseEvent.MOUSE_PRESSED,
                    eh -> {
                      eh.consume();
                      if (!selected.get()) {
                        selected.set(true);
                      } else {
                        setExpanded(!isExpanded());
                      }
                    });
              }
            });

    selected.addListener(
        (p, ov, nv) -> {
          if (nv && parent != null) {
            parent.select(this);
          }
        });

    infoContainer = new Label("");
    confEditor = new ConfigurationEditorInternal(parent, this);

    implementorsBorderPane = new BorderPane();
    implementorsBorderPane.getStyleClass().add("implementors");

    Label label = new Label("type :");
    label.setPadding(new Insets(0, LABEL_MARGING, 0, 0));
    BorderPane.setAlignment(label, Pos.CENTER_LEFT);
    implementorsBorderPane.setLeft(label);

    choiceBox = new ChoiceBox<>();
    //        choiceBox.setMaxWidth(Double.MAX_VALUE);
    choiceBox
        .valueProperty()
        .addListener(
            (ObservableValue<? extends String> p, String ov, String nv) -> {
              try {
                if (property != null) {
                  Configuration value = null;
                  if (!nv.equals("NULL")) {
                    value = Registery.get().getConfiguration(nv);
                  }
                  property.set(value == null ? null : new FromConfigurationPropertyValue(value));
                  setRepresentativeName();
                  confEditor.setModel(value, readOnly, filter);
                }
              } catch (ClassNotFoundException ex) {
                Logger.getLogger(ConfigurationPropertyEditor.class.getName())
                    .log(Level.SEVERE, null, ex);
              }
            });
    BorderPane.setAlignment(choiceBox, Pos.CENTER_LEFT);
    implementorsBorderPane.setCenter(choiceBox);

    editorVBox = new VBox();
    editorVBox.getChildren().addAll(implementorsBorderPane, confEditor);
    setContent(editorVBox);

    setGraphic(infoContainer);
    setExpanded(false);
  }