public static ReadableProperty select()

in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [180:253]


  public static <SourceT, TargetT> ReadableProperty<TargetT> select(
      final ReadableProperty<SourceT> source, final Function<? super SourceT, ReadableProperty<TargetT>> fun,
      final TargetT nullValue
  ) {
    final Supplier<TargetT> calc = new Supplier<TargetT>() {
      @Override
      public TargetT get() {
        SourceT value = source.get();
        if (value == null) return nullValue;
        ReadableProperty<TargetT> prop = fun.apply(value);
        if (prop == null) return null;
        return prop.get();
      }
    };

    return new BaseDerivedProperty<TargetT>(null) {
      private ReadableProperty<TargetT> myTargetProperty;

      private Registration mySourceRegistration;
      private Registration myTargetRegistration;

      @Override
      protected void doAddListeners() {
        myTargetProperty = source.get() == null ? null : fun.apply(source.get());

        final EventHandler<PropertyChangeEvent<TargetT>> targetHandler = new EventHandler<PropertyChangeEvent<TargetT>>() {
          @Override
          public void onEvent(PropertyChangeEvent<TargetT> event) {
            somethingChanged();
          }
        };
        EventHandler<PropertyChangeEvent<SourceT>> sourceHandler = new EventHandler<PropertyChangeEvent<SourceT>>() {
          @Override
          public void onEvent(PropertyChangeEvent<SourceT> event) {
            if (myTargetProperty != null) {
              myTargetRegistration.remove();
            }
            SourceT sourceValue = source.get();
            if (sourceValue != null) {
              myTargetProperty = fun.apply(sourceValue);
            } else {
              myTargetProperty = null;
            }
            if (myTargetProperty != null) {
              myTargetRegistration = myTargetProperty.addHandler(targetHandler);
            }
            somethingChanged();
          }
        };
        mySourceRegistration = source.addHandler(sourceHandler);
        if (myTargetProperty != null) {
          myTargetRegistration = myTargetProperty.addHandler(targetHandler);
        }
      }

      @Override
      protected void doRemoveListeners() {
        if (myTargetProperty != null) {
          myTargetRegistration.remove();
        }
        mySourceRegistration.remove();
      }

      @Override
      protected TargetT doGet() {
        return calc.get();
      }

      @Override
      public String getPropExpr() {
        return "select(" + source.getPropExpr() + ", " + fun + ")";
      }
    };
  }