package org.simantics.district.network.ui.nodes; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.Collections; import org.simantics.scenegraph.g2d.G2DNode; import org.simantics.scenegraph.utils.GeometryUtils; public class ElevationServerNode extends G2DNode { private static final long serialVersionUID = 3832908017166017921L; private static final Stroke DASHED_STROKE = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 4.0f, new float[]{4.0f}, 0.0f); private static final Color BLUE_ALPHA = new Color(0, 0, 255, 100); public static final String ID = "elevationServerNode"; private Collection rectangles; @Override public void render(Graphics2D g2d) { Color old = g2d.getColor(); Stroke oldStroke = g2d.getStroke(); g2d.setColor(BLUE_ALPHA); BasicStroke stroke = GeometryUtils.scaleStroke(DASHED_STROKE, (float) (1.0 / GeometryUtils.getScale(g2d.getTransform()))); g2d.setStroke(stroke); double scale = getTransform().getScaleY(); for (Rectangle2D rect : getRectangles()) { Point2D point = new Point2D.Double(rect.getY(), rect.getX()); Point2D result = DistrictNetworkNodeUtils.calculatePoint2D(point, null); Point2D point2 = new Point2D.Double(rect.getY() + rect.getHeight(), rect.getX() + rect.getWidth()); Point2D result2 = DistrictNetworkNodeUtils.calculatePoint2D(point2, null); double x = result.getX() * scale; double y = result.getY() * scale; double width = result2.getX() * scale - result.getX() * scale; double height = result2.getY() * scale - result.getY() * scale; Rectangle2D translated = new Rectangle2D.Double(x, y - Math.abs(height), width, Math.abs(height)); g2d.draw(translated); } g2d.setStroke(oldStroke); g2d.setColor(old); } @Override public Rectangle2D getBoundsInLocal() { Rectangle2D bounds = new Rectangle2D.Double(); for (Rectangle2D rect : getRectangles()) { bounds.add(rect); } return bounds; } public void setRectangles(Collection rectangles) { this.rectangles = rectangles; } public Collection getRectangles() { if (rectangles == null) return Collections.emptyList(); return rectangles; } }