package jetbrains.mps.lang.editor.figures.library; /*Generated by MPS */ import jetbrains.jetpad.projectional.view.PolyLineView; import jetbrains.jetpad.model.property.Property; import jetbrains.jetpad.model.property.ValueProperty; import jetbrains.jetpad.values.Color; import jetbrains.jetpad.projectional.view.View; import jetbrains.jetpad.geometry.Vector; import jetbrains.jetpad.mapper.MapperFactory; import jetbrains.jetpad.mapper.Mapper; import jetbrains.jetpad.mapper.Synchronizers; public class BoxFigure extends AbstractVerticalLayoutFigure { private PolyLineView myPolyLine = new PolyLineView(); public Property<Integer> lineWidth = new ValueProperty<Integer>(1); public BoxFigure() { this(new BoxFigure.BoxFigureMapperFactory()); } protected BoxFigure(BoxFigure.BoxFigureMapperFactory mapperFactory) { myPolyLine.color().set(Color.GRAY); children().add(myPolyLine); if (mapperFactory != null) { mapperFactory.createMapper(this).attachRoot(); } } protected boolean isExcludedFromLayout(View childView) { return super.isExcludedFromLayout(childView) || childView == myPolyLine; } private void adjustPolyLinePoints() { int width = figureWidth.get(); int height = figureHeight.get(); int lw = lineWidth.get(); int leftInset = lw / 2; int rightInset = lw - leftInset; Vector origin = bounds().get().origin; myPolyLine.points.clear(); myPolyLine.points.add(new Vector(leftInset, leftInset).add(origin)); myPolyLine.points.add(new Vector(width - rightInset, leftInset).add(origin)); myPolyLine.points.add(new Vector(width - rightInset, height - rightInset).add(origin)); myPolyLine.points.add(new Vector(leftInset, height - rightInset).add(origin)); myPolyLine.points.add(new Vector(leftInset, leftInset).add(origin)); } private static class BoxFigureMapperFactory implements MapperFactory<BoxFigure, BoxFigure> { public Mapper<? extends BoxFigure, ? extends BoxFigure> createMapper(BoxFigure figure) { return new BoxFigure.BoxFigureMapper<BoxFigure>(figure); } } protected static class BoxFigureMapper<T extends BoxFigure> extends AbstractVerticalLayoutFigure.AbstractVerticalLayoutFigureMapper<T> { protected BoxFigureMapper(T figure) { super(figure); } @Override protected void registerSynchronizers(Mapper.SynchronizersConfiguration configuration) { super.registerSynchronizers(configuration); final BoxFigure source = getSource(); configuration.add(Synchronizers.forProperty(source.figureWidth, new Runnable() { public void run() { source.adjustPolyLinePoints(); } })); configuration.add(Synchronizers.forProperty(source.figureHeight, new Runnable() { public void run() { source.adjustPolyLinePoints(); } })); configuration.add(Synchronizers.forProperty(source.lineWidth, new Runnable() { public void run() { source.adjustPolyLinePoints(); } })); configuration.add(Synchronizers.forProperty(source.lineWidth, source.myPolyLine.width())); } } }