]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scenegraph.swing;\r
2 \r
3 import java.awt.AWTEvent;\r
4 import java.awt.Component;\r
5 import java.awt.Point;\r
6 import java.awt.event.MouseEvent;\r
7 import java.awt.event.MouseWheelEvent;\r
8 import java.awt.geom.AffineTransform;\r
9 \r
10 import org.simantics.g2d.canvas.Hints;\r
11 import org.simantics.g2d.chassis.AWTChassis;\r
12 import org.simantics.scenegraph.INode;\r
13 import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
14 import org.simantics.scenegraph.g2d.events.SGMouseEvent;\r
15 import org.simantics.scenegraph.g2d.events.SGMouseWheelEvent;\r
16 import org.simantics.scenegraph.swing.ComponentNode.ComponentContainer;\r
17 \r
18 public class JComponentUtils {\r
19 \r
20     private static int getAbsoluteX(Component c, int init) {\r
21         if(c instanceof ComponentContainer) return init;\r
22         else return getAbsoluteX(c.getParent(), init+c.getX());\r
23     }\r
24     \r
25     private static int getAbsoluteY(Component c, int init) {\r
26         if(c instanceof ComponentContainer) return init;\r
27         else return getAbsoluteY(c.getParent(), init+c.getY());\r
28     }\r
29 \r
30     private static Point transform(int eventX, int eventY, JComponentSG comp, INode node) {\r
31         \r
32         if(node == null) return null;\r
33         \r
34                 G2DSceneGraph sg = (G2DSceneGraph)node.getRootNode();\r
35                 AWTChassis chassis = (AWTChassis)(sg.getRootPane().getParent());\r
36                 \r
37                 int trX = getAbsoluteX(comp.getComponent(), 0);\r
38                 int trY = getAbsoluteY(comp.getComponent(), 0);\r
39                 \r
40                 AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);\r
41                 if(ct == null) return null;\r
42 \r
43                 eventX += trX;\r
44                 eventX -= ct.getTranslateX();\r
45                 eventX /= ct.getScaleX();\r
46                 eventX -= trX;\r
47                 eventY += trY;\r
48                 eventY -= ct.getTranslateY();\r
49                 eventY /= ct.getScaleY();\r
50                 eventY -= trY;\r
51                 \r
52                 return new Point(eventX, eventY);\r
53         \r
54     }\r
55     \r
56         public static boolean contains(int eventX, int eventY, JComponentSG comp, INode node) {\r
57                 \r
58                 Point transformed = transform(eventX, eventY, comp, node);\r
59 \r
60                 if(transformed == null) return comp.containsTransformed(new Point(eventX, eventY));\r
61                 \r
62                 boolean result = comp.containsTransformed(transformed); \r
63                 \r
64 //              System.err.println(result + " - contains(" + comp.getClass().getCanonicalName() + ") ? (" + origX + "," + origY + ")=>(" + eventX + "," + eventY + ")");\r
65                 \r
66                 return result; \r
67                 \r
68         }\r
69         \r
70     public static AWTEvent relocate(AWTEvent e, JComponentSG comp, INode node) {\r
71 \r
72                 if(node == null) return e;\r
73 \r
74         if(!(e instanceof MouseEvent)) return e; // Only for mouse events\r
75         MouseEvent me = (MouseEvent)e;\r
76 \r
77                 Point transformed = transform(me.getX(), me.getY(), comp, node);\r
78                 if(transformed == null) return e;\r
79 \r
80         if(me.getID() == MouseWheelEvent.MOUSE_WHEEL) {\r
81             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
82         } else {\r
83             return new SGMouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), transformed.x, transformed.y, me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);\r
84         }\r
85         \r
86     }   \r
87         \r
88 }\r