protected void registerSynchronizers()

in view/src/main/java/jetbrains/jetpad/projectional/view/toGwt/MultiPointViewMapper.java [38:124]


  protected void registerSynchronizers(SynchronizersConfiguration conf) {
    super.registerSynchronizers(conf);

    final Element svg = createSVG();
    getTarget().appendChild(svg);

    final Element polyLine = SvgUtil.createPolyline();
    svg.appendChild(polyLine);

    final Style style = polyLine.getStyle();

    final boolean isPolyLine = getSource() instanceof PolyLineView;

    style.setProperty("strokeWidth", "1");

    conf.add(new Synchronizer() {
      private Registration myReg;

      @Override
      public void attach(SynchronizerContext ctx) {
        myReg = getSource().customFeatureChange(MultiPointView.POINTS).addHandler(new EventHandler<Object>() {
          @Override
          public void onEvent(Object event) {
            whenValid(new Runnable() {
              @Override
              public void run() {
                updatePoints();
              }
            });
          }
        });
        whenValid(new Runnable() {
          @Override
          public void run() {
            updatePoints();
          }
        });
      }

      @Override
      public void detach() {
        myReg.remove();
      }

      private void updatePoints() {
        StringBuilder points = new StringBuilder();

        Vector origin = getSource().bounds().get().origin;
        for (Vector v : getSource().points) {
          v = v.sub(origin);

          //we need this shifting to fix disappearing lines in FF
          double x = v.x != 0 ? v.x : 1;
          double y = v.y != 0 ? v.y : 1;

          if (points.length() > 0) {
            points.append(" ");
          }
          points.append(x).append(",").append(y);
        }

        polyLine.setAttribute("points", points.toString());
      }
    });

    conf.add(GwtViewSynchronizers.boundsSyncrhonizer(getSource(), svg));

    conf.add(Synchronizers.forPropsOneWay(getSource().color(), new WritableProperty<Color>() {
      @Override
      public void set(Color value) {
        if (isPolyLine) {
          style.setProperty("stroke", value.toCssColor());
          style.setProperty("fill", "none");
        } else {
          style.setProperty("stroke", "none");
          style.setProperty("fill", value.toCssColor());
        }
      }
    }));

    conf.add(Synchronizers.forPropsOneWay(getSource().width(), new WritableProperty<Integer>() {
      @Override
      public void set(Integer value) {
        style.setProperty("strokeWidth", "" + value);
      }
    }));
  }