public static Property selectRw()

in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [255:337]


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

    class MyProperty extends BaseDerivedProperty<TargetT> implements Property<TargetT> {
      private Property<TargetT> myTargetProperty;

      private Registration mySourceRegistration;
      private Registration myTargetRegistration;

      MyProperty() {
        super(calc.get());
      }

      @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 void set(TargetT value) {
        if (myTargetProperty == null) return;
        myTargetProperty.set(value);
      }

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

    return new MyProperty();
  }