public static EventSource selectEvent()

in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [339:375]


  public static <EventT, ValueT> EventSource<EventT> selectEvent(final ReadableProperty<ValueT> prop, final Function<ValueT, EventSource<EventT>> selector) {
    return new EventSource<EventT>() {
      @Override
      public Registration addHandler(final EventHandler<? super EventT> handler) {
        final Value<Registration> esReg = new Value<>(Registration.EMPTY);

        final Runnable update = new Runnable() {
          @Override
          public void run() {
            esReg.get().remove();
            if (prop.get() != null) {
              esReg.set(selector.apply(prop.get()).addHandler(handler));
            } else {
              esReg.set(Registration.EMPTY);
            }
          }
        };

        update.run();

        final Registration propReg = prop.addHandler(new EventHandler<PropertyChangeEvent<ValueT>>() {
          @Override
          public void onEvent(PropertyChangeEvent<ValueT> event) {
            update.run();
          }
        });

        return new Registration() {
          @Override
          protected void doRemove() {
            propReg.remove();
            esReg.get().remove();
          }
        };
      }
    };
  }