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 + ")";
}
};
}