1 package org.simantics.scenegraph.swing;
\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
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
18 public class JComponentUtils {
\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
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
30 private static Point transform(int eventX, int eventY, JComponentSG comp, INode node) {
\r
32 if(node == null) return null;
\r
34 G2DSceneGraph sg = (G2DSceneGraph)node.getRootNode();
\r
35 AWTChassis chassis = (AWTChassis)(sg.getRootPane().getParent());
\r
37 int trX = getAbsoluteX(comp.getComponent(), 0);
\r
38 int trY = getAbsoluteY(comp.getComponent(), 0);
\r
40 AffineTransform ct = chassis.getCanvasContext().getDefaultHintContext().getHint(Hints.KEY_CANVAS_TRANSFORM);
\r
41 if(ct == null) return null;
\r
44 eventX -= ct.getTranslateX();
\r
45 eventX /= ct.getScaleX();
\r
48 eventY -= ct.getTranslateY();
\r
49 eventY /= ct.getScaleY();
\r
52 return new Point(eventX, eventY);
\r
56 public static boolean contains(int eventX, int eventY, JComponentSG comp, INode node) {
\r
58 Point transformed = transform(eventX, eventY, comp, node);
\r
60 if(transformed == null) return comp.containsTransformed(new Point(eventX, eventY));
\r
62 boolean result = comp.containsTransformed(transformed);
\r
64 // System.err.println(result + " - contains(" + comp.getClass().getCanonicalName() + ") ? (" + origX + "," + origY + ")=>(" + eventX + "," + eventY + ")");
\r
70 public static AWTEvent relocate(AWTEvent e, JComponentSG comp, INode node) {
\r
72 if(node == null) return e;
\r
74 if(!(e instanceof MouseEvent)) return e; // Only for mouse events
\r
75 MouseEvent me = (MouseEvent)e;
\r
77 Point transformed = transform(me.getX(), me.getY(), comp, node);
\r
78 if(transformed == null) return e;
\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
83 return new SGMouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), transformed.x, transformed.y, me.getClickCount(), me.isPopupTrigger(), me.getButton(), me);
\r