]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkStaticInfoNode.java
Static information label profile definition.
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkStaticInfoNode.java
diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkStaticInfoNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkStaticInfoNode.java
new file mode 100644 (file)
index 0000000..fb7041e
--- /dev/null
@@ -0,0 +1,94 @@
+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);
+
+               g.setFont(FONT);
+               g.setColor(Color.BLACK);
+               
+               g.transform(AffineTransform.getRotateInstance(direction.getX(), direction.getY()));
+               g.translate(0, 10);
+               
+               int width1 = g.getFontMetrics().stringWidth(info);
+               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;
+       }
+}