public static Property forSingleItemCollection()

in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [808:866]


  public static <ItemT> Property<ItemT> forSingleItemCollection(final ObservableCollection<ItemT> coll) {
    if (coll.size() > 1) {
      throw new IllegalStateException("Collection " + coll + " has more than one item");
    }

    return new Property<ItemT>() {
      @Override
      public ItemT get() {
        if (coll.isEmpty()) {
          return null;
        }
        return coll.iterator().next();
      }

      @Override
      public void set(ItemT value) {
        ItemT current = get();
        if (Objects.equals(current, value)) return;
        coll.clear();
        if (value != null) {
          coll.add(value);
        }
      }

      @Override
      public Registration addHandler(final EventHandler<? super PropertyChangeEvent<ItemT>> handler) {
        return coll.addListener(new CollectionAdapter<ItemT>() {
          @Override
          public void onItemAdded(CollectionItemEvent<? extends ItemT> event) {
            if (coll.size() != 1) {
              throw new IllegalStateException();
            }
            handler.onEvent(new PropertyChangeEvent<>(null, event.getNewItem()));
          }

          @Override
          public void onItemSet(CollectionItemEvent<? extends ItemT> event) {
            if (event.getIndex() != 0) {
              throw new IllegalStateException();
            }
            handler.onEvent(new PropertyChangeEvent<>(event.getOldItem(), event.getNewItem()));
          }

          @Override
          public void onItemRemoved(CollectionItemEvent<? extends ItemT> event) {
            if (!coll.isEmpty()) {
              throw new IllegalStateException();
            }
            handler.onEvent(new PropertyChangeEvent<>(event.getOldItem(), null));
          }
        });
      }

      @Override
      public String getPropExpr() {
        return "singleItemCollection(" + coll + ")";
      }
    };
  }