]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/swing/JComponentUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph.swing / src / org / simantics / scenegraph / swing / JComponentUtils.java
diff --git a/bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/swing/JComponentUtils.java b/bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/swing/JComponentUtils.java
new file mode 100644 (file)
index 0000000..008c59a
--- /dev/null
@@ -0,0 +1,88 @@
+package org.simantics.scenegraph.swing;\r
+\r
+import java.awt.AWTEvent;\r
+import java.awt.Component;\r
+import java.awt.Point;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseWheelEvent;\r
+import java.awt.geom.AffineTransform;\r
+\r
+import org.simantics.g2d.canvas.Hints;\r
+import org.simantics.g2d.chassis.AWTChassis;\r
+import org.simantics.scenegraph.INode;\r
+import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
+import org.simantics.scenegraph.g2d.events.SGMouseEvent;\r
+import org.simantics.scenegraph.g2d.events.SGMouseWheelEvent;\r
+import org.simantics.scenegraph.swing.ComponentNode.ComponentContainer;\r
+\r
+public class JComponentUtils {\r
+\r
+    private static int getAbsoluteX(Component c, int init) {\r
+       if(c instanceof ComponentContainer) return init;\r
+       else return getAbsoluteX(c.getParent(), init+c.getX());\r
+    }\r
+    \r
+    private static int getAbsoluteY(Component c, int init) {\r
+       if(c instanceof ComponentContainer) return init;\r
+       else return getAbsoluteY(c.getParent(), init+c.getY());\r
+    }\r
+\r
+    private static Point transform(int eventX, int eventY, JComponentSG comp, INode node) {\r
+       \r
+       if(node == null) return null;\r
+       \r
+               G2DSceneGraph sg = (G2DSceneGraph)node.getRootNode();\r
+               AWTChassis chassis = (AWTChassis)(sg.getRootPane().getParent());\r
+               \r
+               int trX = getAbsoluteX(comp.getComponent(), 0);\r
+               int trY = getAbsoluteY(comp.getComponent(), 0);\r
+               \r
+               AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);\r
+               if(ct == null) return null;\r
+\r
+               eventX += trX;\r
+               eventX -= ct.getTranslateX();\r
+               eventX /= ct.getScaleX();\r
+               eventX -= trX;\r
+               eventY += trY;\r
+               eventY -= ct.getTranslateY();\r
+               eventY /= ct.getScaleY();\r
+               eventY -= trY;\r
+               \r
+               return new Point(eventX, eventY);\r
+       \r
+    }\r
+    \r
+       public static boolean contains(int eventX, int eventY, JComponentSG comp, INode node) {\r
+               \r
+               Point transformed = transform(eventX, eventY, comp, node);\r
+\r
+               if(transformed == null) return comp.containsTransformed(new Point(eventX, eventY));\r
+               \r
+               boolean result = comp.containsTransformed(transformed); \r
+               \r
+//             System.err.println(result + " - contains(" + comp.getClass().getCanonicalName() + ") ? (" + origX + "," + origY + ")=>(" + eventX + "," + eventY + ")");\r
+               \r
+               return result; \r
+               \r
+       }\r
+       \r
+    public static AWTEvent relocate(AWTEvent e, JComponentSG comp, INode node) {\r
+\r
+               if(node == null) return e;\r
+\r
+       if(!(e instanceof MouseEvent)) return e; // Only for mouse events\r
+       MouseEvent me = (MouseEvent)e;\r
+\r
+               Point transformed = transform(me.getX(), me.getY(), comp, node);\r
+               if(transformed == null) return e;\r
+\r
+        if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {\r
+            return new SGMouseWheelEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), transformed.x, transformed.y, me.getClickCount(), me.isPopupTrigger(), ((MouseWheelEvent)me).getScrollType(), ((MouseWheelEvent)me).getScrollAmount(), ((MouseWheelEvent)me).getWheelRotation(), me);\r
+        } else {\r
+            return new SGMouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), transformed.x, transformed.y, me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);\r
+        }\r
+        \r
+    }  \r
+       \r
+}\r