protected void registerSynchronizers()

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