in svg/src/main/java/jetbrains/jetpad/projectional/svg/toDom/SvgElementMapper.java [50:144]
protected void registerSynchronizers(final SynchronizersConfiguration conf) {
super.registerSynchronizers(conf);
conf.add(new Synchronizer() {
private Registration myReg;
@Override
public void attach(SynchronizerContext ctx) {
myReg = getSource().addListener(new SvgElementListener<Object>() {
@Override
public void onAttrSet(SvgAttributeEvent<Object> event) {
if (event.getNewValue() == null) {
getTarget().removeAttribute(event.getAttrSpec().toString());
}
getTarget().setAttribute(event.getAttrSpec().toString(), event.getNewValue().toString());
}
});
for (SvgAttributeSpec<?> key : getSource().getAttributeKeys()) {
getTarget().setAttribute(key.toString(), getSource().getAttribute(key.getName()).get().toString());
}
}
@Override
public void detach() {
myReg.remove();
}
});
conf.add(Synchronizers.forPropsOneWay(getSource().handlersSet(), new WritableProperty<Set<SvgEventSpec>>() {
@Override
public void set(Set<SvgEventSpec> value) {
if (myHandlerRegs == null) {
myHandlerRegs = new EnumMap<>(SvgEventSpec.class);
}
for (final SvgEventSpec spec : SvgEventSpec.values()) {
if (!value.contains(spec) && myHandlerRegs.containsKey(spec)) {
myHandlerRegs.remove(spec).removeHandler();
}
if (!value.contains(spec) || myHandlerRegs.containsKey(spec)) continue;
String event = null;
switch (spec) {
case MOUSE_CLICKED:
event = "click";
break;
case MOUSE_PRESSED:
event = "mousedown";
break;
case MOUSE_RELEASED:
event = "mouseup";
break;
case MOUSE_OVER:
event = "mouseover";
break;
case MOUSE_MOVE:
event = "mousemove";
break;
case MOUSE_OUT:
event = "mouseout";
break;
default:
break;
}
if (event == null) {
throw new IllegalStateException();
}
final GQuery tq = GQuery.$(getTarget()).on(event, new Function() {
@Override
public boolean f(Event e) {
MouseEvent mouseEvent = createMouseEvent(e);
getSource().dispatch(spec, mouseEvent);
return true;
}
});
final String eventToRemove = event;
myHandlerRegs.put(spec, new HandlerRegistration() {
@Override
public void removeHandler() {
tq.off(eventToRemove);
}
});
}
if (myHandlerRegs.isEmpty()) {
myHandlerRegs = null;
}
}
}));
}