1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g2d.participant;
14 import java.awt.geom.AffineTransform;
15 import java.awt.geom.Point2D;
17 import org.simantics.g2d.canvas.Hints;
18 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
19 import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency;
20 import org.simantics.g2d.participant.CanvasGrab.PointerInfo;
21 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
22 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
24 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
25 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
28 * @author Toni Kalajainen
30 public class MultitouchPanZoomRotateInteractor extends AbstractCanvasParticipant {
32 @Dependency TransformUtil util;
33 @Dependency CanvasGrab grab;
35 // Pointer grabbing button
36 public static final int BUTTON_ID = 1;
38 @EventHandler(priority = Integer.MAX_VALUE - 2000)
39 public boolean handleEvent(MouseButtonPressedEvent e) {
40 // ignore normal mouse
41 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
42 if (e.mouseId==0) return false;
43 if (e.button != BUTTON_ID) return false;
45 //System.out.println(e.mouseId+" down");
46 Point2D controlPos = e.controlPosition;
47 Point2D canvasPos = util.controlToCanvas(controlPos, null);
48 grab.grabCanvas(e.mouseId, canvasPos);
52 @EventHandler(priority = Integer.MAX_VALUE - 2000)
53 public boolean handleEvent(MouseButtonReleasedEvent e) {
54 // ignore normal mouse
55 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
56 if (e.mouseId==0) return false;
57 if (e.button != BUTTON_ID) return false;
59 //System.out.println(e.mouseId+" up");
60 grab.grabInfo.remove(e.mouseId);
65 @EventHandler(priority = Integer.MAX_VALUE - 2000)
66 public boolean handleEvent(MouseExitEvent e) {
67 // ignore normal mouse
68 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
69 if (e.mouseId==0) return false;
71 //System.out.println(e.mouseId+" exit");
72 grab.grabInfo.remove(e.mouseId);
76 @EventHandler(priority = Integer.MAX_VALUE - 2000)
77 public boolean handleEvent(MouseMovedEvent e) {
78 if (e.context instanceof MouseUtil) return false;
79 if (getHint(Hints.KEY_TOOL) != Hints.PANTOOL) return false;
81 PointerInfo ai = grab.grabInfo.get(e.mouseId);
82 if (ai==null) return false;
83 if (grab.grabInfo.size() == 1) {
84 PointerInfo pi = grab.grabInfo.values().iterator().next();
86 Point2D pt = util.controlToCanvas(e.controlPosition, null);
88 double a1_x = pi.anchorPos.getX();
89 double a1_y = pi.anchorPos.getY();
90 double b1_x = pt.getX();
91 double b1_y = pt.getY();
93 AffineTransform gat = util.getTransform();
94 gat.translate(b1_x-a1_x, b1_y-a1_y);
95 util.setTransform(gat);
97 return true; // TODO Do panning;
99 if (grab.grabInfo.size()!=2) return false;
103 PointerInfo[] pi = grab.grabInfo.values().toArray(new PointerInfo[2]);
105 for (PointerInfo p : pi)
106 if (p.mouseId == e.mouseId)
107 p.currentPos = util.controlToCanvas(e.controlPosition, null);
109 double a1_x = pi[0].anchorPos.getX();
110 double a1_y = pi[0].anchorPos.getY();
111 double b1_x = pi[0].currentPos.getX();
112 double b1_y = pi[0].currentPos.getY();
114 double a2_x = pi[1].anchorPos.getX();
115 double a2_y = pi[1].anchorPos.getY();
116 double b2_x = pi[1].currentPos.getX();
117 double b2_y = pi[1].currentPos.getY();
119 for (PointerInfo p : pi)
120 if (p.mouseId != e.mouseId)
121 p.currentPos = p.anchorPos;
123 double da_x = a1_x - a2_x;
124 double da_y = a1_y - a2_y;
125 double da_lensq = da_x*da_x + da_y*da_y;
126 if(da_lensq < EPSILON) {
127 System.err.println("a1 ja a2 ovat liian lähellä toisiaan");
131 double db_x = b1_x - b2_x;
132 double db_y = b1_y - b2_y;
134 double s_x = (db_x * da_x + db_y * da_y) / da_lensq;
135 double s_y = (-db_x * da_y + db_y * da_x) / da_lensq;
137 double t_x = b1_x - s_x * a1_x + s_y * a1_y;
138 double t_y = b1_y - s_x * a1_y - s_y * a1_x;
140 double mat[] = new double[] {s_x, s_y, -s_y, s_x, t_x, t_y};
141 AffineTransform at = new AffineTransform(mat);
144 AffineTransform gat = util.getTransform();
146 util.setTransform(gat);