protected void registerSynchronizers()

in svg/src/main/java/jetbrains/jetpad/projectional/svg/toAwt/SvgElementMapper.java [48:119]


  protected void registerSynchronizers(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 (SvgEventSpec spec : SvgEventSpec.values()) {
          if (!value.contains(spec) && myHandlerRegs.containsKey(spec)) {
            myHandlerRegs.remove(spec).remove();
          }
          if (!value.contains(spec) || myHandlerRegs.containsKey(spec)) continue;

          switch (spec) {
            case MOUSE_CLICKED:
              addMouseHandler(spec, SVGConstants.SVG_CLICK_EVENT_TYPE);
              break;
            case MOUSE_PRESSED:
              addMouseHandler(spec, SVGConstants.SVG_MOUSEDOWN_EVENT_TYPE);
              break;
            case MOUSE_RELEASED:
              addMouseHandler(spec, SVGConstants.SVG_MOUSEUP_EVENT_TYPE);
              break;
            case MOUSE_OVER:
              addMouseHandler(spec, SVGConstants.SVG_MOUSEOVER_EVENT_TYPE);
              break;
            case MOUSE_MOVE:
              addMouseHandler(spec, SVGConstants.SVG_MOUSEMOVE_EVENT_TYPE);
              break;
            case MOUSE_OUT:
              addMouseHandler(spec, SVGConstants.SVG_MOUSEOUT_EVENT_TYPE);
              break;
            default:
              break;
          }
        }

        if (myHandlerRegs.isEmpty()) {
          myHandlerRegs = null;
        }
      }
    }));
  }