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