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