package org.simantics.district.network.ui.nodes; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ui.DistrictNetworkUIUtil; import org.simantics.maps.MapScalingTransform; import org.simantics.scenegraph.g2d.G2DNode; import org.simantics.scenegraph.g2d.G2DParentNode; import org.simantics.scenegraph.utils.DPIUtil; public class DistrictNetworkStaticInfoNode extends G2DNode { private static final Font FONT = new Font("Tahoma", Font.PLAIN, (int)(DPIUtil.upscale(9) * MapScalingTransform.getScaleY() + 0.5)); private static final long serialVersionUID = 1L; private static final Point2D UNIT_X = new Point2D.Double(1.0, 0.0); public static final String NODE_KEY = "DISTRICT_NETWORK_STATIC_INFO"; String info = null; Point2D origin = new Point2D.Double(); Point2D direction = UNIT_X; @Override public void render(Graphics2D g) { if (info == null || "".equals(info)) return; AffineTransform oldTransform = g.getTransform(); // There has to be a better way to calculate the zoom level in this context... AffineTransform baseTransform; try { baseTransform = ((G2DParentNode)getParent()).getTransform().createInverse(); } catch (NoninvertibleTransformException e) { baseTransform = new AffineTransform(); } baseTransform.preConcatenate(oldTransform); int zoomLevel = MapScalingTransform.zoomLevel(baseTransform); if (zoomLevel < 15) return; Font oldFont = g.getFont(); Color oldColor = g.getColor(); Object oldAA = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); doRender(g); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldAA); g.setTransform(oldTransform); g.setColor(oldColor); g.setFont(oldFont); } private void doRender(Graphics2D g) { g.translate(origin.getX(), origin.getY()); double scale = 1.5 / g.getTransform().getScaleX(); g.scale(scale, scale); int width1 = g.getFontMetrics().stringWidth(info); int height = g.getFontMetrics().getHeight(); g.setColor(Color.WHITE); g.fillRect(-width1/2 - 5, -2, width1, height); g.setFont(FONT); g.setColor(Color.BLACK); g.transform(AffineTransform.getRotateInstance(direction.getX(), direction.getY())); g.translate(0, 10); g.drawString(info, -width1/2, 0); } @Override public Rectangle2D getBoundsInLocal() { return null; } public void setLocation(Point2D origin, Point2D direction) { this.origin = origin; this.direction = direction; } public void setInfo(String info) { this.info = info; } }